engine/include/SoundManager/SoundManagerWindows.h
2013-01-19 20:02:34 +00:00

248 lines
4.9 KiB
C++

#ifndef SOUND_MANAGER_WINDOWS_H_INCLUDED
#define SOUND_MANAGER_WINDOWS_H_INCLUDED
#include "include/SoundManager/SoundManagerDataTypes.h"
#include "include/SoundManager/SoundManagerInterface.h"
#include "include/Utils/Utils.h"
#ifndef NOSOUND
#include "audiodefs.h"
#include "dsound.h"
namespace SE
{
const cardinal CONST_DIRECTSOUND_BUFFER_SIZE = 4096*16;
const cardinal CONST_BPS = 2;
struct TDirectSoundStruct
{
IDirectSoundBuffer8* soundBuffer;
TDirectSoundStruct() : soundBuffer(NULL) { }
~TDirectSoundStruct()
{
if (soundBuffer != NULL)
{
soundBuffer->Release();
soundBuffer = NULL;
}
}
};
struct TWaveFile
{
TBasicWAVEHeader WaveHeader;
TByteArrPtr WaveData;
cardinal WaveDataCursor;
};
TWaveFile OggSoundFromFile(const std::string& fileName);
TWaveFile LoadWaveFile(const std::string& fileName);
DSBUFFERDESC FillPrimaryWaveBufferDescription();
WAVEFORMATEX FillPrimaryWaveFormat(cardinal samplesPerSec);
DSBUFFERDESC FillSecondaryWaveBufferDescription(cardinal bufferSize, WAVEFORMATEX* pWaveFormat);
WAVEFORMATEX FillSecondaryWaveFormat(cardinal bufferSize);
class TMusicDataAccessInterface
{
public:
TMusicDataAccessInterface() : goneOverEnd(false) { }
protected:
bool goneOverEnd;
void ResetDataCursor();
virtual int InnerReadDataToBuffer(char* buffer, int size, int& bytesRead) = 0;
virtual void InnerResetDataCursor() = 0;
virtual void LoadSoundData(const std::string& fileName) = 0;
virtual void ClearSoundData() = 0;
virtual bool CheckIfSoundIsOver() = 0;
virtual cardinal GetSamplesPerSec() = 0;
void ReadDataToBuffer_Looped(char* buffer, int size);
int ReadDataToBuffer(char* buffer, int size);
};
class TMusicStreamAncestor : public TMusicDataAccessInterface
{
public:
TMusicStreamAncestor();
~TMusicStreamAncestor();
void Load(const std::string& musicFileName);
void Clear();
void Update();
void Play();
void PlayLooped();
void Stop();
protected:
void InnerPlay();
void InitialFillBuffer();
bool IsPlaying;
bool Looped;
bool IsLoaded;
TDirectSoundStruct DirectSoundBuffer;
cardinal BufferCursorPos;
cardinal PlayCursorPos;
cardinal TotalPlayCursorPos;
};
class TWaveStream : public TMusicStreamAncestor
{
public:
TWaveStream();
~TWaveStream();
protected:
virtual int InnerReadDataToBuffer(char* buffer, int size, int& bytesRead);
virtual void InnerResetDataCursor();
virtual void ClearSoundData();
virtual void LoadSoundData(const std::string& fileName);
virtual bool CheckIfSoundIsOver();
virtual cardinal GetSamplesPerSec();
TWaveFile MusicFile;
};
class TOggMusicStream : public TMusicStreamAncestor
{
public:
TOggMusicStream();
~TOggMusicStream();
protected:
bool IsInited;
virtual int InnerReadDataToBuffer(char* buffer, int size, int& bytesRead);
virtual void InnerResetDataCursor();
virtual void ClearSoundData();
virtual void LoadSoundData(const std::string& fileName);
virtual bool CheckIfSoundIsOver();
virtual cardinal GetSamplesPerSec();
TOggCallbackFileBuffer FileBuffer;
OggVorbis_File OggFileData;
vorbis_info* VorbisInfo;
};
DWORD GetMaxWriteSize(cardinal m_cbBufOffset, cardinal m_cbBufSize, TDirectSoundStruct& soundStruct);
void FillMemoryWithZero(char* bufferPtr, cardinal bufferSize);
class TSoundManagerWindows : public TSoundManagerInterface
{
private:
std::map<std::string, TDirectSoundStruct> SoundMap;
std::map<std::string, boost::shared_ptr<TMusicStreamAncestor> > StreamMap;
void InitDirectSound();
void ShutdownDirectSound();
public:
TSoundManagerWindows();
~TSoundManagerWindows();
virtual void LoadSound(const std::string& soundFileName);
virtual void PlaySound(const std::string& soundName);
virtual void LoadMusic(const std::string& musicFileName);
virtual void PlayMusic(const std::string& musicName);
virtual void PlayMusicLooped(const std::string& musicName);
virtual void StopMusic(const std::string& musicName);
virtual void StopAllMusic();
virtual void TryStopAndPlayMusicLooped(const std::string& musicName);
virtual void Update(cardinal dt);
IDirectSoundBuffer8* CreateDirectSound8InterfaceBuffer(cardinal dataSize, cardinal samplesPerSec);
IDirectSound8* DirectSound;
IDirectSoundBuffer* PrimaryBuffer;
};
} //namespace SE
#else
namespace SE
{
//NOSOUND version - just dummy
class TSoundManagerWindows : public TSoundManagerInterface
{
private:
public:
virtual void LoadSound(const std::string& soundFileName) { }
virtual void PlaySound(const std::string& soundName) { }
virtual void LoadMusic(const std::string& musicFileName) { }
virtual void PlayMusic(const std::string& musicName) { }
virtual void PlayMusicLooped(const std::string& musicName) { }
virtual void StopMusic(const std::string& musicName) { }
};
} //namespace SE
#endif
#endif