www.gusucode.com > VC++游戏雷霆战机源代码-源码程序 > VC++游戏雷霆战机源代码-源码程序\code\Sound.cpp
//Download by http://www.NewXing.com // 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" ); }