1. 程式人生 > 實用技巧 >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;
    }

}