input_item_t *p_new_input = NULL;
playlist_item_t *p_item;
+ PL_ASSERT_LOCKED;
if( !psz_name ) psz_name = _("Undefined");
if( !p_input )
- p_new_input = input_ItemNewWithType( VLC_OBJECT(p_playlist), NULL,
+ p_new_input = input_item_NewWithType( VLC_OBJECT(p_playlist), NULL,
psz_name, 0, NULL, -1, ITEM_TYPE_NODE );
p_item = playlist_ItemNewFromInput( p_playlist,
p_input ? p_input : p_new_input );
if( p_root->p_parent )
playlist_NodeRemoveItem( p_playlist, p_root, p_root->p_parent );
- /* 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 );
-
-
+ playlist_ItemRelease( p_root );
}
return VLC_SUCCESS;
}
int i;
if( p_node->p_parent == p_playlist->p_root_category )
{
- if( p_playlist->b_tree )
+ if( pl_priv(p_playlist)->b_tree || p_node->p_input->b_prefers_tree )
return p_node;
for( i = 0 ; i< p_playlist->p_root_onelevel->i_children; i++ )
{
}
else if( p_node->p_parent == p_playlist->p_root_onelevel )
{
- if( !p_playlist->b_tree )
+ if( !pl_priv(p_playlist)->b_tree || !p_node->p_input->b_prefers_tree )
return p_node;
for( i = 0 ; i< p_playlist->p_root_category->i_children; i++ )
{
playlist_item_t *p_root,
playlist_item_t *p_item )
{
- playlist_item_t *p_parent;
- int i;
+ /* If the item is NULL, return the firt child of root */
+ if( p_item == NULL )
+ {
+ if( p_root->i_children > 0 )
+ return p_root->pp_children[0];
+ else
+ return NULL;
+ }
/* Node with children, get the first one */
- if( p_item && p_item->i_children > 0 )
+ if( p_item->i_children > 0 )
return p_item->pp_children[0];
- if( p_item != NULL )
- p_parent = p_item->p_parent;
- else
- p_parent = p_root;
- for( i= 0 ; i < p_parent->i_children ; i++ )
+ playlist_item_t* p_parent = p_item->p_parent;
+ for( int i = 0 ; i < p_parent->i_children ; i++ )
{
- if( p_item == NULL || p_parent->pp_children[i] == p_item )
+ if( p_parent->pp_children[i] == p_item )
{
- if( p_item == NULL )
- i = -1;
-
- if( i+1 >= p_parent->i_children )
+ // Return the next children
+ if( i + 1 < p_parent->i_children )
+ return p_parent->pp_children[i+1];
+ // We are the least one, so try to have uncles
+ else
{
- /* Was already the last sibling. Look for uncles */
PL_DEBUG2( "Current item is the last of the node,"
"looking for uncle from %s",
p_parent->p_input->psz_name );
-
if( p_parent == p_root )
{
PL_DEBUG2( "already at root" );
return NULL;
}
- return GetNextUncle( p_playlist, p_item, p_root );
- }
- else
- {
- return p_parent->pp_children[i+1];
+ else
+ return GetNextUncle( p_playlist, p_item, p_root );
}
}
}