调用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中继续分析: