Android MediaPlayerService解析

来源:互联网 发布:app软件价格 编辑:程序博客网 时间:2024/05/19 11:46

frameworks/av/media/libmediaplayerservice/MediaPlayerService.h

MediaPlayerService 类的继承关系如下:
这里写图片描述

Client 和 AudioOutput 是 MediaPlayerService的内部类
IMediaPlayerService是对为提供的接口类, 定义如下:

frameworks/av/include/media/IMediaPlayerService.h43class IMediaPlayerService: public IInterface44{45public:46    DECLARE_META_INTERFACE(MediaPlayerService);4748    virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName) = 0;49    virtual sp<IMediaMetadataRetriever> createMetadataRetriever() = 0;50    virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client,51            audio_session_t audioSessionId = AUDIO_SESSION_ALLOCATE) = 0;52    virtual sp<IOMX>            getOMX() = 0;53    virtual sp<IHDCP>           makeHDCP(bool createEncryptionModule) = 0;54    virtual sp<IMediaCodecList> getCodecList() const = 0;5556    // Connects to a remote display.57    // 'iface' specifies the address of the local interface on which to listen for58    // a connection from the remote display as an ip address and port number59    // of the form "x.x.x.x:y".  The media server should call back into the provided remote60    // display client when display connection, disconnection or errors occur.61    // The assumption is that at most one remote display will be connected to the62    // provided interface at a time.63    virtual sp<IRemoteDisplay> listenForRemoteDisplay(const String16 &opPackageName,64            const sp<IRemoteDisplayClient>& client, const String8& iface) = 0;6566    // codecs and audio devices usage tracking for the battery app67    enum BatteryDataBits {68        // tracking audio codec69        kBatteryDataTrackAudio          = 0x1,70        // tracking video codec71        kBatteryDataTrackVideo          = 0x2,72        // codec is started, otherwise codec is paused73        kBatteryDataCodecStarted        = 0x4,74        // tracking decoder (for media player),75        // otherwise tracking encoder (for media recorder)76        kBatteryDataTrackDecoder        = 0x8,77        // start to play an audio on an audio device78        kBatteryDataAudioFlingerStart   = 0x10,79        // stop/pause the audio playback80        kBatteryDataAudioFlingerStop    = 0x20,81        // audio is rounted to speaker82        kBatteryDataSpeakerOn           = 0x40,83        // audio is rounted to devices other than speaker84        kBatteryDataOtherAudioDeviceOn  = 0x80,85    };8687    virtual void addBatteryData(uint32_t params) = 0;88    virtual status_t pullBatteryData(Parcel* reply) = 0;89};

MediaPlayerService 是native系统服务, 通过ServiceManager注册到系统中

frameworks/av/media/mediaserver/main_mediaserver.cpp.....38    sp<ProcessState> proc(ProcessState::self());39    sp<IServiceManager> sm(defaultServiceManager());40    ALOGI("ServiceManager: %p", sm.get());41    InitializeIcuOrDie();42    MediaPlayerService::instantiate();

instantiate() 创建MediaPlayerService并注册到系统服务中

frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp267void MediaPlayerService::instantiate() {268    defaultServiceManager()->addService(269            String16("media.player"), new MediaPlayerService());270}

MediaPlayerService构造函数如下:

272MediaPlayerService::MediaPlayerService()273{274    ALOGV("MediaPlayerService created");275    mNextConnId = 1;276277    mBatteryAudio.refCount = 0;278    for (int i = 0; i < NUM_AUDIO_DEVICES; i++) {279        mBatteryAudio.deviceOn[i] = 0;280        mBatteryAudio.lastTime[i] = 0;281        mBatteryAudio.totalTime[i] = 0;282    }283    // speaker is on by default284    mBatteryAudio.deviceOn[SPEAKER] = 1;285286    // reset battery stats287    // if the mediaserver has crashed, battery stats could be left288    // in bad state, reset the state upon service start.289    BatteryNotifier::getInstance().noteResetVideo();290    //register built-in player291    MediaPlayerFactory::registerBuiltinFactories();292}

registerBuiltinFactories() register the NU_PLAYER and TEST_PLAYER

243void MediaPlayerFactory::registerBuiltinFactories() {244    Mutex::Autolock lock_(&sLock);245246    if (sInitComplete)247        return;248249    registerFactory_l(new NuPlayerFactory(), NU_PLAYER);250    registerFactory_l(new TestPlayerFactory(), TEST_PLAYER);251252    sInitComplete = true;253}

createMediaRecorder() 创建Recorder用于录音

299sp<IMediaRecorder> MediaPlayerService::createMediaRecorder(const String16 &opPackageName)300{301    pid_t pid = IPCThreadState::self()->getCallingPid();302    sp<MediaRecorderClient> recorder = new MediaRecorderClient(this, pid, opPackageName);303    wp<MediaRecorderClient> w = recorder;304    Mutex::Autolock lock(mLock);305    mMediaRecorderClients.add(w);306    ALOGV("Create new media recorder client from pid %d", pid);307    return recorder;308}

创建Client主要用于播放

325sp<IMediaPlayer> MediaPlayerService::create(const sp<IMediaPlayerClient>& client,326        audio_session_t audioSessionId)327{328    pid_t pid = IPCThreadState::self()->getCallingPid();329    int32_t connId = android_atomic_inc(&mNextConnId);330331    sp<Client> c = new Client(332            this, pid, connId, client, audioSessionId,333            IPCThreadState::self()->getCallingUid());334335    ALOGV("Create new client(%d) from pid %d, uid %d, ", connId, pid,336         IPCThreadState::self()->getCallingUid());337338    wp<Client> w = c;339    {340        Mutex::Autolock lock(mLock);341        mClients.add(w);342    }343    return c;344}
567MediaPlayerService::Client::Client(568        const sp<MediaPlayerService>& service, pid_t pid,569        int32_t connId, const sp<IMediaPlayerClient>& client,570        audio_session_t audioSessionId, uid_t uid)571{572    ALOGV("Client(%d) constructor", connId);573    mPid = pid;574    mConnId = connId;575    mService = service;576    mClient = client;577    mLoop = false;578    mStatus = NO_INIT;579    mAudioSessionId = audioSessionId;580    mUID = uid;581    mRetransmitEndpointValid = false;582    mAudioAttributes = NULL;583584#if CALLBACK_ANTAGONIZER585    ALOGD("create Antagonizer");586    mAntagonizer = new Antagonizer(notify, this);587#endif588}
阅读全文
0 0
原创粉丝点击