2010-11-21 16 views
2

私はWindowsマルチメディアAPIを使用して、ウェーブオーディオ(waveInOpenと友人)を記録し処理しています。少数のバッファをラウンドロビン方式で使用したいと思います。WindowsのWAVEオーディオ入力でバッファを再利用できますか?

私は、デバイスにバッファを追加する前にwaveInPrepareHeaderを使用し、ウェーブデバイスが "アプリケーションにバッファを返す"後、割り当てを解除する前にwaveInUnprepareHeaderと呼ぶことになっていることを知っています。

私の質問は、バッファを再利用するために準備をして再準備する必要がありますか?または、以前に使用したバッファをデバイスに戻すだけでもかまいませんか?

また、私はこれをどのスレッドで行うのですか?私はオーディオシステムに属しているワーカースレッドで呼び出されるようなコールバック関数を使用しています。コールバック中にwaveInUnprepareHeaderwaveInPrepareHeader、およびwaveInAddBufferにそのスレッドを呼び出すことはできますか?

答えて

2

はい、私の経験では、毎回準備と準備をする必要があります。メモリから、同じものを再利用しようとするとエラーが返されます。

通常、コールバックを処理しているスレッドであれば、準備と準備解除を呼び出します。

+0

ありがとうございました。コールバック中にwaveInUnprepareを呼び出そうとすると、waveInResetの間に問題が発生するようです。デッドロックが発生します。 –

+0

はい、waveInReset(およびwaveOutReset)のデッドロックは苦痛で、使用しているサウンドカードドライバによって異なります。 –

0

バッファを作成するときは、waveInPrepareHeaderを呼び出します。次に、デバイスから返されたバッファーにwaveInAddBufferを呼び出す前に、フラグに設定するだけです。

pHdr->dwFlags = WHDR_PREPARED; 

これは、コールバックスレッド(またはメッセージハンドラ)で実行できます。

+0

私のテストでは、dwFlagsフィールドは、デバイスがバッファで終了した後でもWHDR_PREPAREDを持っています。したがって、そのフィールドの意味を正確には分かりません。私はそれがサウンドドライバによって異なるかもしれないと思います。 –

+0

これは、Windows AFAIKのバージョンによっても異なる場合があります。とにかく、waveInUnprepareHeaderとwaveInPrepareHeaderを呼び出すことなく、waveInAddBufferを呼び出す際に問題が発生したことはありません。 – Han

関連する問題