MediaPlayerService分析

一.MediaPlayerService简介

1.Media Service的启动

Media进程定义:

service media /system/bin/mediaserver

    class main

    user media

    group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc

    ioprio rt 4

servicemanager 进程定义:

service servicemanager /system/bin/servicemanager

    class core

    user system

  group system

Media中有很多Native ServiceAudioFlinger MediaPlayerService CameraService AudioPolicyService等),整个Androidnative或者framework)的Service都需要加入servicemanager中进行统一管理。
  那么Media Process ServiceManager Process是如何进行通信的呢——Binder.通过Media Process中使用binder进行完成IPC过程,学习Binder的概念和使用方法

2.MediaPlayer的文件

MediaPlayer是从MediaPlayer.java开始的,应用如果想播放音乐,先要new 一个MediaPlayer,并设置其相关的参数。先列出主要的代码文件,他们都在frameworks里面:

Java层代码:base/media/java/android/media/MediaPlayer.java

Jni层代码:

base/media/jni/android_media_MediaPlayer.cpp

本地代码:

av/media/libmedia/mediaplayer.cpp

./av/media/libmedia/IMediaPlayer.cpp

MediaPlayerService

av/media/libmediaplayerservice/MediaPlayerService.cpp

 

二.分析MediaPlayer的Binder机制

\frameworks\av\media\mediaserver\ main_mediaserver.cpp

1 .   ProcessState对象创建

当前进程的状态属性,对象创建:

sp<ProcessState> ProcessState::self()

{

    Mutex::Autolock _l(gProcessMutex);

    if (gProcess != NULL) {

        return gProcess;

    }

    gProcess = new ProcessState;

    return gProcess;

}

ProcessState构造函数:

ProcessState::ProcessState()

    : mDriverFD(open_driver())    //打开binder驱动设备

    , mVMStart(MAP_FAILED)

    , mManagesContexts(false)

    , mBinderContextCheckFunc(NULL)

    , mBinderContextUserData(NULL)

    , mThreadPoolStarted(false)

    , mThreadPoolSeq(1)

{

    if (mDriverFD >= 0) {

        //binderfd映射到当前进程虚拟空间地址中 binder进行交互

        mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ,

        MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);

    }

}

 

打开binder设备:

static int open_driver()

{

    //打开binder设备驱动

    int fd = open("/dev/binder", O_RDWR);

    if (fd >= 0) {

        //bidner最大支持线程数

        size_t maxThreads = 15;

        result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);

    }

    return fd;

}

ProcessState对象创建过程所做的事:
  打开/dev/binder设备,得到binder设备的fd
  将bidner设备fd映射到当前进程虚拟地址空间建立交互的通道;

2. IServiceManager对象创建
  sp<IServiceManager> sm = defaultServiceManager();
为什么需要一个IServiceManager对象呢,这个类是个抽象提供接口

class IServiceManager : public IInterface

{

    virtual sp<IBinder> getService( const String16& name) const = 0;

    virtual status_t addService( const String16& name,

                             const sp<IBinder>& service,

                             bool allowIsolated = false) = 0;

    ……                                   

};

  通过IServiceManager派生对象操作将Service

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值