📄 gamesound.cpp
字号:
#include "GameSound.h"
#include "GlobalDefs.h"
#include <mmsystem.h>
static char szSoundEffects[SOUND_COUNT][64] =
{
".\\sound\\fire.wav",
".\\sound\\explode.wav",
".\\sound\\win.wav",
".\\sound\\lost.wav",
".\\sound\\bonus.wav",
".\\sound\\circumvention.wav",
".\\sound\\lvup.wav",
".\\sound\\alarm.wav",
".\\sound\\hit.wav",
".\\sound\\reborn.wav",
};
CGameSound::CGameSound(void)
{
m_pSound = NULL;
int i;
for (i = 0; i < SOUND_COUNT; i++)
{
if (NULL != m_pdsBuffer[i])
{
m_pdsBuffer[i] = NULL;
}
}
}
CGameSound::~CGameSound(void)
{
Release();
}
// Create and release /////////////////////////////////////////////////
BOOL CGameSound::Create(HWND hWnd)
{
// Create DirectSound interface
if (FAILED(DirectSoundCreate(NULL, &m_pSound, NULL)))
{
MessageBox(NULL, "Create DirectSound Failed!!!", "ERROR!", MB_OK);
return FALSE;
}
// Set Cooperative level
if (FAILED(m_pSound->SetCooperativeLevel(hWnd, DSSCL_NORMAL)))
{
Release();
return FALSE;
}
// Set up directsound buffer
int i;
for (i = 0; i < SOUND_COUNT; i++)
{
if (!CreateBuffer(m_pdsBuffer[i], szSoundEffects[i]))
{
return FALSE;
}
}
return TRUE;
}
BOOL CGameSound::CreateBuffer(LPDIRECTSOUNDBUFFER &pBuffer, LPSTR inFileName)
{
WAVEFORMATEX swfmt; // Holds the format description
MMCKINFO ckRiff; // Parent duck
MMCKINFO ckInfo; // Child duck
MMRESULT mmresult;
HMMIO hmmio; // Handle to wave file
// Open a file, if can not find, return
hmmio = mmioOpen(inFileName, NULL, MMIO_ALLOCBUF | MMIO_READ );
if(NULL == hmmio)
{
char szError[255];
wsprintf(szError, "%s is not exsit!", inFileName);
MessageBox(NULL, szError, "ERROR!", MB_OK);
return FALSE;
}
// Descend into the RIFF
ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
if (MMSYSERR_NOERROR != mmresult)
{
MessageBox(NULL, "File's Type Wrong!", "ERROR!", MB_OK);
mmioClose(hmmio, 0);
return FALSE;
}
// Descend to the WAVEfmt
ckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
mmresult = mmioDescend(hmmio, &ckInfo, &ckRiff, MMIO_FINDCHUNK);
if(MMSYSERR_NOERROR != mmresult)
{
mmioClose(hmmio, 0);
return FALSE;
}
// Read the wave format information from file
if(-1 == mmioRead(hmmio, (HPSTR)&swfmt, sizeof(swfmt)))
{
mmioClose(hmmio, 0);
MessageBox(NULL, "File read failed!", "ERROR!" ,MB_OK);
return FALSE;
}
// Ascend up one level, then access data chunk
mmresult = mmioAscend(hmmio, &ckInfo, 0);
ckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
mmresult = mmioDescend(hmmio, &ckInfo, &ckRiff, MMIO_FINDCHUNK);
if(MMSYSERR_NOERROR != mmresult)
{
mmioClose(hmmio, 0);
return FALSE;
}
// WAVEFORMATEX pcmwf; // Holds the format description
DSBUFFERDESC dsbd; // DirectSound buffer description
// Set up the format data sturcture, Set as DEFAULT
/* memset((void *)&pcmwf, 0, sizeof(WAVEFORMATEX));
pcmwf.wFormatTag = WAVE_FORMAT_PCM;
pcmwf.nChannels = 1;
pcmwf.nSamplesPerSec = 22050;
pcmwf.nBlockAlign = 2; // nChannels * bytespersample(here is 2 byte)
pcmwf.nAvgBytesPerSec = pcmwf.nSamplesPerSec * pcmwf.nBlockAlign;
pcmwf.wBitsPerSample = 8;
pcmwf.cbSize = 0;
*/
// Set up the directsound buffer description
memset((void *)&dsbd, 0, sizeof(DSBUFFERDESC));
dsbd.dwSize = sizeof(DSBUFFERDESC);
dsbd.dwFlags = DSBCAPS_STATIC | DSBCAPS_LOCSOFTWARE;
dsbd.dwBufferBytes = ckInfo.cksize; // Enough for file
dsbd.lpwfxFormat = &swfmt;
// Create the sound buffer
if (FAILED(m_pSound->CreateSoundBuffer(&dsbd, &pBuffer, NULL)))
{
mmioClose(hmmio, 0);
MessageBox(NULL, "Create Sound Buffer Failed!", "ERROR!", MB_OK);
return FALSE;
}
void *pAudio = NULL;
DWORD dwAudioLengh = 0;
// Lock
if (FAILED(pBuffer->Lock(0, ckInfo.cksize,
&pAudio, &dwAudioLengh, NULL, NULL, NULL)))
{
mmioClose(hmmio, 0);
pBuffer->Release();
return FALSE;
}
// Read file
if (-1 == mmioRead(hmmio, (HPSTR)pAudio, dwAudioLengh))
{
mmioClose(hmmio, 0);
pBuffer->Release();
return FALSE;
}
// Unlock
if (FAILED(pBuffer->Unlock(pAudio, dwAudioLengh, NULL, NULL)))
{
mmioClose(hmmio, 0);
pBuffer->Release();
return FALSE;
}
// Close file
mmioClose(hmmio, 0);
return TRUE;
}
void CGameSound::Release()
{
int i;
for (i = 0; i < SOUND_COUNT; i++)
{
if (NULL != m_pdsBuffer[i])
{
SAFE_RELEASE(m_pdsBuffer[i]);
}
}
if (NULL != m_pSound)
{
SAFE_RELEASE(m_pSound);
}
}
// Sound controls //////////////////////////////////////////////
BOOL CGameSound::Play(Sound_Type inType)
{
int nIndex = (int)inType;
if (FAILED(m_pdsBuffer[nIndex]->Play(0, 0, 0)))
{
return FALSE;
}
return TRUE;
}
void CGameSound::Stop(Sound_Type inType)
{
int nIndex = (int)inType;
m_pdsBuffer[nIndex]->Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -