XAudio2 编写 XMA2 应该是最简单的方式,但也可以直接使用音频控制处理器 (Audio Control Processor, ACP) 命令为硬件编写 XMA2 代码。
xWMA 和 XMA2 都源自为 Windows Media Audio (WMA) 开发的编解码器,且都专为 XBOX 游戏开发。XMA2 使用的可用编解码器与参数子集比 xWMA 使用的更小。虽然二者都为 XBOX 开发,但并不可互换:它们的文件头不同,格式与 PC 版 Windows 不兼容。XMA2 与 xWMA 所用的编解码器也略有差异,因此各自会有各自所用压缩系统带来的伪影。
XMA2 编码
使用作为 Microsoft Game Development Kit (GDK) 一部分提供的 XMA2 编码器工具 将音频数据编码为 XMA2。XMA2 文件是带有 XMA2WAVEFORMATEX 格式头以及Seek 位置表中额外 seek 块的 .wav 文件。
XMA2 格式与 XBOX 360 兼容,但对 XBOX One,Seek 表需要按 ULONG 进行字节交换。如果输入本身就是 .wav 文件,输出可以直接使用无需修改。
要对 Seek 表进行字节交换,请使用以下代码。
SHAPE_XMA_INPUT_BUFFER_ALIGNMENT 标志用于确保块正确对齐。
XMA2 AXI 总线错误
XMA 硬件解码器(以及 XBOX 360)中长期存在一个 bug:如果游戏直接使用AcpHal,则必须自行采取变通措施。XAudio2 已经内置了变通方案。不过,在 XMA2 编码器工具更新之前,请注意以下信息。
当解码 XMA 位流且只使用单个 XMA 输入缓冲区时,如果 XMA 缓冲区末尾的 64 字节中含有已编码数据,就有可能触发 AXI 总线错误。XMA 位流很少在末尾 64 字节内包含已编码数据,但仍必须处理这种情况以防止 AXI 总线错误。在 XMA2 编码器工具更新以确保不再有任何已编码文件在位流末尾 64 字节内包含已编码数据之前,你可以通过以下方法之一避免此问题。
- 始终使用两个 XMA 输入缓冲区,且永远不要将任一输入缓冲区的指针设置为无效值。
- 将未使用的输入缓冲区的指针设为与另一个输入缓冲区的指针相同,即使你不启用另一个缓冲区。示例如下。
- 在生成内容时使用一个离线工具扫描你的 XMA 文件。如果已编码 XMA 位流末尾的 64 字节中有任何一个字节不是 0xFF,则重新编码该文件。
参考 API 文档
- APU (API 内容)
- XMA2Defs (API 内容)
- Structures
