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

2023-10-27

基于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等文件,相信自己过一遍代码之后,大家会有一个比较清晰的理解
本文原创,转载请注明出处

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BES2300X,BES2500X——音频通路(audio)原理解析(二) 的相关文章

随机推荐

  • 数据分析|情绪字典 绘图 火星坐标转换 「某社交平台」内容情绪分析

    任务要求 情绪理解是文本处理里最常见任务之一 现提供一个五类情绪字典 由情绪词组成 5 个文件 人工标注 实现一个情绪分析工具 并利用该工具对10000条 某社交平台 内容进行测试和分析 一行一条 某社交平台 内容 字典数据见公开数据中的e
  • Windows内核中的数据结构与函数调用

    2 3重要的数据结构 2 3 1驱动对象 Windows内核认为许多东西都是 对象 比如一个驱动 一个设备 一个文件 甚至其他的一些东西 采用面对对象的编程方式 但是使用的是C语言 一个驱动对象代表了一个驱动程序 或者说一个内核模块 驱动对
  • mybatis selectKey 标签

    1 插入返回主键
  • 基于springboot+vue+Java的自习室预定系统+数据库(附源码,文档)

    今天为大家带来的是 基于springboot vue自习室预定系统 源码 文档 开发环境 源码下载地址 https download csdn net download gdutxiaoxu 87595996 后端 开发语言 Java 框架
  • 华为OD机试 - 告警抑制(Python)

    题目描述 告警抑制 是指高优先级告警抑制低优先级告警的规则 高优先级告警产生后 低优先级告警不再产生 请根据原始告警列表和告警抑制关系 给出实际产生的告警列表 不会出现循环抑制的情况 告警不会传递 比如A gt B B gt C 这种情况下
  • 一个200W+30W播放量的物联网创意小视频是怎么创作的?

    title B站拆解视频的创作 tags 拆解 date 2020 5 18 00 53 00 urlname bilibili iphoneSE 折腾的最高境界 把iPhone SE改装成台式机全纪录 这是在B站和达尔闻合作的拆解视频 达
  • 用户分析报告

    用户分析报告 随着国民消费水平的提高和年轻消费群体的崛起 中国的新式茶饮市场不断快速发展 新式茶饮已成为绝大多数年轻人接触茶及茶文化的渠道来源 在市场竞争如此激烈的前提下 品牌如何发挥自身的优势和凝聚力 将这一群对新式茶饮有需求的人集结在一
  • 移动软件技术——Activity(1)

    Part1 Activity基础 1 概念 Activity是Android程序中最基本的组件 显示可视化的用户界面 接收与用户交互所产生的界面事件 一个Activity代表一个单独的屏幕 可以添加多个控件如 Button TextView
  • Linux的top命令解析

    Top命令是什么 TOP命令是Linux下常用的性能分析工具 能够实时显示系统中各个进程的资源占用状况 TOP是一个动态显示过程 即可以通过用户按键来不断刷新当前状态 如果在前台执行该命令 它将独占前台 直到用户终止该程序为止 比较准确的说
  • java Process.waitFor阻塞

    关于java Process waitFor 进程阻塞问题 摘录自 http lelglin iteye com blog 1487351 问题 有同学遇到java调用Process exec node purppeteer插件去浏览器截图
  • js浏览器打开小窗口

    export const openWindow url title w h gt Fixes dual screen position Most browsers Firefox const dualScreenLeft window sc
  • 华为机试:停车场车辆统计(Java解法)

    停车场车辆统计 特定大小的停车场 数组cars 表示 其中1代表有车 0代表无车 车辆大小不一 统计停车场最少可以停多少辆车 返回具体的数字 长度小于1000 输入 小车占一个车位 长度1 中车占两个车位 长度2 大车占三个车位 长度3 输
  • 虚函数在对象中的内存布局

    典型地 C 通过虚函数实现多态性 多态性的定义 无论发送消息的对象属于什么类 他们均发送具有相同形式的消息 对消息的处理方式可能随接受消息的对象而变 具体地说 在某个基类上建立起来的类的层次结构中 可以对任何一个派生类的对象中的同名成员函数
  • VirtualKD-3.0双机调试过程问题记录

    1 vmware虚拟机本身不需要额外配置 但虚拟机名不要是中文 不然会卡死 2 打开virtual 然后点击debugger path 选择windbg exe 此时必须选windbg 选windbgx会没有效果 然后windug exe
  • 报错 RuntimeError: No such operator image::read_file

    初学者在刚接触cv时经常会遇到的问题 一般是文件输入的路径不对 linux 系统使用 分割地址 Windows 使用 分割 如果直接使用某个文件的地址 注意在双引号外加 r 如 r C Users master Desktop 1 jpg
  • C++学习—类的成员函数和变量的访问、静态与非静态成员函数

    类的成员访问方式可以分为两类 没有实例化对象的访问 有实例化对象的访问 一 没有实例化对象的访问 class controller public static void func protected int a int b int main
  • JSON—接收服务器端传来的数据

    1 服务器端传送json格式的数据代码如下 这里指在servlet类中的情况 import java io IOException import java io PrintWriter import javax servlet Servle
  • babel—ES6代码转换为ES5代码

    为什么要将ES6代码转换为ES5代码 为了浏览器兼容 以及为了在node js环境可以顺畅运行应用程序 ES6作为JS的新规范 加入了很多新的语法和API 但现代浏览器对ES6新特性支持度不高 所以需将ES6代码转为ES5代码 如何转换 初
  • Darknet训练yolov7-tiny(AlexeyAB版本)

    darknet框架训练yolov7 Yolov7在darknet框架下的训练配置过程 配置darknet环境 官方数据集下载 模型和配置文件 训练之前必须看 参数修改 模型训练 模型评估 模型测试 Yolov7在darknet框架下的训练配
  • BES2300X,BES2500X——音频通路(audio)原理解析(二)

    基于BES2300系列芯片的audio音频通路详解 引言 BES2300X BES2500X系列博文请点击这里 本文是BES2300X BES2500X系列博文的audio音频通路部分 目前国内市场 BES的TWS方案风生水起 写一下两年来