📄 media_player.c
字号:
p_mi->p_event_manager = libvlc_event_manager_new( p_mi, p_libvlc_instance, p_e ); if( libvlc_exception_raised( p_e ) ) { free( p_mi ); return NULL; } libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerNothingSpecial, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerOpening, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerBuffering, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerPlaying, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerPaused, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerStopped, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerForward, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerBackward, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerEndReached, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerEncounteredError, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerPositionChanged, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerTimeChanged, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerSeekableChanged, p_e ); libvlc_event_manager_register_event_type( p_mi->p_event_manager, libvlc_MediaPlayerPausableChanged, p_e ); return p_mi;}/************************************************************************** * Create a Media Instance object with a media descriptor **************************************************************************/libvlc_media_player_t *libvlc_media_player_new_from_media( libvlc_media_t * p_md, libvlc_exception_t *p_e ){ libvlc_media_player_t * p_mi; p_mi = libvlc_media_player_new( p_md->p_libvlc_instance, p_e ); if( !p_mi ) return NULL; libvlc_media_retain( p_md ); p_mi->p_md = p_md; return p_mi;}/************************************************************************** * Create a new media instance object from an input_thread (Libvlc Internal) **************************************************************************/libvlc_media_player_t * libvlc_media_player_new_from_input_thread( struct libvlc_instance_t *p_libvlc_instance, input_thread_t *p_input, libvlc_exception_t *p_e ){ libvlc_media_player_t * p_mi; if( !p_input ) { libvlc_exception_raise( p_e, "invalid input thread" ); return NULL; } p_mi = libvlc_media_player_new( p_libvlc_instance, p_e ); if( !p_mi ) return NULL; p_mi->p_md = libvlc_media_new_from_input_item( p_libvlc_instance, input_GetItem( p_input ), p_e ); if( !p_mi->p_md ) { libvlc_media_player_destroy( p_mi ); return NULL; } /* will be released in media_player_release() */ vlc_object_yield( p_input ); p_mi->p_input_thread = p_input; p_mi->b_own_its_input_thread = false; return p_mi;}/************************************************************************** * Destroy a Media Instance object (libvlc internal) * * Warning: No lock held here, but hey, this is internal. **************************************************************************/void libvlc_media_player_destroy( libvlc_media_player_t *p_mi ){ input_thread_t *p_input_thread; libvlc_exception_t p_e; libvlc_exception_init( &p_e ); if( !p_mi ) return; p_input_thread = libvlc_get_input_thread( p_mi, &p_e ); if( libvlc_exception_raised( &p_e ) ) { libvlc_event_manager_release( p_mi->p_event_manager ); libvlc_exception_clear( &p_e ); free( p_mi ); return; /* no need to worry about no input thread */ } vlc_mutex_destroy( &p_mi->object_lock ); vlc_object_release( p_input_thread ); libvlc_media_release( p_mi->p_md ); free( p_mi );}/************************************************************************** * Release a Media Instance object **************************************************************************/void libvlc_media_player_release( libvlc_media_player_t *p_mi ){ if( !p_mi ) return; vlc_mutex_lock( &p_mi->object_lock ); p_mi->i_refcount--; if( p_mi->i_refcount > 0 ) { vlc_mutex_unlock( &p_mi->object_lock ); return; } vlc_mutex_unlock( &p_mi->object_lock ); vlc_mutex_destroy( &p_mi->object_lock ); release_input_thread( p_mi ); libvlc_event_manager_release( p_mi->p_event_manager ); libvlc_media_release( p_mi->p_md ); free( p_mi );}/************************************************************************** * Retain a Media Instance object **************************************************************************/void libvlc_media_player_retain( libvlc_media_player_t *p_mi ){ if( !p_mi ) return; p_mi->i_refcount++;}/************************************************************************** * Set the Media descriptor associated with the instance **************************************************************************/void libvlc_media_player_set_media( libvlc_media_player_t *p_mi, libvlc_media_t *p_md, libvlc_exception_t *p_e ){ VLC_UNUSED(p_e); if( !p_mi ) return; vlc_mutex_lock( &p_mi->object_lock ); release_input_thread( p_mi ); if( p_mi->p_md ) libvlc_media_set_state( p_mi->p_md, libvlc_NothingSpecial, p_e ); libvlc_media_release( p_mi->p_md ); if( !p_md ) { p_mi->p_md = NULL; vlc_mutex_unlock( &p_mi->object_lock ); return; /* It is ok to pass a NULL md */ } libvlc_media_retain( p_md ); p_mi->p_md = p_md; /* The policy here is to ignore that we were created using a different * libvlc_instance, because we don't really care */ p_mi->p_libvlc_instance = p_md->p_libvlc_instance; vlc_mutex_unlock( &p_mi->object_lock );}/************************************************************************** * Get the Media descriptor associated with the instance **************************************************************************/libvlc_media_t *libvlc_media_player_get_media( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e ){ VLC_UNUSED(p_e); if( !p_mi->p_md ) return NULL; libvlc_media_retain( p_mi->p_md ); return p_mi->p_md;}/************************************************************************** * Get the event Manager **************************************************************************/libvlc_event_manager_t *libvlc_media_player_event_manager( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e ){ VLC_UNUSED(p_e); return p_mi->p_event_manager;}/************************************************************************** * Play **************************************************************************/void libvlc_media_player_play( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e ){ input_thread_t * p_input_thread; if( (p_input_thread = libvlc_get_input_thread( p_mi, p_e )) ) { /* A thread already exists, send it a play message */ input_Control( p_input_thread, INPUT_SET_STATE, PLAYING_S ); vlc_object_release( p_input_thread ); return; } /* Ignore previous exception */ libvlc_exception_clear( p_e ); vlc_mutex_lock( &p_mi->object_lock ); if( !p_mi->p_md ) { libvlc_exception_raise( p_e, "no associated media descriptor" ); vlc_mutex_unlock( &p_mi->object_lock ); return; } p_mi->p_input_thread = input_CreateThread( p_mi->p_libvlc_instance->p_libvlc_int, p_mi->p_md->p_input_item ); if( !p_mi->p_input_thread ) { vlc_mutex_unlock( &p_mi->object_lock ); return; } p_input_thread = p_mi->p_input_thread; if( p_mi->drawable ) { vlc_value_t val; val.i_int = p_mi->drawable; var_Create( p_input_thread, "drawable", VLC_VAR_DOINHERIT ); var_Set( p_input_thread, "drawable", val ); } vlc_event_manager_t * p_em = input_get_event_manager( p_input_thread ); vlc_event_attach( p_em, vlc_InputStateChanged, input_state_changed, p_mi ); var_AddCallback( p_input_thread, "seekable", input_seekable_changed, p_mi ); var_AddCallback( p_input_thread, "pausable", input_pausable_changed, p_mi ); var_AddCallback( p_input_thread, "intf-change", input_position_changed, p_mi ); var_AddCallback( p_input_thread, "intf-change", input_time_changed, p_mi ); vlc_mutex_unlock( &p_mi->object_lock );}/************************************************************************** * Pause **************************************************************************/void libvlc_media_player_pause( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e ){ input_thread_t * p_input_thread = libvlc_get_input_thread( p_mi, p_e ); if( !p_input_thread ) return; libvlc_state_t state = libvlc_media_player_get_state( p_mi, p_e ); if( state == libvlc_Playing ) { if( libvlc_media_player_can_pause( p_mi, p_e ) ) input_Control( p_input_thread, INPUT_SET_STATE, PAUSE_S ); else libvlc_media_player_stop( p_mi, p_e ); } else input_Control( p_input_thread, INPUT_SET_STATE, PLAYING_S ); vlc_object_release( p_input_thread );}/************************************************************************** * Stop **************************************************************************/void libvlc_media_player_stop( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e ){ libvlc_state_t state = libvlc_media_player_get_state( p_mi, p_e ); if( state == libvlc_Playing || state == libvlc_Paused ) { /* Send a stop notification event only of we are in playing or paused states */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -