]> git.sesse.net Git - vlc/blobdiff - src/playlist/tree.c
Use var_Inherit* instead of var_CreateGet*.
[vlc] / src / playlist / tree.c
index 152af3fdcc783c248a35391f31862110a2cac624..196ab807f05c0e8417b17cc6f818fd8bbaa0df14 100644 (file)
@@ -86,7 +86,7 @@ playlist_item_t * playlist_NodeCreate( playlist_t *p_playlist,
                             p_parent ? p_parent->i_id : -1,
                             !( i_flags & PLAYLIST_NO_REBUILD ));
 
-    p_item->i_flags |= i_flags
+    p_item->i_flags |= i_flags;
 
     return p_item;
 }
@@ -143,22 +143,13 @@ int playlist_NodeDelete( playlist_t *p_playlist, playlist_item_t *p_root,
     PL_ASSERT_LOCKED;
     int i;
 
-    if( p_root->i_children == -1 )
-    {
-        return VLC_EGENERIC;
-    }
-
     /* Delete the children */
     for( i = p_root->i_children - 1 ; i >= 0; i-- )
     {
-        if( p_root->pp_children[i]->i_children > -1 )
+        if( b_delete_items || p_root->pp_children[i]->i_children > -1 )
         {
             playlist_NodeDelete( p_playlist, p_root->pp_children[i],
-                                 b_delete_items , b_force );
-        }
-        else if( b_delete_items )
-        {
-            playlist_DeleteItem( p_playlist, p_root->pp_children[i], true );
+                                 b_delete_items, b_force );
         }
     }
     /* Delete the node */
@@ -167,6 +158,8 @@ int playlist_NodeDelete( playlist_t *p_playlist, playlist_item_t *p_root,
     }
     else
     {
+        pl_priv(p_playlist)->b_reset_currently_playing = true;
+
         int i;
         var_SetInteger( p_playlist, "playlist-item-deleted", p_root->i_id );
         ARRAY_BSEARCH( p_playlist->all_items, ->i_id, int,
@@ -174,6 +167,28 @@ int playlist_NodeDelete( playlist_t *p_playlist, playlist_item_t *p_root,
         if( i != -1 )
             ARRAY_REMOVE( p_playlist->all_items, i );
 
+        if( p_root->i_children == -1 ) {
+            ARRAY_BSEARCH( p_playlist->items,->i_id, int, p_root->i_id, i );
+            if( i != -1 )
+                ARRAY_REMOVE( p_playlist->items, i );
+        }
+
+        /* Check if it is the current item */
+        if( get_current_status_item( p_playlist ) == p_root )
+        {
+            /* Stop */
+            playlist_Control( p_playlist, PLAYLIST_STOP, pl_Locked );
+            msg_Info( p_playlist, "stopping playback" );
+            /* This item can't be the next one to be played ! */
+            set_current_status_item( p_playlist, NULL );
+        }
+
+        ARRAY_BSEARCH( p_playlist->current,->i_id, int, p_root->i_id, i );
+        if( i != -1 )
+            ARRAY_REMOVE( p_playlist->current, i );
+
+        PL_DEBUG( "deleting item `%s'", p_root->p_input->psz_name );
+
         /* Remove the item from its parent */
         if( p_root->p_parent )
             playlist_NodeRemoveItem( p_playlist, p_root, p_root->p_parent );
@@ -205,16 +220,17 @@ int playlist_NodeInsert( playlist_t *p_playlist,
                          int i_position )
 {
     PL_ASSERT_LOCKED;
-   (void)p_playlist;
-   assert( p_parent && p_parent->i_children != -1 );
-   if( i_position == -1 ) i_position = p_parent->i_children ;
-
-   INSERT_ELEM( p_parent->pp_children,
-                p_parent->i_children,
-                i_position,
-                p_item );
-   p_item->p_parent = p_parent;
-   return VLC_SUCCESS;
+    (void)p_playlist;
+    assert( p_parent && p_parent->i_children != -1 );
+    if( i_position == -1 ) i_position = p_parent->i_children ;
+    assert( i_position <= p_parent->i_children);
+
+    INSERT_ELEM( p_parent->pp_children,
+                 p_parent->i_children,
+                 i_position,
+                 p_item );
+    p_item->p_parent = p_parent;
+    return VLC_SUCCESS;
 }
 
 /**
@@ -230,17 +246,25 @@ int playlist_NodeRemoveItem( playlist_t *p_playlist,
                         playlist_item_t *p_parent )
 {
     PL_ASSERT_LOCKED;
-   (void)p_playlist;
+    (void)p_playlist;
+
+    int ret = VLC_EGENERIC;
 
-   for(int i= 0; i< p_parent->i_children ; i++ )
-   {
-       if( p_parent->pp_children[i] == p_item )
-       {
-           REMOVE_ELEM( p_parent->pp_children, p_parent->i_children, i );
-       }
-   }
+    for(int i= 0; i< p_parent->i_children ; i++ )
+    {
+        if( p_parent->pp_children[i] == p_item )
+        {
+            REMOVE_ELEM( p_parent->pp_children, p_parent->i_children, i );
+            ret = VLC_SUCCESS;
+        }
+    }
+
+    if( ret == VLC_SUCCESS ) {
+        assert( p_item->p_parent == p_parent );
+        p_item->p_parent = NULL;
+    }
 
-   return VLC_SUCCESS;
+    return ret;
 }
 
 /**