int next = p_mlp->i_current_playing_index + 1;
- if( libvlc_media_list_count( p_mlp->p_mlist, NULL ) >= next )
+ if( next >= libvlc_media_list_count( p_mlp->p_mlist, NULL ) )
return -1; /* no more to play */
return next;
libvlc_MediaInstanceReachedEnd,
media_instance_reached_end, p_mlp, NULL );
}
+
/**************************************************************************
* Stop (Public)
**************************************************************************/
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
*/
/**************************************************************************
- * libvlc_media_list_player_new (Public)
+ * new (Public)
**************************************************************************/
libvlc_media_list_player_t *
libvlc_media_list_player_new( libvlc_instance_t * p_instance,
libvlc_media_list_player_t * p_mlp;
p_mlp = malloc(sizeof(libvlc_media_list_player_t));
p_mlp->i_current_playing_index = -1;
-
+ p_mlp->p_mi = NULL;
+ p_mlp->p_mlist = NULL;
vlc_mutex_init( p_instance->p_libvlc_int, &p_mlp->object_lock );
-
+ p_mlp->p_event_manager = libvlc_event_manager_new( p_mlp,
+ p_instance,
+ p_e );
+ libvlc_event_manager_register_event_type( p_mlp->p_event_manager,
+ libvlc_MediaListPlayerNextItemSet, p_e );
+ libvlc_event_manager_register_event_type( p_mlp->p_event_manager,
+ libvlc_MediaListPlayerNextItemSet, p_e );
+
return p_mlp;
}
/**************************************************************************
- * libvlc_media_list_player_release (Public)
+ * release (Public)
**************************************************************************/
void libvlc_media_list_player_release( libvlc_media_list_player_t * p_mlp )
{
+ libvlc_event_manager_release( p_mlp->p_event_manager );
free(p_mlp);
}
/**************************************************************************
- * libvlc_media_list_player_set_media_instance (Public)
+ * set_media_instance (Public)
**************************************************************************/
void libvlc_media_list_player_set_media_instance(
libvlc_media_list_player_t * p_mlp,
}
/**************************************************************************
- * Set a playlist (Public)
+ * set_media_list (Public)
**************************************************************************/
void libvlc_media_list_player_set_media_list(
libvlc_media_list_player_t * p_mlp,
void libvlc_media_list_player_play( libvlc_media_list_player_t * p_mlp,
libvlc_exception_t * p_e )
{
- libvlc_media_list_player_next( p_mlp, p_e );
+ if( p_mlp->i_current_playing_index < 0 )
+ {
+ libvlc_media_list_player_next( p_mlp, p_e );
+ return; /* Will set to play */
+ }
+
+ 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;
+ /* Send the next item event */
+ libvlc_event_t event;
+ event.type = libvlc_MediaListPlayerNextItemSet;
+ libvlc_event_send( p_mlp->p_event_manager, &event );
+
libvlc_media_instance_play( p_mlp->p_mi, p_e );
}
+
/**************************************************************************
* Stop (Public)
**************************************************************************/
**************************************************************************/
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 );
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;
+ libvlc_media_instance_play( p_mlp->p_mi, p_e );
- /* 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_list_unlock( p_mlp->p_mlist );
-
- libvlc_media_descriptor_release( p_md ); /* for libvlc_media_list_item_at_index */
+ /* Send the next item event */
+ libvlc_event_t event;
+ event.type = libvlc_MediaListPlayerNextItemSet;
+ libvlc_event_send( p_mlp->p_event_manager, &event);
}