2016-08-02 14 views
2

私は連続してデータをIAudioClientGetBufferSize/GetCurrentPadding/GetBuffer/ReleaseBuffer)に送信しますが、オーディオデバイスが最後に送信したデータの再生をいつ終了するかを知りたいと思います。最後のチャンクをデバイスに送信しただけで、プレイヤーが停止したと仮定したくはありません。バッファされたデータを再生している可能性があります。IAudioClient - 再生終了時に通知を受け取りますか?

私はIAudioClock/IAudioClock2を使用してハードウェアのバッファ位置を確認しようとしましたが、最後のチャンクを送信してから同じ状態を保ちました。

また、私は何をしないのです

... IMMNotificationClientIAudioSessionNotificationインタフェースで関連する何も見えませんか?

ありがとうございます!

答えて

1

IMMNotificationClientとIAudioSessionNotificationは役に立ちません。これは、新しいデバイス/新しいアプリケーションセッションをそれぞれ検出するためのものです。私が知る限り、最後のサンプルがデバイス(排他モード)またはオーディオエンジン(共有モード)で消費されたときに明示的にイベントを送信するWASAPIには何もありません。過去に使用したトリック(DirectSoundにもかかわらず、WASAPIと同等に機能するはずです)は、(GetCurrentPaddingを使用して)WASAPIのオーディオバッファ内の空き領域を継続的にチェックすることです。最後のサンプルを送った後、直ちに現在のパディングを記録します。それはNフレームと言いましょう。次に、Nフレームが処理されるまで(IAudioClock(2)によって報告されるか、またはタイマーを使用してguestimateするまで)、AudioClientにゼロを書き続けてから、ストリームを停止します。排他的イベントドリブンモードストリームで動作するかどうかは、ドライバの品質に関する問題です。ドライバは「実際の」再生位置を報告するか、それをフルバッファサイズのチャンクで処理することを選択することができる。

+0

IAudioClock :: GetPosition /などは、オーディオの再生の有無にかかわらず常に同じ値を返します。 私はIAudioMeterInformation.GetPeakValueを使用して、返された値が== 0であるかどうかを調べることができます。これは私のケースではうまくいくようです(オーディオは少なくとも周囲ノイズのあるマイク録音です)。しかし、解決策 - 確かにオーディオストリームの中に無音の期間を持つことができます。 –

+0

ストリームを停止しない限り、AudioClockは継続的に増加する位置に戻ります。問題を再現するサンプルコードがありますか? –

+0

何も投稿することはできません - データをストリーミングするDelphiアプリケーションを持っています(ストリーミング中)、50msごとにタイマーファイアが発生し、AudioClock :: GetPositionを呼び出します。両方の戻り値がログに記録されます。それらは常に同じままであり、デバイスを再初期化するときにのみ異なります。 –

関連する問題