蓝牙低功耗 (BLE) 音频

本文概述了 Windows 11 版本 22H2 (KB5026446) 中引入的蓝牙 LE 音频。

介绍

蓝牙 LE 音频允许通过等时传输将单播或广播音频流式传输至蓝牙 LE 设备。 从蓝牙核心规范版本 5.3 开始,主机平台没有任何标准定义的主机控制器接口 (HCI) 可向蓝牙控制器发送以及从其接收等时数据。 本文档定义了 Windows 蓝牙供应商特定的音频路径 (VSAP),以允许平台使用特定于供应商的解决方案来启用蓝牙 LE 音频流式处理。 VSAP 软件接口使用本文档中定义的 Windows 音频类扩展 (ACX) 和更多接口属性。

术语和先决条件

除此表中定义的术语外,本文档还引用了由 Windows 音频类扩展定义的术语。

术语 定义
LE 音频 蓝牙 LE 音频的简称
经典音频 使用免手配置文件 (HFP) 和高级音频分发配置文件 (A2DP) 的蓝牙音频流式传输
音频设备 单个远程蓝牙 LE 音频设备或一组蓝牙 LE 音频设备,这些设备从 Windows 的角度共同组成单个音频终结点。
BAP 基本音频配置文件定义了设备如何使用蓝牙低功耗 (LE) 通信来分发和使用音频。
TMAP 电话和媒体音频配置文件指定了较低级别的音频服务和配置文件的可互操作配置。
ASCS 音频流控制服务定义了蓝牙 LE 音频设备配置和建立单播音频流的标准方法。
PACS 已发布的音频功能服务定义了蓝牙 LE 音频设备报告其支持的音频编解码器功能的标准方法。
CIS 连接的等时流传输用于在蓝牙 LE 设备之间发送和接收单播音频数据。
BIS 广播等时流传输用于无连接音频数据传输。
ACX 音频类扩展的缩写,这是所有音频驱动程序在 Windows 上支持蓝牙 LE 音频所需的驱动程序模型。
流式传输线路 供应商特定的音频驱动程序堆栈为其流式处理路径创建的一个或多个 ACXCIRCUIT 对象。
配置文件线路 由 Windows 上的蓝牙 LE 音频配置文件实现创建的 ACXCIRCUIT 对象。 此 ACXCIRCUIT 充当 ACX 规范中定义的头线路,不是流式传输线路。

本文档假定熟悉之前定义的术语和蓝牙核心 5.3 规范中定义的以下 HCI 命令:

  • HCI_Read_Local_Supported_Codecs (v2)
  • HCI_Read_Local_Supported_Codec_Capabilities
  • HCI_LE_Set_CIG_Parameters
  • HCI_LE_Create_CIS
  • HCI_Configure_Data_Path
  • HCI_LE_Setup_ISO_Data_Path
  • HCI_LE_Remove_ISO_Data_Path
  • HCI_LE_Remove_CIG

蓝牙 LE 音频 VSAP 要求音频驱动程序使用 ACX 框架。 针对蓝牙 LE 音频采用 ACX 提供了多种优势,例如:

  • 支持适用于今后的 Windows 版本的首选音频驱动程序模型。
  • 使用 ACX 对多堆栈音频解决方案的本机支持,而无需在驱动程序之间使用专用的 DDI。
  • 不需要 IHV 音频驱动程序将来自音频系统的请求中继到蓝牙堆栈。 相反,ACX 可以通过配置文件线路将请求直接发送到蓝牙堆栈。

体系结构

定义

不同的 VSAP 体系结构变体中涉及以下组件。

Windows ACX 框架

此组件支持多栈音频终结点。 对于蓝牙 LE 音频,构成音频终结点的软件组件是供应商特定的音频驱动程序堆栈和 Windows 蓝牙 LE 音频配置文件。

供应商特定的音频驱动程序堆栈

此供应商特定组件负责通过供应商定义的音频接口向蓝牙控制器发送蓝牙 LE 音频数据,以及从其接收蓝牙 LE 音频数据。 它至少由 ACX 流式处理驱动程序组成,用于管理传入和传出音频数据。 如果有更多 ACX 驱动程序是多线路 ACX 音频终结点的必要部分,则可能会包含这些驱动程序。 在本文档中,此组件也称为 IHV ACX 流式处理驱动程序。

Windows 蓝牙 LE 音频配置文件

此组件包含基本音频配置文件 (BAP)、音量控制配置文件和麦克风控制配置文件的实现。 它负责为每个蓝牙 LE 音频设备或与 Windows 配对的一组设备创建头 ACXCIRCUIT,报告远程设备和蓝牙控制器所报告的音频格式,并管理等时通道和组的状态。

Windows 蓝牙核心堆栈

此组件提供一个接口,允许 Windows 蓝牙 LE 音频配置文件从本地蓝牙控制器查询支持的编解码器功能,以及管理等时通道和组的状态。

LC3 编解码器

此子组件负责在压缩的 LC3 音频和 PCM 音频之间进行转换。 它应同时支持编码和解码功能,并且可以在软件中作为供应商特定的音频驱动程序 (VSAP) 堆栈的一部分来实现,或在硬件中作为音频 DSP 或蓝牙控制器的一部分来实现。 该图按名称提及 LC3,因为它是蓝牙 SIG 支持的标准编解码器。 但是,Windows 日后支持的编解码器和供应商特定的编解码器也可能以类似的方式合并到体系结构中。

体系结构变体

蓝牙 LE 音频 VSAP 体系结构支持不同的流式处理变体。

  1. 无音频卸载的边带蓝牙 LE 音频流式处理
  2. 有无音频卸载的边带蓝牙 LE 音频流式处理
  3. 供应商特定的带内蓝牙 LE 音频流式处理

在以下各图中,带阴影的组件由 IHV 提供,不带阴影的组件由 OS 提供。

无音频卸载的边带蓝牙 LE 音频体系结构

边带体系结构使用供应商特定的音频接口,以允许音频驱动程序堆栈向蓝牙控制器发送音频数据以及从其接收音频数据。 此数据路径不同于用于其他蓝牙数据的 HCI 数据路径,例如在单播客户端和远程单播服务器之间发出消息信号。 下图模拟了一个边带体系结构,其中 LC3 编解码器托管在蓝牙控制器中。 将 LC3 编解码器托管在供应商特定的音频驱动程序堆栈中进行软件编码和解码也是有效的。 在这种情况下,发送到蓝牙控制器的音频将格式化为 LC3 音频帧,而非 PCM 音频。

下图显示了蓝牙控制器中具有 LC3 编解码器的边带蓝牙 LE 音频体系结构。

位于蓝牙控制器中的 LC3 编解码器的侧带蓝牙 LE 音频体系结构示意图。

下图显示了音频驱动程序堆栈中具有 LC3 编解码器的边带蓝牙 LE 音频体系结构。

位于音频驱动程序堆栈中的 LC3 编解码器的侧带蓝牙 LE 音频体系结构示意图。

有音频卸载的边带蓝牙 LE 音频体系结构

带音频卸载的边带体系结构包含音频 DSP 硬件组件,用于提供具有省电优势的蓝牙 LE 音频流式处理解决方案。 下图演示了在蓝牙控制器中具有 LC3 编解码器以及在音频 DSP 中具有该编解码器的可能体系结构。

下图显示了蓝牙控制器中具有 LC3 编解码器的边带蓝牙 LE 音频(带音频卸载)体系结构。

带有音频卸载体系结构的侧带蓝牙 LE 音频示意图,其中蓝牙控制器中具有 LC3 编解码器。

下图显示了音频 DSP 中具有 LC3 编解码器的边带蓝牙 LE 音频(带音频卸载)体系结构。

带带蓝牙 LE 音频与音频卸载体系结构的关系图,其中音频 DSP 中具有 LC3 编解码器。

供应商特定的带内蓝牙 LE 音频体系结构

VSAP 带内体系结构使自定义管道能够向蓝牙控制器的 HCI 发送来自供应商特定音频驱动程序堆栈的蓝牙 LE 音频数据,以及从蓝牙控制器的 HCI 接收这些数据。 此体系结构包含一个新组件“IHV ISO 合并组件”。此组件负责管理 ISO 数据的流控制。 如果需要发送任何 HCI 命令,它还应与 Windows 蓝牙核心堆栈共享 HCI 命令流控制。

下图显示了供应商特定的带内蓝牙 LE 音频体系结构。

特定于供应商的带式蓝牙 LE 音频体系结构示意图。

详细设计

音频格式要求

音频帧持续时间

蓝牙 LE 音频配置文件允许实现支持音频帧持续时间为 7.5 毫秒或 10 毫秒的音频流式处理。 Windows 要求 IHV 提供的编解码器支持这两个帧持续时间,以确保与蓝牙 LE 音频配件设备的互操作性,并与连接到系统的其他蓝牙 LE 设备保持质量共存。

信号处理模式定义

蓝牙 LE 音频支持各种流式处理格式,从而支持不同的用户场景。 BAP 和 TMAP 规范定义了认证必须强制支持的格式。 Windows 会应用 音频信号处理模式,将要使用的格式与系统正在执行的方案相关联。 支持蓝牙 LE 音频的音频驱动程序应指示对下表中的信号处理模式和格式的支持。 此外,蓝牙 LE 音频不支持原始信号处理模式,因此音频驱动程序不应为此模式播发任何受支持的格式。

呈现流音频信号处理模式

蓝牙 LE 音频要求为以下信号处理模式声明呈现音频格式:

  • 默认 (AUDIO_SIGNALPROCESSINGMODE_DEFAULT)
    • 此模式用于单向呈现场景,例如音乐播放、通知和视频游戏音频。
  • 通信 (AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS)
    • 此模式用于双向场景,例如语音呼叫。

以下各表列出了每种用例的格式和信号处理模式。 音频格式按优先顺序从高到低排列。

连接到立体声设备或设备协调集时的系统声音、音乐播放和视频游戏音频

信号处理模式:默认

采样频率 通道计数 位深度 帧持续时间 音频数据速率 BAP 编解码器配置 ID(BAP 规范表 3.11)
48 kHz 2 16 7.5 毫秒 96 kbps 48_3
48 kHz 2 16 7.5 毫秒 80 kbps 48_1
48 kHz 2 16 10 毫秒 96 kbps 48_4
48 kHz 2 16 10 毫秒 80 kbps 48_2
24 kHz 2 16 7.5 毫秒 48 kbps 24_1
24 kHz 2 16 10 毫秒 48 kbps 24_2
连接到协调集的单个成员(单个耳塞或助听器)时的系统声音、音乐播放和视频游戏音频

信号处理模式:默认

采样频率 通道计数 位深度 帧持续时间 音频数据速率 BAP 编解码器配置 ID(BAP 规范表 3.11)
48 kHz 1 16 7.5 毫秒 96 kbps 48_3
48 kHz 1 16 7.5 毫秒 80 kbps 48_1
48 kHz 1 16 10 毫秒 96 kbps 48_4
48 kHz 1 16 10 毫秒 80 kbps 48_2
24 kHz 1 16 7.5 毫秒 48 kbps 24_1
24 kHz 1 16 10 毫秒 48 kbps 24_2
16 kHz 1 16 7.5 毫秒 32 kbps 16_1
16 kHz 1 16 10 毫秒 32 kbps 16_2
具有语音聊天的呈现语音录制器、VOIP 呼叫或视频游戏音频

信号处理模式:通信

采样频率 通道计数 位深度 帧持续时间 音频数据速率 BAP 编解码器配置 ID(BAP 规范表 3.11)
32 kHz 1 16 7.5 毫秒 64 kbps 32_1
32 kHz 1 16 10 毫秒 64 kbps 32_2
24 kHz 1 16 7.5 毫秒 48 kbps 24_1
24 kHz 1 16 10 毫秒 48 kbps 24_2
16 kHz 1 16 7.5 毫秒 32 kbps 16_1
16 kHz 1 16 10 毫秒 32 kbps 16_2
捕获流音频信号处理模式

蓝牙 LE 音频要求为默认 (AUDIO_SIGNALPROCESSINGMODE_DEFAULT) 信号处理模式声明捕获音频格式。 支持的捕获格式列表如下表所示。

音频格式按优先顺序从高到低排列。

具有语音聊天的捕获语音录制器、VOIP 呼叫或视频游戏音频

信号处理模式:默认

采样频率 通道计数 位深度 帧持续时间 音频数据速率 BAP 编解码器配置 ID(BAP 规范表 3.11)
32 kHz 1 16 7.5 毫秒 64 kbps 32_1
32 kHz 1 16 10 毫秒 64 kbps 32_2
24 kHz 1 16 7.5 毫秒 48 kbps 24_1
24 kHz 1 16 10 毫秒 48 kbps 24_2
16 kHz 1 16 7.5 毫秒 32 kbps 16_1
16 kHz 1 16 10 毫秒 32 kbps 16_2

定义的流配置和拓扑

仅限呈现的配置
基本音频配置文件配置 1

蓝牙 BAP 规范的表 4.1 中定义了以下音频配置

说明基本音频配置文件配置 1 的关系图。

电脑连接到支持单声道流的单个音频设备。 单个设备可以是独立设备,也可以是协调集的单个连接的成员。

用例示例 Windows 音频设置 蓝牙控制器设置
媒体播放 Render
信号处理模式:默认
通道计数:1
捕获:无
CIS 计数:1
CIG 计数:1
BAP QoS 设置:可靠性高
音频设备上没有麦克风的语音呼叫 Render
信号处理模式:通信
通道计数:1
捕获:无
CIS 计数:1
CIG 计数:1
BAP QoS 设置:低延迟
视频游戏播放 Render
信号处理模式:默认
通道计数:1
捕获:无
CIS 计数:1
CIG 计数:1
BAP QoS 设置:低延迟
基本音频配置文件配置 4

蓝牙 BAP 规范的表 4.1 中定义了以下音频配置

说明基本音频配置文件配置 4 的关系图。

电脑连接到支持立体声流的单个音频设备。 音频设备能够在单个 CIS 上处理两个音频通道。

用例示例 Windows 音频设置 蓝牙控制器设置
媒体播放 呈现:信号处理模式:默认
通道计数:2
捕获:无
CIS 计数:1
CIG 计数:1
BAP QoS 设置:高可靠性音频通道分配:左前和右前
视频游戏播放 信号处理模式:默认
通道计数:2
捕获:无
CIS 计数:1
CIG 计数:1
BAP QoS 设置:低延迟
音频通道分配:左前和右前
基本音频配置文件配置 6(i)

蓝牙 BAP 规范的表 4.1 中定义了以下音频配置

说明基本音频配置文件配置 6 I 的关系图。

电脑连接到支持立体声流的单个音频设备。 音频设备仅能够处理两个 CIS 中的一个音频通道

用例示例 Windows 音频设置 蓝牙控制器设置
媒体播放 信号处理模式:默认
通道计数:2
捕获:无
CIS 计数:2
CIG 计数:1
BAP QoS 设置:可靠性高
音频设备上没有麦克风的语音呼叫 信号处理模式:通信
通道计数:1
捕获:无
CIS 计数:2
CIG 计数:1
BAP QoS 设置:低延迟
音频通道分配:左前或右前
视频游戏播放 信号处理模式:默认
通道计数:2
捕获:无
CIS 计数:2
CIG 计数:1
BAP QoS 设置:低延迟
音频通道分配:左前和右前
基本音频配置文件配置 6(ii)

蓝牙 BAP 规范的表 4.1 中定义了以下音频配置

说明基本音频配置文件配置 6 II 的关系图。

电脑连接到音频设备协调集。 该组能够处理两个音频通道,每个成员处理一个通道。

用例示例 Windows 音频设置 蓝牙控制器设置
媒体播放 信号处理模式:默认
通道计数:2
捕获:无
CIS 计数:2
CIG 计数:1
BAP QoS 设置:可靠性高
任一设备上没有麦克风的语音呼叫 信号处理模式:通信
通道计数:1
捕获:无
CIS 计数:2
CIG 计数:1
BAP QoS 设置:低延迟
视频游戏播放 信号处理模式:默认
通道计数:2
捕获:无
CIS 计数:2
CIG 计数:1
BAP QoS 设置:低延迟
双向配置

当蓝牙 LE 音频配置文件检测到应用程序打算同时创建流向远程设备或一组设备的捕获流和呈现流时,将使用双向配置。 由于应用程序单独控制捕获流和呈现流,因此 IHV 音频驱动程序和蓝牙控制器应在使用 HCI 命令“配置数据路径”和“LE 设置 ISO 数据路径”预配音频后,允许音频流经双向 CIS 的一个方向。

基本音频配置文件配置 3

蓝牙 BAP 规范的表 4.1 中定义了以下音频配置

说明基本音频配置文件配置 3 的关系图。

电脑连接到在单个 CIS 上建立了双向单声道流的单个音频设备。

用例 Windows 音频设置 蓝牙控制器设置
语音呼叫 Render
信号处理模式:通信
通道计数:1
捕获:
信号处理模式:默认
通道计数:1
CIS 计数:1
CIG 计数:1
BAP QoS 设置:低延迟
具有语音聊天的视频游戏播放 Render
信号处理模式:通信
通道计数:1
捕获:
信号处理模式:默认
通道计数:1
CIS 计数:1
CIG 计数:1
BAP QoS 设置:低延迟
基本音频配置文件配置 8(i)

蓝牙 BAP 规范的表 4.1 中定义了以下音频配置

说明基本音频配置文件配置 8 I 的关系图。

电脑连接到支持立体声呈现流和单声道捕获流的单个音频设备。 该设备能够针对给定方向在单个 CIS 上处理一个音频通道。

用例 Windows 音频设置 蓝牙控制器设置
语音呼叫 Render
信号处理模式:通信
通道计数:1
捕获:
信号处理模式:默认
通道计数:1
CIS 计数:2
CIG 计数:1
BAP QoS 设置:低延迟
具有语音聊天的视频游戏播放 Render
信号处理模式:通信
通道计数:2
捕获:
信号处理模式:默认
通道计数:1
CIS 计数:2
CIG 计数:1
BAP QoS 设置:低延迟
基本音频配置文件配置 8(ii)

蓝牙 BAP 规范的表 4.1 中定义了以下音频配置

说明基本音频配置文件配置 8 II 的关系图。

电脑连接到音频设备协调集。 每个组成员都将接收一个呈现音频通道。 单个组成员具有已建立的捕获流。 具有捕获流的组成员是连接到支持捕获流的电脑的第一个组成员。

用例 Windows 音频设置 蓝牙控制器设置
语音呼叫 Render
信号处理模式:通信
通道计数:1
捕获:
信号处理模式:默认
通道计数:1
CIS 计数:2
CIG 计数:1
BAP QoS 设置:低延迟
具有语音聊天的视频游戏播放 Render
信号处理模式:通信
通道计数:2
捕获:
信号处理模式:默认
通道计数:1
CIS 计数:2
CIG 计数:1
BAP QoS 设置:低延迟
仅限捕获的配置
基本音频配置文件配置 2

蓝牙 BAP 规范的表 4.1 中定义了以下音频配置

说明基本音频配置文件配置 2 的关系图。

电脑连接到支持单声道捕获流的单个音频设备。

用例 Windows 音频设置 蓝牙控制器设置
设备上没有扬声器的语音呼叫 呈现:无
捕获:
信号处理模式:默认
通道计数:1
CIS 计数:1
CIG 计数:1
BAP QoS 设置:低延迟
基本音频配置文件配置 9(i)

蓝牙 BAP 规范的表 4.1 中定义了以下音频配置

说明基本音频配置文件配置 9 I 的关系图。

电脑连接到支持发送立体声音频数据的单个音频设备。 该设备能够在单个 CIS 上编码一个音频通道。

用例 Windows 音频设置 蓝牙控制器设置
多通道麦克风捕获 呈现:无
捕获:
信号处理模式:默认
通道计数:1
CIS 计数:2
CIG 计数:1
BAP QoS 设置:低延迟
基本音频配置文件配置 9(ii)

电脑连接到支持单声道捕获流的单个音频设备。

蓝牙 BAP 规范的表 4.1 中定义了以下音频配置

显示连接到单个音频设备的电脑的基本音频配置文件配置 9(ii) 的关系图。

电脑连接到一组音频设备。 每个组成员将一个音频通道发送到电脑。

用例 Windows 音频设置 蓝牙控制器设置
多通道麦克风捕获 呈现:无
捕获:
信号处理模式:默认
通道计数:1
CIS 计数:2
CIG 计数:1
BAP QoS 设置:低延迟

如果远程设备或设备组支持双向音频,则仅限捕获流的配置与双向配置相同。 这样就可以从仅捕获场景过渡到双向场景,而无需重新创建流。

数据结构

Microsoft 定义的蓝牙 LE 音频接口属性

流创建属性

以下属性通过 ACXOBJECTBAG DDI供应商特定的音频驱动程序堆栈和蓝牙 LE 音频配置文件之间共享,以告知流终结点创建和配置决策,如流创建方案所示

BluetoothLEAudio_CodecCapabilities

此属性由音频驱动程序设置,用以指示对音频驱动程序或音频 DSP 中支持的音频流式处理功能的支持。 属性值是使用 DDI AcxObjectBagAddBlob 设置的,该值的格式与 PACS 规范中定义的 PAC 记录相同。

Windows 蓝牙 LE 音频配置文件会读取此属性以确定要使用的可能编解码器配置和流构成。

字段 八进制数
功能计数 0
编解码器 ID[i] 1-6
编解码器特定功能长度[i] 7
编解码器特定功能 8... n
元数据长度 (m) n + 1
元数据 n+2... m

字段值在 PACS 规范的表 3.2 和 3.4 中定义。

Bluetooth_DatapathID

此属性由音频驱动程序设置,以指示用作 HCI_LE_Setup_ISO_Data_Path 和 HCI_Configure_Data_Path 命令的参数的数据路径 ID。 使用 AcxObjectBagAddUI8 DDI 设置属性值。

蓝牙 LE 音频配置文件会读取此属性,并将其用作 HCI_Configure_Data_Path 和 HCI_LE_Setup_ISO_Data_Path 命令中的参数。 此 ID 适用于为与对象包关联的 ACXSTREAM 创建的所有等时流。

字段 八进制数
数据路径 ID 0

如果音频驱动程序未设置此属性,则 OS 将使用值 1 作为 HCI 命令的参数。

Bluetooth_DatapathConfiguration

此属性由音频驱动程序设置,以便通过 HCI_Configure_Data_Path 命令向蓝牙控制器提供供应商特定配置。 它不应大于 255 字节,这是蓝牙控制器接受 HCI 命令使用的最大有效负载。 使用 AcxObjectBagAddBlob DDI 设置属性值。 此配置适用于音频驱动程序设置的所有数据路径 ID。

BluetoothLEAudio_CodecConfiguration

此属性应由蓝牙 LE 音频配置文件使用 DDI AcxObjectBagAddBlob 在编解码器配置配置了音频设备后设置。 值的结构为:

字段 八进制数
配置计数 0
编码格式[i] 3
公司 ID[i] 1-2
供应商专用编解码器 ID[i] 3-4
编解码器特定配置长度[i] 5
编解码器特定配置[i] 6... n

字段值在蓝牙音频流控制服务规范的表 4.3 中定义。

如果 LC3 编解码器位于 ACX 流式处理驱动程序或音频 DSP 中,供应商特定的音频驱动程序堆栈应读取此属性。

接口

音频终结点模板绑定 ID

音频驱动程序的 ACX 线路工厂使用此 ID 来了解何时创建了配对蓝牙设备的 ACX 线路。

以下组件 ID 用于创建蓝牙 LE 音频线路:

// {5C52FDB5-722A-4AB7-A342-70163B7E9B5C}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_RENDER_COMPONENT_ID,
0x5c52fdb5, 0x722a, 0x4ab7, 0xa3, 0x42, 0x70, 0x16, 0x3b, 0x7e, 0x9b, 0x5c);

// {1DFF2EE3-AE89-441C-BDE3-24F885C55DF8}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_CAPTURE_COMPONENT_ID,
0x1dff2ee3, 0xae89, 0x441c, 0xbd, 0xe3, 0x24, 0xf8, 0x85, 0xc5, 0x5d, 0xf8);

蓝牙 LE 音频支持接口

音频驱动程序堆栈使用该接口来指示它可用于流式处理蓝牙 LE 音频。 Windows 蓝牙音频服务级别会监视此接口,并等到发布后再启用蓝牙 LE 音频支持。

以下接口 ID 用于发布蓝牙 LE 音频支持接口:

// {BA02FA1B-0FD0-4A0F-A748-4FAE2E2D2F67}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE, 
0xba02fa1b, 0x0fd0, 0x4a0f, 0xa7, 0x48, 0x4f, 0xae, 0x2e, 0x2d, 0x2f, 0x67);

序列

音频驱动程序初始化

当 IHV ACX 流式处理驱动程序加载并确定它支持蓝牙 LE 音频流式处理时,它应通过以下方法来显示对该技术的支持:创建 ACXFACTORYCIRCUIT 对象,并使用音频终结点模板绑定 ID 中定义的 ID 向 ACX 注册蓝牙模板绑定。

说明蓝牙 LE 音频驱动程序初始化序列的流程图。

终结点创建

  1. 当 LE 音频设备与系统配对时,蓝牙 LE 音频配置文件会:
    1. 读取远程设备的已发布音频功能。
    2. 通过发送 HCI_Read_Local_Support_Codecs [v2] 和 HCI_Read_Local_Supported_Codec_Capabilities 命令来发现控制器支持的功能。
    3. 使用基于蓝牙控制器和远程音频设备支持的编解码器功能设置的受支持格式创建 ACXCIRCUIT。 如果控制器不支持任何编解码器(因为编解码器支持位于音频 DSP 或音频驱动程序中),则受支持的格式将设置为远程音频设备所支持的格式。
  2. 创建 ACXCIRCUIT 后,ACX 会请求 IHV ACX ACX 流式处理驱动程序的 ACX 线路工厂创建 ACXCIRCUIT 进行流处理。
  3. 收到创建线路的请求时,IHV ACX 流式处理驱动程序会:
    1. 创建 ACXCIRCUITACXPINACXOBJECTBAGACXSTREAMBRIDGE 对象。
    2. 如果 LC3 或供应商专用编解码器托管在音频驱动程序或 DSP 中,则 IHV ACX 流式处理驱动程序会在 ACXOBJECTBAG 上设置 BluetoothLEAudio_CodecCapabilities 属性。
    3. IHV ACX ACX 流式处理驱动程序可能会在 ACXOBJECTBAG 上设置 Bluetooth_DatapathIDBluetooth_DatapathConfiguration(如果目前已知)。
  4. 创建两条线路后,ACX 将在 IHV ACX 驱动程序的桥接引脚上调用 EvtAcxPinConnected 回调。
  5. 调用 EvtAcxPinConnected 时,IHV ACX 流式处理驱动程序会:
    1. 使用 AcxTarget... API 检索配置文件线路的桥接引脚,以检索该线路支持的格式。
    2. 循环访问配置文件线路设置的 ACXDATAFORMAT 列表。 如果蓝牙音频编解码器托管在音频驱动程序或音频 DSP 中,则 IHV 音频驱动程序会使用编解码器和配置文件线路支持的格式更新其 ACXDATAFORMAT。 否则,所有格式都将复制到 IHV ACX ACX 流式处理驱动程序的主机引脚。
    3. 如果为卸载流式处理创建了音频引擎,则在桥接引脚上设置更新后的格式列表。
  6. 更新这些格式后,ACX 会启用这两个接口,并创建音频终结点。

描述蓝牙 LE 音频终结点创建过程的流程图。

流创建

  1. 当应用程序请求创建音频流时,ACX 会为每个线路调用已注册的 EvtCircuitCreateStream 回调,从 IHV ACX 流式处理驱动程序开始。
  2. 调用 EvtCircuitCreateStream 回调时,IHV ACX 流式处理驱动程序会:
    1. 设置或更新 ACXOBJECTBAG 上附加到 ACXSTREAMBRIDGE 的 Bluetooth_DatapathId 和 Bluetooth_DataPathConfiguration 属性。
    2. 创建一个 ACXSTREAM,其中包含为流状态转换和 RT 流处理设置的回调
    3. 如果音频管道支持卸载流,请在流中创建音频引擎元素。
    4. ACXSTREAM 添加到其流桥。 这会调用蓝牙 LE 音频配置文件的 EvtCircuitCreateStream 回调。
  3. 调用 EvtAcxCircuitCreateStream 回调时,蓝牙 LE 音频配置文件会:
    1. 从 IHV ACX ACX 流式处理驱动程序设置的 ACXOBJECTBAG 本地保存属性,以用于将来的流转换回调。
    2. 如果音频终结点用于单播流式传输蓝牙 LE 音频配置文件:
      1. 执行 BAP 规范中定义的配置编解码器操作。 该操作的参数派生自 EvtAcxCircuitCreateStream 回调中指定的 ACXDATAFORMAT,以及 ACXOBJECTBAG 中的其他流参数或蓝牙控制器支持的编解码器功能。
      2. 使用用于配置远程音频设备的值设置 ACXOBJECTBAG 上的 BluetoothLEAudio_CodecConfiguration 属性。
  4. 如果 IHV ACX 流式处理驱动程序需要根据配置文件设置的对象包值更新其数据路径 ID 或数据路径配置,则它可以调用 KSPROPERTY 集操作来更新配置文件线路所存储的值。
    1. 创建一个 ACXSTREAM,其中包含为流状态转换设置的回调。

显示蓝牙 LE 音频流创建过程的流程图。

流状态转换

ACX 根据音频流决定流状态转换的线路顺序,以及状态是转换为更活跃还是不太活跃的状态。

  • 对于从不太活跃的状态转换为更活跃的状态的呈现流,配置文件线路首先接收事件,然后是流式传输线路。
  • 对于从更活跃的状态转换为不太活跃的状态的呈现流,流式传输线路首先接收事件,然后是配置文件线路。 
  • 对于从不太活跃的状态转换为更活跃的状态的捕获流,流式传输线路首先接收事件,然后是配置文件线路。 
  • 对于从更活跃的状态转换为不太活跃的状态的捕获流,配置文件线路首先接收事件,然后是流式传输线路。

准备流

调用 EvtAcxStreamPrepareHardware 回调时,蓝牙 LE 音频配置文件会:

  1. 通过以下方式为单播流分配资源:
    1. 使用 HCI_LE_Set_CIG_Parameters 命令配置 CIG。
    2. 发送 ASCS 配置 QoS 操作以将设置与远程设备同步。

说明配置文件线路的蓝牙 LE 音频流准备的流程图。

调用 EvtAcxStreamPrepareHardware 回调时,IHV ACX 流式处理驱动程序会分配必要的流式处理资源,并初始化要处于获取状态的音频管道。

描述流式传输线路的蓝牙 LE 音频流准备的流程图。

启动流

调用 EvtAcxStreamRun 回调时,蓝牙 LE 音频配置文件会:

  1. 使用 HCI_Configure_Data_Path 命令在流创建过程中应用 ACX 流式处理驱动程序设置的所有数据路径配置设置。
  2. 通过以下方式开始流启动过程:
    1. 执行单播流的 BAP 单播流启用过程:
      1. 将“启用”操作发送到远程终结点。
      2. 如果尚未使用 HCI_LE_Create_CIS 命令创建 CIS,则创建 CIS。
  3. 如果尚未配置数据路径,蓝牙 LE 音频配置文件会:
    1. 使用 HCI_LE_Setup_ISO_Data_Path 命令建立 ISO 数据路径
      1. 如果 IHV ACX 流式处理驱动程序设置 BluetoothLEAudio_CodecCapabilities 属性,则 HCI_LE_Setup_ISO_Data_Path 中 Codec_ID 字段的值应设置为透明 (0x3),如蓝牙分配号码中定义。 否则,该值应与流创建过程中配置编解码器操作中使用的编解码器 ID 相同。
  4. 如果音频流是单播捕获流,则蓝牙 LE 音频配置文件会执行 BAP 接收器启动就绪操作。

显示配置文件线路的蓝牙 LE 音频流启动过程的流程图。

调用 EvtAcxStreamRun 回调时,IHV ACX 流式处理驱动程序将开始处理来自 Windows 音频系统(呈现)或蓝牙控制器(捕获)的传入音频数据。

演示流式传输线路的蓝牙 LE 音频流启动过程的流程图。

暂停流

调用 EvtAcxStreamPause 回调时,蓝牙 LE 音频配置文件会:

  1. 执行 BAP 单播流禁用过程。
  2. 使用 HCI_LE_Remove_ISO_Data_Path 命令移除 ISO 数据路径。
  3. 如果音频流是单播捕获流,则执行 ASCS 接收器停止就绪过程。

描述配置文件线路的蓝牙 LE 音频流暂停过程的流程图。

调用 EvtAcxStreamPause 回调时,IHV ACX 流式处理驱动程序会暂停其音频处理管道。

显示流式传输线路的蓝牙 LE 音频流暂停过程的流程图。

发布流

调用 EvtAcxStreamReleaseHardware 回调时,蓝牙 LE 音频配置文件会通过以下方式执行 BAP 单播流发布过程:

  1. 将 ASCS 发布操作发送到远程蓝牙 LE 音频设备
  2. 如果 CIS 未由另一个活动流使用,则断开 CIS 的连接。
  3. 如果所有 CIS 均已断开连接,则移除 CIG。

说明配置文件线路的蓝牙 LE 音频流发布过程的流程图。

调用 EvtAcxStreamReleaseHardware 回调时,IHV ACX ACX 流式处理驱动程序会释放其音频管道资源。

描述流式传输线路的蓝牙 LE 音频流释放过程的流程图。

终结点断开连接

在以下情况下,Windows 蓝牙 LE Audio 配置文件会更新终结点的连接状态:远程单播设备没有与电脑的 LE-ACL 连接,或者它正在通过其 PACS 可用的音频上下文报告它无法进行流式处理。 当终结点断开连接时,Windows 音频服务会使终结点的所有活动流失效。 这会导致流暂停和释放序列。

终结点移除

当配置文件线路或流式传输线路被销毁时,将从系统中移除蓝牙 LE 音频终结点。 从 Windows 中移除远程单播设备的配对或禁用蓝牙无线电时,可能会移除配置文件线路。

  1. 当 Windows 蓝牙 LE 音频配置文件移除其线路时,ACX 会禁用其终结点接口,以向 Windows 音频服务发出指示应移除该终结点的信号。
  2. 禁用这些接口后,Windows 音频服务会使蓝牙 LE 音频终结点的所有活动流失效,此操作会导致在流式传输线路上调用流暂停和释放回调。
  3. 若要完成终结点移除,ACX 会使 IHV ACX 流式处理驱动程序的线路失效,这会导致 WDF 调用线路的清理回调。
  4. 调用清理回调时,IHV ACX 流式处理驱动程序会释放其线路。

显示蓝牙 LE 音频终结点删除过程的流程图。

音量和静音

如果流式处理驱动程序需要音频引擎,IHV ACX 流式处理线路应仅包含音量和静音元素。 使用音频引擎时,必须设置配置标志,如下所示:

ACX_AUDIOENGINE_CONFIG audioEngineCfg;
ACX_AUDIOENGINE_CONFIG_INIT(&audioEngineCfg);
…

audioEngineCfg.Flags |= AcxAudioEngineConfigVolumeSecondary; // Use this control only if endpoint doesn't have one.

audioEngineCfg.MuteElement = muteElement;

audioEngineCfg.Flags |= AcxAudioEngineConfigMuteSecondary; // Use this control only if endpoint doesn't have one.

audioEngineCfg.PeakMeterElement = peakmeterElement;
    
audioEngineCfg.Flags |= AcxAudioEngineConfigPeakMeterSecondary; // Use this control only if endpoint doesn't have one.

只有这样,蓝牙 LE 音频终结点才能使用蓝牙 SIG 定义的音量和麦克风控制配置文件更改单播音频终结点的音量和静音。

如果远程蓝牙 LE 音频设备不支持音量或麦克风控制服务,或者为广播音频创建了终结点,则音频引擎中的音量和静音元素应充当回退来处理来自音频系统的更改请求。 Windows 音频系统会处理对音量和静音的更改。 如果没有音频引擎,则要么远程设备不支持音量或麦克风服务,要么音频终结点用于广播音频。

蓝牙 LE 和经典音频共存

Windows 应确保只有经典音频或 LE 音频适用于支持这两种技术的配对蓝牙音频设备。 如果 LE 音频处于活动状态,则禁用远程设备的 A2DP 和 HFP 的边带 DDI,并为 LE 音频终结点创建配置文件线路。 如果经典音频处于活动状态,则启用远程设备的 A2DP 和 HFP 的边带 DDI,并且不会为 LE 音频终结点创建配置文件线路。

电源管理

蓝牙 LE 音频没有任何电源管理要求或超出 WDF 已定义的范围的流。