playlist_item_t *p_parent, int i_flags,
input_item_t *p_input )
{
- input_item_t *p_new_input;
+ 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,
- psz_name, 0, NULL, -1, ITEM_TYPE_NODE );
- p_item = playlist_ItemNewFromInput( VLC_OBJECT(p_playlist),
+ p_new_input = input_item_NewWithType( VLC_OBJECT(p_playlist), NULL,
+ psz_name, 0, NULL, 0, -1, ITEM_TYPE_NODE );
+ p_item = playlist_ItemNewFromInput( p_playlist,
p_input ? p_input : p_new_input );
- if( !p_input )
+ if( p_new_input )
vlc_gc_decref( p_new_input );
if( p_item == NULL ) return NULL;
int playlist_NodeEmpty( playlist_t *p_playlist, playlist_item_t *p_root,
bool b_delete_items )
{
+ PL_ASSERT_LOCKED;
int i;
if( p_root->i_children == -1 )
{
int playlist_NodeDelete( playlist_t *p_playlist, playlist_item_t *p_root,
bool b_delete_items, bool b_force )
{
+ PL_ASSERT_LOCKED;
int i;
if( p_root->i_children == -1 )
}
/* Delete the children */
- for( i = p_root->i_children - 1 ; i >= 0; i-- )
+ for( i = p_root->i_children - 1 ; i >= 0; i-- )
{
if( p_root->pp_children[i]->i_children > -1 )
{
}
else if( b_delete_items )
{
- playlist_DeleteFromItemId( p_playlist,
- p_root->pp_children[i]->i_id );
+ playlist_DeleteItem( p_playlist, p_root->pp_children[i], true );
}
}
/* Delete the node */
else
{
int i;
- var_SetInteger( p_playlist, "item-deleted", p_root->i_id );
+ var_SetInteger( p_playlist, "playlist-item-deleted", p_root->i_id );
ARRAY_BSEARCH( p_playlist->all_items, ->i_id, int,
p_root->i_id, i );
if( i != -1 )
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;
}
playlist_item_t *p_parent,
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 ;
playlist_item_t *p_item,
playlist_item_t *p_parent )
{
+ PL_ASSERT_LOCKED;
(void)p_playlist;
for(int i= 0; i< p_parent->i_children ; i++ )
return VLC_SUCCESS;
}
-
-/**
- * Count the children of a node
- *
- * \param p_playlist the playlist
- * \param p_node the node
- * \return the number of children
- */
-int playlist_NodeChildrenCount( playlist_t *p_playlist, playlist_item_t*p_node)
-{
- int i;
- int i_nb = 0;
-
- if( p_node->i_children == -1 )
- return 0;
-
- i_nb = p_node->i_children;
- for( i=0 ; i< p_node->i_children;i++ )
- {
- if( p_node->pp_children[i]->i_children == -1 )
- break;
- else
- i_nb += playlist_NodeChildrenCount( p_playlist,
- p_node->pp_children[i] );
- }
- return i_nb;
-}
-
/**
* Search a child of a node by its name
*
playlist_item_t *playlist_ChildSearchName( playlist_item_t *p_node,
const char *psz_search )
{
+ playlist_t * p_playlist = p_node->p_playlist; /* For assert_locked */
+ PL_ASSERT_LOCKED;
int i;
if( p_node->i_children < 0 )
return NULL;
}
-/**
- * Create a pair of nodes in the category and onelevel trees.
- * They share the same input item.
- * \param p_playlist the playlist
- * \param psz_name the name of the nodes
- * \param pp_node_cat pointer to return the node in category tree
- * \param pp_node_one pointer to return the node in onelevel tree
- * \param b_for_sd For Services Discovery ? (make node read-only and unskipping)
- */
-void playlist_NodesPairCreate( playlist_t *p_playlist, const char *psz_name,
- playlist_item_t **pp_node_cat,
- playlist_item_t **pp_node_one,
- bool b_for_sd )
-{
- *pp_node_cat = playlist_NodeCreate( p_playlist, psz_name,
- p_playlist->p_root_category, 0, NULL );
- *pp_node_one = playlist_NodeCreate( p_playlist, psz_name,
- p_playlist->p_root_onelevel, 0,
- (*pp_node_cat)->p_input );
- if( b_for_sd )
- {
- (*pp_node_cat)->i_flags |= PLAYLIST_RO_FLAG;
- (*pp_node_cat)->i_flags |= PLAYLIST_SKIP_FLAG;
- (*pp_node_one)->i_flags |= PLAYLIST_RO_FLAG;
- (*pp_node_one)->i_flags |= PLAYLIST_SKIP_FLAG;
- }
-}
-
-/**
- * Get the node in the preferred tree from a node in one of category
- * or onelevel tree.
- */
-playlist_item_t * playlist_GetPreferredNode( playlist_t *p_playlist,
- playlist_item_t *p_node )
-{
- int i;
- if( p_node->p_parent == p_playlist->p_root_category )
- {
- if( p_playlist->b_tree )
- return p_node;
- for( i = 0 ; i< p_playlist->p_root_onelevel->i_children; i++ )
- {
- if( p_playlist->p_root_onelevel->pp_children[i]->p_input->i_id ==
- p_node->p_input->i_id )
- return p_playlist->p_root_onelevel->pp_children[i];
- }
- }
- else if( p_node->p_parent == p_playlist->p_root_onelevel )
- {
- if( !p_playlist->b_tree )
- return p_node;
- for( i = 0 ; i< p_playlist->p_root_category->i_children; i++ )
- {
- if( p_playlist->p_root_category->pp_children[i]->p_input->i_id ==
- p_node->p_input->i_id )
- return p_playlist->p_root_category->pp_children[i];
- }
- }
- return NULL;
-}
-
/**********************************************************************
* Tree walking functions
**********************************************************************/
-
-playlist_item_t *playlist_GetLastLeaf(playlist_t *p_playlist,
- playlist_item_t *p_root )
-{
- int i;
- playlist_item_t *p_item;
- for ( i = p_root->i_children - 1; i >= 0; i-- )
- {
- if( p_root->pp_children[i]->i_children == -1 )
- return p_root->pp_children[i];
- else if( p_root->pp_children[i]->i_children > 0)
- {
- p_item = playlist_GetLastLeaf( p_playlist,
- p_root->pp_children[i] );
- if ( p_item != NULL )
- return p_item;
- }
- else if( i == 0 )
- return NULL;
- }
- return NULL;
-}
-
-int playlist_GetAllEnabledChildren( playlist_t *p_playlist,
- playlist_item_t *p_node,
- playlist_item_t ***ppp_items )
-{
- int i_count = 0;
- playlist_item_t *p_next = NULL;
- while( 1 )
- {
- p_next = playlist_GetNextLeaf( p_playlist, p_node,
- p_next, true, false );
- if( p_next )
- INSERT_ELEM( *ppp_items, i_count, i_count, p_next );
- else
- break;
- }
- return i_count;
-}
-
/**
* Finds the next item to play
*
playlist_item_t *p_item,
bool b_ena, bool b_unplayed )
{
+ PL_ASSERT_LOCKED;
playlist_item_t *p_next;
assert( p_root && p_root->i_children != -1 );
playlist_item_t *p_item,
bool b_ena, bool b_unplayed )
{
+ PL_ASSERT_LOCKED;
playlist_item_t *p_prev;
- PL_DEBUG2( "finding previous os %s within %s", PLI_NAME( p_item ),
+ PL_DEBUG2( "finding previous of %s within %s", PLI_NAME( p_item ),
PLI_NAME( p_root ) );
assert( p_root && p_root->i_children != -1 );
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 );
}
}
}