5. Bluetooth Audio Source Sample

5.1. 功能说明

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

示例实现了以下功能:

  • 蓝牙经典音频 Source 模式初始化

  • A2DP Source 配置(音乐传输)

  • HFP AG 配置(语音通话,可选)

  • 虚拟声卡接口注册

  • 立体声测试音生成(左声道 440Hz,右声道 523.25Hz)

  • 音频数据编码和蓝牙传输

  • Shell 命令控制音频发送

5.2. 硬件连接

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

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

5.3. 软件依赖

  • FreeRTOS

  • Lisa Bluetooth 组件

  • Lisa Bluetooth Audio Framework

  • Lisa Shell

  • 数学库(用于正弦波生成)

5.4. 示例内容

  1. 初始化蓝牙音频框架(Source 模式)

  2. 注册虚拟声卡接口

  3. 初始化蓝牙并进入可发现和可连接状态

  4. 等待蓝牙设备连接

  5. 通过 Shell 命令启动音频发送

  6. 生成立体声测试音并通过蓝牙传输

5.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

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

5.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 端口

5.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

5.8. 使用方法

5.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

5.8.2. 2. 连接蓝牙设备

使用您的蓝牙耳机或音箱搜索并连接到设备 “ARCS_BT_SOURCE”

5.8.3. 3. 启动音频发送

连接成功后,在串口控制台输入以下命令启动音频发送:

bt_audio_start

您应该能听到立体声测试音:

  • 左声道: 440Hz(A4 音符)

  • 右声道: 523.25Hz(C5 音符)

5.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
====================================

5.8.5. 5. 停止音频发送

bt_audio_stop

5.9. 配置选项

5.9.1. prj.conf 关键配置

配置项

说明

默认值

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

CONFIG_LISA_BLUETOOTH_DEVICE_NAME

蓝牙设备名称

“ARCS_BT_SOURCE”

5.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 // 右声道频率

5.10. 代码架构

5.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)
    ↓
远程设备接收

5.10.2. 关键函数

5.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)

生成双声道正弦波测试音。

5.10.2.2. 2. 音频发送任务

static void audio_source_task(void *pvParameters)

持续生成并发送音频数据的 FreeRTOS 任务。

5.10.2.3. 3. Shell 命令

  • bt_audio_start: 启动音频发送

  • bt_audio_stop: 停止音频发送

  • bt_audio_status: 显示当前状态

5.11. 扩展开发

5.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);
}

5.11.2. 2. 添加音频处理

在发送前对音频数据进行处理:

  • 音量控制

  • 均衡器

  • 降噪

  • 回声消除

5.11.3. 3. 支持多种编解码器

prj.conf 中启用更多编解码器:

CONFIG_BT_AUDIO_CODEC_SBC=y
CONFIG_BT_AUDIO_CODEC_LC3=y
CONFIG_BT_AUDIO_CODEC_MSBC=y

5.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,
};

5.12. 故障排查

5.12.1. 问题 1: 无法连接蓝牙设备

可能原因:

  • 设备不在可发现状态

  • 蓝牙初始化失败

解决方法:

  1. 检查日志确认蓝牙初始化成功

  2. 确认设备名称 “ARCS_BT_SOURCE” 出现在扫描列表中

  3. 尝试重启设备

5.12.2. 问题 2: 连接成功但听不到声音

可能原因:

  • 未启动音频发送

  • Source 模式未启用

  • 编解码器不匹配

解决方法:

  1. 执行 bt_audio_start 命令

  2. 确认 prj.confCONFIG_BT_CLASSIC_ROLE_SOURCE=y

  3. 检查日志中的编解码器协商信息

5.12.3. 问题 3: 音频卡顿或断续

可能原因:

  • 发送速率不匹配

  • 缓冲区配置不当

  • 系统负载过高

解决方法:

  1. 调整 AUDIO_FRAME_SIZE 和发送延时

  2. 增加 PSRAM 堆大小

  3. 提高音频任务优先级

5.12.4. 问题 4: 编译错误

常见错误:

undefined reference to `bt_audio_interface_virtual_register`

解决方法: 确保 bt_audio_interface_virtual.c 已添加到构建系统中。

5.13. 参考文档

5.14. 许可证

Copyright © 2024 listenai.com SPDX-License-Identifier: Apache-2.0