其他分享
首页 > 其他分享> > AudioPolicyService启动过程分析

AudioPolicyService启动过程分析

作者:互联网

目录

/frameworks/av/media/audioserver/main_audioserver.cpp

int main(int argc __unused, char** argv)
{
  .......
  AudioPolicyService::instantiate();
  .......      
}

AudioPolicyService::instantiate

AudioPlicyService类中并没有instantiate函数,那么肯定是从父类中继承得到的。

/frameworks/av/services/audiopolicy/service/AudioPolicyService.h

class AudioPolicyService :
    public BinderService<AudioPolicyService>,
    public BnAudioPolicyService,
    public IBinder::DeathRecipient
{
    friend class BinderService<AudioPolicyService>;

public:
    // for BinderService
    static const char *getServiceName() ANDROID_API { return "media.audio_policy"; }

在代码中搜索,可以发现instantiate函数是在BinderService类中定义的。

/frameworks/native/libs/binder/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(); }
 .......

从上面的代码可以看出,AudioPolicyService::instantiate()实际上调用了publish函数,publish函数实际上调用了addService函数。在addService函数中,实现了3个作用:

1.SERVICE::getServiceName()

因为BinderService是类模板,又因为AudioPolicyService::instantiate(),所以此处的SERVICE就是类AudioPolicyService类。

因此SERVICE::getServiceName()实际上调用了AudioPolicyService类中的成员函数getServiceName.

static const char *getServiceName() ANDROID_API { return "media.audio_policy"; }

将返回一个media.audio_policy的服务

2.new SERVICE

调用AudioPolicyService的构造函数,创建了一个AudioPolicyService的对象,做一些初始化的工作。

/frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp

AudioPolicyService::AudioPolicyService()
    : BnAudioPolicyService(), mpAudioPolicyDev(NULL), mpAudioPolicy(NULL),
      mAudioPolicyManager(NULL), mAudioPolicyClient(NULL), mPhoneState(AUDIO_MODE_INVALID)
{
}

3.调用AudioPolicyService::onFirstRef()

由于sm是sp<IServiceManager>强引用类型的指针,所以在第一次调用AudioPolicyService模块时,会调用AudioPolicyService::onFirstRef()

/frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp

void AudioPolicyService::onFirstRef()
{
    {
        Mutex::Autolock _l(mLock);

        // start tone playback thread,用于播放tone音,tone是音调的意思
        mTonePlaybackThread = new AudioCommandThread(String8("ApmTone"), this);
        // start audio commands thread,用于执行audio命令
        mAudioCommandThread = new AudioCommandThread(String8("ApmAudio"), this);
        // start output activity command thread,用于执行audio输出命令
        mOutputCommandThread = new AudioCommandThread(String8("ApmOutput"), this);
        //实例化AudioPolicyClient对象
        mAudioPolicyClient = new AudioPolicyClient(this);
        //实例化AudioPolicyManager对象
        mAudioPolicyManager = createAudioPolicyManager(mAudioPolicyClient);
    }
    // load audio processing modules
    //初始化音效相关
    sp<AudioPolicyEffects>audioPolicyEffects = new AudioPolicyEffects();
    {
               mAudioPolicyEffects = audioPolicyEffects;
    }

}

 

标签:分析,SERVICE,启动,instantiate,AudioPolicyService,BinderService,new,audio
来源: https://www.cnblogs.com/-glb/p/14255710.html