LPDIRECTSOUNDBUFFER LoadSoundFX(HWND hwnd,char *filename)
{
if( soundable==FALSE ) return FALSE;
LPDIRECTSOUNDBUFFER DSSoundFX=NULL; //临时对象

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,0x28,SEEK_SET);
fread(&WavLong,sizeof(long),1,f); //读取声音数据长度
len=WavLong+WAV_HDR_SIZE; //文件长度
BufferSize=len-WAV_HDR_SIZE; //设置缓冲去大小

buf=(BYTE *)GlobalAlloc(GPTR,len);
if( buf==NULL )
{
MessageBox(hwnd,"error buf","error",MB_OK);
return FALSE;
}
fseek(f,0x00,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_CTRLDEFAULT|DSBCAPS_STATIC;
dsbd.dwBufferBytes=len-WAV_HDR_SIZE;
dsbd.lpwfxFormat=wav;
if(lpds->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;
}
GlobalFree(buf);

return DSSoundFX;//返回
}
这是圣剑里的代码。请大大们看下出了什么问题。错误窗口是"zp.exe""zp.exe遇到问题需要关闭。如果带来不便。"

解决方案 »

  1.   

    LPDIRECTSOUNDBUFFER DSSoundFX=NULL; //临时对象 他就是指针
    lpds->CreateSoundBuffer(&dsbd,&DSSoundFX,NULL)!=DS_OK)
    应该改为
    lpds->CreateSoundBuffer(&dsbd,DSSoundFX,NULL)!=DS_OK)
      

  2.   

    但是这样改的话,他说:
    error C2664: 'CreateSoundBuffer' : cannot convert parameter 2 from 'struct IDirectSoundBuffer *' to 'struct IDirectSoundBuffer ** '
      

  3.   

    我刚才在我朋友的电脑上也出了这个问题,除了DSOUND还有别的调用声音的API么?我的SDK里面没有DMUSIC。听说DMUSIC被移除了。
      

  4.   

    dsbd没有初始化,加上memset(&dsbd,0,sizeof(DSBUFFERDESC));
      

  5.   

    memset(&dsbd,0,sizeof(dsbd)); 
    dsbd.dwSize=sizeof(dsbd); 
    dsbd.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_STATIC; 
    dsbd.dwBufferBytes=len-WAV_HDR_SIZE; 
    dsbd.lpwfxFormat=wav; 
    请问这些不算初始化吗?
      

  6.   

    SetCooperativeLevel你设置了吗?
    HRESULT hr = lpds->SetCooperativeLevel( hwnd, DSSCL_PRIORITY );标准级(DSSCL_NORMAL):该级别只能使用22KHZ、立体声(STEREO)、8位的音乐,并且不能直接的写主缓冲,也不能使用压缩过的声音。
    优先级(DSSCL_PRIORITY):可以实现硬件混合(hardware mixing),可以设置主缓冲的声音格式(可以根据需要来使用不同质量的音乐)和压缩过的音乐。
    独占级(DSSCL_EXCLUSIVE):当应用程序在前台工作时,其它程序是不可使用声音的。
    写主缓冲级(DSSCL_WRITEPRIMARY):最高的合作级,程序可以直接的操纵主缓冲,而且程序必须直接的写主缓冲区(最基层的操作)。在这种级别,第二缓冲将不可用。 你现在是直接往主缓冲区里写数据,那么必须把SetCooperativeLevel的第三个参数改为DSSCL_WRITEPRIMARY。使用写主缓冲将使第二缓冲区不可用,并且如果你要实现混音得自己写。
    一般需要创建一个辅助缓冲区,往辅助缓冲区里写数据,而主缓冲区用来创建辅助缓冲区并由DX自行操作,用户不用管。
    像这样:
    HRESULT hr = lpds->SetCooperativeLevel( hwnd, DSSCL_PRIORITY );//设置为DSSCL_PRIORITY 
    IDirectSoundBuffer8* ds_buffer_second;
    if(lpds->CreateSoundBuffer(&dsbd,&DSSoundFX,NULL)!=DS_OK)

         MessageBox(hwnd,"error createsoundbuffer","error",MB_OK); 
         return FALSE; 
    } if(FAILED(DSSoundFX->QueryInterface(IID_IDirectSoundBuffer8, (void**)&ds_buffer_second)))
    {
         ds_buffer_main->Release();
          return FALSE;
    }if( (ds_buffer_second->Lock(0,BufferSize,&ptr1,&size1,&ptr2,&size2,0))!=DS_OK) 

    MessageBox(hwnd,"error Lock","error",MB_OK); 
    return FALSE;