XAudio2 默认通道映射

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

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

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

 

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

声道 隐式通道位置
1 始终在两个扬声器中全比例映射到 FrontLeft 和 FrontRight, (单声道声音)
2 FrontLeft、FrontRight (基本立体声配置)
3 FrontLeft、FrontRight、LowFrequency (2.1 配置)
4 FrontLeft、FrontRight、BackLeft、BackRight (quadraphonic)
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::Start 方法都将失败。

如果源语音和目标语音具有不同数量的扬声器位置,并且未对源语音调用 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