DSSPEAKER_DIRECTOUT 扬声器配置

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

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

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

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

频道编号内容 0

声乐

1

2

吉他

3

低音

...

47

钢琴

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

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

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

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

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

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

混合多个所含声道数不同的直接出流时,KMixer 的混合算法稍微复杂一些。 在这种情况下,混合的每个声道 N 是具有声道 N 的所有输入流的声道 N 之和。例如,如果 KMixer 混合四声道和立体声输入流以形成四声道输出混合,则声道零和其中一个输出混合是声道零和 1(分别对应于输入立体声和四声道流)之和。 但是,立体声输入流对混合的声道 2 和 3 没有任何影响,它们仅来自四声道输入流的最后两个声道。

尝试执行以下任一操作的应用程序有可能出现不可预测的行为:

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

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

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

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

  • 在立体声模式下配置目标音频设备(这未必是应用程序用来编辑流的设备),方法是使用 DSSPEAKER_STEREO 调用 SetSpeakerConfig

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

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