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;
}
}