]> git.sesse.net Git - vlc/blobdiff - src/control/media_list_player.c
control/event.c: Don't leak the ARRAY.
[vlc] / src / control / media_list_player.c
index e1bf599236b5ffc4dfb25920aa14a989f2e66f2a..7fd708d99d242de2fdda10a4ea3dca9289412171 100644 (file)
@@ -38,7 +38,7 @@ static int get_next_index( libvlc_media_list_player_t * p_mlp )
        
        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;
@@ -138,6 +138,7 @@ uninstall_media_instance_observer( libvlc_media_list_player_t * p_mlp )
                          libvlc_MediaInstanceReachedEnd,
                                             media_instance_reached_end, p_mlp, NULL );
 }
+
 /**************************************************************************
  *       Stop (Public)
  **************************************************************************/
@@ -149,13 +150,49 @@ 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
  */
 
 /**************************************************************************
- *         libvlc_media_list_player_new (Public)
+ *         new (Public)
  **************************************************************************/
 libvlc_media_list_player_t *
 libvlc_media_list_player_new( libvlc_instance_t * p_instance,
@@ -165,22 +202,31 @@ 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,
@@ -203,7 +249,7 @@ void libvlc_media_list_player_set_media_instance(
 }
 
 /**************************************************************************
- *       Set a playlist (Public)
+ *       set_media_list (Public)
  **************************************************************************/
 void libvlc_media_list_player_set_media_list(
                                      libvlc_media_list_player_t * p_mlp,
@@ -234,14 +280,39 @@ void libvlc_media_list_player_set_media_list(
 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)
  **************************************************************************/
@@ -260,9 +331,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 );
@@ -277,29 +346,15 @@ 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;
+    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);
 }