DSSPEAKER_DIRECTOUT扬声器配置

注意 此信息适用于 Windows XP 和早期作系统。 从 Windows Vista 开始,IDirectSound::GetSpeakerConfigIDirectSound::SetSpeakerConfig 已弃用。

应用程序程序可以通过调用 IDirectSound::SetSpeakerConfig 方法,将扬声器配置参数设置为 DSSPEAKER_DIRECTOUT(请参阅 Microsoft Windows SDK 文档),将 DirectSound 扬声器配置更改为直接退出模式。 这指定无扬声器配置,其中应用程序播放流中的通道将直接输出到音频适配器,而无需解释为扬声器位置。 但是,输入流仍可以通过采样率转换、衰减、筛选和其他类型的处理来修改,这些处理不需要假设将扬声器分配到通道。

生效后,DSSPEAKER_DIRECTOUT扬声器配置设置是全局性的,影响整个音频设备。 随后运行的所有音频应用程序都受新设置的约束,直到 DirectSound 再次更改该设置。

在直接输出模式下,音频设备将第一个通道呈现到设备上的第一个输出连接器,第二个通道呈现到设备上的第二个输出,依此显示。 这样,音频创作应用程序就可以将多通道数据直接输出到外部混音器或音频存储设备(硬盘、ADAT 等)的设备。 例如,可以分配 48 通道流中的通道,如下表所示。

频道编号内容 0

声乐

1

2

吉他

3

低音

...

47

钢琴

对于此类原始音频数据,扬声器位置毫无意义,并将扬声器位置分配给输入或输出流可能会导致不必要的副作用。 例如,KMixer 等组件可以通过将特定于说话人的效果(如 3D 虚拟化或 Dolby Surround Pro 逻辑编码)应用于流来不恰当地进行干预。 请注意,原始数据通道的数量不受通道掩码中的位数的限制。

即使是未专门为音频编辑设计的设备也应接受 KSPROPERTY_AUDIO_CHANNEL_CONFIG 设置属性请求,以将其扬声器配置更改为KSAUDIO_SPEAKER_DIRECTOUT。 通常,设备应避免请求失败,除非它可以以某种方式验证其输出是否连接到扬声器,并且不能用于任何其他目的(例如,作为外部混音器的输入)。

通常为特定硬件设备编写使用直接退出模式的应用程序。 这样,应用程序就可以提前知道设备支持的直接输出数据格式,包括通道数以及应如何解释这些通道中的数据。 此知识是必需的,因为当应用程序调用 IDirectSound::GetSpeakerConfig 在直接退出模式下配置的设备上时,设备只会确认它处于此模式;它不提供有关它在直接输出模式下支持的流格式的通道数的其他信息。 (但是,可以通过向设备上的混音器引脚上的超级混合器节点发送 KSPROPERTY_AUDIO_MIX_LEVEL_CAPS get-property 请求来获取此信息;请参阅 DirectSound Node-Ordering 要求。)

为直接输出流指定波形格式时,应用程序应将 WAVEATEXTENSIBLE 结构的 dwChannelMask 成员设置为值为零的值KSAUDIO_SPEAKER_DIRECTOUT。 零的声道掩码表示未定义扬声器位置。 与往常一样,流中的通道数在 Format.nChannels 成员中指定。

硬件供应商可以选择在直接输出模式下配置 DirectSound 硬件加速时支持 DirectSound 硬件加速。 DirectSound 应用程序可以通过某个设备的混合引脚(如果可用)播放直接传出流。 所有可用的硬件引脚实例都用尽后,任何新流都会通过 KMixer 传递。

在直接输出模式下配置的设备的混合流时,KMixer 在来自应用程序的输入流的通道与输出到设备的混合流的通道之间应用一对一映射。 这意味着,如果应用程序生成多个具有相同数量的通道的直接输出流,例如,输出混合的每个通道 N 只是输入 KMixer 的所有流的通道 N 的总和。

混合多个直接出流时,它们包含的通道数不同,KMixer 的混合算法稍微复杂一些。 在这种情况下,混合的每个通道 N 是具有通道 N 的所有输入流的通道 N 的总和。例如,如果 KMixer 混合四边形和立体声输入流以形成四次输出混合,则通道零和一个输出混合是输入立体声和象限流的通道零和一个。 但是,立体声输入流对二和三个混合通道无贡献,这只来自四边形输入流的最后两个通道。

尝试执行以下作之一的应用程序有不可预知的行为风险:

  • 通过直接退出模式下配置的设备播放不采用直接退出格式的流。

  • 通过未在直接退出模式下配置的设备播放直接出流。

面对其中一种情况时,KMixer 避免只是尝试打开流失败。 相反,它尝试使用上面所述的一对一映射算法来处理明显的不兼容。 用户可能或可能不满意结果。 其他音频组件不能像 KMixer 一样处理这些情况。 例如,在直接输出模式下配置的设备的驱动程序应失败,尝试为不采用直接输出格式的输出流打开硬件缓冲区,反之亦然。

音频创作应用程序可能需要让用户侦听其已混合到其输出流的前几个通道中的数据,但忽略仍包含在流剩余通道中的原始数据。 KMixer 的行为使这一点变得简单明了。 例如,如果 24 通道播放流包含通道 0 和 1 中的立体声混合,以及通道 2 到 23 中的原始数据,则应用程序执行以下作:

  • 使用 DSSPEAKER_STEREO 调用 SetSpeakerConfig,配置目标音频设备(这不一定是应用程序用来编辑流的设备)。

  • 将播放流的 波形 结构中的 dwChannelMask 更改为KSAUDIO_SPEAKER_STEREO,但将 Format.nChannels 设置为 24,这是流中的通道总数。

KMixer 仅混合播放流的立体声通道(通道掩码中所述),并丢弃其余 22 个通道,其中包含原始数据。 请记住,在销毁当前 DirectSound 对象并创建另一个对象之前,对 DirectSound 扬声器配置设置所做的任何更改都不太可能生效(请参阅 应用 Speaker-Configuration 设置)。