赞
踩
分析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
通过音频策略进行设备的选择。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。