过滤器工厂
音频适配器驱动程序提供筛选器工厂来管理筛选器的实例化。 每个筛选器工厂都可以实例化特定类型的一个或多个 KS 筛选器。 如果筛选器类型封装特定的硬件功能,工厂可以实例化的该类型的筛选器数受基础硬件资源的限制。
由于筛选器工厂管理一个基本上自主的硬件功能块,因此每个筛选器工厂都可以视为自己的设备驱动程序。 事实上,在上一段中使用的术语适配器驱动程序是指相关驱动程序(筛选器工厂)的集合,这些驱动程序打包在一起以管理适配器卡上的各种硬件功能。
与任何其他Microsoft Windows 驱动程序模型(WDM)驱动程序一样,筛选器工厂处理电源管理和设置功能。 在安装过程中,驱动程序的 INF 文件注册了一个或多个筛选器设备名称(请参阅 设备标识字符串)。 此过程将名称加载到系统注册表中,并将每个筛选器工厂与一个或多个 KS 筛选器类别相关联,如 安装音频适配器设备接口中所述。 所有音频设备都分类在KSCATEGORY_AUDIO下,但音频设备也可能分为其他类别,例如KSCATEGORY_RENDER(对于音频渲染设备)或KSCATEGORY_CAPTURE(对于音频捕获设备)。 驱动程序通过据其注册设备筛选器的各种类别来播发该设备的一般功能。 例如,当 SysAudio 系统驱动程序需要特定类型的音频设备时,它会在注册表中查找属于相应类别的设备。
操作系统使用安装程序 API(如设备和驱动程序安装中所述)来发现和枚举注册表中的所有 KSCATEGORY_AUDIO 筛选器工厂。 每个工厂的注册表项都指定了筛选器工厂的友好名称和设备标识名,这是客户端在实例化筛选器时传递给 create-file 调用的一个长字符串。 此调用可能是从内核模式调用 ZwCreateFile,也可能是从用户模式调用 CreateFile。 筛选器是内核模式对象,由内核句柄标识。 create-file 调用会返回客户端可用于引用筛选器的实例句柄。 音频图中的用户模式客户端或上游筛选器可以使用此句柄向筛选器发送或转发 IOCTL 请求。 有关 CreateFile的详细信息,请参阅 Microsoft Windows SDK 文档。
例如,典型的 WDM 音频适配器卡可能驻留在 PCI 总线上,并且包含多个用于呈现或捕获波形数据的 I/O 连接器。 此卡上的单个音频设备可能包含用于驱动一组扬声器和线路电缆的模拟音频输出插孔,以及用于接收麦克风和线路电缆信号的模拟音频插孔。 WDM 音频系统将设备表示为筛选器,并将音频插孔表示为该筛选器上的引脚。
音频设备的筛选器作为单独的端口和微型端口驱动程序实现,这些驱动程序绑定在一起以一致方式执行:
- 微型端口驱动程序包含特定于硬件的代码。
- 端口驱动程序包含特定类型的所有筛选器通用的通用代码。
供应商编写微型端口驱动程序,其中包含筛选器管理音频硬件所需的所有专有代码。 操作系统提供的端口驱动程序可通过 PortCls 系统驱动程序访问(Portcls.sys;请参阅 端口类适配器驱动程序和 PortCls 系统驱动程序)。 将筛选器实现划分为端口和微型端口驱动程序简化了为专有设备编写驱动程序的任务。
筛选器工厂实例化筛选器时,会首先为筛选器创建微型端口驱动程序对象。 然后,筛选器工厂将创建相应端口对象的实例,并将微型端口驱动程序对象绑定到该实例,以便形成一个正常运行的筛选器。 Subdevice 创建 中的代码示例演示了此过程。 端口和微型端口驱动程序通过定义完善的软件接口相互通信。 有关这些接口的详细信息,请参阅微型端口接口和支持设备。
音频筛选器将基础音频设备的结构公开为引脚工厂、节点和内部连接的集合。 微型端口驱动程序将此信息合并到筛选器描述符中,该描述符是 PCFILTER_DESCRIPTOR类型的结构。 此结构又包含筛选器的引脚工厂、节点和内部连接的个别描述符。 这些描述符是以下类型的结构:
若要从微型端口驱动程序获取筛选器描述符,端口驱动程序调用 IMiniport::GetDescription 方法。
有关驱动程序如何设置其PCFILTER_DESCRIPTOR结构的示例,请参阅 示例音频驱动程序中讨论的 Sysvad 示例驱动程序。