X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fitem.c;h=cf98e589ea9d33063356e97d53dc9757c0094e26;hb=fdb91a064e0291b5d69124008ec52c9d57f3fa77;hp=d131d45985f75ae0dc28b7f86fad0505f22471da;hpb=587f46a9b50b6bee11c83d9afa471a7fc8fe90d6;p=vlc diff --git a/src/playlist/item.c b/src/playlist/item.c index d131d45985..cf98e589ea 100644 --- a/src/playlist/item.c +++ b/src/playlist/item.c @@ -87,19 +87,19 @@ static void input_item_subitem_added( const vlc_event_t * p_event, if( p_item_in_category->i_children == -1 ) { p_item_in_category = playlist_ItemToNode( p_playlist, - p_item_in_category, true ); + p_item_in_category, pl_Locked ); p_item_in_category->p_input->i_type = ITEM_TYPE_PLAYLIST; } int i_ret = playlist_BothAddInput( p_playlist, p_child, p_item_in_category, PLAYLIST_APPEND | PLAYLIST_SPREPARSE , PLAYLIST_END, - NULL, NULL, true ); + NULL, NULL, pl_Locked ); if( i_ret == VLC_SUCCESS && b_play ) { playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, - true, p_item_in_category, NULL ); + pl_Locked, p_item_in_category, NULL ); } } @@ -134,6 +134,8 @@ static void install_input_item_observer( playlist_item_t * p_item ) input_item_changed, p_item ); vlc_event_attach( p_em, vlc_InputItemInfoChanged, input_item_changed, p_item ); + vlc_event_attach( p_em, vlc_InputItemErrorWhenReadingChanged, + input_item_changed, p_item ); } static void uninstall_input_item_observer( playlist_item_t * p_item ) @@ -149,6 +151,8 @@ static void uninstall_input_item_observer( playlist_item_t * p_item ) input_item_changed, p_item ); vlc_event_detach( p_em, vlc_InputItemInfoChanged, input_item_changed, p_item ); + vlc_event_detach( p_em, vlc_InputItemErrorWhenReadingChanged, + input_item_changed, p_item ); } /***************************************************************************** @@ -195,18 +199,21 @@ playlist_item_t * playlist_ItemNewWithType( playlist_t *p_playlist, ***************************************************************************/ /** - * Delete item + * Release an item * - * Delete a playlist item and detach its input item * \param p_item item to delete * \return VLC_SUCCESS */ -int playlist_ItemDelete( playlist_item_t *p_item ) +int playlist_ItemRelease( playlist_item_t *p_item ) { - uninstall_input_item_observer( p_item ); - - vlc_gc_decref( p_item->p_input ); - free( p_item ); + /* Surprise, we can't actually do more because we + * don't do refcounting, or eauivalent. + * Because item are not only accessed by their id + * using playlist_item outside the PL_LOCK isn't safe. + * Most of the modules does that. + * + * Who wants to add proper memory management? */ + ARRAY_APPEND( p_item->p_playlist->items_to_delete, p_item); return VLC_SUCCESS; } @@ -313,7 +320,7 @@ void playlist_Clear( playlist_t * p_playlist, bool b_locked ) int playlist_DeleteFromItemId( playlist_t *p_playlist, int i_id ) { playlist_item_t *p_item = playlist_ItemGetById( p_playlist, i_id, - true ); + pl_Locked ); if( !p_item ) return VLC_EGENERIC; return DeleteInner( p_playlist, p_item, true ); } @@ -607,7 +614,7 @@ playlist_item_t *playlist_ItemToNode( playlist_t *p_playlist, { ChangeToNode( p_playlist, p_item ); PL_UNLOCK_IF( !b_locked ); - return NULL; + return p_item; } } @@ -863,7 +870,6 @@ static int DeleteInner( playlist_t * p_playlist, playlist_item_t *p_item, { int i; int i_id = p_item->i_id; - bool b_delay_deletion = false; if( p_item->i_children > -1 ) { @@ -893,7 +899,6 @@ static int DeleteInner( playlist_t * p_playlist, playlist_item_t *p_item, msg_Info( p_playlist, "stopping playback" ); vlc_object_signal_maybe( VLC_OBJECT(p_playlist) ); } - b_delay_deletion = true; } PL_DEBUG( "deleting item `%s'", p_item->p_input->psz_name ); @@ -901,13 +906,7 @@ static int DeleteInner( playlist_t * p_playlist, playlist_item_t *p_item, /* Remove the item from its parent */ playlist_NodeRemoveItem( p_playlist, p_item, p_item->p_parent ); - if( !b_delay_deletion ) - playlist_ItemDelete( p_item ); - else - { - PL_DEBUG( "marking %s for further deletion", PLI_NAME( p_item ) ); - p_item->i_flags |= PLAYLIST_REMOVE_FLAG; - } + playlist_ItemRelease( p_item ); return VLC_SUCCESS; }