From 20f10c163d5a5db62b4630cf588d25fbb0ae9806 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Mon, 29 Aug 2016 07:49:18 -0400 Subject: [PATCH] core/playlists/artist: Add pl_artist_delete_track() Library playlists call this when deleting tracks, otherwise we could end up dereferencing invalid pointers the next time we use the artist playlist. Fixes #81: Remove deleted tracks from artist playlists Signed-off-by: Anna Schumaker --- CHANGELOG | 3 +++ core/playlists/artist.c | 11 ++++++++++- core/playlists/library.c | 1 + include/core/playlists/artist.h | 3 +++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index cb2255ea..8995f7ac 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +6.4.19: +- Remove deleted tracks from artist playlists + 6.4.19-rc: - Allow filtering specific fields - Replace filtering with a token matching system diff --git a/core/playlists/artist.c b/core/playlists/artist.c index 19fe6e80..b1ba5f6f 100644 --- a/core/playlists/artist.c +++ b/core/playlists/artist.c @@ -139,5 +139,14 @@ void pl_artist_new_track(struct track *track) artist->ar_playlist = playlist; } - queue_add(&playlist->pl_queue, track); + playlist_generic_add_track(playlist, track); +} + +void pl_artist_delete_track(struct track *track) +{ + struct artist *artist = track->tr_artist; + struct playlist *playlist = (struct playlist *)artist->ar_playlist; + + if (playlist) + playlist_generic_remove_track(playlist, track); } diff --git a/core/playlists/library.c b/core/playlists/library.c index 47e88ded..a5344fbb 100644 --- a/core/playlists/library.c +++ b/core/playlists/library.c @@ -126,6 +126,7 @@ static bool __lib_pl_update(void *data) path = track_path(TRACK(dbe)); if (g_access(path, F_OK) < 0) { pl_system_delete_track(TRACK(dbe)); + pl_artist_delete_track(TRACK(dbe)); queue_remove_all(&playlist->pl_queue, TRACK(dbe)); track_remove(TRACK(dbe)); } diff --git a/include/core/playlists/artist.h b/include/core/playlists/artist.h index afa02f32..4f4a6952 100644 --- a/include/core/playlists/artist.h +++ b/include/core/playlists/artist.h @@ -18,4 +18,7 @@ void pl_artist_deinit(); /* Called to tell system playlists about a new track. */ void pl_artist_new_track(struct track *); +/* Called to tell artist playlists that a track is getting deleted. */ +void pl_artist_delete_track(struct track *); + #endif /* OCARINA_CORE_PLAYLISTS_ARTIST_H */