オーディオ データとエンディアン

Xbox 360 では、x86 PC で使われているリトル エンディアン アーキテクチャではなく、ビッグ エンディアン アーキテクチャが使われています。エンディアン順とは、バイトより大きなデータ型 (DWORDINT など) がメモリーに格納される方法のことです。ビッグ エンディアン システムでは、値の最上位部分がメモリーの最下位記憶域アドレスに格納されます。リトル エンディアン システムでは、値の最上位部分がメモリーの最上位記憶域アドレスに格納されます。

値の表現

ビッグ エンディアンとリトル エンディアンの違いを示すために、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 バイトごとに反転させる必要があります。

ゲームでは、実行時のバイトスワップのオーバーヘッドを避けるため、必要に応じてオーディオ コンテンツを事前にバイトスワップしておくことをお勧めします。ただし、その場合は Windows 用と Xbox 360 用の 2 種類の異なるバージョンでコンテンツを生成する必要があります。

関連トピック