赞
踩
自Android6.0后,Audio系统便和Media系统分离,独立模块。所以了解Audio系统的启动流程就很有必要,它的启动入口位于:main_audioserver.cpp ,由rc文件引导,主要作用是调用了AudioFlinger和AudioPolicyService这两大模块的初始化接口。
1 进程入口
- //xref: /frameworks/av/media/audioserver/main_audioserver.cpp
- if (doLog && (childPid = fork()) != 0) {
- //LOG日志相关,不进入
- } else {
- sp<ProcessState> proc(ProcessState::self());
- sp<IServiceManager> sm = defaultServiceManager();
- ALOGI("ServiceManager: %p", sm.get());
- AudioFlinger::instantiate();
- AudioPolicyService::instantiate();
- //录音系统
- RadioService::instantiate();
- //声效系统
- SoundTriggerHwService::instantiate();
- // FIXME: remove when BUG 31748996 is fixed
- android::hardware::ProcessState::self()->startThreadPool();
-
- IPCThreadState::self()->joinThreadPool();
- }

可见其调用了AudioFlinger和AudioPolicyServer的instantiate()接口,看来是个单例模式。然后就是启动并加入线程池这个老操作了。我们接下开看看AudioFlinger的启动过程。
2 AudioFlinger启动过程
可惜,我们在AudioFlinger类里找不到这个instantiate()接口,按照谷歌的惯性自然要去它的父类寻找,证据如下:
- class AudioFlinger :
- public BinderService<AudioFlinger>,//父类模板类型是AudioFlinger?
- public BnAudioFlinger
- {
- friend class BinderService<AudioFlinger>; // for AudioFlinger()
- }
好的,看看BinderService<AudioFlinger>实现吧:
- //xref: /frameworks/native/include/binder/BinderService.h
- template<typename SERVICE>
- class BinderService
- {
- public:
- static status_t publish(bool allowIsolated = false) {
- sp<IServiceManager> sm(defaultServiceManager());
- return sm->addService(
- String16(SERVICE::getServiceName()),
- new SERVICE(), allowIsolated);
- }
- //...
- static void instantiate() { publish(); }
-
- private:
- //...
- };

清晰明了,new了一个SERVICE(即AudioFlinger),并注册到Manager服务里,方便其他模块申请服务。那么我们看看AudioFlinger的构造函数吧:
- AudioFlinger::AudioFlinger()
- : BnAudioFlinger(),
- mMediaLogNotifier(new AudioFlinger::MediaLogNotifier()),//log
- mPrimaryHardwareDev(NULL),//主音频设备
- mAudioHwDevs(NULL),//音频硬件
- mHardwareStatus(AUDIO_HW_IDLE),//hal层状态
- mMasterVolume(1.0f),//主音量值,默认最大
- mMasterMute(false),//主音量静音?
- // mNextUniqueId(AUDIO_UNIQUE_ID_USE_MAX),
- mMode(AUDIO_MODE_INVALID),
- mBtNrecIsOff(false),//蓝牙
- mIsLowRamDevice(true),
- mIsDeviceTypeKnown(false),
- mGlobalEffectEnableTime(0),
- mSystemReady(false)
- {
- //LOG相关
- }

看来没什么东西。不过所有使用智能指针(继承RefBase)的类在第一次创建时都会调用refBase()函数,我们来看看它里面有什么:
- void AudioFlinger::onFirstRef()
- {
- Mutex::Autolock _l(mLock);
- //设置相关线程待机等待时间?
- /* TODO: move all this work into an Init() function */
- char val_str[PROPERTY_VALUE_MAX] = { 0 };
- if (property_get("ro.audio.flinger_standbytime_ms", val_str, NULL) >= 0) {
- uint32_t int_val;
- if (1 == sscanf(val_str, "%u", &int_val)) {
- mStandbyTimeInNsecs = milliseconds(int_val);
- ALOGI("Using %u mSec as standby time.", int_val);
- } else {
- mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs;
- ALOGI("Using default %u mSec as standby time.",
- (uint32_t)(mStandbyTimeInNsecs / 1000000));
- }
- }
- //低延时IO相关
- mPatchPanel = new PatchPanel(this);
-
- mMode = AUDIO_MODE_NORMAL;
-
- gAudioFlinger = this;
- }

看来只是设置了一些相关参数,AudioFlinger初始化部分也就这些了(但是AudioFlinger才是我们分析Audio系统的大本营,基本C++层的所有音频服务都要过它的手)。我们接着看AudioPolicyService:
3 AudioPolicyService初始化
同样,要去它的父类寻找instantiate()接口,步骤过程和AudioFlinger类似,就不再阐述,我们看看它的构造函数:
- // xref: /frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp
- AudioPolicyService::AudioPolicyService()
- : BnAudioPolicyService(), mpAudioPolicyDev(NULL), mpAudioPolicy(NULL),
- mAudioPolicyManager(NULL), mAudioPolicyClient(NULL), mPhoneState(AUDIO_MODE_INVALID)
- {
- }
哈哈,好吧不用看了,我们移步onFirstRef()函数:
- void AudioPolicyService::onFirstRef()
- {
- {
- Mutex::Autolock _l(mLock);
-
- // start tone playback thread
- mTonePlaybackThread = new AudioCommandThread(String8("ApmTone"), this);
- // start audio commands thread
- mAudioCommandThread = new AudioCommandThread(String8("ApmAudio"), this);
- // start output activity command thread
- mOutputCommandThread = new AudioCommandThread(String8("ApmOutput"), this);
-
- //创建AudioPolicyClient并用于创建AudioPolicyManager
- mAudioPolicyClient = new AudioPolicyClient(this);
- mAudioPolicyManager = createAudioPolicyManager(mAudioPolicyClient);
- }
- // load audio processing modules
- sp<AudioPolicyEffects>audioPolicyEffects = new AudioPolicyEffects();
- {
- Mutex::Autolock _l(mLock);
- mAudioPolicyEffects = audioPolicyEffects;
- }
- }

再看看AudioPolicyManager的创建过程(createAudioPolicyManager)。
- // xref: /frameworks/av/services/audiopolicy/manager/AudioPolicyFactory.cpp
- extern "C" AudioPolicyInterface* createAudioPolicyManager(
- AudioPolicyClientInterface *clientInterface)
- {
- return new AudioPolicyManager(clientInterface);
- }
把clientInterface传参用于AudioPolicyManager的构建,很长的一段代码了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。