相对于start,stop/pause/resume就相对比较简单,主要是通过控制GenericSource中的状态值。
void NuPlayer::GenericSource::stop() {
mStarted = false;
}
void NuPlayer::GenericSource::pause() {
mStarted = false;
}
void NuPlayer::GenericSource::resume() {
mStarted = true;
(new AMessage(kWhatResume, this))->post();
}
停止、暂停、恢复几个动作,相关函数中仅是改变mStarted,其它几乎什么事情都没做。
-
播放器的暂停:表示的是暂停播放;
-
解封装模块的暂停:表示暂停将读取并缓存好的数据提供给播放器,这一点同样适用于停止,恢复和start则相反。
所以,不管是停止、暂停还是恢复的函数,关键都不在函数本身,而在于mStarted变量对于向外提供数据的函数的影响,也就是dequeueAccessUnit(对应start中queueAccessUnit方法)。

status_t NuPlayer::GenericSource::dequeueAccessUnit(
bool audio, sp<ABuffer> *accessUnit) {
if (audio && !mStarted) { // 如果是音频,并且mStarted为false,则不提供数据,返回block
return -EWOULDBLOCK;
}
// ...
}
该函数用于为播放器提供原始媒体数据,audio表示是否为音频,accessUnit则是需要填充的buffer指针。
可以看到,如果GenericSource::stop()或者GenericSource::pause()函数调用后,mStarted变为了false,那么播放器将无法得到媒体数据,也就无法播放了。如果是视频还是可以从该函数中获取数据,但对于播放器而言,视频和音频肯定是同时播放,如果没了音频,视频也不会独活的。
网友评论