1. 程式人生 > >Android開源專案之Music — Android的MediaPlayer架構介紹 + 補充

Android開源專案之Music — Android的MediaPlayer架構介紹 + 補充

3.4 media服務libmediaservice.so
frameworks/base/media\libmediaplayerservice
目錄中的MediaPlayerService.hMediaPlayerService.cpp用於實現一個
servers/media/的服務,MediaPlayerService是繼承BnMediaPlayerService的實現,在這個類的內部又定義了類ClientMediaPlayerService::Client繼承了BnMediaPlayer
class MediaPlayerService : public BnMediaPlayerService

{
    class Client : public BnMediaPlayer
}
MediaPlayerService中具有如下一個靜態函式instantiate
void MediaPlayerService::instantiate() {
    defaultServiceManager()->addService(
    String16("media.player"), new MediaPlayerService());
}
    在instantiate函式中,呼叫IServiceManager的一個函式addService,向其中增加了一個名為"media.player"
的服務。
    這個名為"media.player"的服務和mediaplayer.cpp中呼叫getService中得到的使用一樣名稱。因此,在這裡呼叫addService增加服務在mediaplayer.cpp中可以按照名稱"media.player"來使用。這就是使用Binder實現程序間通訊的(IPC)的作用,事實上這個MediaPlayerService類是在服務中執行的,而mediaplayer.cpp呼叫的功能在應用中執行,二者並不是一個程序。但是在mediaplayer.cpp卻像一個程序的呼叫一樣呼叫MediaPlayerService的功能。
MediaPlayerService.cpp
中的createPlayer函式如下所示:
static sp<MediaPlayerBase> createPlayer(player_type playerType, void* cookie,
    notify_callback_f notifyFunc)
{
    sp<MediaPlayerBase> p;
    switch (playerType) {
        case PV_PLAYER:
            LOGV(" create PVPlayer");
            p = new PVPlayer();
            break;
        case SONIVOX_PLAYER:
            LOGV(" create MidiFile");
            p = new MidiFile();
            break;
        case VORBIS_PLAYER:
            LOGV(" create VorbisPlayer");
            p = new VorbisPlayer();
            break;
    }
//……
    return p;
}

在這裡根據playerType的型別建立不同的播放器:對於大多數情況,型別將是PV_PLAYER,這時會呼叫了new
PVPlayer()
建立一個PVPlayer,然後將其指標轉換成MediaPlayerBase來使用;對於Mini檔案的情況,型別為SONIVOX_PLAYER,將會建立一個MidiFile;對於Ogg
Vorbis
格式的情況,將會建立一個VorbisPlayer
     (OGG Vobis是一種音訊壓縮格式,與MP3等的音樂格式類似,它具有完全免費、開放和沒有專利限制的特點。)
值得注意的是PVPlayerMidiFileVorbisPlayer三個類都是繼承MediaPlayerInterface得到的,而MediaPlayerInterface又是繼承MediaPlayerBase得到的,因此三者具有相同介面型別。只有建立的時候會呼叫各自的建構函式,在建立之後,將只通過MediaPlayerBase介面來MediaPlayerBase控制它們。
frameworks/base/media/libmediaplayerservice目錄中,MidiFile.hMidiFile.cpp的實現MidiFileVorbisPlayer.hVorbisPlayer.cpp實現一個VorbisPlayer