HFP 设备启动

本文介绍蓝牙无手配置文件(HFP)设备到达音频系统时的过程。

对于到达音频系统的每个配对 HFP 设备,Windows HFP 驱动程序在 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 类中注册设备接口。 音频驱动程序使用设备接口通知来随时了解GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS接口的所有实例。 音频驱动程序从其 AVStrMiniDevicePostStart 驱动程序例程(或来自等效的 Portcls 例程)调用 IoRegisterPlugPlayNotification,以注册回调以发现当前安装的 HFP 设备,并通知新的 HFP 设备。

当音频驱动程序调用 IoRegisterPlugPlayNotification 时,使用以下参数进行调用:

  • EventCategory 设置为 EventCategoryDeviceInterfaceChange。
  • EventCategoryFlags 通常设置为PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES以接收现有接口的即时通知。 但是,某些备用音频驱动程序设计可能通过其他方式查找现有接口。
  • EventCategoryData 设置为GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS。
  • DriverObject 设置为音频驱动程序的 DriverObject。
  • CallbackRoutine 设置为音频驱动程序中的例程,该例程将接收通知。

以下部分概述了音频驱动程序可为配对 HFP 设备的每个已注册实例执行的任务。

处理接口实例

对于在 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 类中注册的每个接口实例,音频驱动程序必须使用以下协议进行通信:

  • 当 Windows 调用在名为 IoRegisterPlugPlayNotification 的音频驱动程序时注册的音频驱动程序回调例程时,Windows 将使用 DEVICE_INTERFACE_CHANGE_NOTIFICATION 传递 HFP 接口的符号链接。SymbolicLinkName
  • 当音频驱动程序调用 IoGetDeviceObjectPointer 时,驱动程序使用符号链接获取 HFP FileObject 和 HFP 设备的 DeviceObject。
  • 当音频驱动程序将 IOCTL 发送到 HFP 驱动程序时,驱动程序将使用 HFP 设备的 HFP FileObject 和 DeviceObject。

检索静态信息

音频驱动程序可以从 HFP 驱动程序中检索静态信息。 例如,HFP 驱动程序可以提供 ksnodetype、容器 ID 和配对 HFP 设备的友好名称。 音频驱动程序可以使用此信息创建和初始化表示配对 HFP 设备的 KS 筛选器或筛选器。 音频驱动程序使用 IOCTL_BTHHFP_DEVICE_GET_DESCRIPTOR 来获取此信息。

音频驱动程序还可以检索配对 HFP 设备的蓝牙地址。 每个配对的 HFP 设备都有唯一的蓝牙地址,该地址可以作为唯一标识符字符串使用。 有关详细信息,请参阅获取 HF 设备的蓝牙地址。

创建、初始化特定于音频的筛选器工厂上下文

若要创建和初始化特定于音频的筛选器工厂上下文,音频驱动程序必须在筛选器工厂上下文中存储 HFP DeviceObject 和 HFP FileObject,然后将 Is连接ed 字段初始化为 false。

创建 KS 筛选器工厂

对于GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS接口类中的每个设备实例,音频驱动程序将创建并启用一个或多个筛选器工厂。

如果音频驱动程序是 AVStream 驱动程序,音频驱动程序将调用 KsCreateFilterFactory 来添加新的筛选器工厂和 KsFilterFactorySetDeviceClassesState 以启用工厂。 如果音频驱动程序是 PortCls 驱动程序,则它通过调用 PcRegisterSubdevice 间接创建和启用 KS 筛选器工厂。 对于许多 PortCls 音频驱动程序设计,有两个子设备已注册到给定配对的 HFP 设备。

每个筛选器工厂(或者,对于 PortCls 音频驱动程序,每对筛选器工厂)都表示单个配对 HFP 设备的音频功能。 音频驱动程序为由GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS接口的唯一实例表示的每个配对 HFP 设备创建单独的筛选器工厂。 对于每个配对的 HFP 设备,音频驱动程序必须为 KsCreateFilterFactory 的 RefString 参数或PcRegisterSubdevice 的名称参数使用唯一字符串。 驱动程序开发人员可能会发现,将配对的 HFP 设备的蓝牙地址字符串用作唯一字符串很有用。 有关如何检索唯一字符串的信息,请参阅获取 HF 设备的蓝牙地址。

请注意,没有特定的可能配对 HFP 设备的最大数目,因此音频驱动程序应避免硬编码特定的限制。 相反,音频驱动程序必须正确处理多个GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS接口的动态到达和删除。

但实际上,当 PortCls 驱动程序调用 PcAddAdapterDevice 时,端口驱动程序必须指定最大数量的子设备。 PcAddAdapterDevice 预分配每个潜在子设备的额外内存。 音频驱动程序开发人员应选择足够高的数字来容纳许多配对设备,但同时选择一个不会导致资源浪费的数字。 例如,仅支持两个 HFP 设备可能不足,并且支持两千台设备肯定会导致资源过度扩展。 但是,支持十六项可能是合理的。

如果在运行时,音频驱动程序收到另一个GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS接口的通知,但已经注册了其最大子设备数,则音频驱动程序可以调用一些算法来选择配对的 HFP 设备,其子设备可以注销,以便为新的 HFP 设备腾出空间。 例如,音频驱动程序可以跟踪具有最早连接的 HFP 设备。 而更简单但可能不太友好的音频驱动程序只需在达到其最大值后忽略其他GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS接口。

发送获取连接状态 IOCTL

音频驱动程序发送获取连接状态 IOCTL,以获取有关连接中发生的任何更改的信息。

发送获取卷状态 IOCTL

音频驱动程序发送获取音量状态 IOCTL,以获取有关耳机音量状态中发生的任何音量级别更改的信息。