3. Bluetooth Audio Sink Sample
源码位置: samples/bluetooth/classic/a2dp_sink 查看源码
3.1. 功能说明
本示例演示了如何使用 ARCS SDK 的蓝牙音频框架在 Sink 模式下工作,从远程设备(如手机)接收音频数据并播放。
示例实现了以下功能:
蓝牙经典音频 Sink 模式初始化
A2DP Sink 配置(音乐接收)
HFP HF 配置(语音通话,可选)
虚拟声卡接口注册
音频数据接收与解码(SBC → PCM)
Shell 命令控制音频接收
3.2. 硬件连接
ARCS 开发板(支持蓝牙经典功能)
音频播放设备(可选:扬声器、耳机等)
手机或其他蓝牙音频源设备
3.3. 软件依赖
FreeRTOS
Lisa Bluetooth 组件
Lisa Bluetooth Audio Framework
Lisa Shell
Lisa Audio Device(用于音频播放)
3.4. 示例内容
初始化蓝牙音频框架(Sink 模式)
注册虚拟声卡接口
初始化蓝牙并进入可发现和可连接状态
等待蓝牙设备连接
通过 Shell 命令启动音频接收
接收并解码蓝牙音频数据
3.5. 编译
重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:
arcs_evb - ARCS EVB 评估板
arcs_mini - ARCS Mini 开发板
根据您的开发板型号,选择对应的编译命令:
在示例目录下执行编译:
# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini
Note
如果在 SDK 根目录执行,需要指定示例路径:
# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini
Note
确保已安装对应的工具链。
3.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 端口
3.7. 预期输出
设备启动后控制台输出:
=== Bluetooth Audio Sink Sample ===
Initializing system components...
Bluetooth audio framework initialized (Sink mode)
Virtual soundcard interface registered
Bluetooth initialized successfully
Device name: ARCS_BT_SINK
Waiting for connection from audio source...
Use 'bt_audio_start' command to start audio receiving
3.8. 使用方法
3.8.1. 1. 启动设备
设备启动后会自动初始化蓝牙,并进入可发现和可连接状态。
控制台输出示例:
=== Bluetooth Audio Sink Sample ===
Initializing system components...
Bluetooth audio framework initialized (Sink mode)
Virtual soundcard interface registered
Bluetooth initialized successfully
Device name: ARCS_BT_SINK
Waiting for connection from audio source...
Use 'bt_audio_start' command to start audio receiving
3.8.2. 2. 连接蓝牙设备
使用您的手机或其他蓝牙设备搜索并连接到 “ARCS_BT_SINK”。
3.8.3. 3. 启动音频接收
连接成功后,在串口控制台输入以下命令启动音频接收:
bt_audio_start
输出示例:
Mode: Decode SBC to PCM
Virtual interface opened successfully
Waiting for audio data from remote device...
BT audio sink started successfully
Audio format: sample_rate=48000, channels=2, bits=16
现在您可以在手机上播放音乐,设备将接收并解码音频数据。
3.8.4. 4. 查看状态
bt_audio_status
输出示例:
=== Bluetooth Audio Sink Status ===
Audio receiving: ENABLED
====================================
3.8.5. 5. 停止音频接收
bt_audio_stop
3.9. 配置选项
3.9.1. prj.conf 关键配置
配置项 |
说明 |
默认值 |
|---|---|---|
|
启用 Sink 模式 |
y |
|
启用 A2DP Sink |
y |
|
启用 HFP HF(可选) |
y |
|
SBC 编解码器 |
y |
|
蓝牙设备名称 |
“ARCS_BT_SINK” |
|
音频设备支持 |
y |
3.9.2. 关键差异:Source vs Sink
特性 |
A2DP Source |
A2DP Sink |
|---|---|---|
角色 |
音频发送端 |
音频接收端 |
典型设备 |
手机、电脑 |
蓝牙耳机、音箱 |
数据流向 |
发送音频 → 远程设备 |
接收音频 ← 远程设备 |
Interface 类型 |
|
|
编解码方向 |
PCM → SBC |
SBC → PCM |
配置宏 |
|
|
3.10. 代码架构
3.10.1. 数据流程
远程设备(手机)
↓
蓝牙栈接收 A2DP 数据
↓
适配器接收
↓
会话解码 (SBC → PCM)
↓
虚拟接口处理 (bt_audio_interface_virtual)
↓
音频数据回调 (audio_data_callback)
↓
音频播放设备 (DAC/I2S)
3.10.2. 关键函数
3.10.2.1. 1. 音频数据回调
static void audio_data_callback(const uint8_t *data, size_t len, void *user_data)
当从蓝牙接收并解码音频数据后,该回调函数会被调用。接收到的是 PCM 数据,可以直接发送到音频播放设备。
3.10.2.2. 2. 打开完成回调
static void open_complete_handler(const bt_audio_format_t format)
当虚拟接口打开完成时被调用,可以获取音频格式信息(采样率、声道数等)。
3.10.2.3. 3. Shell 命令
bt_inquiry: 扫描周围的蓝牙设备bt_connect <device_name>: 连接到指定设备bt_audio_start: 启动音频接收bt_audio_stop: 停止音频接收bt_audio_status: 显示当前状态
3.11. 扩展开发
3.11.1. 1. 添加音频播放支持
在 audio_data_callback 中添加音频播放代码:
static void audio_data_callback(const uint8_t *data, size_t len, void *user_data)
{
// 将 PCM 数据发送到音频设备
lisa_audio_play_write(data, len);
}
3.11.2. 2. 音频处理
在播放前对音频数据进行处理:
static void audio_data_callback(const uint8_t *data, size_t len, void *user_data)
{
// 音量调节
adjust_volume((int16_t*)data, len / 2, volume_level);
// 音效处理
apply_equalizer((int16_t*)data, len / 2);
// 播放
lisa_audio_play_write(data, len);
}
3.11.3. 3. 保存接收的音频
将接收到的音频保存到文件:
static FILE *audio_file = NULL;
static void audio_data_callback(const uint8_t *data, size_t len, void *user_data)
{
if (audio_file) {
fwrite(data, 1, len, audio_file);
}
// 同时播放
lisa_audio_play_write(data, len);
}
3.11.4. 4. 支持多种音频格式
示例默认支持 SBC 编解码,可以通过配置添加更多格式:
AAC: 更高的音质
LC3: 低延迟编解码
AptX/AptX HD: 高质量编解码(需要授权)
3.12. 故障排除
3.12.1. 1. 无法连接
确认设备名称配置正确
检查蓝牙是否已初始化
查看是否有配对信息冲突
3.12.2. 2. 没有音频输出
检查
audio_data_callback是否被调用确认音频播放设备已正确初始化
检查音频格式是否匹配
3.12.3. 3. 音频断续
增加音频缓冲区大小
检查系统负载
优化任务优先级
3.13. 性能优化
3.13.1. 1. 降低延迟
使用低延迟编解码器(LC3)
减小音频缓冲区
提高音频任务优先级
3.13.2. 2. 提高音质
使用高质量编解码器(AAC、AptX)
增加编码比特率
减少音频处理环节
3.13.3. 3. 降低功耗
在空闲时关闭音频接收
使用低功耗蓝牙编解码器
优化音频处理算法
3.14. 相关示例
a2dp_source: A2DP Source 音频发送示例
hfp_hf: HFP Hands-Free 语音通话示例
audio_player: 音频播放器示例
3.15. 参考文档
3.16. 许可证
Copyright © 2025, LISTENAI
SPDX-License-Identifier: Apache-2.0