2012-10-19 32 views
1

我運行下面的代碼功能waveOutUnprepareHeader返回錯誤33 WAVERR_STILLPLAYING

waveOpen result 0 
waveOutPrepareHeader 0 
waveOutWrite 0 
waveOutUnprepareHeader 33 
waveOutClose 33 

根據SOUNDWIN.H文件的代碼33意味着WAVERR_STILLPLAYING。但是沒有聽到任何聲音,並且waveOutWrite立即返回(將88000個樣本寫入聲卡)。建議這個即時返回意味着代碼33,但是爲什麼waveOutWrite會立即重新運行並且什麼都聽不到?
一般來說,爲什麼waveOutWrite成功完成,沒有聲音?
去哪裏看?

回答

1

您應該準備一次緩衝區,然後在播放完成時做好準備。緩衝區可以在兩者之間重複使用,但一般不是一個好主意,隨着播放準備/沒有備用緩衝區。

問題出在這樣的事實,即當您寫入數據時立即排隊等待回放(並記住waveOut API僅爲仿真/兼容層),但是稍後會在延遲迴調中返回緩衝區。請參閱WOM_DONE message。只有當緩衝區不再被API使用時,才允許進行無備用。

+0

並沒有任何方法來確定一個可用的緩衝區來進一步使用?如果不是,如何註冊我自己的回調函數來接收該消息? 還有更多,waveOutOpen/Prepare可以調用一次緩衝區在styart和一個應用程序結束時,waveOutWrite多次在同一個緩衝區上? – OlegG

+1

沒有得到通知 - [''waveOutOpen(...,CALLBACK_FUNCTION,...)'](http://msdn.microsoft.com/en-us/library/windows/desktop/dd743866%28v=vs.85% 29.aspx)或從那裏的不同通知選項。 –

+0

請參閱我的previus評論更新。還有一個問題。 – OlegG

0

您開始播放緩衝區並立即嘗試釋放它... 您應該在清除所有內容(waveOutUnprepareHeader,waveOutClose)之前停止聲音(調用waveOutStop或waveOutReset)。 無論如何,如果你想聽到任何聲音,你應該在稍後用另一個功能停止聲音(或者至少在停止聲音之前插入一個睡眠)。

0

我通過查詢解決了這個問題的聲音回放和延誤:除了回調函數用法

WAVEHDR header = { buffer, sizeof(buffer), 0, 0, 0, 0, 0, 0 }; 
waveOutPrepareHeader(hWaveOut, &header, sizeof(WAVEHDR)); 
waveOutWrite(hWaveOut, &header, sizeof(WAVEHDR)); 
/* 
* wait a while for the block to play then start trying 
* to unprepare the header. this will fail until the block has 
* played. 
*/ 
while (waveOutUnprepareHeader(hWaveOut,&header,sizeof(WAVEHDR)) == WAVERR_STILLPLAYING) 
Sleep(100); 
waveOutClose(hWaveOut); 

Playing Audio in Windows using waveOut Interface