1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifndef _SOUND_H_
#define _SOUND_H_
#include "System/Sound/ISound.h"
#include <set>
#include <string>
#include <map>
#include <vector>
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/thread/recursive_mutex.hpp>
#include "System/float3.h"
#include "SoundItem.h"
class CSoundSource;
class SoundBuffer;
class SoundItem;
struct ALCdevice_struct;
typedef struct ALCdevice_struct ALCdevice;
namespace boost {
class thread;
}
/// Default sound system implementation (OpenAL)
class CSound : public ISound
{
public:
CSound();
virtual ~CSound();
virtual bool HasSoundItem(const std::string& name) const;
virtual size_t GetSoundId(const std::string& name);
SoundItem* GetSoundItem(size_t id) const;
virtual CSoundSource* GetNextBestSource(bool lock = true);
virtual void UpdateListener(const float3& campos, const float3& camdir, const float3& camup);
virtual void NewFrame();
/// @see ConfigHandler::ConfigNotifyCallback
virtual void ConfigNotify(const std::string& key, const std::string& value);
virtual void PitchAdjust(const float newPitch);
virtual bool Mute();
virtual bool IsMuted() const;
virtual void Iconified(bool state);
virtual void PrintDebugInfo();
bool SoundThreadQuit() const { return soundThreadQuit; }
bool CanLoadSoundDefs() const { return canLoadDefs; }
bool LoadSoundDefsImpl(const std::string& fileName, const std::string& modes);
const float3& GetListenerPos() const { return myPos; }
private:
typedef std::map<std::string, std::string> soundItemDef;
typedef std::map<std::string, soundItemDef> soundItemDefMap;
private:
void StartThread(int maxSounds);
void Update();
int GetMaxMonoSources(ALCdevice* device, int maxSounds);
void UpdateListenerReal();
size_t MakeItemFromDef(const soundItemDef& itemDef);
size_t LoadSoundBuffer(const std::string& filename);
private:
float masterVolume;
bool mute;
/// we do not play if minimized / iconified
bool appIsIconified;
bool pitchAdjust;
typedef std::map<std::string, size_t> soundMapT;
typedef std::vector<SoundItem*> soundVecT;
soundMapT soundMap;
soundVecT sounds;
/// unscaled
float3 myPos;
float3 camDir;
float3 camUp;
float3 prevVelocity;
bool listenerNeedsUpdate;
typedef boost::ptr_vector<CSoundSource> sourceVecT;
sourceVecT sources;
soundItemDef defaultItem;
soundItemDefMap soundItemDefs;
boost::thread* soundThread;
volatile bool soundThreadQuit;
volatile bool canLoadDefs;
};
#endif // _SOUND_H_
|