4. Bluetooth Audio Source Sample

4.1. 功能说明

本示例演示了如何使用 ARCS SDK 的蓝牙音频框架在 Source 模式下工作,将本地音频数据通过经典蓝牙发送到远程 A2DP Sink 设备,如蓝牙耳机或音箱。

示例实现了以下功能:

  • 初始化 Lisa Shell、Lisa Bluetooth 和 BT Audio Framework

  • 注册经典蓝牙发现回调,支持查看扫描到的设备名称和地址

  • 通过 Shell 命令执行设备扫描、按名称或索引连接远端设备

  • 通过虚拟音频接口发送本地音频数据

  • 在编码模式下将 PCM 数据编码为 SBC 后发送

  • 支持 AT 透传命令直接调试底层蓝牙 AT 指令

4.2. 硬件连接

  • ARCS 开发板(支持蓝牙经典功能)

  • 蓝牙耳机或蓝牙音箱(支持 A2DP Sink)

4.3. 软件依赖

  • FreeRTOS

  • Lisa Bluetooth 组件

  • Lisa Bluetooth Audio Framework

  • Lisa Shell

  • 预置音频数据资源

4.4. 示例内容

  1. 初始化 Shell 与文件系统

  2. 初始化蓝牙协议栈并注册发现回调

  3. 初始化虚拟蓝牙音频接口

  4. 通过 bt_inquiry 扫描可连接设备

  5. 通过 bt_connectbt_connect_index 连接目标设备

  6. 通过 bt_audio_start 启动音频发送任务

4.5. 编译

重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:

  • arcs_evb - ARCS EVB 评估板

  • arcs_mini - ARCS Mini 开发板

根据您的开发板型号,选择对应的编译命令:

在 SDK 根目录执行编译:

# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini

Note

确保已安装对应的工具链。

4.6. 烧录

编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:

./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs

Note

烧录参数说明

  • -s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是 /dev/ttyUSB0/dev/ttyACM0 - 可通过 ls /dev/tty* 命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名

  • -b 3000000:烧录波特率(3Mbps)

  • 0x0:烧录起始地址

  • build/arcs.bin:编译生成的固件路径

  • -C arcs:芯片类型

注意事项

  • 确保开发板已正确连接到电脑

  • 如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口

4.7. 预期输出

4.7.1. 1. 启动日志

设备启动后可以看到类似如下日志:

DBG:hci_aud_access_init,1
DBG:a2dp_init, init_type:0
DBG:bt_stack_init,state:0
DBG:a2dp_init, init_type:1
DBG:bt_stack_init,state:1
DBG:bt reset cmp: 20:23:03:64:74:57
DBG:ble enable cmp, sta:0
DBG:bt classic enable cmp, status:0
DBG:a2dp en, role:0
DBG:hfp en, role:1,feats:0x22
INF:a2dp enable cmp!
DBG:hfp enable cmp,status:0x0
I/BT_AUDIO_SESSION Audio session manager initialized
I/app-bt          Virtual BT interface initialized successfully

4.7.2. 2. 扫描设备

串口执行:

bt_inquiry

命令会立即返回,扫描结果异步打印:

letter:/$ bt_inquiry
Return: 1, 0x00000001
DBG:bt disc cre cmp,sta:0x00,0
DBG:gap start cmp,sta:0x00,type:4, actv:0,actv:0
I/app-bt Discovered device: 6A:05:BF:9F:D0:EC, RSSI=-74, Name=Saw的MIX 2
I/app-bt Discovered device: E0:5D:3B:CC:EE:E8, RSSI=-52, Name=soundcore Liberty 4

4.7.3. 3. 连接设备

如果设备名包含空格,命令里需要加引号,例如:

bt_connect "soundcore Liberty 4"

连接日志示例:

I/app-bt  Connecting to device: soundcore Liberty 4
I/LISA_BT Trying to connect to device: soundcore Liberty 4
I/LISA_BT Device list count: 6
I/LISA_BT Device[5]: soundcore Liberty 4
I/LISA_BT addr: E0:5D:3B:CC:EE:E8
I/LISA_BT Device found! Connecting...
DBG:BT classic connected
DBG:hfp connect cmp,conidx:6, type:0, status:0x0
INF:a2dp connect cmp! conidx=6, status=0x0
INF:avrcp connect cmp!,conidx:0x6, status:0x0

4.7.4. 4. 启动音频发送

连接成功后,执行:

bt_audio_start

日志示例:

I/app-bt   Mode: Encode PCM to SBC
I/BT_VINTF Profile opening: type=0, state=OPENING
I/BT_AUDIO_ADAPTER A2DP stream start requested
I/app-bt   Virtual interface opened successfully
INF:a2dp start! codec:0, ch:2, sample_rate:44100
I/BT_AUDIO_SESSION Session created: direction=1, codec=2, passthrough=0
I/SBC_CODEC Encoder initialized: 44100Hz 2ch, codesize=512, frame_length=77
I/BT_VINTF Audio streaming started for profile=1, conidx=6
I/app-bt   BT audio source started successfully
I/app-bt   Audio source task started (PCM encode mode)
I/app-bt   PCM data size: 3527680 bytes, frame size: 1764 bytes

4.8. 使用方法

4.8.1. 1. 启动设备

设备上电后会自动完成 Shell、蓝牙协议栈和虚拟蓝牙音频接口初始化。初始化成功后,日志中会出现 Virtual BT interface initialized successfully

4.8.2. 2. 扫描设备

在串口控制台输入:

bt_inquiry

说明:

  • bt_inquiry 的 shell 返回值不表示扫描结束,它只表示扫描命令已经成功下发。

  • 设备发现结果会在后续异步打印。

4.8.3. 3. 连接设备

可以按名称连接:

bt_connect My_Headset

如果设备名中包含空格,请使用引号:

bt_connect "soundcore Liberty 4"

也可以按扫描列表索引连接:

bt_connect_index 0

4.8.4. 4. 启动音频发送

连接成功后,执行:

bt_audio_start

当前代码默认使用编码模式发送 PCM,并将其编码为 SBC 后通过 A2DP 发出。

4.8.5. 5. 调整音量

bt_audio_volume 60

4.8.6. 6. 停止音频发送

bt_audio_stop

4.9. Shell 命令

  • bt_inquiry:扫描周围经典蓝牙设备。

  • bt_connect <device_name>:按设备名连接远端设备。

  • bt_connect_index <device_index>:按扫描结果索引连接远端设备。

  • bt_audio_start:打开虚拟音频接口并启动音频发送任务。

  • bt_audio_stop:停止音频发送任务并关闭虚拟接口。

  • bt_audio_volume <0-100>:设置发送音量。

  • AT:进入 AT 透传模式,或直接执行单行 AT 命令。

4.10. 配置选项

4.10.1. 关键配置

配置项

说明

默认值

CONFIG_BT_CLASSIC_ROLE_SOURCE

启用 Source 模式

y

CONFIG_LISA_BLUETOOTH_CLASSIC_A2DP_SOURCE

启用 A2DP Source

y

CONFIG_LISA_BLUETOOTH_CLASSIC_HFP_AG

启用 HFP AG

y

CONFIG_BT_AUDIO_CODEC_SBC

启用 SBC 编解码器

y

4.10.2. 当前音频参数

当前 main.c 中使用的主要参数如下:

#define SAMPLE_RATE      44100
#define CHANNELS         2
#define BITS_PER_SAMPLE  16
#define USE_PCM_ENCODE_MODE 1

4.11. 代码架构

4.11.1. 数据流程

bt_inquiry / bt_connect
    ↓
建立经典蓝牙连接
    ↓
bt_audio_start
    ↓
打开虚拟蓝牙音频接口
    ↓
audio_source_task 持续读取本地音频资源
    ↓
vintf_playback_write
    ↓
BT Audio Session 编码为 SBC
    ↓
A2DP 发送到远端设备

4.11.2. 关键点

  • cmd_bt_inquiry():调用 lisa_bluetooth_inquiry_start() 扫描附近设备。

  • cmd_bt_connect() / cmd_bt_connect_by_index():按名称或索引发起连接。

  • cmd_bt_audio_start():设置编码模式并打开 VINTF_PROFILE_PLAYBACK

  • audio_source_task():循环发送预置 PCM 数据。

4.12. 故障排除

4.12.1. 1. 扫描不到设备

  • 确认目标耳机或音箱已进入可配对状态

  • 检查串口日志是否持续输出发现结果

  • 必要时重新执行 bt_inquiry

4.12.2. 2. 连接成功但没有声音

  • 确认已经执行 bt_audio_start

  • 检查日志中是否出现 INF:a2dp start!BT audio source started successfully

  • 确认远端设备支持 SBC/A2DP Sink

4.12.3. 3. 音频任务启动失败

  • 检查是否有 Failed to create audio source task

  • 检查系统堆内存是否充足