Android開源專案之Music — Android的MediaPlayer架構介紹 + 補充
阿新 • • 發佈:2019-02-19
3.4 media服務libmediaservice.so
frameworks/base/media\libmediaplayerservice目錄中的MediaPlayerService.h和MediaPlayerService.cpp用於實現一個
servers/media/的服務,MediaPlayerService是繼承BnMediaPlayerService的實現,在這個類的內部又定義了類Client,MediaPlayerService::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等的音樂格式類似,它具有完全免費、開放和沒有專利限制的特點。)
值得注意的是PVPlayer、MidiFile和VorbisPlayer三個類都是繼承MediaPlayerInterface得到的,而MediaPlayerInterface又是繼承MediaPlayerBase得到的,因此三者具有相同介面型別。只有建立的時候會呼叫各自的建構函式,在建立之後,將只通過MediaPlayerBase介面來MediaPlayerBase控制它們。
在frameworks/base/media/libmediaplayerservice目錄中,MidiFile.h和MidiFile.cpp的實現MidiFile,VorbisPlayer.h和VorbisPlayer.cpp實現一個VorbisPlayer。
frameworks/base/media\libmediaplayerservice目錄中的MediaPlayerService.h和MediaPlayerService.cpp用於實現一個
servers/media/的服務,MediaPlayerService是繼承BnMediaPlayerService的實現,在這個類的內部又定義了類Client,MediaPlayerService::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
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等的音樂格式類似,它具有完全免費、開放和沒有專利限制的特點。)
值得注意的是PVPlayer、MidiFile和VorbisPlayer三個類都是繼承MediaPlayerInterface得到的,而MediaPlayerInterface又是繼承MediaPlayerBase得到的,因此三者具有相同介面型別。只有建立的時候會呼叫各自的建構函式,在建立之後,將只通過MediaPlayerBase介面來MediaPlayerBase控制它們。
在frameworks/base/media/libmediaplayerservice目錄中,MidiFile.h和MidiFile.cpp的實現MidiFile,VorbisPlayer.h和VorbisPlayer.cpp實現一個VorbisPlayer。