📄 mydsound.cpp
字号:
// MyDSound.cpp: implementation of the MyDSound class.
//
//////////////////////////////////////////////////////////////////////
#include "MyDSound.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
MyDSound::MyDSound()
{
}
MyDSound::~MyDSound()
{
}
bool MyDSound::InitDSound(HWND ghWnd)
{
//===================建立DirectSound对象==================================================================
result = DirectSoundCreate(NULL,&pDS,NULL);
if(result != DS_OK)
{MessageBox(GetFocus(),"建立DirectSound对象失败!","错误!",MB_OK|MB_ICONHAND);return false;}
//======================设置程序协调层级==================================================================
result = pDS->SetCooperativeLevel(ghWnd,DSSCL_PRIORITY);
if(result != DS_OK)
{MessageBox(GetFocus(),"设置程序协调层级失败!","错误!",MB_OK|MB_ICONHAND);return false;}
//=========================建立主缓冲区===================================================================
memset( &desc,0, sizeof(desc) );
desc.dwSize = sizeof(desc);
desc.dwFlags = DSBCAPS_PRIMARYBUFFER;
desc.dwBufferBytes = 0;
desc.lpwfxFormat = NULL;
result = pDS->CreateSoundBuffer( &desc, &pPBuf, NULL );
if(result != DS_OK)
{MessageBox(GetFocus(),"建立主缓冲区失败!","错误!",MB_OK|MB_ICONHAND);}
//=========================设定播放格式====================================================================
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 = pPBuf->SetFormat(&pwfmt); //设置播放格式
if(result != DS_OK)
{MessageBox(GetFocus(),"设定播放格式失败!","错误!",MB_OK|MB_ICONHAND);}
//CreateBuffer("Music\\menu.WAV",1);
//CreateBuffer("Music\\butt_press.wav",0);
return true;
}
LPDIRECTSOUNDBUFFER MyDSound::CreateBuffer(char *filename,int n)
{
// LPDIRECTSOUNDBUFFER buf;
//=====================读取文件内容====================================================================
hmmio = mmioOpen(filename, NULL, MMIO_ALLOCBUF|MMIO_READ );
if(hmmio == NULL){MessageBox(GetFocus(),"文件不存在!","错误!",MB_OK|MB_ICONHAND);} //判断是否为空
ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
//设置文件类型
mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
//查找类型
if(mmresult != MMSYSERR_NOERROR)
{MessageBox(GetFocus(),"文件格式错误!","错误!",MB_OK|MB_ICONHAND);}
//设置区块类型
ckInfo.ckid = mmioFOURCC('f','m','t',' ');
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
//查找区块
if(mmresult != MMSYSERR_NOERROR)
{MessageBox(GetFocus(),"文件格式错误!","错误!",MB_OK|MB_ICONHAND);}
if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1)
{MessageBox(GetFocus(),"读取格式失败!","错误!",MB_OK|MB_ICONHAND);}
mmresult = mmioAscend(hmmio,&ckInfo,0); //跳出子区块
ckInfo.ckid = mmioFOURCC('d','a','t','a'); //设置区块类型
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
//查找区块
if(mmresult != MMSYSERR_NOERROR){MessageBox(GetFocus(),"文件格式错误!","错误!",MB_OK|MB_ICONHAND);}
size = ckInfo.cksize;
//=====================建立次缓冲区====================================================================================
memset( &desc,0,sizeof(desc)); //清空结构体内容
desc.dwSize = sizeof(desc); //设置结构体大小
desc.dwFlags = DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS;
desc.dwBufferBytes = size; //设置缓冲区大小
desc.lpwfxFormat = &swfmt; //设置缓冲区格式
result = pDS->CreateSoundBuffer( &desc, &pSBuf[n], NULL );
if(result != DS_OK)
{MessageBox(GetFocus(),"建立次缓冲区失败!","错误!",MB_OK|MB_ICONHAND);}
//=====================加载声音到次缓冲区=================================================================================================
//锁定缓冲区
result = pSBuf[n]->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);
if(result != DS_OK)
{MessageBox(GetFocus(),"锁定次缓冲区失败!","错误!",MB_OK|MB_ICONHAND);}
mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);
//读取声音文件数据
if(mmresult == -1)
{MessageBox(GetFocus(),"读取音效文件失败!","错误!",MB_OK|MB_ICONHAND);}
//解除锁定缓冲区
result = pSBuf[n]->Unlock(pAudio,bytesAudio,NULL,NULL);
if(result != DS_OK)
{MessageBox(GetFocus(),"解除锁定次缓冲区失败!","错误!",MB_OK|MB_ICONHAND);}
mmioClose(hmmio,0);
return pSBuf[n];
}
void MyDSound::PlayWav(int n,short round)
{
pSBuf[n]->Play(0,0,round);
}
void MyDSound::StopWav(int n)
{
pSBuf[n]->Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -