关于android audio路由策略的修改

关于android audio路由策略的修改

在工作时,往往有这样一些需求:
1)希望针对不同的audio stream type(例如music、tts), 有输出到不同的输出设备(例如speaker、headset、BT、usb audio等)的需求,另外还有输出设备的优先级的需求。例如AUX(headset) > BT > FMTX > speaker。即例如BT连接了,那么音频就输出到BT,而不是FM发射。
2)针对不同的audio stream type和不同的输出设备,有不同的输出音量值。
3)针对不同的audio stream type、不同的输出设备、不同的应用的audio track,同时播放时,有不同的音量的需求。例如TTS、导航音、music声音同时输出时,TTS声音要提高,导航声音要中间,音乐声音要压低。
4)如果接上,一般HDMI输出是音频和视频同时输出到HDMI外设的,如何做到HDMI只输出视频到HDMI外设,例如显示屏,但音频留在本地speaker播放呢?

这些问题,其实修改起来,不同的android版本涉及到不同的函数。

Android KK:

AudioPolicyManagerBase.cpp
AudioPolicyManagerBase.cpp::getDeviceForStrategy() 决定音频路由策略。
MTK的 AudioMTKPolicyManager.cpp

Android L:

AudioPolicyManager.cpp
AudioPolicyManager::getDeviceForStrategy() 决定音频路由策略。
MTK的:
AudioPolicyManager::computeVolume() ? computeCustomVolume() 计算音量
AudioALSAHardware.cpp ::GetAudioCommonData() ::GetAudioCustomVol()

Android M:

AudioPolicyManager.cpp
AudioPolicyManager::getDeviceForStrategy()
还有Engine.cpp ::getDeviceForStrategy() ::getStrategyForUsage() ::getOutputForAttr()等。 决定音频路由策略。

frameworks/av/services/audioflinger/Threads.cpp
AudioFlinger::MixerThread::prepareTracks_l() 关于各个audio track输出音量的混音控制最终接口。

Android O:

与Android M类似。

一定要注意Audio Policy相关的文件,这些是实现音频路由策略的核心。

另外要理解audio的 output device和 available output device。
支持热插拔的输出设备(例如AUX headset、HDMI),靠的是WiredAccessoryManager.java文件实现的。注意阅读这个代码。

关于音量控制需要注意:
1)根据音效,有一个masterVolume
2)系统针对不同的stream type和不同输出设备,不同的音量level,有一个表格,表明输出的音量值,此值,有来算出。此音量作为系统控制音量。叫做typevolume
3)应用针对自己的audio track,有个track音量
混音时,这些音量的乘积作为该track的最终音量。
上面是android framework针对audio stream流的音量数字放大倍数。混音把多个AudioTrack混音到特定输出设备的mixerbuffer中。
Android的混音线程mixerthread是针对不同的输出设备,不同的stream type,不同的音频参数(例如不同采样频率)来创建和维护的。

对应驱动和硬件codec,还有一个模拟PA放大倍数,这个针对“输出设备”,上层通过Kcontrol调用驱动接口设置到硬件,具体看linux ALSA架构。

最终的效果是数字放大和模拟放大的综合结果。

参考我自己的文档:
《MTK 6753 audio V3架构(音量设置参数的传入和使用部分–根据streamtype、output device的类型、volume index第几格音量来设置)2.jpg》
《android audio架构mixerthread的问题.jpg》
《MTK 6753 android L audio 路由策略架构1(这种分层决定的策略也是个架构的好方法).jpg》
《MTK 6753 android L audio 路由策略架构2.jpg》
《关于android和ios的audio音量设置的区别问题.txt》
《MTK 6753 audio V3架构(音量设置参数的传入和使用部分–根据streamtype、output device的类型、volume index第几格音量来设置–是个好架构).jpg》
《MTK 6753 audio V3架构(mic部分,包括频率转换、格式转换、音量增强Bes处理等)1.jpg》
《MTK 6753 audio V3架构 audio captue client的创建.jpg》
《audio左右声道的排列和处理.docx》
《mtk audio codec2.jpg》
《关于MTK的nv中的audio参数.txt》
《MTK audio 双mic录音问题.txt》
《关于audio不同stream type的音源在不同输出设备上播放输出的问题.txt》
《audio concept 概念 i2s等 AEC回声消除.docx》
《关于MTK audio policy(Android M 6755)路由策略.JPG》
《关于MTK audio tuning tool 设置的speaker、headphone等使用情景下的低通滤波器参数配置文件(audio_hcf_default.h、audio_acf_default.h)的代码调用方式.txt》
《关于audio设计需要注意的.txt》
《MTK audio.txt》

关于Android audio的整体框架,后面我会整理出来。但需要的整理时间比较长。

另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html

另外我的免费的linux各种驱动开发课程如下:
https://edu.51cto.com/course/17138.html

原文地址:https://blog.51cto.com/8906847/2367935

时间: 2024-08-21 08:33:03

关于android audio路由策略的修改的相关文章

关于android audio路由策略的修改(续)

关于android audio路由策略的修改(续) 承接我的上一篇https://blog.51cto.com/8906847/2367935 文章. 例如你在HUD抬头显示设备中,需要加入FMTX功能,即fm发射功能,另外需要在打开fmtx广播时,音频优先走fmtx芯片,而不是走speaker.那么可以这样实现:1)方法一:通过特定状态标记,来修改audiopolicy的engine.cpp2)方法二:是使用类似如下的方式:如果是Java的,那么可以仿照类似如下的方式:private Audi

路由策略、策略路由

路由就是报文在转发过程中的路径信息,用来指导报文转发 路由可划分为:网段路由.主机路由.直连路由.间接路由把最优的路由放到FIB(forwarding information base),通过它指导报文转发 路由策略是为了改变网络流量所经过的途径而修改路由信息的技术,主要通过改变路由属性来实现 路由策略的应用方式:1.控制路由的发布(路由协议发布路由信息时,对路由进行过滤,只发布满足条件的路由信息acl.prefix-list)2.控制路由的接收(对路由信息进行过滤,只接收满足条件的路由信息,提

Android -- Audio Native服务之启动流程分析(一)

Android -- Audio Native服务之启动流程分析(一) Android中的Audio系统是比较庞大.繁杂的一部分内容, 其中会涉及较多的音频编解码.多媒体制式与Android Audio HAL设备管理的知识.随着Android的发展,其所支持的音频设备也变得越来丰富,如扬声器.耳机.听筒等等:这种变化也为Android管理如此丰富的音频设备以及如何正确.合理地切换音频输出提出了更高的要求.面对如此繁杂的管理要求,我们分析Android Audio服务的历程想必也不会轻松.接下来

Android 系统默认参数的修改

转自: http://www.th7.cn/Program/Android/201505/447097.shtml 写在前面的话 一般在新项目开始之初,我们需要针对客户需求进行各种系统默认属性的配置,通常这些属性都是通过build.prop.settings.db .default.xml.一些功能package下的 config.xml 等来进行初始化配置的. 那么,要满足客户的定制需求,对于我们开发者来说,修改SettingsProvider默认值,而第一次开机时,用来填充settings.

策略路由和路由策略的不同

路由策略(Routing Policy)是为了改变网络流量所经过的途径而修改路由信息的技术,主要通过改变路由属性(包括可达性)来实现. 策略路由(Policy Routing)是一种依据用户制定的策略进行路由选择的机制. 路由器在发布与接收路由信息时,可能需要实施一些策略,以便对路由信息进行过滤,例如只接收或发布满足一定条件的路由信息.一种路由协议可能需要引入其它的路由协议发现的路由信息,路由器在引入其它路由协议的路由信息时,可能只需要引入一部分满足条件的路由信息,并控制所引入的路由信息的某些属

策略路由与路由策略

最近发现技术交流群里边有很多同学对策略路由与路由策略傻傻分不清楚,于是乎在此用简要通俗的语言来对这两个名词进行说明,希望会给迷茫的同学带来帮助. 路由策略:是对路由信息本身的参数进行修改.控制等,达到使设备有选择的学习路由信息的效果,所以你会看到路由策略是在路由学习与路由引入得时候使用的.说白了路由策略就是告诉设备怎么学. 策略路由:重点在路由,这个很好理解,就是通过策略控制数据包的转发方向.直接作用于用户数据,相当于告诉设备让数据包该怎么走.

Android开发之策略模式初探

策略模式主要定义一系列的算法,学过数据结构的朋友肯定知道,对于数组从大到小进行排序有着很多的算法,比如冒泡.交换.快速插入等等,策略模式就是把这些算法封装成一个个独立的类,方便使用时候进行任意的调用.这里以字符串替代为例, 有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出.关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案. 首先,我们建立一个抽象类RepTempRule 定义一些公用变量和方法: public abstract class

路由策略与策略路由的区别

路由策略与策略路由的区别这两中方案都是为了控制网络流量的可达性或调整网络流量的路径:一.路由策略.(Route-Policy)路由策略是通过修改路由表的路由条目来控制数据流量的可达性.即对接受和发布的路由进过滤.这种方式称为路由策略.路由策略由于仅仅在路由发现的时候产生作用,在路由表产生且稳定之后,如果网络不发生变化,路由表通常都不会变化,这时候,路由策略没有应用就不会占用资源. 二.策略路由.(Traffic-Policy)策略路由是通过用户制定的策略进行转发,且该策略优于路由表的转发.这种方

路由策略---华为实验,不懂得可以当模板用

路由策略是为了改变网络流量所经过的途径而修改路由信息的技术,主要通过改变路由属性(包括可达性)来实现. 实验拓扑:交换机配置: acl number 3000 rule 5 permit ip source192.168.6.105 0 destination 12.12.12.6 0 q traffic classifier secoperator or if-match acl 3000 q traffic behavior sec redirect ip-nexthop172.16.3.1