Android13 MediaPlayerService prepareAsync流程分析

调用MediaPlayer的prepare方法后,经过一系列处理,最终后调用MediaPlayerService的prepareAsync方法,具体如下:

//frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
status_t MediaPlayerService::Client::prepareAsync()
{
    ALOGV("[%d] prepareAsync", mConnId);
    sp<MediaPlayerBase> p = getPlayer(); //取得Player
    if (p == 0) return UNKNOWN_ERROR;
    status_t ret = p->prepareAsync(); //调用MediaPlayerBase的prepareAsync方法
#if CALLBACK_ANTAGONIZER
    ALOGD("start Antagonizer");
    if (ret == NO_ERROR) mAntagonizer->start();
#endif
    return ret;
}

调用MediaPlayerBase的prepareAsync方法,MediaPlayerBase是一个抽象类,MediaPlayerInterface继承于MediaPlayerBase,MediaPlayerInterface是一个接口,NuPlayerDriver继承与MediaPlayerInterface,因此调用MediaPlayerBase的prepareAsync方法,就是调用NuPlayerDriver的prepareAsync方法:

    const sp<NuPlayer> mPlayer;
//frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
status_t NuPlayerDriver::prepareAsync() {
    ALOGV("prepareAsync(%p)", this);
    Mutex::Autolock autoLock(mLock);


    switch (mState) {
        case STATE_UNPREPARED:
            mState = STATE_PREPARING;
            mIsAsyncPrepare = true;
            mPlayer->prepareAsync(); //调用NuPlayer的prepareAsync方法
            return OK;
        case STATE_STOPPED:
            // this is really just paused. handle as seek to start
            mAtEOS = false;
            mState = STATE_STOPPED_AND_PREPARING;
            mIsAsyncPrepare = true;
            mPlayer->seekToAsync(0, MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC /* mode */,
                    true /* needNotify */); //调用NuPlayer的seekToAsync方法
            return OK;
        default:
            return INVALID_OPERATION;
    };
}

首先在每次MediaPlayer调用create创建的时候,会调用一次prepare,这个时候会走入NuPlayerDriver::prepareAsync中的STATE_UNPREPARED,之后会先调用stop一下,从而将NuPlayer播放器的状态切换为STATE_STOPPED态,之后再次调用prepare进入NuPlayerDriver::prepareAsync的STATE_STOPPED流程。

NuPlayer prepareAsync

调用NuPlayer的prepareAsync方法,我们继续在NuPlayer中分析:

 NuPlayer::prepareAsync流程分析 | 知识管理 - PingCode 

NuPlayer seekToAsync

调用NuPlayer的seekToAsync方法,我们继续在NuPlayer中分析:

 NuPlayer::seekToAsync流程分析 | 知识管理 - PingCode 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值