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 }
相關文章
相關標籤/搜索