安卓音频系统启动流程

        自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的构建,很长的一段代码了。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值