XAudio2 を通じて XMA2 をコーディングするのが最も簡単なアプローチですが、Audio Control Processor (ACP) コマンドを使用して XMA2 をハードウェアに直接コーディングすることもできます。
xWMA と XMA2 は、どちらも Windows Media Audio (WMA) 用に開発されたコーデックに由来し、両方とも XBOX ゲーム向けに専用に開発されています。XMA2 で使用される利用可能なコーデックとパラメーターのサブセットは、xWMA で使用されるサブセットよりも小さいです。xWMA と XMA2 の両方が XBOX 用に開発されましたが、これらは相互に交換可能ではありません。各ファイル フォーマットのヘッダーは異なり、フォーマットは Windows の PC バージョンとは互換性がありません。XMA2 および xWMA で使用されるコーデックも若干異なるため、それぞれが使用される圧縮システムからの独自のアーティファクトを持ちます。
XMA2 エンコード
Microsoft Game Development Kit (GDK) の一部として提供される XMA2 エンコーダー ツールを使用して、オーディオ データを XMA2 にエンコードします。XMA2 ファイルは、XMA2WAVEFORMATEX フォーマット ヘッダーと、Seek 位置テーブル内の追加の seek チャンクを持つ .wav ファイルです。
XMA2 フォーマットは XBOX 360 と互換性があり、Seek テーブルは XBOX One 用に ULONG バイト スワップする必要があります。入力が .wav ファイルの場合、出力は変更なしで使用できます。
Seek テーブルをバイト スワップするには、次のコード行を使用します。
SHAPE_XMA_INPUT_BUFFER_ALIGNMENT フラグを使用している点に注目してください。
XMA2 AXI バス エラー
XMA ハードウェア デコーダー (および XBOX 360) に長年存在するバグにより、タイトルはAcpHal を直接使用する場合に回避策を提供する必要があります。XAudio2 は既に回避策を提供しています。ただし、XMA2 エンコーダー ツールが更新されるまでは、次の情報に注意してください。
XMA ビット ストリームをデコードし、単一の XMA 入力バッファーのみを使用する場合、XMA バッファーの最後の 64 バイトにエンコードされたデータが含まれると、AXI バス エラーがトリガーされる可能性があります。XMA ビット ストリームには、最後の 64 バイト以内にエンコードされたデータが含まれることはめったにありません。それでも、AXI バス エラーを防ぐためにこれを処理する必要があります。XMA2 エンコーダー ツールが更新され、ビット ストリームの最後の 64 バイトにエンコードされたデータが含まれるファイルが生成されないようにされるまで、次の方法のいずれかを使用してこの問題を回避できます。
- 常に両方の XMA 入力バッファーを使用し、どちらの入力バッファーのポインターも無効な値に設定しないでください。
- 他方のバッファーを有効にしなくても、未使用の入力バッファーのポインターを他方の入力バッファーのポインターと等しく設定してください。例を以下に示します。
- コンテンツを生成している間、オフライン ツールを使用して XMA ファイルをスキャンしてください。エンコードされた XMA ビット ストリームの最後の 64 バイトのいずれかが 0xFF 以外の値の場合、ファイルを再エンコードしてください。
