Android MediaPlayer架构 -- 前言小知识点(二)

  本文系做者本身学习之所用,文章内容仅出自做者拙劣之思考,问题之处烦请不吝指教。函数

 

  在frameworks\av\media\libmedia\mediaplayer.cpp中会有语句:const sp<IMediaPlayerService>& service(getMediaPlayerService()); 来创建MediaPlayerService的binder接口,那么这个getMediaPlayerService()是如何工做的呢,这篇文章简单看一下。学习

 

  本文涉及到的源文件:spa

  frameworks/av/include/media/mediaplayer.hcode

  frameworks/av/media/libmedia/mediaplayer.cppserver

  frameworks/av/include/media/IMediaDeathNotifier.hblog

  frameworksav/media/libmedia/IMediaDeathNotifier.cpp继承

 

  首先咱们要明确的是,getMediaPlayerService() 是IMediaDeathNotifier类的公有静态成员函数,而MediaPlayer继承自IMediaDeathNotifier,因此能够直接引用。接口

  getMediaPlayerService() 在IMediaDeathNotifier类中的声明:get

  

1 class IMediaDeathNotifier: virtual public RefBase 2 { 3 public: 4  ...... 5     static const sp<IMediaPlayerService>& getMediaPlayerService(); // 静态、公有 6  ...... 7 };

 

 

 

  

  MediaPlayer继承自IMediaDeathNotifier:it

 

1 class MediaPlayer : public BnMediaPlayerClient, 2                     public virtual IMediaDeathNotifier // 注意继承关系 3 { 4  ....... 5 }

 

 

 

 

  重点看一下getMediaPlayerService()方法的定义:

 

 1 // establish binder interface to MediaPlayerService
 2 /*static*/const sp<IMediaPlayerService>&
 3 IMediaDeathNotifier::getMediaPlayerService()  4 {  5     ALOGV("getMediaPlayerService");  6  Mutex::Autolock _l(sServiceLock);  7     if (sMediaPlayerService == 0) {  8         sp<IServiceManager> sm = defaultServiceManager(); // 首先获得ServiceManager的引用
 9         sp<IBinder> binder; 10         do { 11             binder = sm->getService(String16("media.player")); // 向ServiceManager申请服务
12             if (binder != 0) { 13                 break; 14  } 15             ALOGW("Media player service not published, waiting..."); 16             usleep(500000); // 0.5 s
17         } while (true); 18 
19         if (sDeathNotifier == NULL) { 20             sDeathNotifier = new DeathNotifier(); 21  } 22         binder->linkToDeath(sDeathNotifier); 23         sMediaPlayerService = interface_cast<IMediaPlayerService>(binder); // 类型转换为IMediaPlayerService
24  } 25     ALOGE_IF(sMediaPlayerService == 0, "no media player service!?"); 26     return sMediaPlayerService; 27 }

 

 

 

  上面这段代码的函数实现就是典型的经过ServiceManager获取binder服务的过程。

 

  顺便提一下,MediaPlayerService的注册是在 mediaserver (frameworks/av/media/mediaserver/main_mediaserver.cpp)中完成的

1 int main(int argc __unused, char** argv) 2 { 3  ...... 4  MediaPlayerService::instantiate(); 5  ...... 6 }

 

 

 

  MediaPlayerService的instantiate函数:

 

1 void MediaPlayerService::instantiate() { 2     defaultServiceManager()->addService( 3             String16("media.player"), new MediaPlayerService()); 4 }
相关文章
相关标签/搜索