应用 Speaker-Configuration 设置

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

DirectSound 会在注册表中跟踪其当前扬声器配置设置,并在每次创建新的 DirectSound 设备时将该设置应用于音频硬件。

应用程序可以调用 IDirectSound::SetSpeakerConfig 方法来更改系统范围的扬声器配置,该方法会更新注册表中的扬声器配置设置。 该方法还会尝试立即将新设置应用于硬件,但音频设备通常无法在 DirectSound 对象存在时更改扬声器设置。 有关 DirectSound 为此方法定义的扬声器配置的列表,请参阅转换扬声器配置请求

用户可以在控制面板的“多媒体属性”页 (mmsys.cpl) 中通过扬声器配置对话框更改配置。 例如,若要在 Windows XP 下找到 DirectSound 扬声器配置对话框,请执行以下步骤:

  1. 在控制面板中,双击“声音和音频设备”图标。

  2. “音频”选项卡上,从“声音播放”列表中选择设备。

  3. 选择“高级”按钮。

  4. 选择“扬声器”选项卡。

此时,应可在从中选择的扬声器配置列表旁边看到“扬声器设置”标签。

DirectSound 使用 KSPROPERTY_AUDIO_CHANNEL_CONFIG set-property 请求,将扬声器配置信息发送到音频筛选器图中的 3D 节点或 DAC 节点(KSNODETYPE_3D_EFFECTSKSNODETYPE_DAC)。 对于 3D 节点,属性请求的目标实际上是馈送节点的引脚(3D 流对象)。 对于 DAC 节点,目标是包含 DAC 节点的筛选器对象。 在任一情况下,扬声器配置设置都是全局设置,因此会影响整个音频设备。 随后运行的所有音频应用程序都受新设置的约束,直到 DirectSound 再次更改该设置。

请注意,只有 Windows Me 以及 Windows XP 及更高版本随附的 DirectSound 版本才会向 DAC 节点发送扬声器配置属性请求,早期版本的 DirectSound 不支持此功能。 但是,DirectSound 的所有版本都会将这些请求发送到 3D 节点。

如果应用程序程序已创建多个 3D 节点,则 DirectSound 仅将扬声器配置请求发送到要创建的第一个 3D 节点。

每当应用程序创建 DirectSound 对象或调用 IDirectSound::SetSpeakerConfig 方法时,DirectSound 都会将扬声器配置请求发送到 3D 和 DAC 节点。 音频设备在管理活动流时通常无法更改其扬声器配置,并且 DirectSound 会尽量避免此限制。 例如,在创建 DirectSound 对象时,DirectSound 会在实例化筛选器之后但在实例化筛选器上的任何引脚之前(即创建任何流之前)发送扬声器配置请求。

在调用 SetSpeakerConfig 时,很难规避此限制。 当应用程序调用 SetSpeakerConfig 时,适配器驱动程序通常会使得 DirectSound 的扬声器配置请求失败。 这是因为 DirectSound 对象已存在,这意味着设备已具有要管理的活动流。

在这种情况下,适配器驱动程序有两个选项可用于处理已失败的扬声器配置请求:

  • 驱动程序可以记住请求的配置,并在所有流被销毁后立即应用它。

  • 驱动程序可以忽略请求,并利用 DirectSound 在下次创建 DirectSound 对象时发送另一个扬声器配置请求。

第一个选项提供更好的用户体验,因为如果用户通过扬声器配置对话框来选择新设置,更改将立即在所有应用程序中生效,而不仅仅是 DirectSound 应用程序。 (当然,如果在选择新设置时正在运行任何音频应用程序,更改将推迟到所有音频应用程序终止为止。)但是,使用第二个选项,更改在 DirectSound 应用程序运行之前不会生效。 例如,如果使用 Windows 多媒体 waveOut API 的应用程序是在更改控制面板设置后运行的第一个应用程序,则用户可能想知道新设置为何没有明显效果。

为了响应发送到 3D 或 DAC 节点的扬声器配置请求,仅当任何音频应用程序当前未实例化任何引脚时,典型的适配器驱动程序才会更新音频硬件中的扬声器配置。 例如,这意味着,如果 waveOut 应用程序在第二个应用程序调用 DirectSoundCreate 时打开了一个或多个引脚,则驱动程序可能需要将音频设备扬声器配置的任何挂起更改推迟到稍后为止。

如果驱动程序无法满足更改设备扬声器配置的请求,则它只能将请求设为失败。 在 DirectSound 对象创建期间或 SetSpeakerConfig 调用期间,扬声器配置请求失败不会导致 DirectSound 对象创建或 SetSpeakerConfig 调用失败。

在启动时,音频适配器驱动程序会将硬件的扬声器配置初始化为其默认设置,这通常是立体声。 只要任何应用程序创建 DirectSound 对象,DirectSound 就会将注册表中存储的设置应用于硬件。 应用程序必须先创建 DirectSound 设备,然后才能调用 SetSpeakerConfig 来更改注册表中的扬声器配置设置,但此注册表设置通常在发布 DirectSound 设备并创建第二个 DirectSound 设备后才会在硬件中生效。

安装音频设备或发生扬声器配置错误后,DirectSound 扬声器配置将立即默认为立体声。