发帖
3 0 0

教程: 使用btstack制作一个A2DP播放器

O2C14
论坛元老

12

主题

38

回帖

3987

积分

论坛元老

积分
3987
Ai-M61系列 42 3 前天 18:44

btstack_a2dp_player

目前还是个半成品

获取源码

在example目录下运行

git clone https://github.com/O2C14/btstack_test.git -b a2dp_player
cd ./btstack_test
rm -rf ./btstack
git clone 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中的nframes_per_buffer
  2. 计算输出长度对应的时长(单位是ms), 乘以一个整数使其大于10ms(检查间隔), 即init_decoder中的base_size
  3. 计算最终缓冲区的大小, 注意不要大于pcm_buffer
  4. 计算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延迟测试截图:

Screenshot_2025-04-03-18-30-57-865_com.superpower.jpg

──── 0人觉得很赞 ────

使用道具 举报

前天 22:42
优秀呀
好玩
学习
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28427 个
  • 话题数: 40507 篇