⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 media_player.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -