音频边带 A2DP 卸载

本主题介绍在 Windows 11 版本 10.0.22000 开始为蓝牙提供的音频信道 A2DP 卸载功能。

音频旁带 A2DP 卸载的主要目标是降低能耗,例如在音乐播放过程中。

本文档假定你熟悉现有的 HF 侧带解决方案。 请参阅音频驱动程序的蓝牙旁路指南及本主题的参见部分中引用的 A2DP 蓝牙规范。

侧带体系结构设计

已验证的音频边带 A2DP 卸载技术基于现有设计构建,旨在通过集成(内置)扬声器或连接的模拟耳机播放线性音频内容时降低功耗。 简言之,这些设计通过供应商特定的音频驱动程序,将大量的音频数据在大约一秒的时间内一并传送到音频数字信号处理器。 主处理器和其他大多数线路进入低功率状态,而音频 DSP 通过内置扬声器流式传输突发音频数据。 当音频数据即将耗尽时,DSP 会向音频驱动程序产生中断,通知操作系统通过音频驱动程序向 DSP 传输更多的音频数据。

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

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

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

此连接通常是 I2S 或 PCM 接口,但也可以是更丰富、更复杂的总线,例如 SLIMbus。 微软将此体系结构称为旁带音频,反映了音频通过备用路径传输到蓝牙(或其他)控制器,而不是通过普通控制器接口(即“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

元素 DESCRIPTION
端点数量 指示已连接设备上的端点数

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

终结点描述符 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR

SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR的定义如下。

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

终结点描述符 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR - 功能

功能的定义如下。

元素 DESCRIPTION
数据量 端点支持音量控制
静音 终结点支持静音控制
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 和蓝牙控制器之间的音频传输。

例如,若存在多个物理或逻辑连接,则此数据可能包括一个传输 ID,并用于配置 PCM 接口信号的使用或定义传输过程中的音频数据格式。

音频驱动程序使用 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 驱动程序在供应商-SIOP 之间执行直接转换,后者是音频驱动程序更自然的数据结构,也是蓝牙 HCI 更自然的音频接口参数。 供应商 SIOP GUID 是通过基本 GUID 加上 4 个字符的蓝牙供应商 ID 构造的。 只有供应商 ID(而不是整个 GUID)经过蓝牙 HCI 传输。

基本 GUID 为 SIDEBANDAUDIO_PARAMS_SET_A2DP.

Microsoft定义的 A2DP SIOP

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

编解码器(编解码器-SIOP)

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

领域 价值
参数集 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 字段设置如下。

领域 价值
参数设置 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。

编解码器活动延迟模式(编解码器延迟模式-SIOP)

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

领域 价值
参数集 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 字段设置如下。

领域 价值
参数设置 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之前设置供应商SIOP参数。

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

在 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2 之后设置的供应商的 SIOPs

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 接口类

接口类是 GUID_DEVINTERFACE_A2DP_SIDEBAND_AUDIO 用于 A2DP 侧带蓝牙音频。

用于 KS 引脚状态转换的 IOCTL

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

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

请参阅 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_* 命令。

蓝牙 Host-Controller 接口(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 和/或蓝牙控制器中托管的蓝牙编解码器。 编解码器-SIOP 为音频驱动程序提供一种机制来指示支持的编解码器列表。 同样, HCI_VS_MS_Avdtp_Capabilities_Configuration 命令允许蓝牙控制器返回受支持的编解码器列表。 请注意,至少一个 A2DP 驱动程序和蓝牙控制器应返回受支持的编解码器列表。

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

如果 IHV 解决方案需要与音频 DSP 和蓝牙控制器功能的编解码器相关的功能相交或合并,则音频驱动程序可以通过编解码器-SIOP(如果标准表示形式足够)或供应商 SIOP 来指示其功能。 A2DP 驱动程序将 SIOP 传递给蓝牙控制器,蓝牙控制器可以根据功能相交的结果,从 HCI_VS_MSFT_Avdtp_Capabilities_Configuration返回支持的编解码器集合。

另请参阅

Microsoft定义的蓝牙 HCI 扩展

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

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

A2DP 1.3.1 (蓝牙规范)

AVDTP 1.3 (蓝牙规范)