音频边带 A2DP 卸载

本主题介绍从 Windows 11 适用于蓝牙的内部版本 10.0.22000 开始提供的音频边带 A2DP 卸载。

音频边带 A2DP 卸载的主要目标是降低能耗,例如在示例音乐播放期间。

本文假定你熟悉现有的 HF 边带解决方案。 请参阅音频驱动程序的蓝牙旁路指南以及本主题的另请参阅部分提到的 A2DP 蓝牙规范。

边带体系结构设计

音频边带 A2DP 卸载基于现有经过验证的设计构建,用于通过集成(内置)扬声器或连接的模拟耳机在播放线性音频内容期间降低功耗。 简言之,这些设计通过供应商特定的音频驱动程序将大量音频数据(秒钟量级)突增为音频 DSP。 主处理器和其他大多数电路进入低功率状态,而音频 DSP 通过内置扬声器流式处理突增音频数据。 当音频数据几乎耗尽时,DSP 会引发音频驱动程序中断,这指示操作系统通过音频驱动程序向 DSP 突增更多音频数据。

下图中的浅灰色组件由 IHV 提供。

带有 IHV 驱动程序的蓝牙音频驱动程序堆栈,使用边带 DDI IOCTL、蓝牙核心和可选传输驱动程序,在堆栈底部具有 DSP 和蓝牙控制器

音频边带 A2DP 卸载也采用蓝牙 SCO 音频路径的通用设计,其中相同的音频 DSP 直接连接到蓝牙控制器。

此连接通常是 I2S 或 PCM 接口,但也可以是更多样、更复杂的总线,例如 SLIMbus。 Microsoft 将此体系结构称为边带音频,这反映音频通过备用路径,而不是普通控制器接口 (“HCI”) 传输到蓝牙(或其他)控制器。 在这种情况下,音频驱动程序将音频数据从 OS 传输到音频 DSP,音频 DSP 通过边带连接将数据传输到硬件总线控制器,然后控制器将音频数据传输到连接的设备。 (对于双向音频,反方向也会发生。)虽然涉及更多组件,但对于正常控制器接口可能具有一定的优势。 在某些用例(主要是手机)中,整个端到端音频信号路径由固件处理,从主处理器卸载。 它还可能提供更好的接口,用于在主机软件之间实时/等时来回传输音频数据。 对于此边带连接,Microsoft 定义音频驱动程序用于支持采用此物理设计的音频终结点的边带 DDI。

组件

IHV 音频驱动程序(音频 DSP 驱动程序)

此驱动程序控制集成的音频终结点、手机音频和 HFP/SCO 边带/卸载。 此功能要求驱动程序也支持 A2DP 卸载。 驱动程序与 HFP/SCO 的责任相同。

IHV 蓝牙传输驱动程序和控制器

A2DP 卸载未在任何蓝牙 SIG 标准中定义。 此功能可增强和添加 Microsoft 定义的蓝牙 HCI 命令。 若要支持此功能,IHV 的蓝牙控制器或 IHV 驱动程序应支持这些命令。

A2DP 配置文件驱动程序

此驱动程序由 Windows 提供。 包括以下函数。

  • 实现 A2DP 和 AVDTP 规范
  • 公开 IHV 音频驱动程序的 PnP 设备接口实例(A2DP 边带接口),以发现、打开和发送请求
  • 支持本文档中定义的边带 IOCTL 请求
  • 为 A2DP 卸载发送 Microsoft 定义的蓝牙 HCI 命令

IHV 音频驱动程序(音频 DSP 驱动程序)要求

如果在系统上为 A2DP 边带流式处理配置音频驱动程序,则应发布一个设备接口,该接口的类 GUID 设置为 GUID_SIDEBANDAUDIO_A2DP_SUPPORT_INTERFACE {2BC51EE4-07AF-49CF-B04B-FB3F1C26AADC}。 此设备接口的发布时间不得晚于音频驱动程序的 PnP 启动时间。

边带数据结构

请注意,音频驱动程序使用的某些数据结构和常量在 sidebandaudio.h 标头中定义。

以下数据结构用于音频边带 A2DP 卸载。

设备描述符 - SIDEBANDAUDIO_DEVICE_DESCRIPTOR

元素 说明
NumberOfEndpoints 指示已连接设备上的终结点数

已连接设备可以是包含多个音频终结点(扬声器、麦克风等)的复合设备。 音频驱动程序可以循环访问每个终结点,并获取进一步的详细信息,以便为每个终结点生成 KS 筛选器。

终结点描述符 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR

SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR 定义如下。

元素 说明
CbSize 终结点描述符的总大小。 这包括用于存储字符串的缓冲区。
ContainerId 终结点的 GUID。 多个终结点的通用 GUID 表示这些终结点包含在同一物理容器中。 操作系统可以轻松关联各种场景的此类终结点。
类别 KSPIN_DESCRIPTOR。 用于指示每个终结点的外形规格的类别。
方向 指示捕获或呈现数据流方向。
功能 (请参阅下表)
FriendlyName 要应用于终结点 KS 筛选器接口上的 DEVPKEY_DeviceInterface_FriendlyName 的终结点的友好名称。
VolumePropertyValuesSize 描述每个通道的音量步进和范围的 KSPROPERTY_DESCRIPTION 结构的大小。
SidetoneVolumePropertyValueSize 描述 Sidetone 每个通道的音量步进和范围的 KSPROPERTY_DESCRIPTION 结构的大小。

终结点描述符 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR - 功能

功能定义如下。

元素 说明
体积 终结点支持音量控制
静音 终结点支持静音控制
Sidetone 终结点支持 Sidetone 控制
反馈 终结点具有关联的反馈通道

SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR2

A2DP 边带使用现有 SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR 结构的更新版本来提供 Windows 音频系统进行终结点标识所需的详细信息 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR2

// Number of device properties that shall be added to the audio filter factory interface.
ULONG                                   FilterInterfacePropertyCount;
DEVPROPERTY*                            FilterInterfaceProperties;

音频驱动程序使用新的 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2 请求获取此数据结构。 请求完成后,音频驱动程序会将这些设备属性添加到其拓扑音频筛选器接口。

音频接口参数

音频设备和蓝牙控制器之间的音频传输接口选择和设计特定于供应商。 此音频传输接口通常是 I2S 或 PCM 接口,但也可以是更多样、更复杂的总线,例如 SLIMbus 或潜在的 SoundWire。 此功能设计对音频传输接口没有具体要求。 但是,如果在音频 DSP 中实现蓝牙编解码器,蓝牙控制器应能够从通过音频传输接口传输的数据中提取编码帧,将这些帧打包到 AVDTP 媒体数据包中用于传输。

音频传输接口的设置和配置(如果有)被视为特定于供应商的任务。 此操作可通过在此功能中的组件之间传递的特定于供应商的音频接口参数来简化。 特定于供应商的参数通常由音频驱动程序供应商和蓝牙控制器和/或传输驱动程序供应商定义。 音频设备和蓝牙控制器使用参数来配置音频 DSP 和蓝牙控制器之间的音频传输接口。

例如,如果有多个物理或逻辑连接、配置 PCM 接口的信号使用或传输中音频数据的格式,则此数据可能包括传输 ID。

音频驱动程序使用 SIOP 设置和获取特定于供应商的音频接口参数,这些参数使用 GUID 和整数标识数据。 但是,为了维护更自然的蓝牙 HCI 命令集,Microsoft 定义的 HCI 命令使用以下结构传递特定于供应商的音频接口参数。

音频接口参数

字段 八进制数
供应商 ID 0..3
供应商特定的参数 ID 4..5
供应商特定值的长度 = (n-9) 6
供应商特定值 7.. n

供应商 ID 在蓝牙分配的编号中定义:https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers

A2DP 驱动程序在 vendor-SIOP 之间执行直接转换,后者是音频驱动程序更自然的数据结构,也是为蓝牙 HCI 提供的更自然的音频接口参数。 供应商 SIOP GUID 由基本 GUID 和 4 个字符的蓝牙供应商 ID 构成。 只有供应商 ID(而不是整个 GUID)通过蓝牙 HCI 传递。

基 GUID 为 SIDEBANDAUDIO_PARAMS_SET_A2DP

Microsoft 定义的 A2DP SIOP

Microsoft 为提供编解码器信息的 A2DP 定义两个 SIOP。 供应商可以定义其他 SIOP 来支持其实现。

编解码器 (codecs-SIOP)

音频驱动程序使用此 SIOP 表示其支持的 A2DP 编解码器(如果有)的列表。 此 SIOP 的 SIDEBANDAUDIO_IO_PARAM_HEADER 字段设置如下。

字段
ParamsSet SIDEBANDAUDIO_PARAMS_SET_A2DP ({8FE0297F-3AE6-4384-ACE3-87589E571B9C})
TypeId SIDEBANDAUDIO_PARAM_A2DP_CODECS (1)
大小 此标头后面的编解码器功能列表的总大小

此标头后面的数据是一系列(大小可变的)编解码器功能结构,如上述编解码器功能信息中所述。

对于本主题的其余部分,此参数称为 codecs-SIOP。

配置的编解码器 (configured-codec-SIOP)

音频驱动程序可以使用此 SIOP 检索当前配置的 A2DP 编解码器。 此 SIOP 的 SIDEBANDAUDIO_IO_PARAM_HEADER 字段设置如下。

字段
ParamsSet SIDEBANDAUDIO_PARAMS_SET_A2DP ({8FE0297F-3AE6-4384-ACE3-87589E571B9C})
TypeId SIDEANDAUDIO_PARAM_A2DP_CONFIGURED_CODEC (2)
大小 此标头后面的编解码器功能的总大小

此标头后面的数据是单个(大小可变的)编解码器功能结构,如上述编解码器功能信息中所述。

此 SIOP 可更新,这意味着音频驱动程序应使用 IOCTL_SBAUD_GET_SIOP_UPDATE 请求来随时了解配置的编解码器中的更改。

对于本主题的其余部分,此参数称为 configured-codec-SIOP。

编解码器主动延迟模式 (codec-latency-mode-SIOP)

音频驱动程序可以使用此 SIOP 检索当前配置的 A2DP 编解码器的主动延迟模式。 此 SIOP 的 SIDEBANDAUDIO_IO_PARAM_HEADER 字段设置如下。

字段
ParamsSet SIDEBANDAUDIO_PARAMS_SET_A2DP
TypeId SIDEBANDAUDIO_PARAM_A2DP_CODEC_LATENCY_MODE
大小 1 个字节

此标头后面的数据是一个字节,该字节被解释为无符号 8 位整数。 值 SIDEBANDAUDIO_CODEC_MODE_HIGH_QUALITY 指示当前配置的编解码器在高质量模式下运行,而值 SIDEBANDAUDIO_CODEC_MODE_LOW_LATENCY 指示编解码器在低延迟模式下运行。 此 SIOP 可更新,这意味着音频驱动程序应使用 IOCTL_SBAUD_GET_SIOP_UPDATE 请求来随时了解延迟模式下的更改。

目前,仅当 aptX 自适应编解码器处于活动状态时,才使用此 SIOP。 有关 aptX 的详细信息,请参阅 Qualcomm aptX 自适应音频

对于本主题的其余部分,此参数称为 codec-latency-mode-SIOP。

编解码器 L2CAP MTU 大小 (mtu-size-SIOP)

音频驱动程序可以使用此 SIOP 检索当前的 L2CAP MTU 大小(以字节为单位)。 此 SIOP 的 SIDEBANDAUDIO_IO_PARAM_HEADER 字段设置如下。

字段
ParamsSet SIDEBANDAUDIO_PARAMS_SET_A2DP
TypeId SIDEBANDAUDIO_PARAM_A2DP_CODEC_MTU_SIZE
大小 2 个字节

此标头后面的数据是 2 个字节,被解释为无符号 16 位整数。 此 SIOP 可更新,这意味着音频驱动程序应使用 IOCTL_SBAUD_GET_SIOP_UPDATE 请求来随时了解 MTU 大小的更改。

目前,仅当 aptX 自适应编解码器处于活动状态时,才使用此 SIOP。 有关 aptX 的详细信息,请参阅 Qualcomm aptX 自适应音频

对于本主题的其余部分,此参数称为 mtu-size-SIOP。

使用供应商定义的 SIOP

音频驱动程序可以设置供应商定义的 SIOP。

在打开边带接口之后,处理 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR 之前设置 Vendor-SIOP

A2DP 驱动程序将 SIOP 值保存在系统配置供应商 SIOP 集合中。 A2DP 驱动程序在处理 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2 时将此集合发送到蓝牙控制器(使用 HCI_VS_MSFT_Avdtp_Capabilities_Configuration)。 蓝牙控制器返回的任何音频接口参数也存储在系统配置供应商 SIOP 集合中。 音频驱动程序可以在 IOCTL 完成后随时获取这些值。

处理 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2 后设置的供应商 SIOP

A2DP 驱动程序处理 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2 后,音频驱动程序发送的任何 SIOP 将失败。

供应商 SIOP 在处理 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR 之后和处理 IOCTL_SBAUD_STREAM_OPEN 之前设置

A2DP 驱动程序将 SIOP 值保存在流配置供应商 SIOP 集合中。 A2DP 驱动程序在处理 IOCTL_SBAUD_STREAM_OPEN 时将此集合发送到蓝牙控制器(使用 HCI_VS_MSFT_Avdtp_Open)。 蓝牙控制器返回的任何音频接口参数也存储在流配置供应商 SIOP 集合中。 音频驱动程序可以在 IOCTL 完成后随时获取这些值。

处理 IOCTL_SBAUD_STREAM_CLOSE时,A2DP 驱动程序会清除流配置供应商 SIOP 的集合。 (它不清除系统配置供应商 SIOP 的集合。)

A2DP 边带接口

A2DP 边带使用泛型 IOCTL_SBAUD_* 请求。 有关 IOCTL 的完整列表,请参阅 sidebandaudio.h 标头。 本部分提供特定于 A2DP 的信息。

PnP 接口类

接口类适用于 A2DP 边带蓝牙音频的 GUID_DEVINTERFACE_A2DP_SIDEBAND_AUDIO

用于 KS 引脚状态转换的 IOCTL

音频驱动程序针对某些 KS 引脚状态转换发送这些请求。

Microsoft 定义的蓝牙 HCI 扩展,用于 A2DP 卸载

有关当前定义的扩展,请参阅 Microsoft 定义的蓝牙 HCI 扩展

HCI_VS_MSFT_Read_Supported_Features

音频边带 A2DP 卸载通过在 Supported_features 返回参数中定义另一个位来指示对 AVDTP 卸载命令的支持,从而增强 HCI_VS_MSFT_Read_Supported_Features 命令。 重新设置此位后,应支持本部分中的剩余命令。

有关命令和返回参数的说明,请参阅 HCI_VS_MSFT_Read_Supported_Features

有关 Supported_features(8 个八进制数)值,另请参阅 HCI_VS_MSFT_Read_Supported_Features。 另一个值用于指示控制器支持 AVDTP 卸载,以及 Microsoft 定义的 AVDTP 蓝牙 HCI 事件中描述的 HCI_VS_MSFT_Avdtp_* 命令。

蓝牙主机控制器接口 (HCI) 指定主机和蓝牙无线电控制器之间的所有交互。 蓝牙规范允许供应商定义的 HCI 命令和事件在主机和控制器之间启用非标准化交互。 Microsoft 定义了 Windows 使用的特定于供应商的 HCI 命令和事件。 以下 Microsoft 定义 HCI 命令用于音频边带卸载。

蓝牙主题介绍了以下 AVDTP HCI 命令 - Microsoft 定义的 AVDTP 蓝牙 HCI 事件

HCI_VS_MSFT_Avdtp_Capabilities_Configuration

子命令操作码值:7

配置音频传输接口并返回蓝牙控制器的编解码器功能,即编解码器信息块的列表。 每个编解码器信息块描述一个支持的编解码器。 有关详细信息,请参阅 HCI_VS_MSFT_Avdtp_Capabilities_Configuration

HCI_VS_MSFT_Avdtp_Open

子命令操作码值:8

在控制器中分配和配置 AVDTP 卸载资源。 有关详细信息,请参阅 HCI_VS_MSFT_Avdtp__Open

HCI_VS_MSFT_Avdtp_Start

子命令操作码值:9

此命令开始从音频传输接口到传输的 AVDTP 媒体数据包的音频流式处理。 有关详细信息,请参阅 HCI_VS_MSFT_Avdtp_Start

HCI_VS_MSFT_Avdtp_Suspend

子命令操作码值:0xA

停止由 HCI_VS_MSFT_Avdtp_Start 启动的流式处理活动。 有关详细信息,请参阅 HCI_VS_MSFT_Avdtp_Suspend

HCI_VS_MSFT_Avdtp_Close

子命令操作码值:0xB

释放由 HCI_VS_MSFT_Avdtp_Open 分配的 AVDTP 卸载资源。 有关详细信息,请参阅 HCI_VS_MSFT_Avdtp_Close

音频 DSP 或蓝牙控制器中的蓝牙编解码器

该实现适用于音频 DSP 和/或蓝牙控制器中托管的蓝牙编解码器。 codecs-SIOP 为音频驱动程序提供一种机制来指示支持的编解码器列表。 同样,HCI_VS_MS_Avdtp_Capabilities_Configuration 命令允许蓝牙控制器返回支持的编解码器列表。 请注意,至少一个 A2DP 驱动程序和蓝牙控制器应返回支持的编解码器列表。

A2DP 驱动程序无法可靠地插入或合并音频驱动程序和蓝牙控制器支持的 A2DP 编解码器列表。 如果两者都返回 A2DP 支持的编解码器,Windows 仅使用蓝牙传输驱动程序返回的列表。

如果 IHV 解决方案需要插入或合并音频 DSP 和蓝牙控制器功能的编解码器相关功能,则音频驱动程序可以通过 codecs-SIOP(如果提供足够的标准表示形式)或 vendor-SIOP 来指示其功能。 A2DP 驱动程序将 SIOP 传递到蓝牙控制器,然后插入功能,并返回 HCI_VS_MSFT_Avdtp_Capabilities_Configuration 支持的编解码器集。

另请参阅

Microsoft 定义的蓝牙 HCI 扩展

音频驱动程序的蓝牙旁路指南

用于蓝牙功率控制处理的传输总线驱动程序指南

A2DP 1.3.1(蓝牙规范)

AVDTP 1.3(蓝牙规范)