BES2300X,BES2500X——音频通路(audio)原理解析(二)

5 篇文章 9 订阅

基于BES2300系列芯片的audio音频通路详解

引言

BES2300X,BES2500X系列博文请点击这里

本文是BES2300X,BES2500X系列博文的audio音频通路部分
目前国内市场,BES的TWS方案风生水起,写一下两年来做BES方案的心得

框图

针对BES2300系列芯片(I,Y,Z)的1402/1302内核架构如下图

有空再画

一,音频链路分类

在BES系统中,音频链路根据使用场景分类主要有3大类
1,audio通路:播放音乐等一切从手机端传输过来的单向音频链路,bes代码里通常称之为SBC通路
2,vioce通路:通话,录音等单向或双向链路,主要特征存在耳机->手机的上行链路,bes代码里通常称之为SCO通路
3,media通路:耳机本地提示音播放

根据数据的流动方向,可分为两大类
1,上行数据:从耳机到手机
2,下行数据:从手机到耳机

在这篇文章中我们重点讨论音频数据的流动,至于数据流的控制会在以后的博文中与协议一块讲解,写完会在这里贴出来

二,上行通路

蓝牙耳机中的音频数据既然我们以流来形容它,那么它的最重要的特点也就如同水流

1,从哪里来

对于上行数据,来源一是耳机的MIC,根据MIC的种类,蓝牙芯片的CODEC模块会收到MIC采集到的模拟信号或者PDM编码,二是外部CODEC传入的IIS数据等。这些数据都会以某种预定的数据格式存入到DMABuff中,等待系统DMA的进一步处理

其中
MIC配置方式参考以下链接:
BSP部分外围部件配置还没写,敬请期待
CODEC的配置方式是BES原厂提供的硬件驱动,存放在下图文件中,一般情况下SDK开发不会动这一部分。
在这里插入图片描述

2,从哪里经过

数据是以DMA的方式在各缓存中流动的,我们最开始能见到数据的地方是DMA中断
DMA中断处理函数af_thread_stream_handler
在这里插入图片描述
role->handler(buf, len); 是DMA的数据来源与目标,某些情况下BUF为空传进去,取完数据后触发DMA中断,将数据传走,某些情况下BUF满数据传进去,处理完数据后触发DMA中断,将数据传出。该函数的注册等会在数据流的初始化时进行。

例如scoplayer中的codec上行数据获取函数的注册:
在这里插入图片描述
bt_sco_codec_capture_data函数的参数BUF时一个存有正经PCM数据的BUF,DMA收满数据会触发中断,经过
speech_tx_process(pcm_buf, aec_echo_buf, &pcm_len);
对原始PCM数据进行处理,例如通话的回声消除,ENC,降噪算法等等处理。再将处理完的数据通过
store_voicebtpcm_p2m_buffer((uint8_t *)pcm_buf, pcm_len * sizeof(short));
函数写到缓冲队列中,等待下一步
codec上行数据playback函数的注册:
在这里插入图片描述
该函数的参数buf是一个空buf,函数中的voicebtpcm_pcm_audio_more_data函数,将缓冲队列中的数据读到buf中,等待DMA将之送往codec,然后等待BT上行数据的DMA中断取获取数据。
同codec,BT部分也存在两个DMA中断函数,分别如下
stream_cfg.handler = bt_sco_btpcm_capture_data;
stream_cfg.handler = bt_sco_btpcm_playback_data;
作用是将codec得到的数据经过编码,格式转换等操作,再送到DMA

3,到哪里去

对于不同的数据,由不同的归处,就上行而言,最多的就是送往协议栈,发给手机
上文中DMA会将数据搬运给协议栈,由BT协议栈将数据发出。

三,下行通路

通路原理与上行通路类似,总体是BT–>DMA–>CODEC–>SPEAKER的流程
这里只挑一个DMA中断来讲
例如sbcplayer中的下行数据获取函数的注册:
在这里插入图片描述
在该函数中,先将BUFF清空,再用a2dp_audio_more_data函数从A2DP解码器中取出数据放入BUFF,在这里插入图片描述
在该函数的后面还会对取出的数据进行处理,在audio_process_run函数中,会有EQ调节等音频算法相关的处理。
在这里插入图片描述
处理完成后,DMA将BUFF中数据传走,等待下一次中断

总结

SCO上行:mic–>audioflinger capture (capture,PPbuffer->Queue) -->store_voicebtpcm_p2m_buffer–>get_voicebtpcm_p2m_frame (playback,queue->PPbuffer) -->bt
SCO下行:bt–>store_voicebtpcm_m2p_buffer (capture,PPbuffer->Queue) -->decode_voicebtpcm_m2p_frame–>audioflinger playback (playback,queue->PPbuffer)–>speaker

SBC下行:BT->A2dp_callback->store_sbc_buffer(capture,PPbuffer->SBCQueue)–>load_sbc_frame(queue->PPbuffer)–>a2dp_audio_more_data(decode,process)–>bt_sbc_player_more_data(ppbuff–>DMA)–SPEAKER
总的音频通路大致有以上几条通路,涉及外部codec,提示音等等通路的原理都是相同的,涉及到的文件主要是bt stream和audioflinger等文件,相信自己过一遍代码之后,大家会有一个比较清晰的理解
本文原创,转载请注明出处

  • 21
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值