XAudio2 處理 XMA2 應該是最簡單的方法,但也可以使用音訊控制處理器 (ACP) 命令直接對硬體處理 XMA2。
xWMA 和 XMA2 都源自為 Windows Media Audio (WMA) 開發的轉碼器,而且兩者都是專為 XBOX 遊戲所開發。XMA2 所使用的可用轉碼器與參數子集比 xWMA 所使用的子集小。雖然 xWMA 和 XMA2 都是為 XBOX 開發的,但兩者不能互換:每種檔案格式的標頭都不同,而且這些格式與 PC 版 Windows 不相容。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,請重新編碼該檔案。
