2012-04-23 84 views
2

我玩的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實際上是一些隨機的東西。我究竟做錯了什麼?

+0

你的聲卡(或驅動程序)可能被瞧不起的垃圾,你應該嘗試在Data1產生正弦波 – Djole 2012-04-23 14:38:43

+0

在哪裏你的'IDirectSound8 :: SetCooperativeLevel'調用,你有嗎? – 2012-04-23 21:32:23

+0

我已經用WinMM和XAudio2成功播放了隨機數據。所以我不認爲正弦波會顯示問題。另外我打電話給SetCooperativeLevel,就像你在我的代碼中看到的一樣。 – user1266334 2012-04-27 14:08:28

回答

2

我有你的問題的somekind的,我定你的代碼通過設置buf_format.dwFlags buf_format.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_GETCURRENTPOSITION2 |DSBCAPS_GLOBALFOCUS | DSBCAPS_LOCSOFTWARE | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_CTRLVOLUME | DSBCAPS_GETCURRENTPOSITION2;

+0

我有完全相同的問題,我發現只需'DSBCAPS_GLOBALFOCUS'就足以從我的代碼中獲得'聲音' – Graeme 2017-07-01 22:01:17