オーディオ データとエンディアン
Xbox 360 では、x86 PC で使われているリトル エンディアン アーキテクチャではなく、ビッグ エンディアン アーキテクチャが使われています。エンディアン順とは、バイトより大きなデータ型 (DWORD や INT など) がメモリーに格納される方法のことです。ビッグ エンディアン システムでは、値の最上位部分がメモリーの最下位記憶域アドレスに格納されます。リトル エンディアン システムでは、値の最上位部分がメモリーの最上位記憶域アドレスに格納されます。
値の表現
ビッグ エンディアンとリトル エンディアンの違いを示すために、0x00ff1234 という値が両方のアーキテクチャでどのように表現されるかを見てみます。
リトル エンディアン アーキテクチャでの 0x00ff1234
hexadecimal: 0x34 0x12 0xff 0x00 binary: 00110100 00010010 11111111 00000000
リトル エンディアン アーキテクチャでは、最下位ビット (0x34) が最下位のメモリー アドレスに格納されます。
ビッグ エンディアン アーキテクチャでの 0x00ff1234
hexadecimal: 0x00 0xff 0x12 0x34 binary: 00000000 11111111 00010010 00110100
ビッグ エンディアン アーキテクチャでは、最下位ビット (0x34) が最上位のメモリー アドレスに格納されます。
2 つのアーキテクチャを比較する場合、1 バイト内のビットの順序は反転していなくて、バイトの順序だけが反転していることに注意してください。
オーディオ データの読み込み
ある条件下では、整数または浮動小数点など特定のタイプのオーディオ データには、XAudio2 で使用する前にデータのエンディアンを修正するためのバイトスワップが必要になります。
次のルールは、オーディオ データに対してバイト スワップを行う方法およびそれが必要なケースを示しています。
Xbox 360 用にオーディオ バンクを作成する場合、XACT で作成されたオーディオ バンクにはバイト スワップは必要ありません。XACT で自動的にバイト スワップが実行されます。
Windows アプリケーションでロードされる Windows で作成されたオーディオ コンテンツには、バイト スワップは必要ありません。
XMA、XMA2、および xWMA オーディオ データは、バイトスワップしてはいけません。
Xbox 360 では、WAVEFORMATEX 形式で wBitsPerSample の値が 24 である PCM オーディオでは、そのオーディオ データをバイトスワップしてはいけません。
Xbox 360 では、WAVEFORMATEX 形式で wBitsPerSample の値が 16 または 32 である PCM オーディオでは、そのオーディオ データをバイトスワップする必要があります。wBitsPerSample が 16 の場合、オーディオ データ内の各バイトのペアを入れ替える必要があります。wBitsPerSample が 32 の場合、4 バイトごとに反転させる必要があります。
XMA、XMA2、xWMA オーディオ データなど、オーディオ データ自体をバイト スワップする必要がない場合でも、オーディオ ファイル内のその他のデータはバイトスワップしなければならないことがあります。オーディオ データをバイトスワップする必要があるかどうかに関係なく、Xbox 360 で使用するために Windows で作成されるオーディオ コンテンツは、オーディオ データ チャンクのヘッダー情報およびサイズ フィールドをバイトスワップする必要があります。
ゲームでは、実行時のバイトスワップのオーバーヘッドを避けるため、必要に応じてオーディオ コンテンツを事前にバイトスワップしておくことをお勧めします。ただし、その場合は Windows 用と Xbox 360 用の 2 種類の異なるバージョンでコンテンツを生成する必要があります。
関連トピック
- 一般的なオーディオ概念
一般的なオーディオ概念の概要です。