当前位置:   article > 正文

安卓音频系统启动流程_安卓audio启动流程

安卓audio启动流程

        自Android6.0后,Audio系统便和Media系统分离,独立模块。所以了解Audio系统的启动流程就很有必要,它的启动入口位于:main_audioserver.cpp ,由rc文件引导,主要作用是调用了AudioFlinger和AudioPolicyService这两大模块的初始化接口。


         1  进程入口


  1. //xref: /frameworks/av/media/audioserver/main_audioserver.cpp
  2. if (doLog && (childPid = fork()) != 0) {
  3. //LOG日志相关,不进入
  4. } else {
  5. sp<ProcessState> proc(ProcessState::self());
  6. sp<IServiceManager> sm = defaultServiceManager();
  7. ALOGI("ServiceManager: %p", sm.get());
  8. AudioFlinger::instantiate();
  9. AudioPolicyService::instantiate();
  10. //录音系统
  11. RadioService::instantiate();
  12. //声效系统
  13. SoundTriggerHwService::instantiate();
  14. // FIXME: remove when BUG 31748996 is fixed
  15. android::hardware::ProcessState::self()->startThreadPool();
  16. IPCThreadState::self()->joinThreadPool();
  17. }

           可见其调用了AudioFlinger和AudioPolicyServer的instantiate()接口,看来是个单例模式。然后就是启动并加入线程池这个老操作了。我们接下开看看AudioFlinger的启动过程。


          2  AudioFlinger启动过程


           可惜,我们在AudioFlinger类里找不到这个instantiate()接口,按照谷歌的惯性自然要去它的父类寻找,证据如下:

  1. class AudioFlinger :
  2. public BinderService<AudioFlinger>,//父类模板类型是AudioFlinger?
  3. public BnAudioFlinger
  4. {
  5. friend class BinderService<AudioFlinger>; // for AudioFlinger()
  6. }

          好的,看看BinderService<AudioFlinger>实现吧:

  1. //xref: /frameworks/native/include/binder/BinderService.h
  2. template<typename SERVICE>
  3. class BinderService
  4. {
  5. public:
  6. static status_t publish(bool allowIsolated = false) {
  7. sp<IServiceManager> sm(defaultServiceManager());
  8. return sm->addService(
  9. String16(SERVICE::getServiceName()),
  10. new SERVICE(), allowIsolated);
  11. }
  12. //...
  13. static void instantiate() { publish(); }
  14. private:
  15. //...
  16. };

           清晰明了,new了一个SERVICE(即AudioFlinger),并注册到Manager服务里,方便其他模块申请服务。那么我们看看AudioFlinger的构造函数吧:

  1. AudioFlinger::AudioFlinger()
  2. : BnAudioFlinger(),
  3. mMediaLogNotifier(new AudioFlinger::MediaLogNotifier()),//log
  4. mPrimaryHardwareDev(NULL),//主音频设备
  5. mAudioHwDevs(NULL),//音频硬件
  6. mHardwareStatus(AUDIO_HW_IDLE),//hal层状态
  7. mMasterVolume(1.0f),//主音量值,默认最大
  8. mMasterMute(false),//主音量静音?
  9. // mNextUniqueId(AUDIO_UNIQUE_ID_USE_MAX),
  10. mMode(AUDIO_MODE_INVALID),
  11. mBtNrecIsOff(false),//蓝牙
  12. mIsLowRamDevice(true),
  13. mIsDeviceTypeKnown(false),
  14. mGlobalEffectEnableTime(0),
  15. mSystemReady(false)
  16. {
  17. //LOG相关
  18. }

          看来没什么东西。不过所有使用智能指针(继承RefBase)的类在第一次创建时都会调用refBase()函数,我们来看看它里面有什么:

  1. void AudioFlinger::onFirstRef()
  2. {
  3. Mutex::Autolock _l(mLock);
  4. //设置相关线程待机等待时间?
  5. /* TODO: move all this work into an Init() function */
  6. char val_str[PROPERTY_VALUE_MAX] = { 0 };
  7. if (property_get("ro.audio.flinger_standbytime_ms", val_str, NULL) >= 0) {
  8. uint32_t int_val;
  9. if (1 == sscanf(val_str, "%u", &int_val)) {
  10. mStandbyTimeInNsecs = milliseconds(int_val);
  11. ALOGI("Using %u mSec as standby time.", int_val);
  12. } else {
  13. mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs;
  14. ALOGI("Using default %u mSec as standby time.",
  15. (uint32_t)(mStandbyTimeInNsecs / 1000000));
  16. }
  17. }
  18. //低延时IO相关
  19. mPatchPanel = new PatchPanel(this);
  20. mMode = AUDIO_MODE_NORMAL;
  21. gAudioFlinger = this;
  22. }

        看来只是设置了一些相关参数,AudioFlinger初始化部分也就这些了(但是AudioFlinger才是我们分析Audio系统的大本营,基本C++层的所有音频服务都要过它的手)。我们接着看AudioPolicyService:


         3  AudioPolicyService初始化


         同样,要去它的父类寻找instantiate()接口,步骤过程和AudioFlinger类似,就不再阐述,我们看看它的构造函数:

  1. // xref: /frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp
  2. AudioPolicyService::AudioPolicyService()
  3. : BnAudioPolicyService(), mpAudioPolicyDev(NULL), mpAudioPolicy(NULL),
  4. mAudioPolicyManager(NULL), mAudioPolicyClient(NULL), mPhoneState(AUDIO_MODE_INVALID)
  5. {
  6. }

         哈哈,好吧不用看了,我们移步onFirstRef()函数:

  1. void AudioPolicyService::onFirstRef()
  2. {
  3. {
  4. Mutex::Autolock _l(mLock);
  5. // start tone playback thread
  6. mTonePlaybackThread = new AudioCommandThread(String8("ApmTone"), this);
  7. // start audio commands thread
  8. mAudioCommandThread = new AudioCommandThread(String8("ApmAudio"), this);
  9. // start output activity command thread
  10. mOutputCommandThread = new AudioCommandThread(String8("ApmOutput"), this);
  11. //创建AudioPolicyClient并用于创建AudioPolicyManager
  12. mAudioPolicyClient = new AudioPolicyClient(this);
  13. mAudioPolicyManager = createAudioPolicyManager(mAudioPolicyClient);
  14. }
  15. // load audio processing modules
  16. sp<AudioPolicyEffects>audioPolicyEffects = new AudioPolicyEffects();
  17. {
  18. Mutex::Autolock _l(mLock);
  19. mAudioPolicyEffects = audioPolicyEffects;
  20. }
  21. }

        再看看AudioPolicyManager的创建过程(createAudioPolicyManager)。

  1. // xref: /frameworks/av/services/audiopolicy/manager/AudioPolicyFactory.cpp
  2. extern "C" AudioPolicyInterface* createAudioPolicyManager(
  3. AudioPolicyClientInterface *clientInterface)
  4. {
  5. return new AudioPolicyManager(clientInterface);
  6. }

       把clientInterface传参用于AudioPolicyManager的构建,很长的一段代码了。

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号