管理动态拓扑

音频适配器包含一些用于为外部音频设备(如扬声器和麦克风)提供服务的子设备,用户可将这些设备插入适配器的前面板或后面板音频插孔中。 每个子设备都为特定音频插孔或插孔组提供服务。

音频驱动程序通过呈现一个拓扑来描述每个子应用程序,该拓扑实际上是子设备中的内部连接和处理元素的映射。 系统提供的 Windows API 模块和供应商提供的控制面板应用程序使用拓扑信息,确定子组件的功能,并标识其内部控制点。 有关详细信息,请参阅公开筛选器拓扑

在提供 IUnregisterSubdeviceIUnregisterPhysicalConnection 接口之前开发的 WDM 音频驱动程序大多数具有静态拓扑。 对于这些驱动程序,在适配器驱动程序创建一个微型端口驱动程序对象来管理子设备后,该对象及其关联的子设备将在适配器驱动程序对象的生存期内保留。

但是,在动态配置的音频适配器中,适配器驱动程序可以在运行时创建和删除子设备,以反映硬件配置中的更改,因为用户将外部设备插入音频插孔,然后将其删除。 此行为允许子设备作为逻辑上独立的硬件功能运行。 换言之,每个子设备都可以独立于其他子设备进行启动、配置和关闭。

每个子应用程序都有一个内部拓扑,其中包含以下内容:

  • 经过子设备的数据路径。

  • 处理沿数据路径流动的数据流的拓扑节点(例如音量控制)。

  • 子设备与同一适配器中的其他子设备的物理连接。

当适配器驱动程序动态删除子设备时,它会释放绑定到子设备内部拓扑的硬件资源。 然后,适配器驱动程序可以使用这些资源创建拓扑可能不同的新子设备。

配置新的音频子设备时,适配器驱动程序会将子设备的驱动程序接口注册为一个或多个设备接口类的实例,并且 I/O 管理器将添加一个或多个包含关联接口类和接口实例的符号链接的注册表项。 若要访问子设备,用户模式客户端会从注册表检索符号链接,并将其作为调用参数传递给 CreateFile 函数。 通常,客户端是 Windows API 模块,例如 Dsound.dll 或 Wdmaud.drv,或者供应商提供的控制面板或音频实用工具程序。 有关 CreateFile 的详细信息,请参阅 Microsoft Windows SDK 文档。

当微型端口驱动程序调用 IUnregisterSubdevice::UnregisterSubdevice 方法,以删除子设备时,PortCls 系统驱动程序 (Portcls.sys) 会指示 I/O 管理器从注册表中删除关联设备接口的符号链接。 在删除接口时,为设备接口删除事件注册的组件会收到通知。

音频适配器可以包含插孔存在线路,以在在音频插孔中插入或删除插头时通知微型端口驱动程序。 当用户将插头插入音频插孔时,适配器驱动程序会将关联子设备的设备接口添加到注册表。 当用户从音频插孔中删除插头时,适配器驱动程序将从注册表中删除对应的设备接口。

支持动态拓扑的音频适配器具有以下优势:

  • 用户友好

    除非实际将桌面扬声器、耳机和其他外部音频设备插入到音频适配器前面板或后面板上的音频插孔中,否则系统不会将这些设备作为可用使用状态呈现给音频应用程序。

  • 高能效

    当用户从音频插孔中删除插头时,驱动程序可以关闭为该插孔提供服务的适配器线路部分。

  • 可配置

    删除子设备后,驱动程序可以使用绑定到子设备内部拓扑的硬件资源,创建拓扑可能不同的新子设备。