Skip to content

由 O2C14 贡献,Ai-Thinker 进行整理

btstack_a2dp_player

目前还是个半成品

获取源码

在example目录下运行

html
git clone [https://github.com/O2C14/btstack_test.git](https://github.com/O2C14/btstack_test.git) -b a2dp_player
cd ./btstack_test
rm -rf ./btstack
git clone [https://github.com/bluekitchen/btstack.git](https://github.com/bluekitchen/btstack.git) -b v1.6.1

gpio_config.h中配置引脚, 目前仅支持ES9038Q2M

存在的问题:

目前使用的缓冲区最小为100ms, 但这样也有可能失去同步.

如何配置DMA:

pcm_open中的base_buffer_size决定了DMA中断的频率, 也决定了检查是否同步的频率

pcm_open中的buffer_numbase_buffer_size相乘的结果就是缓冲区的总大小, 单位是字节

set_start_loc这个函数决定了过载缓冲区和欠载缓冲区的大小, 参数为0代表欠载缓冲区大小为0, 即不能接受欠载, 也就是说一旦发生欠载就会直接重置DMA. 过载缓冲区与欠载缓冲区之和就是最终缓冲区的大小

配置过程:

操作步骤

1
获取解码器每次解码的输出长度, 必须是定值(单位是samples), 也就是`a2dp_decoder.h`中的`nfr

获取解码器每次解码的输出长度, 必须是定值(单位是samples), 也就是a2dp_decoder.h中的nframes_per_buffer

2
计算输出长度对应的时长(单位是ms), 乘以一个整数使其大于10ms(检查间隔), 即`init_decoder`中的`

计算输出长度对应的时长(单位是ms), 乘以一个整数使其大于10ms(检查间隔), 即init_decoder中的base_size

3
计算最终缓冲区的大小, 注意不要大于`pcm_buffer`

计算最终缓冲区的大小, 注意不要大于pcm_buffer

4
计算`set_start_loc`的参数, 推荐大小为`nframes_per_buffer`的整数倍, 并使过载缓冲区

计算set_start_loc的参数, 推荐大小为nframes_per_buffer的整数倍, 并使过载缓冲区和欠载缓冲区的大小一样.

I2S移植:

es9038q2m.h已经介绍了.

可能会遇到的问题:

I2S没有输出, GPIO_PIN_12 拉高(在Ai-M61-32S-kit上表现为亮红灯). 这代表I2S已经崩溃, 并且无法通过复位I2S和DMA恢复, 应该检查MCU的供电是否稳定.

目前已经支持的编码:

LHDCV5(未公开), LDAC, AAC, SBC

LHDCV5延迟测试截图:

遇到问题?

如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

Released under the MIT License. Build Time 2026-09-11 14:52:23