📄 dsobj.cpp
字号:
#include "dsobj.h"
// CDSObj()
// - default constructor, initialize all the member
// INPUT: none;
// OUTPUT: none;
CDSObj::CDSObj()
{
lpDS = NULL;
for (int i = 0; i < 50; i++)
{
DSBufStack[i].lpDSBuffer = NULL;
DSBufStack[i].dwWaveSize = 0;
DSBufStack[i].szFileName = NULL;
DSBufStack[i].lpWFmtEX = NULL;
DSBufStack[i].lpWaveData = NULL;
}
size = 0;
}
// ~CDSObj()
// - destructor, destroy all the memor we allocated
// INPUT: none;
// OUTPUT: none;
CDSObj::~CDSObj()
{
Terminate();
}
// Initialize()
// - construct DirectSound object and set the correct cooperative level
// INPUT: HWND object - the application window object.
// OUTPUT: none;
BOOL CDSObj::Initialize(HWND hwnd)
{
HRESULT hr;
// to make sure, we initialize again.
lpDS = NULL;
for (int i = 0; i < 50; i++)
{
DSBufStack[i].lpDSBuffer = NULL;
DSBufStack[i].szFileName = NULL;
DSBufStack[i].dwWaveSize = 0;
DSBufStack[i].lpWFmtEX = NULL;
DSBufStack[i].lpWaveData = NULL;
}
size = 0;
// first construct a directsound object
hr = DirectSoundCreate(NULL, &lpDS, NULL);
if (hr != DS_OK)
{
MessageBox(hwnd, "ERROR: Can't construct directsound object!",
"DirectSound initialization:", MB_OK);
Terminate();
return FALSE;
}
// set cooperative level as normal
hr = lpDS->SetCooperativeLevel(hwnd, DSSCL_NORMAL);
if (hr != DS_OK)
{
MessageBox(hwnd, "ERROR: Can't set cooperative level!",
"DirectSound initialization:", MB_OK);
Terminate();
return FALSE;
}
return TRUE;
}
// Terminate()
// - terminate DirectSound object and all the buffers we allocated.
// INPUT: none;
// OUTPUT: none;
void CDSObj::Terminate()
{
if (lpDS != NULL)
{
for (int i = 0; i < 50; i++)
{
DestroySoundBuffer(i);
}
lpDS->Release();
lpDS = NULL;
}
size = 0;
}
// DestroySoundBuffer()
// - destroy a sound buffer with index num.
// INTPUT: num - the index of DSBufStack array.
// OUTPUT: none;
void CDSObj::DestroySoundBuffer(int num)
{
if (DSBufStack[num].lpDSBuffer != NULL)
{
DSBufStack[num].lpDSBuffer->Release();
DSBufStack[num].lpDSBuffer = NULL;
}
if(DSBufStack[num].dwWaveSize != 0)
DSBufStack[num].dwWaveSize = 0;
if(DSBufStack[num].szFileName != NULL)
DSBufStack[num].szFileName = NULL;
if(DSBufStack[num].lpWFmtEX != NULL)
{
delete DSBufStack[num].lpWFmtEX;
DSBufStack[num].lpWFmtEX = NULL;
}
if(DSBufStack[num].lpWaveData != NULL)
{
GlobalFree(DSBufStack[num].lpWaveData);
DSBufStack[num].lpWaveData = NULL;
}
if (size != 0)
size -= 1;
}
// GetSoundFromFile
// - Get sound data from a file.
// INPUT: 1. fn - the name of the file.
// 2. num - the index.
// OUTPUT: TRUE if this operation success, FALSE otherwise.
BOOL CDSObj::GetSoundDataFromFile(LPSTR fn, int num)
{
BOOL success;
WAVEFORMATEX * lpTempWFmtEX;
char * lpWaveDataTemp;
CWave * lpTempWave = new CWave;
success = lpTempWave->LoadWaveFile(fn);
if(!success)
return FALSE;
if(IsBufferExisting(num))
DestroySoundBuffer(num);
lpTempWFmtEX = lpTempWave->GetWaveFormatEXPtr();
lpWaveDataTemp = lpTempWave->GetWaveData();
DSBufStack[num].dwWaveSize = lpTempWave->GetWaveSize();
DSBufStack[num].szFileName = fn;
DSBufStack[num].lpWFmtEX = new WAVEFORMATEX;
DSBufStack[num].lpWaveData = (char *)GlobalAlloc(GMEM_FIXED, DSBufStack[num].dwWaveSize);
memcpy(DSBufStack[num].lpWFmtEX, lpTempWFmtEX, sizeof(WAVEFORMATEX));
memcpy(DSBufStack[num].lpWaveData, lpWaveDataTemp, DSBufStack[num].dwWaveSize);
delete lpTempWave;
lpTempWFmtEX = NULL;
lpWaveDataTemp = NULL;
size += 1;
return TRUE;
}
// CreateBuffer
// -create buffer with specified index.
// * remember one thing: call GetSoundDataFrom() first.
// INPUT: num - the index.
// OUTPUT: TRUE if this operation success, FALSE otherwise.
BOOL CDSObj::CreateBuffer(int num)
{
DSBUFFERDESC dsbc;
HRESULT hr;
if (IsStackFull())
return FALSE;
if(!IsIndexValid(num))
return FALSE;
memset(&dsbc, 0, sizeof(DSBUFFERDESC));
dsbc.dwSize = sizeof(DSBUFFERDESC);
dsbc.dwFlags = DSBCAPS_STATIC;
if(DSBufStack[num].dwWaveSize == 0)
return FALSE;
dsbc.dwBufferBytes = DSBufStack[num].dwWaveSize;
if(DSBufStack[num].lpWFmtEX == NULL)
return FALSE;
dsbc.lpwfxFormat = DSBufStack[num].lpWFmtEX;
// construct the buffer
hr = lpDS->CreateSoundBuffer(&dsbc, &DSBufStack[num].lpDSBuffer, NULL);
if (hr != DS_OK)
{
DSBufStack[num].lpDSBuffer = NULL;
return FALSE;
}
return TRUE;
}
// LoadDataToBuffer
// - After create the sound buffer, load data to buffer.
// * remember one thing: call CreateBuffer() first.
// INPUT: num - the index.
// OUTPUT: TRUE if this operation success, FALSE otherwise.
BOOL CDSObj::LoadDataToBuffer(int num)
{
LPVOID pSoundBlock1;
LPVOID pSoundBlock2;
DWORD bytes1;
DWORD bytes2;
HRESULT hr;
if(DSBufStack[num].lpWaveData == NULL && DSBufStack[num].dwWaveSize == 0)
return FALSE;
hr = DSBufStack[num].lpDSBuffer->Lock(0, DSBufStack[num].dwWaveSize,
&pSoundBlock1, &bytes1, &pSoundBlock2, &bytes2,0);
if(hr != DS_OK)
return FALSE;
// load the data
memcpy((void *)pSoundBlock1, DSBufStack[num].lpWaveData, DSBufStack[num].dwWaveSize);
// unlock the memory buffer
DSBufStack[num].lpDSBuffer->Unlock(pSoundBlock1, bytes1, pSoundBlock2, bytes2);
if (hr != DS_OK)
return FALSE;
return TRUE;
}
// SetSoundTrack()
// -load a valid sound file into specified dsound buffer.
// * This method:
// 1. GetSoundDataFromFile()
// 2. CreateBuffer()
// 3. LoadSoundDataToBuffer().
// INPUT: 1. fn - the name of the file.
// 2. num - the index.
// OUTPUT: TRUE if this operation success, FALSE otherwise.
BOOL CDSObj::SetSoundTrack(LPSTR fn, int num)
{
if(!GetSoundDataFromFile(fn, num))
return FALSE;
if(!CreateBuffer(num))
return FALSE;
if(!LoadDataToBuffer(num))
return FALSE;
return TRUE;
}
// PlaySound()
// - play the sound in the specified sound buffer with index num.
// INPUT: 1. loop - specify loop the sound.
// 2. num - the index.
// OUTPUT: TRUE if this operation success, FALSE otherwise.
BOOL CDSObj::PlaySound(BOOL loop, int num)
{
HRESULT hr;
if(!IsIndexValid(num))
return FALSE;
if (!IsBufferExisting(num))
return FALSE;
hr = DSBufStack[num].lpDSBuffer->SetCurrentPosition(0);
if (hr != DS_OK)
return FALSE;
if (loop)
{
hr = DSBufStack[num].lpDSBuffer->Play(0, 0, DSBPLAY_LOOPING);
if(hr != DS_OK)
return FALSE;
}
else
{
hr = DSBufStack[num].lpDSBuffer->Play(0, 0, 0);
if(hr != DS_OK)
return FALSE;
}
return TRUE;
}
// StopSound()
// -stop the sound in a specified sound buffer with index num.
// INPUT: num - the index.
// OUTPUT: none;
void CDSObj::StopSound(int num)
{
if(!IsIndexValid(num))
return;
if (!IsBufferExisting(num))
return;
DSBufStack[num].lpDSBuffer->Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -