Win32 API 日本語リファレンス
ホームMedia.Audio.XAudio2 › IXAudio2VoiceCallback

IXAudio2VoiceCallback

COM
自前メソッド開始 vtbl0

公式ドキュメント

IXAudio2VoiceCallback インターフェイスは、特定の IXAudio2SourceVoice で特定のイベントが発生したときにクライアントへ通知するメソッドを提供します。

解説(Remarks)

プラットフォーム要件

Windows 10 (XAudio2.9); Windows 8, Windows Phone 8 (XAudio 2.8); DirectX SDK (XAudio 2.7)

メソッド 7

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 0 void OnVoiceProcessingPassStart(DWORD BytesRequired)

各ボイスの処理パスごとに、XAudio2 がそのボイスのバッファーキューからデータを読み取る直前に呼び出されます。

BytesRequiredDWORDin

枯渇(スターベーション)を回避するために直ちに送信しなければならないバイト数です。これにより、ジャストインタイム方式のストリーミングを実装できます。クライアントは常に必要最小限のデータのみをボイスにキューイングしておき、データが必要になる直前に新しいデータを渡すことができます。このモデルにより、XAudio2 で達成可能な最小のレイテンシを実現できます。xWMA および XMA データの場合、xWMA や XMA データのフレームという概念には意味がないため、BytesRequired は常にゼロになります。

メモ ソースボイスに常に十分なデータが用意されている状況では、グリッチを回避するために直ちに必要となるサンプルが存在しないため、BytesRequired は常にゼロを報告します。

解説(Remarks)

IXAudio2VoiceCallback インターフェイスのメソッドについては、XAudio2 Callbacks のトピックを参照してください。

プラットフォーム要件

Windows 10 (XAudio2.9); Windows 8, Windows Phone 8 (XAudio 2.8); DirectX SDK (XAudio 2.7)
vtbl 1 void OnVoiceProcessingPassEnd()

ボイスの処理パスが終了した直後に呼び出されます。

解説(Remarks)

IXAudio2VoiceCallback インターフェイスのメソッドについては、XAudio2 Callbacks のトピックを参照してください。

プラットフォーム要件

Windows 10 (XAudio2.9); Windows 8, Windows Phone 8 (XAudio 2.8); DirectX SDK (XAudio 2.7)
vtbl 2 void OnStreamEnd()

ボイスが連続するオーディオストリームの再生を終えた直後に呼び出されます。

解説(Remarks)

OnStreamEnd は、XAudio2 が XAUDIO2_END_OF_STREAM フラグを設定した XAUDIO2_BUFFER を処理したときにトリガーされます。詳細については IXAudio2SourceVoice::SubmitSourceBuffer メソッドを参照してください。

OnStreamEnd コールバックは、XAudio2 がボイスに送信された最後のバッファーの消費を終えたことを示します。PCM データの場合、すべてのオーディオが再生されたことが保証されており、ボイスを安全に停止または破棄できます。

OnStreamEnd コールバックは、XAUDIO2_END_OF_STREAM フラグを設定した XAUDIO2_BUFFER が処理されたことを示すにすぎません。このコールバックはあくまで情報提供のためのものであり、それをトリガーしたソースボイスの状態を変更しません。ボイスは IXAudio2SourceVoice::Stop が呼び出されるまで開始状態にとどまり、送信済みのソースバッファーの再生と追加コールバックのトリガーを継続します。

OnStreamEnd は、現在のバッファーの最後のバイトが消費された直後に呼び出されることが保証されています。

IXAudio2VoiceCallback インターフェイスのメソッドについては、XAudio2 Callbacks のトピックを参照してください。

プラットフォーム要件

Windows 10 (XAudio2.9); Windows 8, Windows Phone 8 (XAudio 2.8); DirectX SDK (XAudio 2.7)
vtbl 3 void OnBufferStart(void* pBufferContext)

ボイスが新しいオーディオバッファーの処理を開始しようとするときに呼び出されます。

pBufferContextvoid*inoutバッファーの送信時に XAUDIO2_BUFFER 構造体の pContext メンバーに割り当てられたコンテキストポインターです。

解説(Remarks)

pBufferContext は、XAUDIO2_BUFFER 構造体の pContext メンバーによって元々指定されたコンテキストポインターであり、NULL の場合があります。

OnBufferStart は、現在のバッファーの最初のバイトが消費される直前に呼び出されることが保証されています。このコールバックは、次のようなボイス状態の変更に使用するのが適切です。

上記のすべての操作は、XAudio2 コールバック内で実行された場合は同期的に処理されるため、変更は直ちに反映され、これから開始しようとしているバッファーに影響します。

また、このコールバックを使用してバッファーに直接オーディオデータを書き込むことも安全であり、低レイテンシのストリーミングシナリオで役立ちます。ただし、他のすべての XAudio2 コールバックと同様に、同期的なディスクアクセスやネットワーク読み取りを含め、プロセッサー時間を大量に消費したり実行をブロックしたりする処理を行ってはなりません。

IXAudio2VoiceCallback インターフェイスのメソッドについては、XAudio2 Callbacks のセクションを参照してください。

プラットフォーム要件

Windows 10 (XAudio2.9); Windows 8, Windows Phone 8 (XAudio 2.8); DirectX SDK (XAudio 2.7)
vtbl 4 void OnBufferEnd(void* pBufferContext)

ボイスがバッファーの処理を終えたときに呼び出されます。

pBufferContextvoid*inoutバッファーの送信時に XAUDIO2_BUFFER 構造体の pContext メンバーに割り当てられたコンテキストポインターです。

解説(Remarks)

OnBufferEnd コールバックの後は、pBufferContext に関連付けられたバッファーのオーディオメモリを安全に解放できます。

pBufferContext は、XAUDIO2_BUFFER 構造体の pContext メンバーによって元々指定されたコンテキストポインターであり、NULL の場合があります。

OnBufferEnd は、現在のバッファーの最後のバイトが消費された直後、かつ次のバッファーの最初のバイトが消費される前に呼び出されることが保証されています。このコールバックは、処理が完了したバッファーが参照するオーディオデータを上書きまたは解放したり、ボイスに関連付けられたその他の状態を必要に応じて更新したりするために使用できます。

IXAudio2VoiceCallback インターフェイスのメソッドについては、XAudio2 Callbacks のトピックを参照してください。

プラットフォーム要件

Windows 10 (XAudio2.9); Windows 8, Windows Phone 8 (XAudio 2.8); DirectX SDK (XAudio 2.7)
vtbl 5 void OnLoopEnd(void* pBufferContext)

ボイスがループの終端位置に到達したときに呼び出されます。

pBufferContextvoid*inoutバッファーの送信時に XAUDIO2_BUFFER 構造体の pContext メンバーに割り当てられたコンテキストポインターです。

解説(Remarks)

pBufferContext は、XAUDIO2_BUFFER 構造体の pContext メンバーによって元々指定されたコンテキストポインターであり、NULL の場合があります。

OnLoopEnd はサンプル単位で正確ではありません。つまり、コールバック内の処理は、特定のサンプルが処理されるまさにその瞬間に発生するわけではありません。ループ内の最後のサンプルが処理された直後に呼び出されることのみが保証されています。

IXAudio2VoiceCallback インターフェイスのメソッドについては、XAudio2 Callbacks のセクションを参照してください。

プラットフォーム要件

Windows 10 (XAudio2.9); Windows 8, Windows Phone 8 (XAudio 2.8); DirectX SDK (XAudio 2.7)
vtbl 6 void OnVoiceError(void* pBufferContext, HRESULT Error)

ボイス処理中に致命的なエラーが発生したときに呼び出されます。

pBufferContextvoid*inoutバッファーの送信時に XAUDIO2_BUFFER 構造体の pContext メンバーに割り当てられたコンテキストポインターです。
ErrorHRESULTin発生したエラーの HRESULT コードです。

解説(Remarks)

OnVoiceError は、Xbox 360 上のハードウェア XMA デコーダーのエラーなど、ボイス処理中にエラーが発生した場合に呼び出されます。引数は、エラー発生時に処理されていたバッファーとその HRESULT コードを報告します。ボイスを破棄して再作成しても回復できないエラーの場合は、OnCriticalError エンジンコールバックも呼び出されます。

プラットフォーム要件

Windows 10 (XAudio2.9); Windows 8, Windows Phone 8 (XAudio 2.8); DirectX SDK (XAudio 2.7)
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

#define global IID_IXAudio2VoiceCallback "{}"
#usecom global IXAudio2VoiceCallback IID_IXAudio2VoiceCallback "{}"
#comfunc global IXAudio2VoiceCallback_OnVoiceProcessingPassStart  0 int
#comfunc global IXAudio2VoiceCallback_OnVoiceProcessingPassEnd    1
#comfunc global IXAudio2VoiceCallback_OnStreamEnd                 2
#comfunc global IXAudio2VoiceCallback_OnBufferStart               3 sptr
#comfunc global IXAudio2VoiceCallback_OnBufferEnd                 4 sptr
#comfunc global IXAudio2VoiceCallback_OnLoopEnd                   5 sptr
#comfunc global IXAudio2VoiceCallback_OnVoiceError                6 sptr,int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。