4. Bluetooth Audio Source Sample
源码位置: samples/bluetooth/classic/a2dp_source 查看源码
4.1. 功能说明
本示例演示了如何使用 ARCS SDK 的蓝牙音频框架在 Source 模式下工作,将音频数据通过蓝牙发送到远程设备(如蓝牙耳机、音箱)。
示例实现了以下功能:
蓝牙经典音频 Source 模式初始化
A2DP Source 配置(音乐传输)
HFP AG 配置(语音通话,可选)
虚拟声卡接口注册
立体声测试音生成(左声道 440Hz,右声道 523.25Hz)
音频数据编码和蓝牙传输
Shell 命令控制音频发送
4.2. 硬件连接
ARCS 开发板(支持蓝牙经典功能)
蓝牙耳机或音箱(支持 A2DP Sink)
4.3. 软件依赖
FreeRTOS
Lisa Bluetooth 组件
Lisa Bluetooth Audio Framework
Lisa Shell
数学库(用于正弦波生成)
4.4. 示例内容
初始化蓝牙音频框架(Source 模式)
注册虚拟声卡接口
初始化蓝牙并进入可发现和可连接状态
等待蓝牙设备连接
通过 Shell 命令启动音频发送
生成立体声测试音并通过蓝牙传输
4.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
确保已安装对应的工具链。
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. 预期输出
设备启动后控制台输出:
=== Bluetooth Audio Source Sample ===
Initializing system components...
Bluetooth audio framework initialized (Source mode)
Virtual soundcard interface registered
Bluetooth initialized successfully
Device name: ARCS_BT_SOURCE
System initialization complete
Use 'bt_audio_start' command to start audio transmission
4.8. 使用方法
4.8.1. 1. 启动设备
设备启动后会自动初始化蓝牙,并进入可发现和可连接状态。
控制台输出示例:
=== Bluetooth Audio Source Sample ===
Initializing system components...
Bluetooth audio framework initialized (Source mode)
Virtual soundcard interface registered
Bluetooth initialized successfully
Device name: ARCS_BT_SOURCE
System initialization complete
Use 'bt_audio_start' command to start audio transmission
4.8.2. 2. 连接蓝牙设备
使用您的蓝牙耳机或音箱搜索并连接到设备 “ARCS_BT_SOURCE”。
4.8.3. 3. 启动音频发送
连接成功后,在串口控制台输入以下命令启动音频发送:
bt_audio_start
您应该能听到立体声测试音:
左声道: 440Hz(A4 音符)
右声道: 523.25Hz(C5 音符)
4.8.4. 4. 查看状态
bt_audio_status
输出示例:
=== Bluetooth Audio Source Status ===
Audio sending: ENABLED
Task running: YES
Sample rate: 48000 Hz
Channels: 2 (Stereo)
Bits per sample: 16
Frame size: 480 samples (1920 bytes)
Test tone frequencies: L=440.00Hz, R=523.25Hz
====================================
4.8.5. 5. 停止音频发送
bt_audio_stop
4.9. 配置选项
4.9.1. prj.conf 关键配置
配置项 |
说明 |
默认值 |
|---|---|---|
|
启用 Source 模式 |
y |
|
启用 A2DP Source |
y |
|
启用 HFP AG(可选) |
y |
|
SBC 编解码器 |
y |
|
蓝牙设备名称 |
“ARCS_BT_SOURCE” |
4.9.2. 音频参数配置(main.c)
#define SAMPLE_RATE 48000 // 采样率
#define CHANNELS 2 // 声道数
#define BITS_PER_SAMPLE 16 // 采样位深
#define TEST_TONE_FREQ_LEFT 440.0 // 左声道频率
#define TEST_TONE_FREQ_RIGHT 523.25 // 右声道频率
4.10. 代码架构
4.10.1. 数据流程
音频生成任务 (audio_source_task)
↓
生成 PCM 数据 (generate_stereo_sine_wave)
↓
虚拟声卡写入 (bt_vsnd_play_write)
↓
虚拟接口处理 (bt_audio_interface_virtual)
↓
会话编码 (bt_audio_session - SBC/LC3/mSBC)
↓
适配器发送
↓
蓝牙栈传输 (bt_stack_a2dp_send_data / bt_stack_hfp_send_sco_data)
↓
远程设备接收
4.10.2. 关键函数
4.10.2.1. 1. 音频生成
static void generate_stereo_sine_wave(int16_t *buffer, size_t frame_count,
uint32_t sample_rate,
float *phase_left, float *phase_right)
生成双声道正弦波测试音。
4.10.2.2. 2. 音频发送任务
static void audio_source_task(void *pvParameters)
持续生成并发送音频数据的 FreeRTOS 任务。
4.10.2.3. 3. Shell 命令
bt_audio_start: 启动音频发送bt_audio_stop: 停止音频发送bt_audio_status: 显示当前状态
4.11. 扩展开发
4.11.1. 1. 使用真实音频源
替换 generate_stereo_sine_wave() 函数,从以下源读取音频数据:
SD 卡上的 WAV/MP3 文件
麦克风采集
网络音频流
I2S 音频输入
示例:
// 从文件读取 PCM 数据
size_t bytes_read = read_audio_file(audio_buffer, AUDIO_BUFFER_SIZE);
if (bytes_read > 0) {
bt_vsnd_play_write((uint8_t *)audio_buffer, bytes_read);
}
4.11.2. 2. 添加音频处理
在发送前对音频数据进行处理:
音量控制
均衡器
降噪
回声消除
4.11.3. 3. 支持多种编解码器
在 prj.conf 中启用更多编解码器:
CONFIG_BT_AUDIO_CODEC_SBC=y
CONFIG_BT_AUDIO_CODEC_LC3=y
CONFIG_BT_AUDIO_CODEC_MSBC=y
4.11.4. 4. 动态采样率适配
根据蓝牙连接协商的参数动态调整:
bt_audio_framework_config_t audio_config = {
.mode = BT_AUDIO_MODE_SOURCE,
.sample_rate = negotiated_sample_rate, // 根据协商结果
.channels = negotiated_channels,
.bits_per_sample = negotiated_bits,
};
4.12. 故障排查
4.12.1. 问题 1: 无法连接蓝牙设备
可能原因:
设备不在可发现状态
蓝牙初始化失败
解决方法:
检查日志确认蓝牙初始化成功
确认设备名称 “ARCS_BT_SOURCE” 出现在扫描列表中
尝试重启设备
4.12.2. 问题 2: 连接成功但听不到声音
可能原因:
未启动音频发送
Source 模式未启用
编解码器不匹配
解决方法:
执行
bt_audio_start命令确认
prj.conf中CONFIG_BT_CLASSIC_ROLE_SOURCE=y检查日志中的编解码器协商信息
4.12.3. 问题 3: 音频卡顿或断续
可能原因:
发送速率不匹配
缓冲区配置不当
系统负载过高
解决方法:
调整
AUDIO_FRAME_SIZE和发送延时增加 PSRAM 堆大小
提高音频任务优先级
4.12.4. 问题 4: 编译错误
常见错误:
undefined reference to `bt_audio_interface_virtual_register`
解决方法:
确保 bt_audio_interface_virtual.c 已添加到构建系统中。
4.13. 参考文档
4.14. 许可证
Copyright © 2024 listenai.com SPDX-License-Identifier: Apache-2.0