Android音频系统学习三:AudioPolicyService服务的启动过程(下)

上篇大致梳理了下APM解析配置文件的过程,接下来再看看APM的初始化过程,也就是initialize的部分

回顾一下APM的构造函数如下:
在这里插入图片描述
看看initialize内部里面的处理内容:

1、创建音频engine对象,并将APM设置为监听者,监听音频engine的状态
在这里插入图片描述
可以看到代码上也并没有多做什么,主要就是实例化一个engine对象,且让APM可以监听其状态

2、根据module名找到对应的hal库,然后在根据module下的outputprofile创建用于播放的Thread;在这里插入图片描述

2.1 loadHwModule()
这里实际最终调用到AudioFlinger:loadHwModule_l(),这也是上篇有提到过为什么先去启动AF,因为APS的启动要用到;
在这里插入图片描述
为了图省事就只截图了,后面还是要画一下流程图补上来:

接下来看看openDevice做了什么;
在这里插入图片描述
在这里插入图片描述
2.1.1先看看hw_get_module_by_class做了什么,参数就是 库名所需要的name 去拼接,
在这里插入图片描述
可以看到就是通过传进来的AUDIO_HARDWARE_MODULE_ID以及name去生成lib的path,然后通过**load()**函数去解析这个hal lib ,返回一个handle 句柄并赋值给传入的参数&mod
在这里插入图片描述
2.1.2:audio_hw_device_open(mod, dev):
在这里插入图片描述
这里就是去调用hal的open函数,
在这里插入图片描述
实际调用到了audio_hw.c中adev_open(),只会被调用一次,也就是给硬件模块中的函数指针赋值open()。
在这里插入图片描述
将这些hal的方法的结构体指针返回给最初传入的&dev中,这样AF就可以通过hal向下操作了

2.2、openoutput():
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.2.1、findSuitableHwDev_l()
在这里插入图片描述
看起来就是根据传入的module去找到对应的解析到可以操作hal接口的Handle;

2.2.2:AudioStreamOut & outHwDev->openOutputStream():
先创建了一个AudioStreamOut类型的指针变量,接着调用AudioHwDevice::openoutputstream()
在这里插入图片描述
接着有实例化一个AudioStreamOut对象,并且AudioHwDevice对象作为参数也传入进去
在这里插入图片描述
然后调用AudioStreamOut:open(),通过hwDev call 到 hal 的openOutputStream
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看上面的逻辑,由于系统启动的时候传入的flag是AUDIO_OUTPUT_FLAG_NONE,所以只会创建MixerThread且与output所绑定,方便启动完成后,播放声音会根据output去选择对应的Thread来播放,后续梳理播放的过程会在详细介绍,至于OFFLOAD以及DIRECT是在使用到该场景才会去创建Thread;

到此APS 的启动过程已经完成大半,接下来的操作就是调用addOutput(),和 setOutputDevice(去设置要默认打开的设备,并且applyStreamVolumes)这个也是后面更新播放的流程去介绍,最后就是去openInputStream,因为音频系统不止有播放还有录音过程,openInputStream 和openOutputStream也差不多,感兴趣的同学可以去看看;

3、总结APS整个的启动过程:

Android系统启动会去解析init.rc配置文件,然后会调用到main_audioserver.cpp 中的main函数去启动AF和APS

main 函数当中会去 new AudioPolicyService,会做如下事情:
3.1、创建音频系统去处理一些指令的AudioCommandThread,如调节音量、start tone 等等
3.2、实例化一个AudioPolicyManager对象
3.2.1、解析音频系统的配置文件给接下来APM初始化使用
3.2.2、初始化APM:
3.2.2.1:创建一个engine的对象,并且将APM设定为监听者
3.2.2.2.1:根据解析得到的module集合循环去需要加载hal 库,并通过hal adev_open对结构体函数指针赋值----hal的接口
3.2.3.2.2:将每个module下多个outProfile 再去调用AF的openOutput,先去获取hal的一个outputstream,然后再去创建对应的playback thread,且与output 绑定,播放时可以根据output选择对应的playback thread
3.2.3.2.3:然后setOutputDevice去设定默认的设备以及apply volume等
3.2.3.2.4:接着就是openInputStream的操作

    3.3、实例化一个AudioEffect对象

到这APS的启动就基本完成了,重点就是获取了可以操作hal接口的对象dev,stream,dev就是audio_hw_device,outputStream就是audio_stream_in、audio_stream_out。

注:文章用于记录一下学习音频流程的个人理解,如果理解不对,还请多指教,感谢感谢~

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值