读书人

急求c++的directsound使用,该如何处理

发布时间: 2012-03-20 14:01:11 作者: rapoo

急求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模块。 

读书人网 >C++

热点推荐