2010-11-21 32 views
2

我正在使用Windows多媒體API記錄和處理波形音頻(waveInOpen和朋友)。我想以循環方式使用少量的緩衝區。你可以在Windows波形音頻輸入中重複使用緩衝區嗎?

我知道在向設備添加緩衝區之前,您應該先使用waveInPrepareHeader,並且在波形設備「將緩衝區返回給應用程序」之前以及在您釋放它之前,您應該調用waveInUnprepareHeader

我的問題是,我是否必須做好準備並重新準備才能重新使用緩衝區?或者我可以只將以前使用的緩衝區添加回設備?

另外,它是什麼線程我這樣做?我正在使用回調函數,它似乎在屬於音頻系統的工作線程上調用。在回調期間,我可以在該線程上撥打waveInUnprepareHeaderwaveInPrepareHeaderwaveInAddBuffer嗎?

回答

2

是的,我的經驗一直是你需要每次都打電話給準備和毫無準備。從內存中,如果您嘗試重複使用相同的內容,則會返回錯誤。

而且您通常在任何處理回調的線程上調用prepare和unprepare。

+0

謝謝。它看起來像在waveInReset期間嘗試在回調期間調用waveInUnprepare是一個問題 - 它會導致死鎖。 – 2010-11-21 22:00:01

+0

是的,waveInReset(和waveOutReset)中的死鎖很痛苦,並且取決於您擁有的聲卡驅動程序。 – 2010-11-21 23:02:46

0

當您創建緩衝區時,請致電waveInPrepareHeader。然後,您可以簡單地設置準備好的標誌,然後在從設備返回的緩衝區上調用waveInAddBuffer

pHdr->dwFlags = WHDR_PREPARED; 

您可以在回調線程(或消息處理程序)中執行此操作。

+0

在我的測試中,即使設備已經完成緩衝區,dwFlags字段也有WHDR_PREPARED,所以我不確定該字段具體含義。我想這可能會因聲音驅動程序而異。 – 2010-11-24 20:16:39

+0

它也可能在不同版本的Windows AFAIK之間有所不同。無論如何,我從來沒有調用waveInAddBuffer而沒有調用waveInUnprepareHeader和waveInPrepareHeader的問題。 – Han 2010-11-26 19:57:32

相關問題