在framework中涉及media播放的流程头文件如下:IMediaPlayer.h mediaplayer.h IMediaPlayerClient.h
其中IMediaPlayer.h 定义了binder通信相关的接口。
定义了:
class BnMediaPlayer: public BnInterface
{
public:
virtual status_t onTransact( uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
};
IMediaPlayer.cpp 是binder通信接口的实现。
class BpMediaPlayer: public BpInterface;
status_t BnMediaPlayer::onTransact();
mediaplayer.h 是定义binder通信的客户端。在mediaplayer.cpp中如下代码获取BpMediaPlayer:
status_t MediaPlayer::setDataSource(
const char *url, const KeyedVector *headers)
{
LOGV("setDataSource(%s)", url);
status_t err = BAD_VALUE;
if (url != NULL) {
const sp& service(getMediaPlayerService());
if (service != 0) {
sp player(
service->create(getpid(), this, url, headers));
err = setDataSource(player);
}
}
return err;
}
服务端在MediaPlayerService中。在MediaPlayerService.h中如下定义:
class Client : public BnMediaPlayer
在MediaPlayerService.cpp中,create函数创建了BnMediaPlayer:
sp MediaPlayerService::create(
pid_t pid, const sp& client, const char* url,
const KeyedVector *headers)
{
int32_t connId = android_atomic_inc(&mNextConnId);
sp c = new Client(this, pid, connId, client);
LOGV("Create new client(%d) from pid %d, url=%s, connId=%d", connId, pid, url, connId);
if (NO_ERROR != c->setDataSource(url, headers))
{
c.clear();
return c;
}
wp w = c;
Mutex::Autolock lock(mLock);
mClients.add(w);
return c;
}
再来看一下MediaPlayer这个类的定义:
class MediaPlayer : public BnMediaPlayerClient,
public virtual IMediaDeathNotifier{}
很奇怪:在binder通信的客户端又有了一个binder通信的服务端: BnMediaPlayerClient
在IMediaPlayerClient.h 中这个binder通信只有一个接口:
class IMediaPlayerClient: public IInterface
{
public:
DECLARE_META_INTERFACE(MediaPlayerClient);
virtual void notify(int msg, int ext1, int ext2) = 0;
};
这个binder通信服务为谁提供呢?在回来看一下MediaPlayerServer中的create函数:
sp MediaPlayerService::create(
pid_t pid, const sp& client, const char* url,
const KeyedVector *headers)
客户端就在这里。这个binder通信的实质是一个消息回调函数。framework的media框架式一个双向binder通信框架。
以seek接口为例分析一下:
在mediaplayer.cpp 中调用seek 接口:
MediaPlayer (seek)->IMediaPlayer.cpp(bpMediaPlayer.cpp )->IMediaPlayer.cpp(bnMediaPlayer.cpp ) 在这里其实已经达到了MediaPlayerServer中的client类。当底层的media 完成seek 以后会抛出来一消息,这个消息通过 const sp& client 通知给MediaPlayer。
在media相关的头文件中还有一个MediaPlayerInterface.h 。这个头文件定义了底层播放器的接口。