|
只有1个类(方法已写好,可直接调用)
1、SoundWAV.cpp
#include ".\soundwav.h"
SoundWAV::SoundWAV(void)
{
volume = -1000;
pan = 0;
}
SoundWAV::~SoundWAV(void)
{
}
void SoundWAV:oadWAV(HWND hWnd, const char* szSoundFileName)
{
result = DirectSoundCreate( NULL, &pDS, NULL );
if(result != DS_OK) MessageBox(hWnd,"建立 DirectSound 对象失败!","提示",MB_OK);
result = pDS->SetCooperativeLevel( hWnd, DSSCL_PRIORITY );
if(result != DS_OK) MessageBox(hWnd,"设置协调层级失败!","提示",MB_OK);
memset( &dsdesc,0, sizeof(dsdesc) );
dsdesc.dwSize = sizeof(dsdesc);
dsdesc.dwFlags = DSBCAPS_PRIMARYBUFFER;
dsdesc.dwBufferBytes = 0;
dsdesc.lpwfxFormat = NULL;
result = pDS->CreateSoundBuffer( &dsdesc, &pPBuf, NULL );
if(result != DS_OK) MessageBox(hWnd,"建立主缓冲区失败!","提示",MB_OK);
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(hWnd,"设置播放格式失败!","提示",MB_OK);
GetCurrentDirectory(MAX_PATH, strSoundPath);
strcat(strSoundPath, "\\music\\");
strcat(strSoundPath, szSoundFileName);
hmmio = mmioOpen(strSoundPath, NULL, MMIO_ALLOCBUF|MMIO_READ );
if(hmmio == NULL) MessageBox(hWnd,"文件不存在!","提示",MB_OK);
ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
if(mmresult != MMSYSERR_NOERROR) MessageBox(hWnd,"文件格式错误!","提示",MB_OK);
ckInfo.ckid = mmioFOURCC('f','m','t',' ');
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
if(mmresult != MMSYSERR_NOERROR) MessageBox(hWnd,"文件格式错误!","提示",MB_OK);
if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1) MessageBox(hWnd,"读取格式失败!","提示",MB_OK);
mmresult = mmioAscend(hmmio,&ckInfo,0);
ckInfo.ckid = mmioFOURCC('d','a','t','a');
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
//搜寻区块
if(mmresult != MMSYSERR_NOERROR) MessageBox(hWnd,"文件格式错误!","提示",MB_OK);
size = ckInfo.cksize;
memset( &dsdesc,0,sizeof(dsdesc));
dsdesc.dwSize = sizeof(dsdesc);
dsdesc.dwFlags = DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS;
dsdesc.dwBufferBytes = size;
dsdesc.lpwfxFormat = &swfmt;
result = pDS->CreateSoundBuffer( &dsdesc, &pSBuf, NULL );
if(result != DS_OK) MessageBox(hWnd,"建立次缓冲区失败!","提示",MB_OK);
result = pSBuf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);
if(result != DS_OK) MessageBox(hWnd,"锁定缓冲区失败!","提示",MB_OK);
mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);
if(mmresult == -1) MessageBox(hWnd,"读取声音文件失败!","提示",MB_OK);
result = pSBuf->Unlock(pAudio,bytesAudio,NULL,NULL);
if(result != DS_OK) MessageBox(hWnd,"解除锁定缓冲区失败!","提示",MB_OK);
mmioClose(hmmio,0);
}
// 播放
void SoundWAV:lay()
{
pSBuf->Stop();
pSBuf->SetCurrentPosition(0);
pSBuf->SetVolume(volume);
pSBuf->SetPan(pan);
pSBuf->Play(0,0,0);
}
// 停止
void SoundWAV::Stop()
{
pSBuf->Stop();
}
// 循环
void SoundWAV::WAVLoop()
{
pSBuf->Stop();
pSBuf->SetCurrentPosition(0);
pSBuf->SetVolume(volume);
pSBuf->SetPan(pan);
pSBuf->Play(0,0,1);
}
// 调大声音
void SoundWAV::WAVMAX()
{
if(volume<=0) volume+=200;
pSBuf->SetVolume(volume);
}
// 调小声音
void SoundWAV::WAVMIX()
{
if(volume>=-2000) volume-=200;
pSBuf->SetVolume(volume);
}
//左声道
void SoundWAV::WAVLEFT()
{
pSBuf->SetPan(-10000);
}
// 右声道
void SoundWAV::WAVRIGHT()
{
pSBuf->SetPan(10000);
}
// 双声道
void SoundWAV::WAVDOUBLE()
{
pSBuf->SetPan(0);
}
2、soundwav.h
#pragma once
#include
#include
#pragma comment (lib,"dsound.lib")
#pragma comment (lib,"strmiids.lib")
class SoundWAV
{
private:
LPDIRECTSOUND pDS;
LPDIRECTSOUNDBUFFER pPBuf;
LPDIRECTSOUNDBUFFER pSBuf;
WAVEFORMATEX pwfmt;
WAVEFORMATEX swfmt;
DSBUFFERDESC dsdesc;
MMCKINFO ckRiff;
MMCKINFO ckInfo;
MMRESULT mmresult;
HMMIO hmmio;
DWORD size;
HRESULT result;
LPVOID pAudio;
DWORD bytesAudio;
CHAR strSoundPath[MAX_PATH];
int volume;
int pan;
public:
SoundWAV(void);
~SoundWAV(void);
void LoadWAV(HWND hWnd, const char* szSoundFileName);
void Play(); // 播放
void Stop(); // 停止
void WAVLoop(); // 循环
void WAVMAX(); // 调大声音
void WAVMIX(); // 调小声音
void WAVLEFT(); // 左声道
void WAVRIGHT(); // 右声道
void WAVDOUBLE();// 双声道
}; |
|