android mediaplayer 架构总结

 mediaplyer client and server 的关联机制和Binder使用:

(原)android <wbr>mediaplayer <wbr>架构总结

 (原)android <wbr>mediaplayer <wbr>架构总结


(原)android <wbr>mediaplayer <wbr>架构总结

(原)android <wbr>mediaplayer <wbr>架构总结

1、启动mediaserver进程mips-ics\frameworks\base\media\mediaserver\main_mediaserver.cpp

int main(int argc, char** argv)

{

    sp proc(ProcessState::self());

sp sm = defaultServiceManager();\*获取service manager*\

    MediaPlayerService::instantiate();

    ProcessState::self()->startThreadPool();

    IPCThreadState::self()->joinThreadPool();//将自己加入到线程池

}

 

void MediaPlayerService::instantiate() {

    defaultServiceManager()->addService(

            String16("media.player"), new MediaPlayerService());

}

addService( const String16& name, const sp& service)

 

2.mediaplyer client获取服务:

const sp& IMediaDeathNotifier::getMediaPlayerService()

{

        sp sm = defaultServiceManager();

        sp binder;

         binder = sm->getService(String16("media.player"));

       sMediaPlayerService = interface_cast<<span style="color:#0070C0">IMediaPlayerService>(binder);

    将基类binder指向MediaplayerService的对外接口IMediaPlayerService

}

 

3.libMedia_Jni (android_media_MediaPlayer.cpp)

 

static JNINativeMethod gMethods[] = {

{"setDataSource",       "(Ljava/lang/String;)V",      (void *)android_media_MediaPlayer_setDataSource},

{"prepare",             "()V",   (void *)android_media_MediaPlayer_prepare},

{"_start",              "()V",     (void *)android_media_MediaPlayer_start},

{"_stop",               "()V",     (void *)android_media_MediaPlayer_stop},};

 

4.Mediaplayer Java API: (MediaPlayer.java)

public class MediaPlayer

{

    static {

        System.loadLibrary("media_jni"); 

        native_init();}

 

三、Mediaplayer实例

1 Java 代码

   mMediaPlayer = new MediaPlayer(); 

   mMediaPlayer .setDataSource(uri)

 

2 C++ 代码

1. Client  Java code.

android_media_MediaPlayer_native_setup() 

{

sp mp = new MediaPlayer();

 

    // create new listener and give it to MediaPlayer

    sp listener = new JNIMediaPlayerListener(env, thiz, weak_this);

    mp->setListener(listener);

}

 

2. Client C++ code

android_media_MediaPlayer_setDataSource() 

{

sp mp = getMediaPlayer(env, thiz);

mp->setDataSource();

}

 

MediaPlayer::setDataSource()            

{

      const sp& service(getMediaPlayerService());

       sp<<span style="color:#0070C0">IMediaPlayer> player(service->create(getpid(), this, mAudioSessionId));

       player->setDataSource(url, headers)) ;

       attachNewPlayer(player);

}

3. Server C++ code.

sp<<span style="color:#C00000">IMediaPlayer> MediaPlayerService::create()

{
    sp c = new MediaPlayerService ::Client();

    Return c;

}

 

MediaPlayerService::Client::setDataSource()

{

        player_type playerType = getPlayerType(url);

        sp p = createPlayer(playerType);

        mStatus = p->setDataSource(url, headers);

}


http://blog.sina.com.cn/s/blog_4a471ff601015o7q.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值