QCC5181 LE Audio 调试实战:从零到有声的完整旅程

日期:2026-08-02
硬件平台:QCC5181 + Android
工程模式:Headset LEA (Simple Speaker, LE Audio Only)


一、LE Audio 技术简介

1.1 什么是 LE Audio?

LE Audio(Low Energy Audio)是蓝牙技术联盟(SIG)在蓝牙 5.2 规范中引入的新一代蓝牙音频标准。与传统的 A2DP(Advanced Audio Distribution Profile)不同,LE Audio 基于BLE(Bluetooth Low Energy)传输音频流,而非传统的 BR/EDR 射频。

1.2 LE Audio 的核心优势

特性传统 A2DPLE Audio
射频基础BR/EDR(经典蓝牙)LE(低功耗蓝牙)
音频编解码SBC(强制)、AAC、aptX、LDACLC3(Low Complexity Communication Codec)
功耗较高降低 30%-50%
多流音频不支持原生原生支持(Multi-Stream Audio)
广播音频不支持支持(Auracast)
听力辅助不支持支持(Hearing Aid Profile)

1.3 LE Audio 协议栈架构

LE Audio 的协议栈层次如下:

应用层 │ ├── TMAP (Telephony and Media Audio Profile) — 电话与媒体音频 ├── HAP (Hearing Aid Profile) — 听力辅助 ├── VCP (Volume Control Profile) — 音量控制 │ ├── BAP (Basic Audio Profile) — 基本音频规范 │ ├── Unicast (单播) — 一对一音频流 │ └── Broadcast (广播) — 一对多音频流 │ ├── ASCS (Audio Stream Control Service) — 音频流控制服务 ├── PACS (Published Audio Capabilities Service) — 音频能力发布服务 ├── CIS (Connected Isochronous Stream) — 连接等时流 └── ISOAL (Isochronous Adaptation Layer) — 等时适配层 │ └── 链路层 (LL) — LE 链路层

关键概念

  • CIG (Connected Isochronous Group):一组 CIS 的集合,用于多声道音频
  • CIS (Connected Isochronous Stream):点对点的等时连接,承载音频数据
  • ASE (Audio Stream Endpoint):音频流端点,每个方向一个,用于配置编解码和 QoS
  • LC3 Codec:LE Audio 强制编解码器,提供高压缩比和低延迟

1.4 LE Audio 连接建立流程

一个完整的 LE Audio 连接建立经过以下阶段:

阶段1: LE ACL 连接建立 (LE Connection) 阶段2: LE 配对与加密 (LE Pairing & Encryption) 阶段3: GATT 服务发现 (GATT Service Discovery) └─ 发现 ASCS (0x184E)、PACS (0x1850)、TMAS (0x1851) 等 阶段4: BAP 能力交换 (PAC Exchange) — 通过 PACS 阶段5: ASE 配置 (ASE Configuration) — 通过 ASCS └─ Codec 配置 → QoS 配置 → 使能 (Enable) 阶段6: CIS 建立 (CIS Establishment) — 通过 HCI └─ LE_Create_CIS → LE_CIS_Request → LE_CIS_Established 阶段7: ISO 数据路径建立 (Setup ISO Data Path) 阶段8: 音频流传输 (Streaming) — LC3 编码数据通过 ISO 传输

二、调试环境

2.1 硬件

设备型号角色
开发板QCC5181LE Audio 音箱终端
手机Android 设备LE Audio 音源
调试器USB + MDE固件下载与日志

2.2 软件

组件说明
工程headset/workspace/QCC5181/
协议栈Qualcomm Synergy (ADK)
Android 版本基于 AOSP 的 Android 蓝牙栈
调试工具pydbg(开发板日志)、adb logcat(Android 日志)、btsnoop(HCI 抓包)

2.3 日志收集命令

# 开发板日志 — pydbg 串口输出# Android logcatadb logcat-bmain-bsystem|grep-iE'bluetooth|bt_|le_audio|LE_AUDIO|audio_policy|BLE_HEADSET'# Android 蓝牙进程日志adb shell dumpsys bluetooth_manager# HCI 抓包 (btsnoop)adb shellcat/data/misc/bluetooth/logs/btsnoop_hci.log>btsnoop_hci.log# 音频策略配置adb shellcat/vendor/etc/bluetooth_audio_policy_configuration_7_0.xml

三、调试过程中遇到的问题

问题 1:LE Audio 连接但音频从手机扬声器输出

症状
  • 开发板与手机成功配对并连接
  • 开发板日志显示LE Audio已连接,CIS Established
  • 但手机播放音乐时,声音从手机扬声器发出,而不是从开发板输出
  • 类似于"手机连接了蓝牙耳机但声音还是外放"
日志分析

logcat 关键错误

08-02 14:12:01.127 APM_AudioPolicyManager: setDeviceConnectionStateInt() connecting device AUDIO_DEVICE_OUT_BLE_HEADSET, @:SUPPRESSED format 2b000000 08-02 14:12:01.128 APM_AudioPolicyManager: opening output for device 20000000 with params 00:02:5B:00:FF:00 profile name ble output 08-02 14:12:01.128 AudioFlinger: openOutput() module 34 Device AUDIO_DEVICE_OUT_BLE_HEADSET, Sampling Rate 0, Format 00000000, Channels 0, flags 0 08-02 14:12:01.138 AudioFlinger: openOutput() module 34 Device AUDIO_DEVICE_OUT_BLE_HEADSET, Sampling Rate 48000, Format 0x000001, Channels 0x3, flags 0 08-02 14:12:01.168 APM::HwModule: createDevice: could not find HW module for device type 'AUDIO_DEVICE_IN_BLE_HEADSET' (a0000000)

注意上面输出端(AUDIO_DEVICE_OUT_BLE_HEADSET)配置成功,但是输入端(AUDIO_DEVICE_IN_BLE_HEADSET)配置失败。不过对于音频播放来说,输出端配置成功已经足够。

根因分析

Android 的音频策略框架(Audio Policy Manager, APM)通过 XML 配置文件bluetooth_audio_policy_configuration_7_0.xml管理蓝牙音频设备的路由。该配置文件位于/vendor/etc/目录下,定义了蓝牙音频 HAL 模块的mixPorts(混音端口)、devicePorts(设备端口)和routes(路由规则)。

原始配置文件中缺少LE Audio 相关的设备端口定义:

<!-- 原始配置:只有 A2DP 和 Hearing Aid,没有 LE Audio --><mixPorts><mixPortname="a2dp output"role="source"/><mixPortname="hearing aid output"role="source"/></mixPorts><devicePorts><devicePorttagName="BT A2DP Out"type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP"role="sink"/><devicePorttagName="BT Hearing Aid Out"type="AUDIO_DEVICE_OUT_HEARING_AID"role="sink"/></devicePorts>

当音频策略框架尝试将音频路由到AUDIO_DEVICE_OUT_BLE_HEADSET时,HAL 模块bluetooth中找不到对应的AUDIO_DEVICE_OUT_BLE_HEADSET设备端口定义,导致createDevice失败。

修复方法

在配置文件中添加 LE Audio 设备端口:

<mixPorts><!-- ... 原有配置 ... --><mixPortname="ble output"role="source"/><mixPortname="ble input"role="sink"/></mixPorts><devicePorts><!-- ... 原有配置 ... --><devicePorttagName="BT BLE Headset"type="AUDIO_DEVICE_OUT_BLE_HEADSET"role="sink"/><devicePorttagName="BT BLE Headset Mic"type="AUDIO_DEVICE_IN_BLE_HEADSET"role="source"/></devicePorts><routes><!-- ... 原有配置 ... --><routetype="mix"sink="BT BLE Headset"sources="ble output