在工作时,往往有这样一些需求:
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://edu.51cto.com/sd/0a9d4
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。