> ## 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 概觀

> XMA2 硬體音訊解壓縮在 XBOX One 上的運作方式,以及它與 xWMA 軟體解碼在 XAudio2 遊戲音訊內容上的比較。

在 XBOX One 上,XMA2 音訊解壓縮是以硬體實作。不過,xWMA 並非如此,它需要軟體解碼。XMA2 和 xWMA 都使用相同的壓縮演算法,但 xWMA 提供更廣泛的編碼格式。為了效能與壓縮的優點,請編碼為 XMA2,但請注意,某些高傳真音樂透過 xWMA 轉譯可能聽起來更好,這需要進行聆聽測試。透過 `XAudio2` 處理 XMA2 應該是最簡單的方法,但也可以使用音訊控制處理器 (ACP) 命令直接對硬體處理 XMA2。

<Note>xWMA 和 XMA2 都源自為 Windows Media Audio (WMA) 開發的轉碼器,而且兩者都是專為 XBOX 遊戲所開發。XMA2 所使用的可用轉碼器與參數子集比 xWMA 所使用的子集小。雖然 xWMA 和 XMA2 都是為 XBOX 開發的,但兩者不能互換:每種檔案格式的標頭都不同,而且這些格式與 PC 版 Windows 不相容。XMA2 和 xWMA 使用的轉碼器也略有不同,因此各自會因所使用的壓縮系統而產生自己的失真。</Note>

本主題涵蓋下列內容:

* [XMA2 編碼](#ID4E3)
* [XMA2 AXI 匯流排錯誤](#ID4ENC)

<a id="ID4E3" />

## XMA2 編碼

使用 Microsoft Game Development Kit (GDK) 隨附的 [XMA2 編碼器工具](/zh-TW/build/console-features/audio/tools/xma2encodertool),將音訊資料編碼為 XMA2。XMA2 檔案是具有 [XMA2WAVEFORMATEX](/zh-TW/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 上,所有搭配流程圖使用的直接記憶體存取 (DMA) 輸入和輸出緩衝區,以及所有提交至來源緩衝區的 XMA 內容,都必須使用 [ApuAlloc](/zh-TW/reference/audio/apu/functions/apualloc) 方法配置,並使用 [ApuFree](/zh-TW/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](/zh-TW/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 內容)](/zh-TW/reference/audio/apu/apu_members)
  * 函式
    * [ApuAlloc](/zh-TW/reference/audio/apu/functions/apualloc)
    * [ApuFree](/zh-TW/reference/audio/apu/functions/apufree)
* [XMA2Defs (API 內容)](/zh-TW/reference/audio/xma2defs/xma2defs_members)
  * 結構
    * [XMA2WAVEFORMATEX](/zh-TW/reference/audio/xma2defs/structs/xma2waveformatex)

## 另請參閱

[XMA2 編碼器工具](/zh-TW/build/console-features/audio/tools/xma2encodertool)


## Related topics

- [Overview of XMA2](/build/console-features/audio/overviews/xma2-overview.md)
- [XMA2 概述](/zh-CN/build/console-features/audio/overviews/xma2-overview.md)
- [XMA2 개요](/ko/build/console-features/audio/overviews/xma2-overview.md)
- [XMA2 encoder tool](/build/console-features/audio/tools/xma2encodertool.md)
- [XMA2 の概要](/ja-jp/build/console-features/audio/overviews/xma2-overview.md)
