浅析智能手机音频设计框架

2024-04-22 18:08

本文主要是介绍浅析智能手机音频设计框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前转载过一篇文章-智能手机音频系统概述,描述了手机音频系统设计框图。实际上那是一个简单的做法,应用中有较大的局限性。那么一个完善的音频框架应该是什么样的呢?这两天根据Android4.0源码的一些线索,找到了相应的硬件资料,摘录下来。

注:以samsung tuna方案(即galaxy nexus)为例。


audio_hw

在ANDROID音频系统散记之四:4.0音频系统HAL初探中,提及到samsung的tuna方案,其实就是大名鼎鼎的galaxy nexus了。

android-4.0.3_r1\device\samsung\tuna\audio\audio_hw.c,这文件就是tuna的音频HAL了,从中我们看出:根据上层的音频策略打开/关闭相应的pcm设备。

[cpp] view plain copy
  1. struct pcm_config pcm_config_mm = {  
  2.     .channels = 2,  
  3.     .rate = MM_FULL_POWER_SAMPLING_RATE,  
  4.     .period_size = LONG_PERIOD_SIZE,  
  5.     .period_count = PLAYBACK_LONG_PERIOD_COUNT,  
  6.     .format = PCM_FORMAT_S16_LE,  
  7. };  
  8.   
  9. struct pcm_config pcm_config_mm_ul = {  
  10.     .channels = 2,  
  11.     .rate = MM_FULL_POWER_SAMPLING_RATE,  
  12.     .period_size = SHORT_PERIOD_SIZE,  
  13.     .period_count = CAPTURE_PERIOD_COUNT,  
  14.     .format = PCM_FORMAT_S16_LE,  
  15. };  
  16.   
  17. struct pcm_config pcm_config_vx = {  
  18.     .channels = 2,  
  19.     .rate = VX_NB_SAMPLING_RATE,  
  20.     .period_size = 160,  
  21.     .period_count = 2,  
  22.     .format = PCM_FORMAT_S16_LE,  
  23. };  
1、mm:media playback设备,即audio download link;

2、mm_ul:audio record设备,即audio upload link;

3、vx:voice设备,通话模块的声音就是经过这个设备的。

根据上层声音模式audio_mode_t来选择打开不同的pcm设备,详细见select_mode()函数。


audio_hw.c还定义了各种音频路径(音频路径概念见:DAPM之二:audio paths与dapm kcontrol)。

[cpp] view plain copy
  1. struct route_setting hf_output[] = {  
  2.     {  
  3.         .ctl_name = MIXER_HF_LEFT_PLAYBACK,  
  4.         .strval = MIXER_PLAYBACK_HF_DAC,  
  5.     },  
  6.     {  
  7.         .ctl_name = MIXER_HF_RIGHT_PLAYBACK,  
  8.         .strval = MIXER_PLAYBACK_HF_DAC,  
  9.     },  
  10.     {  
  11.         .ctl_name = NULL,  
  12.     },  
  13. };  
  14.   
  15. struct route_setting hs_output[] = {  
  16.     {  
  17.         .ctl_name = MIXER_HS_LEFT_PLAYBACK,  
  18.         .strval = MIXER_PLAYBACK_HS_DAC,  
  19.     },  
  20.     {  
  21.         .ctl_name = MIXER_HS_RIGHT_PLAYBACK,  
  22.         .strval = MIXER_PLAYBACK_HS_DAC,  
  23.     },  
  24.     {  
  25.         .ctl_name = NULL,  
  26.     },  
  27. };  
  28. // ......  
1、hf_output:headfree输出路径;

2、hs_output:headset输出路径;

3、......

根据上层的audio_devices_t选择打开或关闭对应的音频路径部件,如:

[cpp] view plain copy
  1. // ...  
  2. headset_on = adev->devices & AUDIO_DEVICE_OUT_WIRED_HEADSET;  
  3. headphone_on = adev->devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE;  
  4. // ...  
  5. set_route_by_array(adev->mixer, hs_output, headset_on | headphone_on);  
  6. set_route_by_array(adev->mixer, hf_output, speaker_on);  
  7. // ...  


以上的mode和device都是由Android更上一层的音频策略所决定的,不在本模块的讨论范畴,这里仅需要按照音频策略来打开正确的音频通道。


kernel

如我们所知,galaxy nexus用的是omap4460,音频芯片是twl6040。因此我们下载omap的kernel代码:

[plain] view plain copy
  1. $ git clone https://android.googlesource.com/kernel/omap.git  
详见: http://source.android.com/source/downloading.html

就本篇的讨论内容来看,我们只需关注如下几个源文件:

1、sound\soc\codecs\twl6040.c

2、sound\soc\omap\omap-abe-dsp.c和sound\soc\omap\omap-abe.c

twl6040.c是音频芯片twl6040的驱动代码,这部分是通用的;

omap-abe是omap4460的音频后端处理(Audio Back-End)驱动代码,这是平台相关的。结合后面的硬件框图来看,就会明白audio_hw很大程度是直接控制abe。

其中omap的dsp代码是以firmware的形式提供的,因此omap-abe-dsp.c用于调用dsp的接口函数。


hardware diagram

omap4460数据手册及设计资料如下:

datasheet:http://www.ti.com/general/docs/wtbu/wtbuproductcontent.tsp?templateId=6123&navigationId=12843&contentId=53243

ABE:http://focus.ti.com/pdfs/wtbu/OMAP4430_ES2%20x_4460_ES1%200_PUBLIC_TRM_Addendum_ABE_HAL_vC.pdf

音频系统框图如下:


左边是OMAP的ABE,右边是codec twl4060,由此可知:音频先经过OMAP ABE的处理,再送到codec输出。

通话下行路径:ABE[VX_DL -> DL_Mixer -> ...] -> PDM_DL -> CODEC[DAC -> Earpiece/Headfree/Headset]

其中在ABE端还要经过一些EQ、Gain、SRC、Echo部件,这里不一一列出了。可见OMAP ABE是非常复杂的一个模块,声音在这里处理好之后才送到CODEC,相比之下CODEC端的工作就简单多了。


这篇关于浅析智能手机音频设计框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926493

相关文章

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte