Android13 MediaPlayerService start流程分析

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

//frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
status_t MediaPlayerService::Client::start()
{
    ALOGV("[%d] start", mConnId);
    sp<MediaPlayerBase> p = getPlayer();
    if (p == 0) return UNKNOWN_ERROR;
    p->setLooping(mLoop); //调用MediaPlayerBase的setLooping方法
    return p->start(); //调用MediaPlayerBase的start方法
}

上面方法会调用MediaPlayerBase的setLooping方法和start方法,并返回start的执行结果,setLooping方法我们不在这里分析,我们继续分析MediaPlayerBase的start方法。

class MediaPlayerInterface : public MediaPlayerBase {}
struct NuPlayerDriver : public MediaPlayerInterface {}

MediaPlaerInterface继承于MediaPlayerBase,而NuPlayerDriver又继承于MediaPlayerInterface,因此NuPlayerDriver间接继承于MediaPlayerBase,调用MediaPlayerBase的start方法就是调用NuPlayerDriver的start方法:

//frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
status_t NuPlayerDriver::start() {
    ALOGV("start(%p), state is %d, eos is %d", this, mState, mAtEOS);
    Mutex::Autolock autoLock(mLock);
    return start_l();
}

调用start_l方法:

State mState;
const sp<NuPlayer> mPlayer;
//frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
status_t NuPlayerDriver::start_l() {
    switch (mState) {
        case STATE_UNPREPARED:
        {
            status_t err = prepare_l(); //如果在STATE_UNPREPARED状态下调用prepare_l方法进行prepare_l处理


            if (err != OK) {
                return err;
            }


            CHECK_EQ(mState, STATE_PREPARED);


            FALLTHROUGH_INTENDED;
        }


        case STATE_PAUSED:
        case STATE_STOPPED_AND_PREPARED:
        case STATE_PREPARED:
        {
            mPlayer->start(); //调用NuPlayer的start方法


            FALLTHROUGH_INTENDED;
        }


        case STATE_RUNNING:
        {
            if (mAtEOS) {
                mPlayer->seekToAsync(0); //调用NuPlayer的seekToAsync方法
                mAtEOS = false;
                mPositionUs = -1;
            }
            break;
        }


        default:
            return INVALID_OPERATION;
    }


    mState = STATE_RUNNING;


    return OK;
}

NuPlayer::start

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

Android13 NuPlayer::start流程分析-CSDN博客

NuPlayer::seekToAsync

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

Android13 NuPlayer::seekToAsync流程分析-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值