//MediaPlayer.java /** * Stops the playing media * */ public void stop() {
synchronized ( this ) {
mPlayRequested = false ; mPlaying = false ; mAudioReset = true ; } //调用native方法 nativeStop(); if (mAfd != null ) try {
mAfd.close(); } catch (IOException ignored) {} } //libvlcjni-mediaplayer.c void Java_org_videolan_libvlc_MediaPlayer_nativeStop(JNIEnv *env, jobject thiz) {
LOGI( "libvlc_MediaPlayer_nativeStop +++ " ); vlcjni_object *p_obj = VLCJniObject_getInstance(env, thiz); if (!p_obj) {
LOGI( "libvlc_MediaPlayer_nativeStop -- " ); return ; } //jni只是桥梁,这里调用真正的stop libvlc_media_player_stop(p_obj->u.p_mp); LOGI( "libvlc_MediaPlayer_nativeStop ---" ); } //media_player.c /* * Release the associated input thread. * * Object lock is NOT held. * Input lock is held or instance is being destroyed. */ static void release_input_thread( libvlc_media_player_t *p_mi ) {
assert ( p_mi ); input_thread_t *p_input_thread = p_mi->input.p_thread; if ( !p_input_thread ) return ; p_mi->input.p_thread = NULL; media_detach_preparsed_event( p_mi->p_md ); //删除回调函数 var_DelCallback( p_input_thread, "can-seek" , input_seekable_changed, p_mi ); var_DelCallback( p_input_thread, "can-pause" , input_pausable_changed, p_mi ); var_DelCallback( p_input_thread, "program-scrambled" , input_scrambled_changed, p_mi ); var_DelCallback( p_input_thread, "intf-event" , input_event_changed, p_mi ); del_es_callbacks( p_input_thread, p_mi ); //这里先后调用了input_thread的input_Stop和input_Close函数 /* We owned this one */ input_Stop( p_input_thread ); input_Close( p_input_thread ); } |