> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XMA2 の概要

> XBOX One 上での XMA2 ハードウェア オーディオ展開の仕組みと、XAudio2 ゲーム オーディオ コンテンツ向けの xWMA ソフトウェア デコードとの比較。

XBOX One では、XMA2 オーディオ展開はハードウェアに実装されています。ただし、xWMA はそうではなく、ソフトウェア デコードが必要です。XMA2 と xWMA は両方とも同じ圧縮アルゴリズムを使用しますが、xWMA はより広いエンコード フォーマット範囲を提供します。パフォーマンスと圧縮の利点のため XMA2 でエンコードしますが、一部の高忠実度の音楽は xWMA を通じてレンダリングした方が良く聞こえるかもしれない点に注意してください。これはリスニング テストが必要です。`XAudio2` を通じて XMA2 をコーディングするのが最も簡単なアプローチですが、Audio Control Processor (ACP) コマンドを使用して XMA2 をハードウェアに直接コーディングすることもできます。

<Note>xWMA と XMA2 は、どちらも Windows Media Audio (WMA) 用に開発されたコーデックに由来し、両方とも XBOX ゲーム向けに専用に開発されています。XMA2 で使用される利用可能なコーデックとパラメーターのサブセットは、xWMA で使用されるサブセットよりも小さいです。xWMA と XMA2 の両方が XBOX 用に開発されましたが、これらは相互に交換可能ではありません。各ファイル フォーマットのヘッダーは異なり、フォーマットは Windows の PC バージョンとは互換性がありません。XMA2 および xWMA で使用されるコーデックも若干異なるため、それぞれが使用される圧縮システムからの独自のアーティファクトを持ちます。</Note>

このトピックでは、次の内容について説明します。

* [XMA2 エンコード](#ID4E3)
* [XMA2 AXI バス エラー](#ID4ENC)

<a id="ID4E3" />

## XMA2 エンコード

Microsoft Game Development Kit (GDK) の一部として提供される [XMA2 エンコーダー ツール](/build/console-features/audio/tools/xma2encodertool)を使用して、オーディオ データを XMA2 にエンコードします。XMA2 ファイルは、[XMA2WAVEFORMATEX](/reference/audio/xma2defs/structs/xma2waveformatex) フォーマット ヘッダーと、`Seek` 位置テーブル内の追加の `seek` チャンクを持つ .wav ファイルです。

XMA2 フォーマットは XBOX 360 と互換性があり、`Seek` テーブルは XBOX One 用に `ULONG` バイト スワップする必要があります。入力が .wav ファイルの場合、出力は変更なしで使用できます。

`Seek` テーブルをバイト スワップするには、次のコード行を使用します。

```cpp theme={null}
      for(UINT32 i = 0;(i < xmaformat->BlockCount);i++)
      {
      rgpXMASeekTable[i] = _byteswap_ulong(rgpXMASeekTable[i]);
      }  
```

まずこのコードをアプリに追加して機能をテストし、次にアプリで前処理が不要になるようにスワップを実行する別のツールを作成することを検討してください。

XBOX One の場合、フローグラフで使用されるすべての Direct Memory Access (DMA) 入出力バッファー、およびソース バッファーに送信されるすべての XMA コンテンツは、[ApuAlloc](/reference/audio/apu/functions/apualloc) メソッドを使用して割り当て、[ApuFree](/reference/audio/apu/functions/apufree) メソッドを使用して解放する必要があります。これは次のコードに示されています。ブロックが正しくアラインされるように、`SHAPE_XMA_INPUT_BUFFER_ALIGNMENT` フラグを使用している点に注目してください。

```cpp theme={null}
      HRESULT ApuVirtualAllocate(void** virtualAddress,UINT32 sizeInBytes)
      {
        DWORD dwsize = sizeInBytes;
        DWORD change = 0;
        if(FixBlockAlign((DWORD*)&sizeInBytes,SHAPE_XMA_INPUT_BUFFER_SIZE_ALIGNMENT,&change)) // Returns TRUE if an alignment was needed; else, returns FALSE.
        {
          return E_INVALIDARG;
        }
        return ApuAlloc(virtualAddress,NULL,sizeInBytes,SHAPE_XMA_INPUT_BUFFER_ALIGNMENT);
      }

      void ApuVirtualFree(void* virtualAddress)
      {
        if(virtualAddress)
        {
          ApuFree(virtualAddress);
        }
      }

      BOOL FixBlockAlign(DWORD* pBYTES,DWORD BLOCKALIGN,DWORD* pChange)
      {
        if(pBYTES && (BLOCKALIGN > 1))
        {
          DWORD bytes = (*pBYTES);
          (*pBYTES) /=  BLOCKALIGN;
          (*pBYTES) *=  BLOCKALIGN;
          if(pChange)
          {
            (*pChange) = bytes&mdash;(*pBYTES);
            if((*pChange) > 0)
            {
              return TRUE;
            }
          }
        }
        return FALSE;
      }  
```

XMA2 エンコードされたファイルで構造体のフィールドを使用する方法の詳細については、[XMA2WAVEFORMATEX](/reference/audio/xma2defs/structs/xma2waveformatex) 構造体を参照してください。

<a id="ID4ENC" />

## XMA2 AXI バス エラー

XMA ハードウェア デコーダー (および XBOX 360) に長年存在するバグにより、タイトルは `AcpHal` を直接使用する場合に回避策を提供する必要があります。`XAudio2` は既に回避策を提供しています。ただし、XMA2 エンコーダー ツールが更新されるまでは、次の情報に注意してください。

XMA ビット ストリームをデコードし、単一の XMA 入力バッファーのみを使用する場合、XMA バッファーの最後の 64 バイトにエンコードされたデータが含まれると、AXI バス エラーがトリガーされる可能性があります。XMA ビット ストリームには、最後の 64 バイト以内にエンコードされたデータが含まれることはめったにありません。それでも、AXI バス エラーを防ぐためにこれを処理する必要があります。XMA2 エンコーダー ツールが更新され、ビット ストリームの最後の 64 バイトにエンコードされたデータが含まれるファイルが生成されないようにされるまで、次の方法のいずれかを使用してこの問題を回避できます。

* 常に両方の XMA 入力バッファーを使用し、どちらの入力バッファーのポインターも無効な値に設定しないでください。

* 他方のバッファーを有効にしなくても、未使用の入力バッファーのポインターを他方の入力バッファーのポインターと等しく設定してください。例を以下に示します。

```cpp theme={null}
      context->ptrRead1 = context->ptrRead0  
```

* コンテンツを生成している間、オフライン ツールを使用して XMA ファイルをスキャンしてください。エンコードされた XMA ビット ストリームの最後の 64 バイトのいずれかが 0xFF 以外の値の場合、ファイルを再エンコードしてください。

これらの方法のいずれかによって、XMA プリフェッチャーが無効なアドレスを読み取ることを防ぎます。

<a id="ID4EFD" />

## リファレンス API ドキュメント

* [APU (API 内容)](/reference/audio/apu/apu_members)
  * 関数
    * [ApuAlloc](/reference/audio/apu/functions/apualloc)
    * [ApuFree](/reference/audio/apu/functions/apufree)
* [XMA2Defs (API 内容)](/reference/audio/xma2defs/xma2defs_members)
  * 構造体
    * [XMA2WAVEFORMATEX](/reference/audio/xma2defs/structs/xma2waveformatex)

## 関連項目

[XMA2 エンコーダー ツール](/build/console-features/audio/tools/xma2encodertool)


## Related topics

- [XMA2WAVEFORMATEX](/ja-jp/reference/audio/xma2defs/structs/xma2waveformatex.md)
- [XMA2PACKET](/ja-jp/reference/audio/xma2defs/structs/xma2packet.md)
- [XMA2STREAMFORMAT](/ja-jp/reference/audio/xma2defs/structs/xma2streamformat.md)
- [XMA2Defs](/ja-jp/reference/audio/xma2defs/xma2defs_members.md)
- [XMA2WAVEFORMAT](/ja-jp/reference/audio/xma2defs/structs/xma2waveformat.md)
