XAudio2 のコールバック

XAudio2 では、クライアントから提供された関数を呼び出して、その関数にオーディオ処理スレッドで行われている一部の非同期イベントを通知することができます。これらのコールバックは、グローバルに実行するか、指定したソース ボイスのみに対して実行できます。コールバックを受け取るには、クライアントは、XAudio2 の初期化時 (グローバルなコールバック) またはソース ボイスの作成時 (ボイスごとのコールバック)に、インターフェイスへのポインター (または C 言語の場合は、関数ポインターの配列) を指定する必要があります。詳細については、「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 を返します。

前述したように、クライアントが指定した実装にとって、できるだけ早く (理想的にはミリ秒以内に) これらのコールバックを返すことは重要なことです。コールバックはオーディオ処理スレッドで実行され、すべての処理はコールバックが返されるまで中断されます。したがって、コールバックの遅延はオーディオの問題を引き起こしやすくなります。

関連トピック