XAudio2 のコールバック

XAudio2 は、クライアントによって提供される関数を呼び出して、オーディオ処理スレッドで発生する特定のイベントを非同期的に通知できます。 これらのコールバックは、グローバルにすることも、特定のソース音声に固有にすることもできます。 グローバル エンジン コールバックを受け取るために、クライアントは XAudio2 を初期化するときに IXAudio2EngineCallback インターフェイスを実装するクラスのインスタンスを提供する必要があります。 ソース音声コールバックを受信するには、クライアントがソース音声を作成するときに IXAudio2VoiceCallback インターフェイスを実装するクラスのインスタンスを提供する必要があります。 詳細については、「 IXAudio2EngineCallback 」および「 IXAudio2VoiceCallback」を参照してください。

オーディオで中断が発生しないように、コールバックを慎重に実装する必要があります。 コールバックが実行されている場合、XAudio2 はオーディオを生成できません。 数ミリ秒を超える遅延は、オーディオの問題を引き起こす可能性があります。 この性質の遅延により、デバッガーの出力も生成されます。 これは、潜在的なパフォーマンスの問題を示しています。 少なくとも、コールバック関数は次の操作を行う必要はありません。

  • ハード ディスクまたはその他の永続的な記憶域にアクセスする
  • コストの高い API 呼び出しまたはブロックしている API 呼び出しを行う
  • クライアント コードの他の部分と同期する
  • CPU 使用率の大幅な要求

クライアント設計で、前述のようなアクションをトリガーするためのコールバックが必要な場合、コールバックは別のクライアント スレッドに通知して作業を行う必要があります。 これを行うには、単純な SetEvent メカニズム、または別のスレッドによって使用される非ブロッキング コマンド キューなどの高度なメカニズムを使用します。

IXAudio2EngineCallback

IXAudio2EngineCallback クラスには、XAudio2 エンジンで特定のイベントが発生したときにクライアントに通知するメソッドが含まれています。 これらのメソッドは、XAudio2 クライアントによって実装する必要があります。 XAudio2 は、 IXAudio2::RegisterForCallbacks メソッドを使用してクライアントによって提供されるインターフェイス ポインターを使用して、これらのメソッドを呼び出します。 これらのメソッドはすべて、HRESULT ではなく void を返します。

IXAudio2VoiceCallback

IXAudio2VoiceCallback クラスには、特定の XAudio2 ソース音声で特定のイベントが発生したときにクライアントに通知するメソッドが含まれています。 XAudio2 は、 IXAudio2::CreateSourceVoice のクライアントによって提供されるインターフェイス ポインターを使用して、これらのメソッドを呼び出します。 IXAudio2EngineCallback と同様に、これらのメソッドは XAudio2 クライアントによって実装され、HRESULT ではなく void を返す必要があります。

前述のように、クライアントが提供するこれらのコールバックの実装は、可能な限り迅速に (できれば 1 ミリ秒以内に) 返す必要があります。 コールバックはオーディオ処理スレッドで実行され、コールバックが返されるまですべての処理が中断されます。 コールバックの遅延により、オーディオの問題が簡単に発生する可能性があります。

コールバック

XAudio2 プログラミング ガイド

方法: ソース ボイスのコールバックの使用

方法: エンジン コールバックの使用

方法: ディスクからのサウンドのストリーム