急求c++的directsound使用
要做一个俄罗斯方块加背景音乐,想用directsound实现多种音乐混合使用,环境是dos版的,不是用mfc的,请求各位大大指点一下如何使用,最好是原创精简的,网上找的都是不能用。
[解决办法]
参见这个帖子的回复
http://wenwen.soso.com/z/q144736222.htm
[解决办法]
directsound只能播放wav的音乐文件。早先最先使用在windows平台的游戏中。
比如下面代码段为DirectSound的代码段:
- C/C++ code
//----------------//创建主声音缓冲区bool CSound::CreatePrimarySoundBuffer(){ if( bExist || !bEnable ) return true; DSBUFFERDESC dsbdesc; WAVEFORMATEX pcmwf; // 设置wave格式结构 memset(&pcmwf, 0, sizeof(WAVEFORMATEX)); pcmwf.wFormatTag = WAVE_FORMAT_PCM; pcmwf.nChannels = 1; pcmwf.nSamplesPerSec = 8000; pcmwf.nBlockAlign = 4; pcmwf.nAvgBytesPerSec = pcmwf.nSamplesPerSec * pcmwf.nBlockAlign; pcmwf.wBitsPerSample = 8; pcmwf.cbSize = 0; // 设置 DSBUFFERDESC 结构 memset(&dsbdesc, 0, sizeof(DSBUFFERDESC)); // Zero it out. dsbdesc.dwSize = sizeof(DSBUFFERDESC); dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER; // 主缓冲区必须是0 dsbdesc.dwBufferBytes = 0; dsbdesc.lpwfxFormat = NULL; // 主缓冲区必须是NULL if( (lpDSound->CreateSoundBuffer(&dsbdesc, &lpPrimarySoundBuffer, NULL)) == DS_OK) { if( (lpPrimarySoundBuffer->SetFormat(&pcmwf)) == DS_OK ) return true; } return false;}//-------------//释放声音设备void CSound::ReleaseDirectSound(void){ if( !bExist ) return; bExist=false; if( lpDSound != NULL ) { _RELEASE( lpPrimarySoundBuffer ); _RELEASE( lpDSound ); }}//---------------------//音效开关void CSound::EnableSound(bool sw){ CSound::bEnable=sw;}//---------------------//创建一个WAV声音缓冲区bool CSound::LoadSoundFX(HWND hwnd,char *filename){ if( !bEnable ) return true; DSBUFFERDESC dsbd; //结构 LPWAVEFORMATEX wav; //声音格式 DWORD len; //文件长度 BYTE *buf; //临时缓冲区 LPVOID ptr1; //指针1 LPVOID ptr2; //指针2 DWORD size1; DWORD size2; DWORD BufferSize; //DirectSoundBuffer 大小 FILE *f; long WavLong; if( (f=fopen(filename,"rb"))==NULL ) { MessageBox(hwnd,"error open file",filename,MB_OK); return FALSE; } fseek(f,0x04,SEEK_SET); fread(&WavLong,sizeof(long),1,f); //读取声音数据长度 len=WavLong+WAV_HDR_SIZE; //文件长度 BufferSize=len-WAV_HDR_SIZE-800; //设置缓冲区大小 buf=(BYTE *)malloc(len); if( buf==NULL ) { MessageBox(hwnd,"error buf",filename,MB_OK); return FALSE; } //读取声音数据到临时缓冲区 fseek(f,0l,SEEK_SET); fread(buf,len,1,f); fclose(f); ptr1=buf+20; wav=(LPWAVEFORMATEX)(ptr1); memset(&dsbd,0,sizeof(dsbd)); dsbd.dwSize=sizeof(dsbd); dsbd.dwFlags=DSBCAPS_STATIC; dsbd.dwBufferBytes=len-WAV_HDR_SIZE; dsbd.lpwfxFormat=wav; _RELEASE( DSSoundFX ); if(lpDSound->CreateSoundBuffer(&dsbd,&DSSoundFX,NULL)!=DS_OK) { MessageBox(hwnd,"error createsoundbuffer","error",MB_OK); return FALSE; } if( (DSSoundFX->Lock(0,BufferSize,&ptr1,&size1,&ptr2,&size2,0))!=DS_OK) { MessageBox(hwnd,"error Lock","error",MB_OK); return FALSE; } memcpy(ptr1,buf+WAV_HDR_SIZE,size1); //拷贝数据到声音缓冲区 if(size2) memcpy(ptr2,buf+size1+WAV_HDR_SIZE,size2);//拷贝数据到声音缓冲区 if( DSSoundFX->Unlock(ptr1,size1,ptr2,size2)!=DS_OK) { MessageBox(hwnd,"error UnLock","error",MB_OK); return FALSE; } _FREE(buf); return true;}//-------------------------//功能:播放声音//参数:loop=-1 循环void CSound::Play(DWORD loop){ if( bEnable==FALSE || !DSSoundFX ) return; DWORD *Status1=NULL; if( (DSSoundFX->GetStatus(Status1))!=DS_OK ) goto _next; if( (*Status1 & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING ) return;_next: DSSoundFX->SetCurrentPosition(0); if( loop==-1 ) loop=DSBPLAY_LOOPING; //循环播放 DSSoundFX->Play(0,0,loop);}//------------------------//停止播放void CSound::Stop(){ if( bEnable==FALSE || DSSoundFX==NULL ) return; DSSoundFX->Stop();}//-------------------------//缓冲区是否正在播放bool CSound::IsPlaying(){ if( bEnable==FALSE || DSSoundFX==NULL ) return true; DWORD pos, wpos; DSBCAPS dsbc; memset(&dsbc,0,sizeof(DSBCAPS)); dsbc.dwSize=sizeof(DSBCAPS); if( (DSSoundFX->GetCaps(&dsbc)) != DS_OK ) { MessageBox(hWnd, "DSSoundFX->GetCaps","error",MB_OK); return true; } pos=dsbc.dwBufferBytes; if( (DSSoundFX->GetCurrentPosition(&wpos,NULL)) != DS_OK ) { MessageBox(hWnd, "DSSoundFX->GetCurrentPosition","error",MB_OK); return true; } if( wpos >= pos/7.16 ) return false; return true;}楼主可以参考圣剑英雄传这款游戏中的DirectSound模块。