内核流式处理注意事项
本文阐明了内核流式处理与蓝牙绕过音频流式传输相关的要求和特殊注意事项。
音频驱动程序应完全支持 WaveRT 端口驱动程序,包括“拉取模式”。 有关详细信息,请参阅 WaveRT 端口驱动程序简介。 尽管不需要为面向同步连接 (SCO) 的旁路输出实现硬件音频引擎,但这样做不会造成任何损害。
格式支持的 Windows 徽标要求包括蓝牙例外。
音频驱动程序应支持通过边带硬件(通常是 8kHz 单声道音频流式传输)可能实现的格式。
拓扑
所有蓝牙免提设备都支持捕获和呈现。 音频驱动程序应公开免提设备的内核流式处理 (KS) 拓扑,如下图所示,以支持呈现和捕获。
注意:音频驱动程序开发人员可以选择是针对捕获和呈现路径还是单独的筛选器实现单个筛选器。 但是,HFP 设备仅允许 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 设备接口上的单个文件对象。 因此,使用两个筛选器的设计需要允许两个筛选器共享单个文件对象。
DAC 和 ADC 节点表示模拟/数字转换,但不支持任何 KS 属性。
音量节点通过将 SETVOLUME 和 GETVOLUMESTATUSUPDATE IOCTLs 发送到 HFP 驱动程序来支持 KSPROPERTY_AUDIO_VOLUMELEVEL 和 KSEVENT_CONTROL_CHANGE。
音量节点应按如下所示实现:
- 如果蓝牙耳机支持音量控制,音频驱动程序应在其 KS 拓扑中包含音量节点。 音频驱动程序的音量属性处理程序将上述 IOCLTs 发送到蓝牙 HFP 驱动程序来处理音量。
- 如果蓝牙耳机未实现硬件音量,并且编解码器(或 DSP)具有硬件音量,音频驱动程序应处理编解码器(或 DSP)上的音量控制。
- 如果蓝牙耳机和音频设备都没有硬件音量控制,则不应显示任何音量节点,并且 Windows 将插入软件音量控制节点。
- 静音节点是可选的。 当且仅当 DSP 或音频编解码器提供在将旁路 PCM 信号传递给蓝牙控制器之前将其静音的功能时,音频驱动程序才应实现静音节点。 静音节点支持 KSPROPERTY_AUDIO_MUTE。
属性请求
音频驱动程序使用以下 KS 属性获取有关音频路径中任何音频插孔的信息。 音频驱动程序还可以使用适当的属性请求来与音频路径中的任何蓝牙音频设备建立或中断连接。
KSPROPERTY_JACK_DESCRIPTION
此属性会返回 KSJACK_DESCRIPTION 结构。 音频驱动程序应按如下所示设置 KSPROPERTY_JACK_DESCRIPTION 字段。
- ChannelMapping = KSAUDIO_SPEAKER_MONO
- Color = 0
- ConnectionType = eConnTypeOtherDigital
- GeoLocation = eGeoLocNotApplicable
- GenLocation = eGenLocOther
- PortConnection = ePortConnUnknown
- IsConnected = <BOOL,表示当前连接状态>
KSPROPERTY_JACK_DESCRIPTION2
此属性会返回 KSJACK_DESCRIPTION2 结构。 音频驱动程序应按如下所示设置 KSPROPERTY_JACK_DESCRIPTION2 字段。
- DeviceStateInfo = 0
- JackCapabilities = JACKDESC2_PRESENCE_DETECT_CAPABILITY
KSPROPERTY_ONESHOT_RECONNECT
音频驱动程序的筛选器应支持 KSPROPERTY_ONESHOT_RECONNECT。 若要创建和初始化此结构,音频驱动程序会将 IOCTL_BTHHFP_DEVICE_REQUEST_CONNECT 发送到 HFP 驱动程序。 HFP 驱动程序完成此请求,然后尝试异步连接到蓝牙音频设备。
KSPROPERTY_ONESHOT_DISCONNECT
音频驱动程序的筛选器应支持 KSPROPERTY_ONESHOT_DISCONNECT。 若要创建和初始化此结构,音频驱动程序会将 IOCTL_BTHHFP_DEVICE_REQUEST_DISCONNECT 发送到 HFP 驱动程序。 HFP 驱动程序完成此请求,然后尝试异步与蓝牙音频设备断开连接。
当音频驱动程序支持这些属性时,控制面板中的“声音”对话框将为 HFP 终结点公开连接和断开连接命令。