#include <dsound.h>
#include <assert.h>
#include <math.h>
#include <ogg/ogg.h>
#include <vorbis/codec.h>
#include <vorbis/vorbisfile.h>
#include <mmsystem.h>
#pragma comment(lib,"dsound.lib")
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib,"winmm.lib")
class ljmMusicBuffer_DSound : public ljmMusicBuffer
{
public:
ljmMusicBuffer_DSound(IDirectSound8* pDS);
~ljmMusicBuffer_DSound();
bool LoadOggFile(const char* szFileName);
void Play(bool bLoop);
void Stop(void);
void Pause(void);
void Reset(void);
void SetVolume(float vol);
bool IsPlaying(void);
protected:
LPDIRECTSOUND8 m_pDS;
LPDIRECTSOUNDBUFFER m_pBuffer;
LONG m_lVolume;
WAVEFORMATEX m_wfx;
DWORD m_dwWritePos;
OggVorbis_File* m_pVorbisFile;
string m_strCurFile;
bool m_bMono ;
long m_lRate;
int current_section;
bool m_bLoop;
bool m_bFinished;
// static const int BUFFERSIZE = 8192;
UINT m_TimerID;
void Clear(void);
void FillBuffer(void);
static void CALLBACK OnTimerCB(UINT uID, UINT uMsg,DWORD_PTR pUserData, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
};
全部评论4
{
Stop();
Clear();
if(m_strCurFile == szFileName)
return true;
FILE* pFile = fopen(szFileName,"rb");
if(!pFile)
return false;
if(m_pVorbisFile)
{
ov_clear(m_pVorbisFile);
delete m_pVorbisFile;
}
m_pVorbisFile = new OggVorbis_File;
memset(m_pVorbisFile,0,sizeof(OggVorbis_File));
ov_clear(m_pVorbisFile);
if( 0!=ov_open(pFile,m_pVorbisFile,NULL,0) )
{
ov_clear(m_pVorbisFile);
delete m_pVorbisFile;
return false;
}
if(m_pVorbisFile->vi->channels == 1)
{
m_bMono = true;
}
else
{
m_bMono = false;
}
m_lRate = m_pVorbisFile->vi->rate;
// WAVEFORMATEX wfx;
m_wfx.wFormatTag = WAVE_FORMAT_PCM;
m_wfx.nSamplesPerSec = (DWORD)m_lRate;
m_wfx.wBitsPerSample = 16;
m_wfx.cbSize = sizeof(WAVEFORMATEX);
if(m_bMono)
{
m_wfx.nChannels = 1;
}
else
{
m_wfx.nChannels = 2;
}
m_wfx.nBlockAlign = m_wfx.nChannels * m_wfx.wBitsPerSample / 8;
m_wfx.nAvgBytesPerSec = m_wfx.nSamplesPerSec * m_wfx.nBlockAlign;
DSBUFFERDESC dsbd;
ZeroMemory(&dsbd,sizeof(DSBUFFERDESC));
dsbd.dwSize = sizeof(dsbd);
dsbd.dwFlags = 0;//DSBCAPS_CTRLVOLUME;
dsbd.dwBufferBytes = m_wfx.nAvgBytesPerSec * 2; dsbd.guid3DAlgorithm = GUID_NULL;
dsbd.lpwfxFormat = &m_wfx;
HRESULT hr;
if(FAILED( hr = m_pDS->CreateSoundBuffer(&dsbd,&m_pBuffer,NULL)))
{
ov_clear(m_pVorbisFile);
delete m_pVorbisFile;
return false;
}
return true;
}
void CALLBACK ljmMusicBuffer_DSound::OnTimerCB(
UINT uID, UINT uMsg,
DWORD_PTR pUserData,
DWORD_PTR dwParam1,
DWORD_PTR dwParam2)
{
ljmMusicBuffer_DSound* pObj = (ljmMusicBuffer_DSound*)pUserData;
if(pObj)
{
if(pObj->m_bFinished)
{
pObj->Stop();
}
else
{
pObj->FillBuffer();
}
}
}