[DSound]CreateSoundBuffer()失败问题

 以下代码,在XP上,CreateSoundBuffer失败,返回E_INVALIDARG,即参数设置错误。

 1  pcmwf.wFormatTag     =   WAVE_FORMAT_PCM;  
 2  pcmwf.nChannels     =    2 ;                            
 3  pcmwf.nSamplesPerSec     =    48000 ;  
 4  pcmwf.wBitsPerSample     =    24 ;  
 5  pcmwf.nBlockAlign     =   pcmwf.nChannels  *  pcmwf.wBitsPerSample  /   8 ;                                  
 6  pcmwf.nAvgBytesPerSec   =   pcmwf.nSamplesPerSec   *   pcmwf.nBlockAlign;  
 7  
 8  dsbd.dwSize  =    sizeof (DSBUFFERDESC); 
 9  dsbd.dwFlags  =   DSBCAPS_CTRLPAN  |    DSBCAPS_CTRLVOLUME 
10 |  DSBCAPS_GLOBALFOCUS  |  DSBCAPS_CTRLPOSITIONNOTIFY; 
11  dsbd.dwBufferBytes  =    3 * 11520
12  dsbd.lpwfxFormat  =    & pcmwf;  
13
14  lpds -> CreateSoundBuffer( & dsbd, & tmp_ds_buf,NULL) 
15


在DirectX的SDK中查看WAVE_FORMAT_PCM可以得到关于wBitsPerSample的说明如下:

 If wFormatTag is WAVE_FORMAT_PCM, then wBitsPerSample should be equal to 8 or 16.
If wFormatTag is WAVE_FORMAT_EXTENSIBLE, this value can be any integer multiple of 8.

也就是说,在格式为WAVE_FORMAT_PCM的时候,设置wBitsPerSample为24是不可以的,所以会创建失败。
在wBitsPerSample = 24时,需要使用WAVE_FORMAT_EXTENSIBLE格式。

参考如下文章:

http://www.eggheadcafe.com/forumarchives/win32programmerdirectxaudio/Nov2005/post24249606.asp

你可能感兴趣的:([DSound]CreateSoundBuffer()失败问题)