操作系统升级
可以在操作系统升级中频繁保留音频设备的驱动程序设置。 升级后,目标是向前移动用户设置,同时确保音频终结点准确反映 OS 和驱动程序功能。
音频终结点迁移过程
在 OS 升级期间,可能会运行音频终结点迁移过程。 此过程会尝试将尽可能多的信息向前移动,这是安全的操作。 开发音频驱动程序时,请记住这些迁移行为。
可以在以下情况下运行此终结点迁移过程。
- OS 更新。
- 音频驱动程序更新。 这包括安装音频扩展驱动程序或 AudioProcessingObject。 有关详细信息,请参阅创建组件化音频驱动程序安装。
- 将就地重新安装现有音频驱动程序。 当音频故障排除程序运行时,可能会进行此重新安装。 通过设备管理器执行“更新驱动程序”,然后选择已安装的驱动程序时,也可能会发生这种情况。
- 已为 AudioEndpointBuilder 提供服务。 每当 AudioEndpointBuilder 服务中存在错误修复,并且已在 Windows 的已发布版本中更新此错误修复时,都会出现这种情况。
- USB 音频驱动程序上的固件修订已更改。
- 音频驱动程序通过 KSPROPERTY_JACK_DESCRIPTION3 更改终结点配置。
音频终结点迁移过程
音频终结点迁移过程会执行以下操作。
- 复制转发用户控制的终结点属性。
- 复制转发 CAPX 属性。
音频终结点迁移过程不会执行以下任何操作。
- 不要在 Windows 11 中提供 CAPX 之前复制转发 FXProperties。
- 它不会复制转发不在 OS 已知的用户设置列表中的属性。
从 Windows 11 开始,新的“CAPX”设置框架用于存储设置。 设置框架允许 APO 在音频终结点上公开用于查询和修改音频效果的属性存储区(“FX 属性存储区”)的方法。 有关详细信息,请参阅 Windows 11 音频处理对象 API。
将升级前终结点与升级后终结点匹配
迁移过程使用这两个元素将升级前终结点与升级后终结点匹配。
- 硬件 Id - 有关硬件 ID 的详细信息,请参阅系统范围唯一设备 ID。
- 引用字符串 - 下面讨论了引用字符串的用法。
请注意,由于创建了新终结点,因此缓存 mmdevice ID 在终结点迁移过程中将不起作用。
已注册的子设备
端口类驱动程序的 PcRegisterSubdevice 函数会注册子设备,该子设备会被系统其余部分视为设备。 该函数为筛选器对象注册设备接口实例,该对象表示音频适配器上的子设备。 I/O 管理器将 Name 参数指定的字符串追加到用于标识实例的引用字符串。 修改后的引用字符串可用于区分音频适配器中的子设备。 有关引用字符串的详细信息,请参阅 IoRegisterDeviceInterface。
引用字符串用法
创建 KS 接口时,音频终结点由传递给 PnP 的引用字符串以及外部连接器的引脚 ID 标识。 更改这些值将导致创建新的音频终结点。 此新的音频终结点将不包含与前面的引用字符串和连接器引脚 ID 关联的用户设置。
如果两个或更多个已安装的音频设备之间的硬件 ID 相同,并且引用字符串也相同,迁移系统将无法正确迁移设置,因为无法将迁移前的终结点与迁移后的终结点匹配。
在所有版本的 Windows 上安装同一根枚举的软件音频设备的多个副本(所有版本都使用相同的硬件 ID 和引用字符串)将无法正确迁移。
在 Windows 11 之前
对于 Windows 11 之前的系统上根枚举的软件音频设备,具有相同引用字符串值的音频终结点将无法正确迁移。
创建面向 Windows 11 之前的 Windows 版本的根枚举的软件音频设备时,需要为每个音频终结点使用唯一的引用字符串值,以确保迁移成功。
Windows 11 及更高版本
对于 Windows 11 和之后系统上的根枚举的软件音频设备,没有硬件 ID 时,具有相同引用字符串值的音频终结点将无法正确迁移。
创建面向 Windows 11 之后 Windows 版本的根枚举的软件音频设备时,需要在驱动程序 inf 中指定唯一的硬件 ID,并且只能使用该硬件 ID 安装每个根枚举的软件音频设备一次。若要安装同一驱动程序的多个副本,必须在每个安装上使用不同的引用字符串,以确保迁移成功。
引用字符串规则
强烈建议不要使用音频示例驱动程序中使用的默认“wave”和“topo”引用字符串。 应改用更具描述性的引用字符串。 在硬件 ID 不可用或与使用这些引用字符串的其他驱动程序匹配时,使用默认引用字符串的驱动程序会面临迁移数据丢失或应用于错误设备的风险。 合理的策略类似于“ContosoSoftwareRender-output2”。 包括唯一供应商名称有助于消除引用字符串歧义。
对于音频驱动程序安装、更新、OS 更新、重启等,引用字符串必须保持静态。如果引用字符串发生更改,将创建新的音频终结点,并且不会将用户设置从之前的终结点复制到新终结点。
硬件 ID 设备实例名称
音频驱动程序硬件 ID 可在 INF 文件的 Models 部分中定义。 硬件 ID 至少标识一个设备,并引用该设备 INF 文件的 DDInstall 部分。 它还指定该设备的 unique-to-the-model-section 硬件标识符 (ID)。 有关详细信息,请参阅 INF Models 部分和 INF DDInstall 部分。
此 INF 文件显示 Sysvad 音频示例中 DDInstall 部分的 Device Description。
[SYSVAD.NT$ARCH$]
%SYSVAD_SA.DeviceDesc%=SYSVAD_SA, Root\sysvad_ComponentizedAudioSample
SYSVAD_SA.DeviceDesc="Virtual Audio Device (WDM) - Tablet Sample"
此 INF 文件显示 Device Description 如何由 OEM 自定义。
[CONTOSO.NT$ARCH$]
%CONTOSO_SA.DeviceDesc%=CONTOSO_SA, Root\contoso_ContosoSoftwareRender
CONTOSO_SA.DeviceDesc="Description of the Contoso Software Render Driver"
AudioEndpointBuilder 将匹配的硬件 ID 将是 Root\contoso_ContosoSoftwareRender
注册表存储的设置
音频适配器驱动程序可以跟踪系统注册表中的当前设备设置(主要是音量级别和静音设置)。 驱动程序通常将这些设置存储在系统提供的驱动程序项(由 INF 关键字 HKR 表示)的子项“Settings”下。 当用户通过控制面板或其他音频应用程序更改这些设置时,驱动程序将更新相应的注册表项。 每次系统启动时,驱动程序都会从注册表还原设备设置。
用户通常更喜欢此行为,因为这将保留他们随时间推移对系统所做的调整,而不是强制他们在每次升级操作系统时手动还原其设置。
但是,某些驱动程序在每次安装时都会使用默认值盲目地覆盖这些设置。 更好的方法是,驱动程序在安装时确定是否已存在某些特定于驱动程序的条目。 如果它们确实存在,驱动程序应保留这些条目中包含的设置,而不是覆盖这些设置。
驱动程序 INF 文件的 add-registry 部分中的指令指定是否应覆盖现有注册表项。 有关详细信息,请参阅 INF AddReg 指令中有关 FLG_ADDREG_NOCLOBBER 标志的描述。