我玩的DirectSound,并试图用下面的代码玩简单随机WAV数据:DirectSound的:简单的PCM播放
int _tmain(int argc, _TCHAR* argv[])
{
LPDIRECTSOUND8 dsound;
WAVEFORMATEX format;
const int numchunks = 8;
LPDIRECTSOUNDBUFFER dsbuf;
DSBUFFERDESC buf_format;
const int chunksize = 1024;
HRESULT res;
uint8_t *data1,*data2;
uint32_t size1,size2;
memset(&format,0,sizeof(WAVEFORMATEX));
format.wFormatTag = WAVE_FORMAT_PCM;
format.nChannels = 1;
format.wBitsPerSample = 16;
format.nSamplesPerSec = 44100;
format.nBlockAlign = format.nChannels * format.wBitsPerSample/8;
format.nAvgBytesPerSec = format.nBlockAlign * format.nSamplesPerSec ;
format.cbSize = 0;
assert(DirectSoundCreate8(NULL,&dsound,NULL) == DS_OK);
assert(dsound->SetCooperativeLevel(GetDesktopWindow(),DSSCL_PRIORITY) == DS_OK);
memset(&buf_format,0,sizeof(DSBUFFERDESC));
buf_format.dwSize = sizeof(buf_format);
buf_format.dwFlags = DSBCAPS_GETCURRENTPOSITION2;
buf_format.dwFlags |= DSBCAPS_STICKYFOCUS;
buf_format.dwBufferBytes = numchunks * chunksize;
buf_format.dwReserved = 0;
buf_format.lpwfxFormat = &format;
res = dsound->CreateSoundBuffer(&buf_format,&dsbuf,NULL);
assert(res == DS_OK);
srand(time(NULL));
assert(IDirectSoundBuffer_Lock(dsbuf,0,buf_format.dwBufferBytes,(LPVOID *)&data1,(LPDWORD)&size1,
(LPVOID *)&data2,(LPDWORD)&size2,DSBLOCK_ENTIREBUFFER) == DS_OK);
cout << "got buffer with size "<<size1<<endl;
for (uint32_t i = 0 ; i < size1; i ++)
data1[i] = rand() % 256;
IDirectSoundBuffer_Unlock(dsbuf,
(LPVOID) data1, (DWORD)size1,
(LPVOID) data2, (DWORD)size2);
assert(IDirectSoundBuffer_Play(dsbuf,0,0,DSBPLAY_LOOPING) == DS_OK);
cin.get();
return 0;
}
但输出我听到的只有沉默。也没有输出错误,我的data1实际上是一些随机的东西。我究竟做错了什么?
你的声卡(或驱动程序)可能被瞧不起的垃圾,你应该尝试在Data1产生正弦波 – Djole 2012-04-23 14:38:43
在哪里你的'IDirectSound8 :: SetCooperativeLevel'调用,你有吗? – 2012-04-23 21:32:23
我已经用WinMM和XAudio2成功播放了随机数据。所以我不认为正弦波会显示问题。另外我打电话给SetCooperativeLevel,就像你在我的代码中看到的一样。 – user1266334 2012-04-27 14:08:28