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 ミリ秒以内に) 返される必要があります。 コールバックはオーディオ処理スレッドで実行され、コールバックが戻るまですべての処理が中断されます。 コールバックの遅延は、オーディオの問題を簡単に引き起こす可能性があります。
関連トピック
-
方法: ソース音声コールバック を使用する
-
方法: エンジン コールバック を使用する
-
方法: ディスク からサウンドをストリーミングする