From: Pierre d'Herbemont Date: Sat, 11 Aug 2007 01:49:26 +0000 (+0000) Subject: control/media_list_player.c: Implement _play_item_at_index(). X-Git-Tag: 0.9.0-test0~6584 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=7b246662a8b51c5e10676b4010865cdc26fa163e;p=vlc control/media_list_player.c: Implement _play_item_at_index(). --- diff --git a/include/vlc/libvlc.h b/include/vlc/libvlc.h index c11df891da..67273021f1 100644 --- a/include/vlc/libvlc.h +++ b/include/vlc/libvlc.h @@ -483,6 +483,12 @@ VLC_PUBLIC_API void libvlc_media_list_player_play( libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e ); +VLC_PUBLIC_API void + libvlc_media_list_player_play_item_at_index( + libvlc_media_list_player_t * p_mlp, + int i_index, + libvlc_exception_t * p_e ); + VLC_PUBLIC_API void libvlc_media_list_player_stop( libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e ); diff --git a/src/control/media_list_player.c b/src/control/media_list_player.c index 3685d2bcd6..3611a8f494 100644 --- a/src/control/media_list_player.c +++ b/src/control/media_list_player.c @@ -149,6 +149,42 @@ libvlc_media_list_player_is_playing( libvlc_media_list_player_t * p_mlp, return 0; } +/************************************************************************** + * Next (private) + * + * Playlist lock should be held + **************************************************************************/ +static void +media_list_player_set_next( libvlc_media_list_player_t * p_mlp, int index, + libvlc_exception_t * p_e ) +{ + libvlc_media_descriptor_t * p_md; + + p_md = libvlc_media_list_item_at_index( p_mlp->p_mlist, index, p_e ); + if( !p_md ) + { + libvlc_media_list_unlock( p_mlp->p_mlist ); + if( !libvlc_exception_raised( p_e ) ) + libvlc_exception_raise( p_e, "Can't obtain a media" ); + return; + } + + vlc_mutex_lock( &p_mlp->object_lock ); + + p_mlp->i_current_playing_index = index; + + /* We are not interested in getting media_descriptor stop event now */ + uninstall_media_instance_observer( p_mlp ); + libvlc_media_instance_set_media_descriptor( p_mlp->p_mi, p_md, NULL ); +// wait_playing_state(); /* If we want to be synchronous */ + install_media_instance_observer( p_mlp ); + + vlc_mutex_unlock( &p_mlp->object_lock ); + + libvlc_media_list_unlock( p_mlp->p_mlist ); + + libvlc_media_descriptor_release( p_md ); /* for libvlc_media_list_item_at_index */ +} /* * Public libvlc functions @@ -243,6 +279,25 @@ void libvlc_media_list_player_play( libvlc_media_list_player_t * p_mlp, libvlc_media_instance_play( p_mlp->p_mi, p_e ); } +/************************************************************************** + * Play item at index (Public) + * + * Playlist lock should be help + **************************************************************************/ +void libvlc_media_list_player_play_item_at_index( + libvlc_media_list_player_t * p_mlp, + int i_index, + libvlc_exception_t * p_e ) +{ + media_list_player_set_next( p_mlp, i_index, p_e ); + + if( libvlc_exception_raised( p_e ) ) + return; + + libvlc_media_instance_play( p_mlp->p_mi, p_e ); +} + + /************************************************************************** * Stop (Public) **************************************************************************/ @@ -261,9 +316,7 @@ void libvlc_media_list_player_stop( libvlc_media_list_player_t * p_mlp, **************************************************************************/ void libvlc_media_list_player_next( libvlc_media_list_player_t * p_mlp, libvlc_exception_t * p_e ) -{ - libvlc_media_descriptor_t * p_md; - +{ int index; libvlc_media_list_lock( p_mlp->p_mlist ); @@ -278,29 +331,8 @@ void libvlc_media_list_player_next( libvlc_media_list_player_t * p_mlp, return; } - p_md = libvlc_media_list_item_at_index( p_mlp->p_mlist, index, p_e ); - if( !p_md ) - { - libvlc_media_list_unlock( p_mlp->p_mlist ); - if( !libvlc_exception_raised( p_e ) ) - libvlc_exception_raise( p_e, "Can't obtain a media" ); - return; - } - - vlc_mutex_lock( &p_mlp->object_lock ); + media_list_player_set_next( p_mlp, index, p_e ); - p_mlp->i_current_playing_index = index; - - /* We are not interested in getting media_descriptor stop event now */ - uninstall_media_instance_observer( p_mlp ); - libvlc_media_instance_set_media_descriptor( p_mlp->p_mi, p_md, NULL ); -// wait_playing_state(); /* If we want to be synchronous */ - install_media_instance_observer( p_mlp ); - - vlc_mutex_unlock( &p_mlp->object_lock ); - - libvlc_media_list_unlock( p_mlp->p_mlist ); - - libvlc_media_descriptor_release( p_md ); /* for libvlc_media_list_item_at_index */ + libvlc_media_list_unlock( p_mlp->p_mlist ); }