Chinaunix首页 | 论坛 | 博客
  • 博客访问: 466756
  • 博文数量: 89
  • 博客积分: 1126
  • 博客等级: 少尉
  • 技术积分: 1432
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-11 23:37
文章分类

全部博文(89)

文章存档

2016年(6)

2015年(2)

2014年(1)

2013年(3)

2012年(23)

2011年(54)

分类: 嵌入式

2012-04-19 10:52:51

在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 。这个头文件定义了底层播放器的接口。
阅读(3771) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~