XAudio2 默认通道映射

XAudio2 客户端通过 IXAudio2Voice::SetOutputMatrix 方法,完全控制从语音通道到每个目标 voicesIt 的通道的映射。 但在某些情况下,XAudio2 通过自动设置默认发送矩阵来简化此任务。 它通过使用通道掩码(如果有)与语音的音频通道相关联来执行此操作。 通道掩码是 X3DAudio.h 和其他地方定义的SPEAKER_xxx位掩码的组合。 XAudio2 要求通道掩码为 0 或设置与通道数相同的位数。

下表显示了 XAudio2 支持的格式的通道掩码要求和默认值。

格式 通道掩码要求 默认掩码 相应的结构成员
PCM 文件可能包含通道掩码 通道掩码为 0 或不存在 波形图XTENSIBLE.dwChannelMask 或无 (波形图X)
ADPCM 文件不包含通道掩码 始终使用默认通道掩码 (ADPCMWAVEFORMAT) 无

 

对于子混合和主语音,对于没有通道掩码或通道掩码为 0 的源语音,XAudio2 根据下表假定默认扬声器位置。

声道 隐式通道位置
1 始终在两个扬声器中以全比例映射到 FrontLeft 和 FrontRight, (单声) 特殊案例
2 FrontLeft、FrontRight (基本立体声配置)
3 FrontLeft、FrontRight、LowFrequency (2.1 配置)
4 FrontLeft、FrontRight、BackLeft、BackRight (四元音)
5 FrontLeft、FrontRight、FrontCenter、SideLeft、SideRight (5.0 配置)
6 FrontLeft、FrontRight、FrontCenter、LowFrequency、SideLeft、SideRight (5.1 配置) (请参阅以下备注)
7 FrontLeft、FrontRight、FrontCenter、LowFrequency、SideLeft、SideRight、BackCenter (6.1 配置)
8 FrontLeft、FrontRight、FrontCenter、LowFrequency、BackLeft、BackRight、SideLeft、SideRight (7.1 配置)
9 个或多个 没有隐式位置 (一对一映射)

 

如果音频图中的给定语音配对没有与其源或目标语音关联的扬声器位置, (一个语音具有八个以上的通道) ,那么在源语音显式使用 IXAudio2Voice::SetOutputMatrix 方法设置发送矩阵之前,两个语音都无法播放。 调用任一语音的 IXAudio2SourceVoice::"开始"菜单 方法将失败,直到执行此操作。

如果源语音和目标语音的扬声器位置数量不同,并且未在源语音上调用 IXAudio2Voice::SetOutputMatrix,则 XAudio2 会将每个源通道发送到最近的目标扬声器 (或扬声器) 可用,与预期扬声器的距离成比例。 存在两种特殊情况,即默认行为不同。

  1. 如果源音频为单声道且定位在SPEAKER_FRONT_CENTER或未定义位置,则始终将其发送到SPEAKER_FRONT_LEFT,并在输出音频中存在时SPEAKER_FRONT_RIGHT。 如果它们不存在,则回退到正常情况。
  2. 如果源和目标均为 6 通道,并且位于标准 5.1 扬声器设置中的任一位置, (Left+Right+Center+Sub+BackL+BackR 或 Left+Right+Center+Sub+SideL+SideR) ,则通道通过一对一映射。 换句话说,SideLeft/Right 和 BackLeft/Right 等效。 这是因为这些设置存在历史混乱。 因此,假定的意图始终是将一个映射到一个。

语音

XAudio2 编程指南

GetChannelMask