目录
/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; } }