自 Windows 10 起推出默认音频终结点选择
Windows 10 音频子系统使用具有增强试探法的算法进行默认音频终结点选择。 本主题介绍这些试探法,以及 Windows 10 音频子系统如何使用它们来选择默认音频终结点。 为了让你尽可能了解新的 Windows 10 选择机制,本主题还介绍了如何在 Windows 7 中选择默认音频终结点。 本主题的目标受众是 OEM 和 IHV。
此信息适用于 Windows 10 操作系统。
本主题末尾列出了此处讨论的引用和资源。
介绍
大多数电脑音频设备包含多个逻辑独立的音频功能。 在 Windows 7 和 Windows 10 中,每个功能都公开为单独的音频终结点。 终结点列在“控制面板”的“声音”应用程序中,如 Windows 7 的以下示例对话框中所示。
还列在 Windows 10 中新增的声音设置页中。
一次只能将一个音频终结点设置为特定主机或通信角色的默认值。 但是,从 Windows 10 开始,可以选择使用“应用音量和设备首选项”页将这些角色的不同终结点定向到不同的应用程序。
Windows 7 和 Windows 10 音频子系统使用类似的算法来确定尚未指定用户首选项时的默认音频终结点。 但是,Windows 10 算法与 Windows 7 的不同之处在于,它会处理用户选择的默认值以及处理应用程序首选项。
本主题介绍如何在 Windows 10 中选择默认音频终结点。 为了更好地了解 Windows 10 的新增功能,还介绍了 Windows 7 中的默认音频终结点选择。
默认音频终结点选择的基本算法
Windows 7 和 Windows 10 音频子系统使用类似的算法来确定默认音频终结点。 该算法按如下方式运行:
- 循环访问所有 ACTIVE 终结点以查找此应用程序的用户设为首选默认值的终结点(Windows 10 的新增功能)
- 如果标识了终结点,则会返回该终结点,并完成该过程。
- 如果未标识任何终结点,则循环访问所有 ACTIVE 终结点,以查找系统用户设为首选默认值的终结点(针对 Windows 10 进行修改的选择)。
- 如果标识了终结点,则会返回该终结点,并完成该过程。
- 如果未标识任何终结点,则循环访问所有 ACTIVE 终结点,以查找具有所请求角色的最高“排名”属性的终结点,且未设置永不设为默认值的 PKEY_AudioDevice_NeverSetAsDefaultEndpoint 属性集。 (针对 Windows 10 修改的排名权重值。)
- 如果标识了终结点,则会返回该终结点,并完成该过程。
- 如果未标识任何终结点,则请求将失败,指示 E_NOTFOUND。
有四个终结点状态:ACTIVE、UNPLUGGED、DISABLED 和 NOT PRESENT,这些状态在 DEVICE_STATE_XXX 常量中定义。 音频子系统在确定默认音频终结点时仅考虑 ACTIVE 终结点(处于当前和已启用状态)。 会导致终结点状态更改为 ACTIVE 状态或从 ACTIVE 状态更改为其他状态的任何事件都可能会影响当前默认音频终结点。 此类事件包括插入音频设备、拔出设备以及安装新的音频设备。 为了响应此类操作,Windows 音频子系统会运行默认音频终结点试探法算法来确定新的默认音频终结点。
Windows 7 中的终结点时间戳属性
终结点时间戳属性是包含系统时间的属性键。 在 Windows 7 中,当终结点的时间戳属性通过“控制面板”的“声音”应用程序设置为默认音频终结点时,系统会创建或更新该属性。
时间戳属性与每个角色相关联,时间戳属性由默认选择算法用来标识该角色的用户已将哪些终结点设置为首选默认值。 该算法会将具有最新时间戳属性的终结点标识为默认终结点。
Windows 10 中的级别属性
在 Windows 7 中用于用户默认首选项的时间戳属性不允许在初始默认选择后自动选择新附加的设备。 例如,如果用户在过去的任意时刻以及日后附加新的 USB 耳机时将内部扬声器设置为默认终结点,则系统永远不会在没有手动选择的情况下移至 USB 耳机。
从 Windows 10 开始,用户默认选择作为过往首选项的树状结构生成,该结构会考虑用户在进行默认选择时可用的终结点。 原因在于,当用户选择默认终结点时,他们将相对于进行选择时哪些其他终结点处于活动状态传达该终结点的首选项。 用户不会一直以及在所有情况下传达所选设备的绝对首选项。
已从 Windows 10 中取消使用和创建时间戳属性,该属性已替换为级别属性。 级别属性用于生成用户首选项的树状结构。 与时间戳属性一样,每个角色都有一个与之关联的级别属性。 每当用户通过声音控制面板、声音设置页或系统托盘中的音频控件选择默认终结点时,系统都会创建或更新级别属性。
默认赋值算法的工作原理如下:
将终结点选作默认值时,系统会通过为其分配最高可用级别而将其移动到树状结构的顶部。 树中的下一个较低级别将包含一个或多个终结点,这些终结点过去已选为默认值,或在进行此选择时处于活动状态,但从未被用户选择。 每个后续选择都会将所需的终结点置于列表顶部,将之前的选定内容向下移动,并将处于活动状态但尚未取消选择的终结点分为一组以创建关联条件。 如果系统中的所有终结点都设置为默认值,生成的结构将成为一个简单的有序列表,其中每个级别都有一个终结点。
默认确定算法的工作原理如下:
首先,对没有级别值的活动终结点进行排名比较,将具有最高排名的终结点选为默认值。 这样,最近添加的终结点便获得了成为默认终结点的先机,因为它们是系统中的最新终结点,并在用户选择了上一个默认值之后进行连接。
接下来,如果所有活动终结点都包含一个级别,则将具有最高级别的终结点(没有关联)选为默认值。 具有最高级别表示用户在过去某个时间点将此终结点设置为默认值,而其他具有较低级别值的终结点处于活动状态。
最后,如果所有终结点都包含一个级别值,并且具有最高级别值的终结点都已关联,则终结点排名将用于打破关联。 这指示这些终结点在进行默认选择时处于活动状态,但本身未选定。 我们没有指示这些终结点之间的用户首选项,因此使用了自动排名系统。
值得注意的是,有了这一新算法,就会增加“新”终结点成为默认值的权重。 这意味着会导致音频终结点被系统视为新终结点的驱动程序行为有可能触发默认更改。
驱动程序行为和事件的示例,这些行为和事件会导致音频终结点在音频终结点上丢失用户设置,并使音频终结点被系统视为“新”,从而可能触发默认设备中的更改,包括:
- 安装其他驱动程序。 例如,在 HDAudio 类驱动程序与硬件的匹配第三方驱动程序之间进行切换。 这是意料之中的,也是设计使然,因为用户设置和可用终结点在两个或更多个不相关的驱动程序安装之间不会被视为相同。
- 卸载并重新安装驱动程序。 卸载音频驱动程序会导致 AudioEndpointBuilder 删除与该驱动程序关联的用户设置。 安装新驱动程序将导致 AudioEndpointBuilder 创建新的音频终结点。 这是预期行为,也是设计使然,但如果会导致用户设置意外丢失,自动安装程序应避免此行为。
- 对音频终结点筛选器引用字符串或引脚 ID 的任何更改。 创建 KS 接口时,音频终结点由传递给 PnP 的引用字符串以及外部连接器的引脚 ID 标识。 更改这些值将导致创建新的音频终结点。 此新的音频终结点将不包含与前面的引用字符串和连接器引脚 ID 关联的用户设置。 在驱动程序安装生命周期内,引用字符串和连接器引脚 ID 不得更改,包括跨驱动程序更新。
- 更改终端类型或接收器 ID 的 HDMI 或显示音频设备。 当用户将不同的显示设备附加到系统时,终端类型和接收器 ID 将更改,不同的显示是一个新的终结点,其中包含与之关联的新用户设置。 但是,如果在未对连接的显示屏进行相应更改的情况下更改这些值,则将被视为用户设置丢失。 连接的显示屏的接收器 ID 和终端类型必须保持不变。
Windows 10 默认音频终结点试探法
用于自动选择终结点的 Windows 10 默认音频终结点试探法与 Windows 7 试探法相同,只是对权重做了一些细微修改,以提供更好的用户体验。
默认选择试探法首先收集有关音频终结点的信息;因子。 然后,对每个因子进行加权,并将所有因子产生的加权值相加。 得到的和称为终结点排名。 针对每个终结点(控制台和通信)为每个角色计算排名值。
然后,将排名最高的终结点选为所请求角色的默认值。
Windows 10 试探法因子
Windows 10 音频子系统会考虑以下终结点特征(即因子)来选择默认音频终结点:
Windows 10 为每个受支持的终结点因子定义了一组枚举值,并将其存储在注册表中。 这些因子及其相应的枚举值集的详细说明如下。
插孔检测功能
具备此功能的终结点意味着,当连接到终结点的音频外围设备插入或拔出时,音频驱动程序可以通知音频子系统。 支持插孔检测功能的音频终结点称为动态终结点,不提供此支持的音频终结点称为静态终结点。 若要支持插孔检测功能,音频设备驱动程序必须支持 KSPROPERTY_JACK_DESCRIPTION2 属性。 有关此属性的详细信息,请参阅 KSPROPERTY_JACK_DESCRIPTION2。
插孔检测功能枚举值 |
---|
支持 |
NotSupported |
Windows 10 默认音频设备试探法将所有 USB 音频终结点和蓝牙音频终结点视为支持检测插孔。
外形规格
音频终结点的外形规格会指示用户与之交互的音频终结点的物理属性,例如耳机、扬声器或 S/PDIF。 为了确定终结点的外形规格,音频子系统使用内置固定逻辑将音频驱动程序公开的内核流式处理 (KS) 引脚类别 (KSNodeType) 映射到特定的外形规格。 有关详细信息,请参阅 EndpointFormFactor。
终结点外形规格枚举值 |
---|
RemoteNetworkDevice |
扬声器 |
LineLevel |
耳机 |
Microphone |
耳机 |
手机 |
UnknownDigitalPassthrough |
SPDIF |
DigitalAudioDisplayDevice |
UnknownFormFactor |
KSNodeType
音频驱动程序会为终结点上的 KS 引脚选择 KSNodeType,因为该驱动程序对可能连接到音频插孔的音频设备有详细的了解。 因此,KsNodeType 比终结点的外形规格更能揭示该终结点的具体信息。
KSNodeType 枚举值 |
---|
KSNODETYPE_SPEAKER |
KSNODETYPE_MICROPHONE_ARRAY |
KSNODETYPE_HEADPHONES |
有关 KsNodeType 的更多详细信息,请参阅引脚类别属性。
总线类型
此因子表示从中枚举公开音频终结点的音频设备的总线类型。
总线类型枚举值 |
---|
BTHENUM |
BTHHFENUM |
USB |
HDAUDIO |
PCI |
未知 |
当所有其他终结点特征相同时,音频子系统会偏向于特定总线类型而非其他总线类型上的终结点。 例如,系统会优先考虑蓝牙耳机而非板载 HD Audio 耳机,为用户提供更好的通信体验;也就是说,当最终用户向此电脑引入蓝牙耳机设备时,系统会使其成为默认设备。
常规位置
常规位置指示音频终结点连接到的插孔或设备的物理粗略位置。
常规位置枚举值 |
---|
PrimaryBox 在主系统机箱上,可供用户访问) |
内部(在主板上,不打开框则不可访问) |
单独(如移动盒) |
其他 |
几何位置
几何位置指示音频终结点连接到的插孔或设备的几何位置。
几何位置枚举值 |
---|
eGeoLocRear |
eGeoLocFront |
eGeoLocLeft |
eGeoLocRight |
eGeoLocTop |
eGeoLocBottom |
eGeoLocRearOPanel |
eGeoLocRiser |
SubtypeSpecific
子类型特定属性允许将来扩展依赖于终结点引脚类别属性的试探法值。 它支持 Supported/NotSupported 功能。
SubtypeSpecific 功能枚举值 |
---|
支持 |
NotSupported |
目前,唯一特定于子类型的属性与麦克风阵列几何相关。 在麦克风阵列几何上下文中,“Supported”表示前/后几何。 “NotSupported”表示其他某种几何。 如果存在多个麦克风阵列,则可能采用前/后几何首选项。
Windows 10 试探法详细信息
Windows 10 默认音频终结点试探法会权衡每个终结点因子。 因子的优先级越高,其权重就越大。 本主题使用 WeightFactor_Xxx 来确定因子的优先级。
此外,Windows 10 试探法将排名值(本主题中的 nRankXxx)分配给因子类别中的每个枚举值。 此排名值会在同一因子下的所有枚举值之间建立相对重要性。
这些 WeightFactor_Xxx 和 nRankXxx 值由 Windows 在操作系统安装过程中存储在注册表中。 试探法排名计算的参数集取决于终结点的特征。 下表显示了一组示例参数。
终结点因子的权重 | 终结点因子的排名值 |
---|---|
WeightFactor_JackDet | nRankJackDet |
WeightFactor_SubType | nRankSubType |
WeightFactor_FormFactor | nRankFormFactor |
WeightFactor_BusType | nRankBusType |
WeightFactor_GenLoc | nRankGenLoc |
WeightFactor_GenLoc | nRankGeoLoc |
WeightFactor_SubtypeSpecific | nRankSubtypeSpecific |
音频子系统会计算终结点的所有因子的加权排名,如下所示:
WeightedRankValue =
WeightFactor_JackDet * nRankJackDet +
WeightFactor_SubType * nRankSubType +
WeightFactor_FormFactor * nRankFormFactor +
WeightFactor_BusType * nRankBusType +
WeightFactor_GenLoc * nRankGenLoc +
WeightFactor_GeoLoc * nRankGeoLoc |
WeightFactor_SubtypeSpecific * nRankSubtypeSpecific.
音频子系统会计算所有活动终结点的加权排名值,并选择排名最高的终结点作为默认音频终结点。
Windows 10 默认音频终结点选择试探法机制还支持例外功能。 此功能允许系统或 OEM 使音频子系统指定与具有非常高或非常低权重排名值的特定特征集匹配的终结点。 当系统处理意外情况时,这种指定使系统的试探法更加灵活。
控制台设备角色和通信设备角色的试探法是分开的,但机制完全相同,因子的顺序取决于角色。
Windows 10 内置试探法设置
Windows 10 附带基于本主题中的试探法详细信息的设置。 默认控制台音频终结点和默认通信音频终结点具有不同的设置。 本节介绍这两种类型的终结点的设置。
默认控制台音频终结点的内置试探法设置
本节介绍控制台音频终结点的每个因子的默认试探法设置。 因子按优先级顺序列出;也就是说,Windows 10 将在音频子系统确定默认控制台终结点时为以下列表中的第一个因子设置最高优先级。
插孔检测功能
具有插孔检测功能的终结点会向系统提供以下最新信息:音频外围设备是否物理连接到系统,以及它何时插入或拔出。 这些信息有助于打造更好的最终用户体验,因此 Windows 10 会将此因子设置为最高优先级因子。 无论其他因子如何比较,具有插孔检测功能的终结点的优先级都高于没有此功能的终结点。
外形规格
Windows 10 使用与 Windows 7 不同的外形规格优先级顺序,这些值已根据用户反馈和研究进行调整。
Windows 10 按以下优先级顺序为呈现控制台终结点设置外形规格优先级:
- 耳机和头戴设备
- 扬声器
- LineLevel
- DigitalAudioDisplayDevice
- S/PDIF
- 任何其他(以相同的最低优先级处理;也就是说,_nRankFormFactor_ 等于零)
Windows 10 按以下优先级顺序为捕获控制台终结点设置外形规格优先级:
- 耳机
- Microphone
- LineLevel
- 任何其他(以相同的最低优先级处理;也就是说,nRankFormFactor 等于零)
例如,考虑一个有三个音频控制台呈现终结点的系统:
- HD 音频静态耳机终结点(没有插孔检测功能的耳机)。
- 静态 S/PDIF 输出终结点。
- 动态扬声器终结点(支持插孔检测的扬声器)。
音频子系统使用 Windows 10 系统试探法,并选择动态扬声器终结点作为默认控制台呈现音频终结点,即使扬声器的外形规格优先级低于耳机的外形规格。 选择扬声器终结点是因为它支持检测插孔,具有比外形规格更高的优先级,而耳机没有此功能。
如果将动态 USB 耳机终结点引入上述示例中,Windows 7 音频子系统会将此终结点选为默认控制台呈现终结点。 之所以这样选择,是因为当两台设备都支持插孔检测时,耳机外形规格的优先级高于扬声器外形规格。
KSNodeType
如前所述,KSNodeType 可提供比连接到终结点的音频设备的外形规格所指示的更详细的信息。 Windows 10 定义了三个与麦克风相关的 KSNodeTypes,以进一步确定具有麦克风外形规格和不同 KSNodeType 的终结点的优先级。 它们按优先级顺序排列,如下所示:
- KSNODETYPE_PROCESSING_MICROPHONE_ARRAY
- KSNODETYPE_MICROPHONE_ARRAY
- KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE
- 任何其他(以相同的最低优先级处理;也就是说,nRankSubType 等于零)
例如,考虑一个具有两个音频捕获终结点的系统:
- 具有 KSNODETYPE_MICROPHONE_ARRAY 的内置静态麦克风阵列终结点。
- 具有 KSNODETYPE_MICROPHONE 的静态麦克风终结点。
当音频子系统使用系统试探法选择默认控制台捕获音频终结点时,它将选择麦克风阵列终结点。 选择麦克风阵列是因为,尽管两个终结点具有相同的插孔检测功能和外形规格,但麦克风阵列的 KsNodeType 的优先级高于麦克风的优先级。 也就是说,KSNODETYPE_MICROPHONE_ARRAY 的优先级高于 KSNODETYPE_MICROPHONE,它未列出并属于“任何其他”类别。
有关 KsNodeType 的详细信息,请参阅引脚类别属性。
总线类型
Windows 10 按以下优先级顺序(从最高到最低优先级)对终结点总线类型的枚举值进行排名:
- USB
- HDAudio 和 UnknownBusType(通常是 SOC 系统)
- PCI
- BTHENUM
- BTHHFENUM
- 其他(以相同的最低优先级处理;也就是说,nRankBusType 等于零)
常规位置
Windows 10 按以下优先级顺序(从最高到最低优先级)对常规位置的枚举值进行排名:
- PrimaryBox 和内部
- 其他(以相同的最低优先级处理;也就是说,nRankGenLoc 等于零)
音频驱动程序通过 KSPROPERTY_JACK_DESCRIPTION 属性报告其终结点的常规位置信息。 有关详细信息,请参阅插孔说明属性。
几何位置
Windows 10 按以下优先级顺序(从最高到最低优先级)对几何位置的枚举值进行排名:
- Front 和 InsideMobileLid
- Bottom、Left、OutsideMobileLid、Rear、Right 和 Top
- RearPanel
- 其他(以相同的最低优先级处理;也就是说,nRankGeoLoc 等于零)
音频驱动程序通过 KSPROPERTY_JACK_DESCRIPTION 属性报告其终结点的几何位置信息。 有关详细信息,请参阅插孔说明属性。
异常
除了上述试探法因子之外,Windows 10 为默认控制台设备试探法添加了 3 个例外。 Windows 7 只有 1 个例外。
第一个例外存在于 Windows 7 和 10 中,可避免将明显面向通信的终结点(如手机和扬声器)选为默认控制台终结点。 具体而言,音频子系统对具有以下 KSNodeType 值的终结点的 WeightedRankValue 结果进行降级:
- KSNODETYPE_SPEAKER_AND_HEADSET
- KSNODETYPE_SPEAKERS_STATIC_JACK
- KSNODETYPE_HANDSET
- KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION
- KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE
- KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE
- KSNODETYPE_PHONE_LINE
- KSNODETYPE_TELEPHONE
- KSNODETYPE_DOWN_LINE_PHONE
- 移动方案中存在的手机网络音频特定终结点
第二个例外(仅存在于 Windows 10 上)也可避免将明显面向通信的终结点选为默认控制台终结点。 与第一个例外不同,此例外还会考虑总线类型。 原因是许多常用的 USB 耳机使用以下 KSNodeType,即使这些设备不是特定于通信。 Windows 7 排名算法对所有总线类型的默认控制台终结点的这些 KSNodeType 进行了降级。 对于 Windows 10,这些 KSNodeType 仅针对非总线总线类型进行降级。
- KSNODETYPE_PERSONAL_MICROPHONE
- KSNODETYPE_COMMUNICATION_SPEAKER
- KSNODETYPE_HEADSET
对于第三个例外,为“个人”终结点(如耳机和头戴设备)显式引入了首选项,这些终结点以物理方式连接到带有电线的系统。 一些示例是有线 USB 耳机和有线 3.5mm 耳机。 与前面的 2 个例外不同,此例外会将这些终结点升级为默认控制台终结点的首选终结点。 此例外是 Windows 10 的新增功能,旨在更好的保护用户隐私,首选只有这位用户可以通过扬声器终结点听到其他人能听到的终结点。
默认通信音频终结点的内置试探法设置
本节介绍通信音频终结点的每个因子的默认试探法设置。 这些因子按优先级顺序列出;也就是说,Windows 10 在计算默认通信终结点时将为以下列表中的第一个因子设置最高优先级。 控制台默认终结点和通信默认终结点的试探法唯一区别在于外形规格设置和例外规则。
插孔检测功能
对于默认通信音频终结点和默认控制台音频终结点,插孔检测功能试探法设置相同。
外形规格
系统会为呈现通信默认设备和捕获通信默认设备创建不同的优先级列表。
通信默认捕获终结点的外形规格优先级按优先级顺序(从最高优先级到最低优先级)如下所示:
- 耳机
- 手机
- Microphone
- LineLevel
通信默认呈现终结点的外形规格优先级按优先级顺序(从最高优先级到最低优先级)如下所示:
- 耳机
- 手机
- 耳机
- 扬声器
- LineLevel
- DigitalAudioDisplayDevice(HDMI 或 DisplayPort)
- S/PDIF
- 任何其他(以相同的最低优先级处理;也就是说,nRankFormFactor 等于零)
KSNodeType
对于默认通信音频终结点和默认控制台音频终结点,KsNodeType 试探法设置相同。
总线类型
对于默认通信音频终结点和默认控制台音频终结点,总线类型试探法设置相同。
常规位置
Windows 10 按以下优先级顺序(从最高到最低优先级)对常规位置的枚举值进行排名:
- 拆分
- PrimaryBox
- 内部
- 其他(以相同的最低优先级处理;也就是说,nRankGenLoc 等于零)
音频驱动程序通过 KSPROPERTY_JACK_DESCRIPTION 属性报告其终结点的常规位置信息。 有关详细信息,请参阅插孔说明属性。
几何位置
Windows 10 按以下优先级顺序(从最高到最低优先级)对几何位置的枚举值进行排名:
- Front 和 InsideMobileLid
- 其他(以相同的最低优先级处理;也就是说,nRankGeoLoc 等于零)
音频驱动程序通过 KSPROPERTY_JACK_DESCRIPTION 属性报告其终结点的几何位置信息。 有关详细信息,请参阅插孔说明属性。
异常
除了上述试探法因子之外,Windows 10 还针对默认通信设备试探方法实现了三个例外,而 Windows 7 只有一个。
第一个例外首选将明显面向通信的终结点(如手机和扬声器)选为默认通信终结点。 具体而言,音频子系统会使用与以下任意值匹配的 KSNodeType 升级终结点的 WeightedRankValue 结果:
- KSNODETYPE_PERSONAL_MICROPHONE
- KSNODETYPE_HEADSET
- KSNODETYPE_PHONE_LINE
- KSNODETYPE_DOWN_LINE_PHONE
- KSNODETYPE_COMMUNICATION_SPEAKER
- KSNODETYPE_HANDSET
- KSNODETYPE_TELEPHONE
- KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION
- KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE
- KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE
第二个例外可避免那些明显面向控制台的终结点,这些终结点不适合通信使用情况:
- KSNODETYPE_SPEAKERS_STATIC_JACK
- 仅在移动方案中存在的特殊音频终结点,这些终结点不适用于通信音频
在撰写本文时,存在第三个首选手机网络音频终结点的例外。 此例外仅存在于支持手机网络功能的移动方案,不在本文档的讨论范围之内。 由于此类终结点仅存在于移动系统上,因此可以安全地忽略此例外。