]> git.sesse.net Git - vlc/blobdiff - src/playlist/engine.c
Fix for deletion of current item
[vlc] / src / playlist / engine.c
index 1443fad7f8be896c12c829661174ce78f9f8ef4e..d01af13ab7d12f399634192c38d0c044a54b63af 100644 (file)
@@ -28,8 +28,6 @@
 #include "vlc_playlist.h"
 #include "vlc_interaction.h"
 
-#undef PLAYLIST_DEBUG
-
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
@@ -62,6 +60,9 @@ playlist_t * playlist_Create( vlc_object_t *p_parent )
     p_playlist->i_last_input_id = 0;
     p_playlist->p_input = NULL;
 
+    p_playlist->i_vout_destroyed_date = 0;
+    p_playlist->i_sout_destroyed_date = 0;
+
     p_playlist->i_size = 0;
     p_playlist->pp_items = NULL;
     p_playlist->i_all_size = 0;
@@ -76,19 +77,30 @@ playlist_t * playlist_Create( vlc_object_t *p_parent )
     /* Create playlist and media library */
     p_playlist->p_local_category = playlist_NodeCreate( p_playlist,
                                  _( "Playlist" ),p_playlist->p_root_category );
-    p_playlist->p_ml_category =   playlist_NodeCreate( p_playlist,
-                           _( "Media Library" ), p_playlist->p_root_category );
     p_playlist->p_local_onelevel =  playlist_NodeCreate( p_playlist,
                                 _( "Playlist" ), p_playlist->p_root_onelevel );
-    p_playlist->p_ml_onelevel =  playlist_NodeCreate( p_playlist,
-                           _( "Media Library" ), p_playlist->p_root_onelevel );
+    p_playlist->p_local_category->i_flags |= PLAYLIST_RO_FLAG;
+    p_playlist->p_local_onelevel->i_flags |= PLAYLIST_RO_FLAG;
 
-    /* This is a hack to find it later. Quite ugly, but I haven't found a
-     * better way */
+    /* Link the nodes together. Todo: actually create them from the same input*/
     p_playlist->p_local_onelevel->p_input->i_id =
         p_playlist->p_local_category->p_input->i_id;
-    p_playlist->p_ml_onelevel->p_input->i_id =
-        p_playlist->p_ml_category->p_input->i_id;
+
+    if( config_GetInt( p_playlist, "media-library") )
+    {
+        p_playlist->p_ml_category =   playlist_NodeCreate( p_playlist,
+                           _( "Media Library" ), p_playlist->p_root_category );
+        p_playlist->p_ml_onelevel =  playlist_NodeCreate( p_playlist,
+                           _( "Media Library" ), p_playlist->p_root_onelevel );
+        p_playlist->p_ml_category->i_flags |= PLAYLIST_RO_FLAG;
+        p_playlist->p_ml_onelevel->i_flags |= PLAYLIST_RO_FLAG;
+        p_playlist->p_ml_onelevel->p_input->i_id =
+             p_playlist->p_ml_category->p_input->i_id;
+    }
+    else
+    {
+        p_playlist->p_ml_category = p_playlist->p_ml_onelevel = NULL;
+    }
 
     /* Initial status */
     p_playlist->status.p_item = NULL;
@@ -126,7 +138,12 @@ void playlist_Destroy( playlist_t *p_playlist )
     var_Destroy( p_playlist, "loop" );
     var_Destroy( p_playlist, "activity" );
 
-    playlist_LockClear( p_playlist );
+    PL_LOCK;
+    playlist_NodeDelete( p_playlist, p_playlist->p_root_category, VLC_TRUE,
+                         VLC_TRUE );
+    playlist_NodeDelete( p_playlist, p_playlist->p_root_onelevel, VLC_TRUE,
+                         VLC_TRUE );
+    PL_UNLOCK;
 
     if( p_playlist->p_stats )
         free( p_playlist->p_stats );
@@ -183,8 +200,6 @@ void playlist_MainLoop( playlist_t *p_playlist )
 {
     playlist_item_t *p_item = NULL;
 
-    mtime_t    i_vout_destroyed_date = 0;
-    mtime_t    i_sout_destroyed_date = 0;
 
     PL_LOCK
 
@@ -192,12 +207,10 @@ void playlist_MainLoop( playlist_t *p_playlist )
     /* FIXME : this can be called several times */
     if( p_playlist->request.b_request )
     {
-#ifdef PLAYLIST_DEBUG
-        msg_Dbg(p_playlist, "incoming request - stopping current input" );
-#endif
         /* Stop the existing input */
-        if( p_playlist->p_input )
+        if( p_playlist->p_input && !p_playlist->p_input->b_die )
         {
+            PL_DEBUG( "incoming request - stopping current input" );
             input_StopThread( p_playlist->p_input );
         }
     }
@@ -210,6 +223,7 @@ void playlist_MainLoop( playlist_t *p_playlist )
         {
             int i_activity;
             input_thread_t *p_input;
+            PL_DEBUG( "dead input" );
 
             p_input = p_playlist->p_input;
             p_playlist->p_input = NULL;
@@ -228,13 +242,17 @@ void playlist_MainLoop( playlist_t *p_playlist )
             /* Destroy object */
             vlc_object_destroy( p_input );
 
-            i_vout_destroyed_date = 0;
-            i_sout_destroyed_date = 0;
+            p_playlist->i_vout_destroyed_date = 0;
+            p_playlist->i_sout_destroyed_date = 0;
 
             if( p_playlist->status.p_item->i_flags
                 & PLAYLIST_REMOVE_FLAG )
             {
+                 PL_DEBUG( "%s was marked for deletion, deleting",
+                                 PLI_NAME( p_playlist->status.p_item  ) );
                  playlist_ItemDelete( p_playlist->status.p_item );
+                 if( p_playlist->request.p_item == p_playlist->status.p_item )
+                     p_playlist->request.p_item = NULL;
                  p_playlist->status.p_item = NULL;
             }
 
@@ -247,12 +265,13 @@ void playlist_MainLoop( playlist_t *p_playlist )
         /* This input is dying, let it do */
         else if( p_playlist->p_input->b_die )
         {
-            ;
+            PL_DEBUG( "dying input" );
         }
         /* This input has finished, ask it to die ! */
         else if( p_playlist->p_input->b_error
                   || p_playlist->p_input->b_eof )
         {
+            PL_DEBUG( "finished input" );
             input_StopThread( p_playlist->p_input );
             /* Select the next playlist item */
             PL_UNLOCK
@@ -260,13 +279,13 @@ void playlist_MainLoop( playlist_t *p_playlist )
         }
         else if( p_playlist->p_input->i_state != INIT_S )
         {
-            PL_UNLOCK
-            i_vout_destroyed_date =
+            PL_UNLOCK;
+            p_playlist->i_vout_destroyed_date =
                 ObjectGarbageCollector( p_playlist, VLC_OBJECT_VOUT,
-                                        i_vout_destroyed_date );
-            i_sout_destroyed_date =
+                                        p_playlist->i_vout_destroyed_date );
+            p_playlist->i_sout_destroyed_date =
                 ObjectGarbageCollector( p_playlist, VLC_OBJECT_SOUT,
-                                        i_sout_destroyed_date );
+                                        p_playlist->i_sout_destroyed_date );
             PL_LOCK
         }
     }
@@ -283,7 +302,7 @@ void playlist_MainLoop( playlist_t *p_playlist )
               ( p_playlist->request.b_request &&
                 p_playlist->request.i_status != PLAYLIST_STOPPED ) )
          {
-             msg_Dbg( p_playlist, "Starting new item" );
+             msg_Dbg( p_playlist, "starting new item" );
              stats_TimerStart( p_playlist, "Playlist walk",
                                   STATS_TIMER_PLAYLIST_WALK );
              p_item = playlist_NextItem( p_playlist );
@@ -300,18 +319,19 @@ void playlist_MainLoop( playlist_t *p_playlist )
          }
          else
          {
-             if( p_item && p_playlist->status.p_item &&
+             if( p_playlist->status.p_item &&
                  p_playlist->status.p_item->i_flags & PLAYLIST_REMOVE_FLAG )
              {
-                 playlist_ItemDelete( p_item );
+                 PL_DEBUG( "deleting item marked for deletion" );
+                 playlist_ItemDelete( p_playlist->status.p_item );
                  p_playlist->status.p_item = NULL;
              }
 
              /* Collect garbage */
              PL_UNLOCK
-             i_sout_destroyed_date =
+             p_playlist->i_sout_destroyed_date =
              ObjectGarbageCollector( p_playlist, VLC_OBJECT_SOUT, mdate() );
-             i_vout_destroyed_date =
+             p_playlist->i_vout_destroyed_date =
              ObjectGarbageCollector( p_playlist, VLC_OBJECT_VOUT, mdate() );
              PL_LOCK
          }