]> git.sesse.net Git - vlc/commitdiff
playlist: Make sure we don't crash when we delete the currently playing node.
authorPierre d'Herbemont <pdherbemont@videolan.org>
Sun, 6 Jul 2008 10:46:04 +0000 (12:46 +0200)
committerPierre d'Herbemont <pdherbemont@videolan.org>
Sun, 6 Jul 2008 13:46:16 +0000 (15:46 +0200)
src/playlist/control.c
src/playlist/engine.c
src/playlist/tree.c

index 2f22476c544568a8625d130c0f2091408dfb4c46..fa2644cc162f919a501a3b478f1b173fc891ae27 100644 (file)
@@ -373,9 +373,23 @@ playlist_item_t * playlist_NextItem( playlist_t *p_playlist )
                         PLI_NAME( p_playlist->request.p_item ),
                         PLI_NAME( p_playlist->request.p_node ), i_skip );
 
+        /* Make sure the node wasn't deleted */
+        if( p_playlist->status.p_node &&
+            p_playlist->status.p_node->i_flags & PLAYLIST_REMOVE_FLAG )
+        {
+             PL_DEBUG( "%s was marked for deletion, deleting",
+                             PLI_NAME( p_playlist->status.p_node  ) );
+             playlist_ItemDelete( p_playlist->status.p_node );
+             /* Don't attempt to reuse that node */
+             if( p_playlist->status.p_node == p_playlist->request.p_node )
+                p_playlist->request.p_node = NULL;
+             p_playlist->status.p_node = NULL;
+        }
+
         if( p_playlist->request.p_node &&
             p_playlist->request.p_node != p_playlist->status.p_node )
         {
+
             p_playlist->status.p_node = p_playlist->request.p_node;
             p_playlist->b_reset_currently_playing = true;
         }
index f6385d01e3a83f63e0d750f3f1ef4270aa39b50a..3631c1fb58d7b38133253aeb30e7c30c1f4ec92c 100644 (file)
@@ -477,6 +477,15 @@ void playlist_LastLoop( playlist_t *p_playlist )
         sout_DeleteInstance( p_sout );
 #endif
 
+    if( p_playlist->status.p_node &&
+        p_playlist->status.p_node->i_flags & PLAYLIST_REMOVE_FLAG )
+    {
+         PL_DEBUG( "%s was marked for deletion, deleting",
+                         PLI_NAME( p_playlist->status.p_node  ) );
+         playlist_ItemDelete( p_playlist->status.p_node );
+         p_playlist->status.p_node = NULL;
+    }
+
     /* Core should have terminated all SDs before the playlist */
     /* TODO: It fails to do so when not playing anything -- Courmisch */
     playlist_ServicesDiscoveryKillAll( p_playlist );
index c10451817d5f11f3d299ecb3943789ca05f0b146..35eb33b367f4f15980fdeda463e0110222c3f85a 100644 (file)
@@ -171,7 +171,24 @@ int playlist_NodeDelete( playlist_t *p_playlist, playlist_item_t *p_root,
         if( p_root->p_parent )
             playlist_NodeRemoveItem( p_playlist, p_root, p_root->p_parent );
 
-        playlist_ItemDelete( p_root );
+        /* Check if it is the current node */
+        if( p_playlist->status.p_node == p_root )
+        {
+            /* Hack we don't call playlist_Control for lock reasons */
+            p_playlist->request.i_status = PLAYLIST_STOPPED;
+            p_playlist->request.b_request = true;
+            p_playlist->request.p_item = NULL;
+            p_playlist->request.p_node = NULL;
+            msg_Info( p_playlist, "stopping playback" );
+            vlc_object_signal_maybe( VLC_OBJECT(p_playlist) );
+
+            PL_DEBUG( "marking %s for further deletion", PLI_NAME( p_root ) );
+            p_root->i_flags |= PLAYLIST_REMOVE_FLAG;
+        }
+        else
+            playlist_ItemDelete( p_root );
+
+
     }
     return VLC_SUCCESS;
 }