分组参数

分组参数可识别音频会话的集合,这些会话均由系统音量控制程序 Sndvol 中的一个音量控件来控制。 分组参数是一个 GUID,用于唯一标识计算机范围内的集合。

分组参数的作用与跨进程会话的会话 GUID 相似。 也就是说,分组参数可以让用户将任意数量进程的数据流集合作为一个单元来加以控制。 但是,在跨进程会话无法提供解决方案的情况下,分组参数也能实现这一目的。

如果多个客户端将各自的流分配给不同的会话,但将相同的分组参数分配给所有会话,则 Sndvol 会为这些会话显示单一的音量控件。 要支持分组参数,Sndvol 或任何类似的音量控件应用程序都必须执行以下操作:

  • 在显示音量控件之前,请检查所有活动会话的分组参数。 将具有相同分组参数的所有会话集中在一个音量控件下。
  • 当用户更改某个分组参数的音量控件设置时,更新共享该分组参数的所有会话的音量水平。

分组参数有助于减少 Sndvol 显示的音量控件的数量。 如果 Sndvol 显示屏上的控件过多,则可能会让用户感到困惑。 如果不支持分组参数,Sndvol 总是会为每个会话显示单独的音量控件,这可能并不适合于所有的情况。 此外,分组参数还提供了一种便捷的方法,可确保包含相似类型音频内容的会话能轻松设置为相同的音量水平。

如前所述,高级音频 API 通常会将其流分配给默认的特定进程会话(由会话 GUID 值 GUID_NULL 标识)。 此默认值使 Sndvol 能够为每个客户端应用程序进程显示单独的音量控件,这通常是所需的行为。 此外,如果同一个客户端的多个实例在不同进程中运行,但需要一个共享的音量控件,那么客户端只需将其流分配给同一个跨进程会话即可。 这两种情况都不需要使用分组参数。 但是,有一种重要的情况(以 Microsoft Internet Explorer 为例)确实需要使用分组参数才能实现所需的行为。

Internet Explorer 允许用户打开多个浏览器窗口,而这些窗口可能并不都在同一进程中运行。 如果 Sndvol 为每个应用程序实例显示单独的音量控件,而所有这些实例都有相同的标签“Internet Explorer”,则用户可能会感到困惑。在这种情况下,跨进程会话并不是一个可行的解决方案 — 如果 Internet Explorer 的多个实例在不同进程中运行,它们可能无法将所有音频流分配给一个跨进程会话。 原因是 Internet Explorer 窗口可能正在运行 Windows Media Player 或其他多媒体插件实例,这些插件使用更高级别的音频 API 来播放音频流。 这些 API 通常会将进程中的流分配给一个特定于进程的默认会话。 Internet Explorer 无法控制将这些流分配给会话。

WASAPI 解决了这一问题,它让 Internet Explorer 的每个实例都能访问其默认进程特定会话的会话控件,并为该会话分配分组参数。 如果 Internet Explorer 的所有实例都为其所有音频会话分配了相同的分组参数,那么 Sndvol 将为这些会话显示单一的音量控件。

默认情况下,会话不属于任何分组。 如果客户端未将会话明确分配给分组,则 Sndvol 会为该会话显示专用音量控件。 分组参数值 GUID_NULL 表示会话不属于任何分组。 如果没有客户端为会话明确分配分组参数,则该会话的分组参数值将默认为 GUID_NULL。

客户可以动态更改为其分配会话的分组。

分组可包括音频终结点设备上跨进程会话和特定于进程的会话的任意组合。

Sndvol 用户界面允许用户一次只显示一个音频终结点设备的音量控件。 当用户调整特定设备的音量控件时,连接其他设备的会话音量不会受到影响。 具体而言,特定分组参数的音量控件只会影响共享分组参数并连接到当前选定设备的会话。 恰好具有相同分组参数但连接到其他设备的会话不会受到影响。

如前所述,Sndvol 会为显示的每个音量控件标注显示名称和图标。 对于分组的音量控件,Sndvol 会任意选择分组中的一个会话作为音量控件显示名称和图标的来源。 因此,为确保 Sndvol 始终为分组显示相同的显示名称和图标,为该分组分配会话的所有应用程序实例都应确保各自的会话具有相同的显示名称和图标。 有关显示名称和图标的详细信息,请参阅音频会话

当会话分组参数发生变化时,Sndvol 等应用程序可自行注册以接收通知。 如果应用程序缓存了会话分配到分组参数的信息,那么这种通知可能会很有用。 通知会告知应用程序缓存的信息可能不再有效。

要为会话指定分组参数,请调用 IAudioSessionControl::SetGroupingParam 方法。 要获取分配给会话的分组参数,请调用 IAudioSessionControl::GetGroupingParam 方法。

音频会话