MediaPlayer--stop()流程

作者: llm_5243 | 来源:发表于2020-06-17 15:14 被阅读0次

frameworks/base/media/java/android/media/MediaPlayer.java

    /**
     * Stops playback after playback has been started or paused.
     *
     * @throws IllegalStateException if the internal player engine has not been
     * initialized.
     */
    public void stop() throws IllegalStateException {
        stayAwake(false);
        _stop();
        baseStop();
    }

  • stayAwake(false) 取消保持屏幕长亮
  • _stop() 调用了native层的接口
  • baseStop() 调用父类 PlayerBase 的接口,这部分主要针对audio, 后面有时间再结合audio模块来分析

下面主要分析一般的流程_stop()
frameworks/base/media/jni/android_media_MediaPlayer.cpp

static void
android_media_MediaPlayer_stop(JNIEnv *env, jobject thiz)
{
    ALOGV("stop");
    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
    if (mp == NULL ) {
        jniThrowException(env, "java/lang/IllegalStateException", NULL);
        return;
    }
    process_media_player_call( env, thiz, mp->stop(), NULL, NULL );
}

没有其他逻辑,直接调下一层
frameworks/av/media/libmedia/mediaplayer.cpp

status_t MediaPlayer::stop()
{
    ALOGV("stop");
    Mutex::Autolock _l(mLock);
   //已经是stop状态,则直接返回
    if (mCurrentState & MEDIA_PLAYER_STOPPED) return NO_ERROR;
    //判断播放器状态是否符合条件
    if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
                    MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) ) {
        //调用下一次接口
        status_t ret = mPlayer->stop();
        if (ret != NO_ERROR) {
            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
        } else {
            mCurrentState = MEDIA_PLAYER_STOPPED;
        }
        return ret;
    }
    ALOGE("stop called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
    return INVALID_OPERATION;
}

先判断player的状态, 处于以下状态才会调用下一层播放器接口 MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE.

mPlayer是mediaplayer 同服务端MediaPlayerService
frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp

status_t MediaPlayerService::Client::stop()
{
    ALOGV("[%d] stop", mConnId);
    mMaybeVideoAlive = false;
    sp<MediaPlayerBase> p = getPlayer();
    if (p == 0) return UNKNOWN_ERROR;
    return p->stop();
}

这里直接调用了底层的即可, 如果是原生android 8, 就是调用了Nuplayer 的接口

相关文章

  • MediaPlayer--stop()流程

    frameworks/base/media/java/android/media/MediaPlayer.java...

  • Tomcat 服务器启动时序图

    启动流程 Catalina 加载流程 Catalina 初始化流程 Catalina 启动流程 应用部署流程 原文...

  • Activiti5

    Activiti5 新增流程部署 查询所有部署的流程(流程部署) 删除部署的流程(流程部署) 查看所有的流程定义 ...

  • 登陆流程

    看了资料,注册登陆流程包括:注册流程、登录流程;逆向流程:找回密码流程,风控流程。 备注:正向流程是指正常情况下企...

  • 80页整套企业流程管理体系PPT:4级结构,48条管理流程

    【该流程体系含】: 一级流程:战略决策工作流程 二级流程:产品战略规划制定流程 二级流程:技术研究流程 二级流程:...

  • Activiti工作流框架——控制操作流程

    部署流程定义 启动流程实例 查询流程定义 查询最新版本的流程定义 查询流程实例状态 导出流程图到文件夹下 删除流程...

  • 流程,流程

    没有规律的生活,就是没有流程没有流程,就不会有可测量的成长和发展做任何事,要知道成功会怎样,plan b是怎样马不...

  • Activiti 流程

    Activiti 流程 流程引擎 流程启动,运行的具体环境。 创建流程引擎 创建流程引擎时,会在classpath...

  • 采购部的六大流程编制及说明

    采购部管理流程知识:采购计划流程、供应商管理流程、生产物料采购流程、外协物品采购流程、采购付款流程、采预付款流程的...

  • 什么是流程?

    《流程管理》这本书主要围绕流程理念、流程浮现、考核流程的方法、指导具体流程的业务原则、流程细化与优化、基于IT的岗...

网友评论

    本文标题:MediaPlayer--stop()流程

    本文链接:https://www.haomeiwen.com/subject/ufksxktx.html