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遇到问题需要关闭。如果带来不便。"
{
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遇到问题需要关闭。如果带来不便。"
lpds->CreateSoundBuffer(&dsbd,&DSSoundFX,NULL)!=DS_OK)
应该改为
lpds->CreateSoundBuffer(&dsbd,DSSoundFX,NULL)!=DS_OK)
error C2664: 'CreateSoundBuffer' : cannot convert parameter 2 from 'struct IDirectSoundBuffer *' to 'struct IDirectSoundBuffer ** '
dsbd.dwSize=sizeof(dsbd);
dsbd.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_STATIC;
dsbd.dwBufferBytes=len-WAV_HDR_SIZE;
dsbd.lpwfxFormat=wav;
请问这些不算初始化吗?
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;
}