AudioServer进程是在init进程启动之后通过启动脚本启动的。
涉及文件:
frameworks/av/media/audioserver/main_audioserver.cpp
frameworks/av/services/audioflinger/AudioFlinger.cpp
frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp
frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
frameworks/av/services/audioflinger/AudioHwDevice.cpp
frameworks/av/media/libaudiohal/impl/DeviceHalLocal.cpp
frameworks/av/services/audioflinger/AudioStreamOut.cpp
一. AudioServer启动分析:
1.AudioFlinger服务初始化,并注册进ServiceManager:
sm->addService("media.audio_flinger), new sp<AudioFlinger>);
AudioFlinger负责音量设置、混音播放、录音等功能,它是音频策略的执行者。
2.AudioPolicyService服务初始化,并注册进SM:
sm->addService("media.audio_policy", new sp<AudioFlinger>);
AudioPolicyService是音频策略的制定者,在AudioPolicyService初始化的过程中,除了向SM注册服务之外,还做了以下事情:
- 1) 通过AF加载解析etc下的config音频策略文件,读取硬件相关配置;
- 2) 根据config module信息,loadHwModule 加载打开HAL动态库,获取AudioHwDevice结构体作为访问HAL的媒介;
- 3)创建AudioPolicyManager对象,通过AF调用AudioHwDevice openOutputStream ,最终获取构建对应的AudioStreamOut对象。
- 4)构建AudioStreamOut对应的PlaybackThread音频播放线程用于音频输出。
- 5)通过AudioHwDevice openInputStream 获取构建对应的AudioStreamIn对象用于音频录入。
详细的调用过程参照以下AudioServer的启动时序图:
3. 启动Binder线程池,等待客户端的访问。
二、AudioServer的启动时序图
详细调用过程如下:
01_AudioServerStart_primary.png 02_AudioServerStart_loadHw.png 03_AudioServerStart_openAudioInput.png
网友评论