📄 sound.cpp
字号:
// Sound.cpp: implementation of the CSound class.
//
//////////////////////////////////////////////////////////////////////
#include "Sound.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSound::CSound(HWND hWnd)
{
m_hWnd = hWnd;
lpds = NULL;
lpPrimaryBuf = NULL;
for( int i = 0; i < 10; i++ )
{
lpSndObj[i]=NULL;
}
InitDirectSound();
}
CSound::~CSound()
{
if(lpds)
{
ClearBuffer();
lpds->Release();
lpds=NULL;
}
}
BOOL CSound::InitDirectSound()
{
if(DS_OK != DirectSoundCreate(NULL,&lpds,NULL)) // 建立DirectSound对象
return FALSE;
if(DS_OK != lpds->SetCooperativeLevel(m_hWnd,DSSCL_NORMAL)) //设定协调层次
{
return FALSE;
}
// if(!CreatePrimaryBuf())
// return FALSE;
LoadSoundResource();
return TRUE;
}
LPDIRECTSOUNDBUFFER CSound::CreateSndBuffer(char *path)
{
WAVEFORMATEX swfmt; // 声明声音结构
MMCKINFO ckRiff; // RIFF区块的信息
MMCKINFO ckInfo; // 子区块的信息
HMMIO hmmio; // 打开的多媒体文件
DWORD size; // 实际数据大小
hmmio = mmioOpen(path,NULL,MMIO_ALLOCBUF|MMIO_READ);
ckRiff.fccType = mmioFOURCC('W','A','V','E'); // 设定文件类型
mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF); // 查找类型
ckInfo.ckid = mmioFOURCC( 'f', 'm' , 't' , ' '); // 设定区块类型
mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK); // 查找区块
mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt));
mmioAscend(hmmio,&ckInfo,0); // 跳出子区块
ckInfo.ckid = mmioFOURCC('d','a','t','a'); // 设定区块类型
mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK); // 查找区块
size = ckInfo.cksize;
LPDIRECTSOUNDBUFFER pSBuf; // 声明缓冲区指针
DSBUFFERDESC desc; // 声明描述结构
memset(&desc,0,sizeof(desc)); // 清空结构内容
desc.dwSize = sizeof(desc); // 配置结构大小
desc.dwBufferBytes = size; // 设定缓冲区大小
desc.lpwfxFormat = &swfmt; // 设定缓冲区格式
desc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLPAN |
DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS;
lpds->CreateSoundBuffer(&desc,&pSBuf,NULL);
LPVOID pAudio;
DWORD bytesAudio;
pSBuf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);
mmioRead(hmmio,(HPSTR)pAudio,bytesAudio); // 读取音文件数据
pSBuf->Unlock(pAudio,bytesAudio,NULL,NULL);
mmioClose(hmmio,0);
return pSBuf;
}
void CSound::ClearBuffer()
{
SAFE_RELEASE(lpPrimaryBuf)
for( int i = 0; i < 10; i++ )
{
SAFE_RELEASE(lpSndObj[i])
}
}
BOOL CSound::CreatePrimaryBuf()
{
DSBUFFERDESC dsdesc;
HRESULT result;
WAVEFORMATEX pwfmt; //声明声音结构
memset( &dsdesc,0, sizeof(dsdesc) ); //清空结构内容
dsdesc.dwSize = sizeof(dsdesc); //配置描述结构大小
dsdesc.dwFlags = DSBCAPS_PRIMARYBUFFER;
dsdesc.dwBufferBytes = 0;
dsdesc.lpwfxFormat = NULL;
result = lpds->CreateSoundBuffer( &dsdesc, &lpPrimaryBuf, NULL );
if(result != DS_OK)
return FALSE;
memset( &pwfmt,0, sizeof(pwfmt) );
pwfmt.wFormatTag = WAVE_FORMAT_PCM;
pwfmt.nChannels = 2; //播放声道
pwfmt.nSamplesPerSec = 44100; //播放频率
pwfmt.wBitsPerSample = 16; //位
pwfmt.nBlockAlign = pwfmt.wBitsPerSample / 8 * pwfmt.nChannels;
pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign;
result = lpPrimaryBuf->SetFormat(&pwfmt); //设定播放格式
if(result != DS_OK)
return FALSE;
return TRUE;
}
void CSound::PlaySound(int seq,int loop)
{
lpSndObj[seq]->SetCurrentPosition(0);
lpSndObj[seq]->Play(0,0,loop);
}
void CSound::LoadSoundResource()
{
lpSndObj[0] = CreateSndBuffer( "sound//eExplode.wav" );
lpSndObj[1] = CreateSndBuffer( "sound//pExplode.wav" );
lpSndObj[2] = CreateSndBuffer( "sound//bossexp.wav" );
lpSndObj[3] = CreateSndBuffer( "sound//Bomb.wav" );
lpSndObj[4] = CreateSndBuffer( "sound//bonus.wav" );
lpSndObj[5] = CreateSndBuffer( "sound//hit.wav" );
lpSndObj[6] = CreateSndBuffer( "sound//fire.wav" );
lpSndObj[7] = CreateSndBuffer( "sound//addlife.wav" );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -