将流格式映射到扬声器配置
当系统要求播放与音频设备扬声器配置不匹配的流格式时,音频驱动程序有多个选项:
拒绝播放流。
通过执行单个声道到扬声器的一对一映射来播放流。 如果将声道映射到每个扬声器后保留任何声道,则放弃剩余声道。 相反,如果在将所有声道都分配给扬声器后,保留任何扬声器来,则通过剩余的扬声器静音播放。
通过混合原始流中的声道来播放流,以精确生成扬声器配置所需的声道数。 如果原始流中的声道数多于扬声器,则此方法可避免放弃多余声道导致的内容丢失。 混合和格式转换可以在软件或硬件中执行。
对于第三个选项,驱动程序应避免直接执行软件混合。 相反,硬件供应商应在到达音频设备之前安装全局效果 (GFX) 软件模块来处理流。 在 Windows Vista 中,全局效果作为 GFX 音频处理对象 (APO) 来实现。 在 Windows Server 2003 和 Windows XP 中,全局效果作为 GFX 筛选器实现。
在 7.1 扬声器配置中播放 5.1 声道流
下图显示了为 5.1 环绕声扬声器配置(左)录制但通过 7.1 家庭影院扬声器配置(右)播放的流。
在上图中,录制的 5.1 格式不包含 7.1 扬声器配置中 BL 和 BR 扬声器位置的声道信息。 因此,这两个扬声器是无声的。 (另一种较为困难的替代方案是,音频设备通过混合录制中原始六个声道的内容,为 BL 和 BR 扬声器合成两个额外的声道。)
根据声道掩码位的定义,用于录制上图左侧显示的 5.1 流的声道掩码应为 0x60F,该流将六个声道分配给以下扬声器位置:FL、FR、FC、LFE、SL 和 SR。 (这是前面讨论的侧扬声器 5.1 配置。)事实上,由于之前提到的原因,5.1 流的声道掩码为 0x3F,而不是 0x60F,现在来详细解释。
在早期版本的 Windows(Windows Server 2003、Windows XP with SP1、Windows 2000 和 Windows Me/98)中,声道掩码 0x3F 的解释是,它将 5.1 格式的六个声道分配给以下扬声器位置:FL、FR、FC、LFE、BL 和 BR。 (这是后扬声器 5.1 配置。)但是,Windows Vista、Windows Server 2003 with SP1 和 Windows XP with SP2 的解释不同:按照惯例,声道掩码为 0x3F 的 5.1 格式解释为表示侧扬声器 5.1 配置,而不是后扬声器 5.1 配置。
以这种方式解释声道掩码时,就无需引入第二个 5.1 声道格式描述符来区分侧扬声器 5.1 配置与后扬声器 5.1 配置。 这两种配置非常类似,因此普通用户可能会难以区分它们。 尽管只有单个 5.1 声道格式描述符可避免用户混淆,但它确实需要硬件供应商记住解释 0x3F 声道掩码,这意味着将声道 5 和 6 分配给 SL 和 SR 扬声器位置,而不是 BL 和 BR 位置。 反过来,为了记住 5.1 流的声道掩码的这种特殊情况解释,供应商可让用户轻松区分两个非常相似的 5.1 声道格式描述符。
认为至少有一些用户可能希望区分侧扬声器 5.1 配置和后扬声器 5.1 配置的供应商可以选择为此目的提供用户界面 (UI) 程序。 通过 UI,用户可以选择 5.1 声道流中的声道 4 和 5 是否应驱动后扬声器,而不是 7.1 家庭影院扬声器配置中的侧扬声器。
在 5.1 扬声器配置中播放 7.1 声道流
下图显示了为 7.1 家庭影院扬声器配置(左)录制但通过 5.1 环绕声扬声器配置(右)播放的流。 7.1 声道流的声道掩码为 0x63F。
在此示例中,声道 6 和 7(包含 7.1 配置中侧扬声器位置的数据)通过 5.1 配置中的侧扬声器位置播放。 当音频设备在 5.1 配置中播放流时,音频设备只需放弃声道 4 和 5,其中包含 7.1 配置中的后扬声器位置的数据。 如前所述,另一种替代方案(上图中未显示)是,设备尝试通过将内容与声道 6 和 7 混合,保留声道 4 和 5 中的内容,然后再通过 5.1 配置中的侧扬声器来播放这些内容。
系统混音器行为
在 Windows Server 2003、Windows XP、Windows 2000 和 Windows Me/98 中,音频设备播放的多声道音频流通常由软件系统混音器 Kmixer.sys 生成。 在流开始播放之前,系统混音器和音频驱动程序必须协商混音器和驱动程序都可以处理的流格式。
当系统要求使用与音频设备扬声器配置不匹配的格式播放多声道流时,音频驱动程序可能会拒绝请求,在这种情况下,协商仍在继续。
系统混音器可以将内容从 5.1 声道输入流转换为 7.1 声道输出流(转为音频设备),反之亦然,但首选是避免此类转换来保留输入流的质量。 因此,系统混音器通过要求驱动程序接受格式与系统混音器质量最高的输入流相同的流来开始协商。 通常,这意味着,如果系统混音器具有采用 5.1 或 7.1 声道格式的输入流,它将要求驱动程序接受采用相同格式的流。 如果驱动程序拒绝此格式,则系统混音器会继续协商,询问驱动程序是否可以处理其他流格式。
例如,如果采用 5.1 扬声器配置的音频设备的驱动程序拒绝系统混音器播放 7.1 声道流的请求,则系统混音器会继续协商,提出将 7.1 声道流转换为 5.1 声道流。 如果驱动程序接受此格式,则系统混音器将为驱动程序执行流转换。
设计音频驱动程序时,驱动程序编写人员必须决定是否处理其自己的格式转换,还是依赖于系统混音器来执行转换。 驱动程序可能需要在以下任一情况下处理转换:
如果驱动程序要求以不同于系统混音器执行的转换的方式执行转换。
如果驱动程序必须播放绕过系统混音器的流。
在第二种情况下,如果正在从 Microsoft DirectSound 硬件加速缓冲区直接播放到音频设备上的硬件混合引脚,则流可以绕过系统混音器。 此外,某些“专业音频”应用程序会将其流直接发送到音频设备,以避免系统混音器的延迟,或防止混合过程更改原始音频流中的数字样本值。
在 Windows Server 2003 with SP1 和 Windows XP with SP2 中,如果系统混音器生成 5.1 声道输出流,则混音器始终会将流的声道掩码设置为 0x3F。 即使系统混音器收到声道掩码为 0x60F 的 5.1 声道输入流,系统混音器的行为也是如此。 使用此行为,音频驱动程序永远不会收到来自混音器的声道掩码为 0x60F 的 5.1 声道流。
如果系统混音器收到声道掩码为 0x63F 的 7.1 声道输入流,并生成 5.1 声道输出流(声道掩码为 0x3F),则混音器会将输入流中的声道 6 和 7 复制到输出流中的声道 4 和 5。 混音器会放弃来自 7.1 声道输入流的声道 4 和 5(对于两个后扬声器)。 此行为可确保包含 7.1 声道流中两个侧扬声器内容的声道通过 5.1 扬声器配置中的侧扬声器播放。