bes2300之i2s(八)_在云巅的博客-程序员ITS401

技术标签: 蓝牙耳机  bes2300  

目录

音频处理代码逻辑分析

如何配置i2s输出


音频处理代码逻辑分析

音频模块的初始化

app_audio_open
	/* 首先是注册了app线程的APP_MODUAL_AUDIO模块的回调函数*/
	app_set_threadhandle(APP_MODUAL_AUDIO, app_audio_handle_process);

 然后我们在来看看当有音频要处理时,流程是怎样的

/* 当有音频处理的消息时,比如通话,音乐,提示音等等 */
app_audio_handle_process
	app_bt_stream_open
		/* 这里根据是音乐、通话、还是提示音启用不同的音频处理接口*/
		case APP_BT_SETTING_OPEN:
			/*配置通话的音频,这里我简单的说一下一些主要的参数以及接口,详细请参考sdk*/
			bt_sco_player
				/* 主麦配置,其中.handler是数据的处理回调函数*/
				stream_cfg.io_path = AUD_INPUT_PATH_MAINMIC;
				stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
				stream_cfg.handler = bt_sco_codec_playback_data;
				af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg);

				/* 硬件speaker配置,bt_sco_codec_playback_data中能看到解码之后的pcm数据*/
				stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER;
				stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
				stream_cfg.handler = bt_sco_codec_playback_data;
				af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);

				/* 降噪mic配置,如果使能了anc */
				stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER;
				stream_cfg.device = AUD_STREAM_USE_MC;
				stream_cfg.handler = audio_mc_data_playback_sco;
				af_stream_open(AUD_STREAM_ID_1, AUD_STREAM_CAPTURE, &stream_cfg);

				/* 不确定具体的作用,猜测是远端过来的数据先在这里接收,然后在转到第二个实体speaker*/
				stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER;
				stream_cfg.device = AUD_STREAM_USE_BT_PCM;
				stream_cfg.handler = bt_sco_btpcm_capture_data;
				af_stream_open(AUD_STREAM_ID_1, AUD_STREAM_CAPTURE, &stream_cfg);



			/*配置音乐的音频处理*/
			bt_sbc_player
				/* 音频解码配置,bt_sbc_player_more_data 可以看到解码之后的原始音频数据*/
				stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER;
				stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
				stream_cfg.handler = bt_sbc_player_more_data;
				af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);

				a2dp_audio_init
					/* 这里根据编辑格式,将不同的解码驱动赋值给a2dp_audio_context.audio_decoder */
					/*a2dp_audio_sbc_decoder_config -- sbc解码器驱动*/
					/*a2dp_audio_aac_lc_decoder_config -- aac解码器驱动*/
					/*a2dp_audio_ldac_decoder_config -- ldac解码器驱动*/
					/*a2dp_audio_scalable_decoder_config -- scalable解码器驱动*/
					switch (codec_type)
						case A2DP_AUDIO_CODEC_TYPE_SBC:
							memcpy(&(a2dp_audio_context.audio_decoder), &a2dp_audio_sbc_decoder_config
						case A2DP_AUDIO_CODEC_TYPE_MPEG2_4_AAC:
							memcpy(&(a2dp_audio_context.audio_decoder), &a2dp_audio_aac_lc_decoder_config
						......



			/*配置提示音的音频处理*/
			app_play_audio_onoff
				stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
				stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER;
				stream_cfg.handler = app_play_sbc_more_data;
				af_stream_open(AUD_STREAM_ID_2, AUD_STREAM_PLAYBACK, &stream_cfg);

上面已经主要是对音频的相关参数进行配置,下面我们在来看看,当数据到来,比如播放音乐时,收到了远端的数据是如何解码输出的

/*上面在配置bt_sbc_player的时候,我们有说过这个接口,当接收到远端的数据之后, 这里会从buff区去读取数据,并进行解码操作,最终由codec输出到硬件*/
bt_sbc_player_more_data
	a2dp_audio_playback_handler
		/* 上面a2dp_audio_init中,我们已经把相应的解码驱动赋值给a2dp_audio_context,以指针的方式找到对应的接口*/
		a2dp_audio_context.audio_decoder.audio_decoder_decode_frame->a2dp_audio_sbc_decode_frame
			a2dp_audio_sbc_mcu_decode_frame
				/* 这里出来的就是解码之后的音频数据了 */
				btif_sbc_decode_frames

到这里,流程就基本比较清晰了,我这里也只是将我觉得比较重要的接口摘出来说明一下,详细的逻辑还是要自己去看sdk

如何配置i2s输出

  • 打开这个宏AF_DEVICE_I2S
  • 在bt_sco_player/bt_sbc_player/app_play_audio_onoff函数中,把参数进行如下设置即可

stream_cfg.device = AUD_STREAM_USE_I2S_MASTER(i2s主) / AUD_STREAM_USE_I2S_SLAVE(i2s从)

最后会通过af_stream_open(..., AUD_STREAM_PLAYBACK, &stream_cfg)将参数设置下去

  • 在bt_sco_player中有要注意的地方,会调用三次af_stream_open,只改下面这个地方的参数,其他的不要动

af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg)这个的stream_cfg.device,同时stream_cfg.channel_num = 2,不然可能会死机


上面的方法我只在在立体声的工程试过,ibrt工程我没试过!并且i2s参数(采样率,采样位数,通道数)随蓝牙的传过来的音频的参数,固定采样率的接口用不了,很麻烦,不知道ibrt的版本是否有改善

 

相关资料请到<bes2300开发调试笔记>文章底部的网盘链接中下载!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ylangeia/article/details/113743497

智能推荐

ADC-JESD204B接口调试记录_青豆哒哒的博客-程序员ITS401_jesd204b 例程

调试JESD调试时比较容易出问题的地方:1、ADC配置:2、时钟:①外时钟:GTH参考时钟、jesd core时钟、sysref参考时钟②内时钟:drp时钟3、复位:时钟锁定-&gt;ADC配置完成-&gt;JESD复位,JESD复位有以下三个,其中rx_reset为jesd core 和phy core复位,axi_reset为axi配置总线复位,rx_aresetn为输出标志复位完成。后面补个图吧好抽象。。。。问题描述根据前面所述,ADC配置完成后首先进入CGS阶段。这时会发送连

react--node.js中间件解决跨域问题_Cherish_喜爱的博客-程序员ITS401

跨域问题解决了很长时间,一直踩坑,但是今天终于解决了。网上关于跨域的博客很多但方法还是那几种,最主要的问题是忽略的版本的更新。下面我将针对新版本写一下跨域的解决方法。在这里我们手动配置代理:注意:此功能可用于[email protected]或更高版本首先:$ npm install http-proxy-middleware --save$#或$ yarn添加http-pr...

react打包 APP_漂亮得皮皮的博客-程序员ITS401_react打包成app

react写好js后1、在package.json 里改相对路径 &quot;homepage&quot;:&quot;./&quot; //避免打包build后空白页2、运行npm run build3、生成build文件4、试运行build里的index.html,看看是否有自己写好的内容,如果是空白,检查一下package.json是否配置好,或者其他原因5、运用Hbuild打包...

Qt(C++)项目中使用 Basler 工业相机(1)_liyuanbhu的博客-程序员ITS401_basler c++

Qt(C++)项目中使用 Basler 工业相机(1 枚举相机)最近的一个项目中用到Basler 的GigE 接口的工业相机。为此花了好几天时间研究了pylon 的用法。本文就是学习过程中做的笔记。Pylon 的结构可以参考下图。 图 1 Pylon 的结构 整个pylon 对 GenICam 接口进行了封装,但是这个封装并不是特别的彻底。只有理解了GenICam 的设计思想才能真正明白pylo

MySQL日常坑洞之服务器重启后MySQL服务启动失败:Can't create/write to file '/var/run/mysqld/mysqld.pid'_Light-dragon的博客-程序员ITS401

mysql5.7在系统重启后首先尝试登录失败,出以下错误:Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'找到mysql.sock文件,将其删除。建议将其改一个名字mv mysql.sock mysql.sock.bak修改完再次进入,还是同样的问题,很坑。...

常用的数学符号sup(上确界) 和 inf(下确界)以及少量数学公式的markdown模式下latex 格式 编写_D_turtle的博客-程序员ITS401_latex 下确界

本文部分参考wikipedia. 以下讨论均在数学分析范围内进行。 infinfinf: infimum 或 infima,中文是下确界或最大下界。 比如 inf(E)inf(E)inf (E), EEE 表示一个集合, inf(E)inf(E)inf(E) 是指集合EEE 的下确界, 即小于或等于E的所有其他元素的最大元素, 这个数不一定在集合E中。 例子: 1. inf{1,2...

随便推点

devops工程师_什么是devops工程师? 你如何成为一个?_cxu0262的博客-程序员ITS401

devops工程师 简而言之,Devops是一种文化和哲学,旨在将以前分开的开发 (创建应用程序的人)和操作 (确保这些应用程序按应有的方式工作的人)的孤岛统一为一个团队。 该团队使用持续集成,持续交付和测试 ,将对现有代码库的频繁增量改进发布到生产中。 因此,从逻辑上讲,devops工程师是具有为这样的团队服务所需的技能的人。 但是像所有开发人员一样,很难确定开发人员工程师的确切定义,而且...

enable 华为交换机ntdp_华为交换机如何实现功能_可爱小梨的博客-程序员ITS401

该楼层疑似违规已被系统折叠隐藏此楼查看此楼我在ensp里,测试通过,valn 10,20之间不能访问,vlan 10,20可以访问vlan 20,都自动获取IP地址,交换机LSW!是S5700,其他是S3700#sysname Huawei#vlan batch 10 20 30#cluster enablentdp enablendp enable#drop illegal-mac alarm...

如何在 1 秒内做到大数据精准去重?_hzbooks的博客-程序员ITS401

去重计数在企业日常分析中应用广泛,如用户留存、销售统计、广告营销等。海量数据下的去重计数十分消耗资源,动辄几分钟,甚至几小时,Apache Kylin 如何做到秒级的低延迟精确去重呢?作...

京东价格监控软件开发技术探讨十五:通过酷Q和ZeroMQ实现推送变价变库消息到QQ群_赖皮鹏的博客-程序员ITS401_京东价格监控软件

在对该需求展开进行说明前,我们需要先了解几个基本名词。1、酷Q是什么?简单来说,酷Q是一个QQ机器人软件,能在QQ群里回答、发布信息。相关的机器人软件比较多,如QQLight、2、ZeroMQ是什么?简单来说,ZeroMQ是一个网络层的数据通信组件,支持TCP或UDP发送数据。具体到C#,有一个NetMQ的组件,简单好用。酷Q的使用就不多说了,可以加入酷Q官网或者相关技术群进行...

Cocos2D-X 场景切换效果汇总_我不是黄飞鸿的博客-程序员ITS401

这些是Cocos2D-X 场景切换效果汇总,希望能对大家有所帮助

mysql 设置root密码_xuyemei的博客-程序员ITS401_mysql给root用户设置密码

1.首先查看mysqld的服务状态若没有开启,则启动mysql服务:service mysqld start2.默认mysql无密码,需设置root用户密码登录mysql服务器:mysql -u root//直接回车进入mysql控制台进入mysql数据库:use mysql;更改root用户密码: update user set password=password...

推荐文章

热门文章

相关标签