AudioPolicyService::instantiate()流程分析

分析instantiate()之前,
依然是接着前面分析了main()函数的开始:Android Audio:main_audioserver.cpp中的main()函数启动流程

在这里插入图片描述
接下来分析AudioPolicyService的instantiate(),写的hin粗糙仅供自己实习学习记录
在这里插入图片描述
android\frameworks\av\services\audiopolicy\service\AudioPolicyService.cpp

同AudioFligner一样,会走到AudioPolicyService的构造函数去。
在这里插入图片描述
此处未做任何操作,因此会走到onFirstRef()函数中去。这里的继承关系如下:
在这里插入图片描述
关于为何会走到onFirstRef()是因为智能指针RefBase首次创建就会调用此方法。
具体可参考:理解Refbase强弱引用 – Gityuan博客

开启tone,audio,output线程,构建一个AudioPolicyClient对象,然后createAudioPolicyManager函数的初始化;
在这里插入图片描述
frameworks\av\services\audiopolicy\manager\AudioPolicyFactory.cpp

构建一个APM对象
在这里插入图片描述
frameworks\av\services\audiopolicy\managerdefault\AudioPolicyManager.cpp

通过new 一个AudioPolicyManager对象。
在这里插入图片描述
首先看loadConfig()的函数中具体加载什么样的配置文件。如果配置不存在,则加载默认的配置。这里我通过加打印日志,设备真机调试,这里加载的是圈起来的配置。
在这里插入图片描述
由此也可推断出上面的空构造函数是走的如下的参数赋值(具体的打印日志被我版本回退没有了…):
在这里插入图片描述
我们可以看下它另一条路对应的配置文件的内容是什么。

frameworks\av\services\audiopolicy\common\managerdefinitions\include\audio_policy_conf.h

对应的配置文件定义为:
在这里插入图片描述
配置文件中主要是硬件模块的采样率等信息。
在这里插入图片描述
接着看initialize(),初始化音量配置后,开始引擎的实例化。
在这里插入图片描述
android\frameworks\av\services\audiopolicy\enginedefault\src\EngineInstance.cpp

构造函数中没有作任何操作,单例模式。getInstance得到对象的地址。
在这里插入图片描述

返回initialize(),通过实例engineInstance查询AudioPolicyManagerInterface接口。

frameworks\av\services\audiopolicy\managerdefault\AudioPolicyManager.cpp
在这里插入图片描述
queryInterface函数获取mEngine对象指针
在这里插入图片描述
\frameworks\av\services\audiopolicy\enginedefault\src\Engine.cpp

将AudioPolicyManager设置观察者,检测策略引擎是否初始化成功。
在这里插入图片描述
\frameworks\av\services\audiopolicy\enginedefault\src\Engine.cpp

设置AudioPolicyManagerObserver为观察者
在这里插入图片描述
通过mEngine->initCheck()函数检测观察者模式是否设置成功;
在这里插入图片描述
frameworks\av\services\audiopolicy\managerdefault\AudioPolicyManager.cpp

打开所有输出流必须能访问连接设备,以迭代的方式初始化所有的硬件模块。通过模块名称加载硬件模块,如果不能打开相应模块,则继续循环。push_back(),将加载的模块保存到集合:mHwModules中,声明:HwModuleCollection mHwModules;这个变量只保存加载成功的音频硬件模块。
在这里插入图片描述
得到设备的支持输出类型。
在这里插入图片描述
new一个输出设备的描述符,通过描述符打开输出设备的地址。
在这里插入图片描述
frameworks\av\services\audiopolicy\common\managerdefinitions\src\AudioOutputDescriptor.cpp
在这里插入图片描述
\android\system\media\audio\include\system\audio-base.h

取得flags对应的值。
在这里插入图片描述
通过传入的配置文件,设备和地址来打开。如果配置文件已经被卸载了,则设置为默认值。
在这里插入图片描述
打开带有请求参数的音频输出,参数值可以指示使用默认值。函数返回时,参数值反映音频硬件输出流使用的实际值。音频策略管理器可以检查建议的参数是否合适,并相应地进行操作。
在这里插入图片描述
android\frameworks\av\services\audiopolicy\service\AudioPolicyClientImpl.cpp

得到一个af对象,通过af打开设备。
在这里插入图片描述
通过binder机制获取af的服务。
在这里插入图片描述
android\frameworks\av\services\audioflinger\AudioFlinger.cpp

然后通过转到AF来打开输出,开启线程。
在这里插入图片描述
前面进行传入参数的设置,得到一个音频模块的设备。
在这里插入图片描述
开启音频硬件设备音频输出流。
在这里插入图片描述
frameworks\av\services\audioflinger\AudioHwDevice.cpp
尝试使用目前的格式打开HAL层
在这里插入图片描述
frameworks\av\services\audioflinger\AudioStreamOut.cpp

创建并打开音频硬件输出流。
在这里插入图片描述
frameworks\av\media\libaudiohal\include\media\audiohal\DeviceHalInterface.h
在这里插入图片描述
frameworks\av\media\libaudiohal\include\media\audiohal\DeviceHalInterface.h
在这里插入图片描述
因为DeviceHalLocal继承DeviceHalInterface,因此走DHL的open.
在这里插入图片描述frameworks\av\media\libaudiohal\4.0\DeviceHalLocal.cpp

创建并打开音频硬件输出流。
在这里插入图片描述
继续往下走,走下面的new。
在这里插入图片描述
android\frameworks\av\media\libaudiohal\4.0\StreamHalLocal.cpp

未作任何操作。只是初始化了这个对象,此条线暂时不走了。
在这里插入图片描述
frameworks\av\services\audiopolicy\managerdefault\AudioPolicyManager.cpp

回到最开始的AudioPolicyManager::initialize()函数中。

接下来打开输入设备。
在这里插入图片描述
android\frameworks\av\services\audiopolicy\common\managerdefinitions\src\ AudioInputDescriptor.cpp
获得参数,如果存在,则设置为默认参数。
在这里插入图片描述
\frameworks\av\services\audiopolicy\common\managerdefinitions\include\ IOProfile.h
因为IOProfile继承AudioPort,所以pickAudioProfile走父类的方法。
在这里插入图片描述
frameworks\av\services\audiopolicy\common\managerdefinitions\src\ AudioPort.cpp

获得音频格式、采样率、声道掩码的值。
在这里插入图片描述
返回,继续看AudioPolicyManager::initialize()函数。
在这里插入图片描述
frameworks\av\services\audiopolicy\common\managerdefinitions\src\ AudioInputDescriptor.cpp
跟输出设备大致相同,暂时不研究输入。
在这里插入图片描述
保证所有的连接设备都有一个独一无二的值。
在这里插入图片描述
frameworks\av\services\audiopolicy\engineconfigurable\src\ Engine.cpp]
设置设备连接,得到策略管理观察者的可用设备类型。
在这里插入图片描述
保证默认音频设备可用
在这里插入图片描述
如果麦克风地址为空,需根据设备类型来设置麦克风的地址
在这里插入图片描述
更新设备和输出设备,根据系统的当前状态选择最后的输出设备.
在这里插入图片描述
为设备获取音频策略。
在这里插入图片描述
通过流类型进行循环赋值,如果策略满足,选择设备。最后返回引擎对象中的获取设备策略。
在这里插入图片描述
android\frameworks\av\services\audiopolicy\enginedefault\src\ Engine.cpp
在这里插入图片描述
通过音频策略进行设备的选择。
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值