9. android 动态音频策略的原理
创始人
2024-04-06 05:02:40

基于Android 11 aosp 源码分析。

 

目录

理解

AudioManager.java, 提供了注册外部策略的接口:

注入的mAudioPolicy包含了什么信息:

外部策略如何被系统触发:

音量控制

 焦点请求

设备选择      


理解

针对与Car,  Android 将音频策略部分,通过提供外部(app 层)注入的方式,放在更加灵活的 app java层来实现。

        以前的android基本为了手机设计,输出设备相对较少也不会给应用来控制,应用只是给一个stream类型,由AudioPolicy在底层根据你的stream类型偷偷地给你选一个设备,现在android要用于车机,发现这些音频设备变多了,手机上的那一套做很难满足需求,为了即保留对原来手机的逻辑支持,有可在车机上自定义更高级的策略玩法,于是想了个办法,把所有设备对应什么用途这些定义不再是直接写在AudioPolicy里面了,而是可以通过函数的方式注入进来,这样这些设备用途的定义,都可以放在更加灵活的app层面来做,并且不光是设备的usage定义,还有音量控制,音频焦点请求等这些逻辑一样,都可以先把回调注入 进来。

如此,对于手机上的场景,可以使用默认的策略,对于汽车,只需要再添加一个app,把新的策略注册进去即可覆盖替换原先的策略。 这个支持app层注册音频规则和控制回调的策略,即动态策略,它包括了 设备选择(mix规则)、音量控制(分频分区域控制音量)、音频焦点申请这三个策略。
 

AudioManager.java, 提供了注册外部策略的接口:

@TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull AudioPolicy policy) {

return registerAudioPolicyStatic(policy);

}

 有了这个接口,mix规则就可以放在 app 层实现,通过这个方法注入进去。当然,不是所有app都能随意注册,需要systemapp , 需要MODIFY_AUDIO_ROUTING权限

默认不注册动态策略,也就是传统的手机设备,如果在车机,只需要 加入这么一个系统app,在app层实现动态策略然后注入,底层即可适配。

注入的mAudioPolicy包含了什么信息:

  注入这里的AudioPolicy.java 它和 底层AudioPolicyServer里面的AudioPolicy没什么关系,仅仅是用来包含这个动态策略的一个类而已。AudioManager.java作为java层对外提供的api,大部分时候也只是一个空壳,内部还是通过调用AudioServer.java ,而AudioServer.java再调用音频系统总功能AudioSystem.cpp 在java层的接口AudioSystem.java
AudioServer
 

 AudioService.java::public String registerAudioPolicy(AudioPolicyConfig policyConfig, IAudioPolicyCallback pcb,boolean hasFocusListener, boolean isFocusPolicy, boolean isTestFocusPolicy,boolean isVolumeController, IMediaProjection projection) {...if (isFocusPolicy) {// 1.0 焦点控制的回调,...mMediaFocusControl.setFocusPolicy(mPolicyCallback,     mIsTestFocusPolicy);}if (mIsVolumeController) {// 2.0 音量控制的回调setExtVolumeController(mPolicyCallback);}// 3.0 mix规则connectMixes(){....AudioSystem.registerPolicyMixes(mMixes, true);}}

外部策略如何被系统触发:

音量控制

按音量+-键,系统会触发AudioServer.java的 adjustSuggestedStreamVolume(),如果注册了外部音量控制器,就直接由外部控制器处理音量事件。在AudioServer.java中,通过notifyExternalVolumeController() 全部交给外部策略来控制,处理完即返回

 焦点请求

  app通过AudioManager.java接口请求获取焦点 requestAudioFocus(), 如果注入了外部焦点策略,就通知外部策略模块处理焦点请求。

   在MediaFocusControl.java中,通过notifyExtFocusPolicyFocusRequest_syncAf()交给外部策略处理,外部处理完策略,可以通过 AudioManager.java::setFocusRequestResult()

  ( ->AudioServer.java::setFocusRequestResultFromExtPolicy()->MediaFocusControl.java::setFocusRequestResultFromExtPolicy() )

  将结果设置回来,由AudioManager 把结果发给引用层通知app其焦点发送变化,如果是有framework强制duck的,AudioMnager在发送结果的同时还会让MediFocusControl执行duck操作,外部策略只需要处理焦点策略逻辑。


设备选择      

        则是AudioSystem.registerPolicyMixes() 直接注册到AudioPolicy中的,用于设备选择的规则。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...