Android多媒体框架--10:stop/pause/resu

2023-04-24  本文已影响0人  DarcyZhou

  相对于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,其它几乎什么事情都没做。

  所以,不管是停止、暂停还是恢复的函数,关键都不在函数本身,而在于mStarted变量对于向外提供数据的函数的影响,也就是dequeueAccessUnit(对应start中queueAccessUnit方法)。

01.png
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,那么播放器将无法得到媒体数据,也就无法播放了。如果是视频还是可以从该函数中获取数据,但对于播放器而言,视频和音频肯定是同时播放,如果没了音频,视频也不会独活的。

上一篇 下一篇

猜你喜欢

热点阅读