diff --git a/core/playlist.c b/core/playlist.c index f3e39db9..f3940635 100644 --- a/core/playlist.c +++ b/core/playlist.c @@ -101,19 +101,18 @@ void playlist_fixup_collection() queue_remove_all(collection_get_queue(), track_get(it.it_val)); } -void playlist_add(enum playlist_t plist, struct track *track) +bool playlist_add(enum playlist_t plist, struct track *track) { - if (!track || !__playlist_is_static(plist)) - return; + if (!track || !__playlist_is_static(plist) || playlist_has(plist, track)) + return false; - if (!playlist_has(plist, track)) { - index_insert(&playlist_db, playlist_names[plist], - track->tr_dbe.dbe_index); - if (playlist_cur == plist) - queue_add(&playlist_q, track); - if (plist == PL_BANNED) - queue_remove_all(collection_get_queue(), track); - } + index_insert(&playlist_db, playlist_names[plist], + track->tr_dbe.dbe_index); + if (playlist_cur == plist) + queue_add(&playlist_q, track); + if (plist == PL_BANNED) + queue_remove_all(collection_get_queue(), track); + return true; } void playlist_remove(enum playlist_t plist, struct track *track) diff --git a/gui/playlist.cpp b/gui/playlist.cpp index a30e9253..4cba2629 100644 --- a/gui/playlist.cpp +++ b/gui/playlist.cpp @@ -135,10 +135,8 @@ static void on_ban() { struct track *track = audio :: current_track(); if (o_ban->get_active()) { - if (!playlist_has(PL_BANNED, track)) { - playlist_add(PL_BANNED, track); + if (playlist_add(PL_BANNED, track)) audio :: next(); - } } else playlist_remove(PL_BANNED, track); } diff --git a/include/core/playlist.h b/include/core/playlist.h index 93b0d2cd..40a034ad 100644 --- a/include/core/playlist.h +++ b/include/core/playlist.h @@ -30,7 +30,7 @@ void playlist_fixup_collection(); /* Called to add a track to a playlist. */ -void playlist_add(enum playlist_t, struct track *); +bool playlist_add(enum playlist_t, struct track *); /* Called to remove a track from a playlist. */ void playlist_remove(enum playlist_t, struct track *); diff --git a/tests/core/playlist.c b/tests/core/playlist.c index 6a9a6310..121fecf9 100644 --- a/tests/core/playlist.c +++ b/tests/core/playlist.c @@ -43,16 +43,16 @@ static void test_add() struct queue *q = playlist_get_queue(); struct track *track = track_get(0); - playlist_add(PL_FAVORITED, NULL); + test_equal(playlist_add(PL_FAVORITED, NULL), (bool)false); test_equal(playlist_has(PL_FAVORITED, NULL), (bool)false); test_equal(playlist_has(PL_FAVORITED, track), (bool)false); - playlist_add(PL_FAVORITED, track); + test_equal(playlist_add(PL_FAVORITED, track), (bool)true); test_equal(playlist_has(PL_FAVORITED, track), (bool)true); test_equal(queue_size(q), 1); - playlist_add(PL_FAVORITED, track); + test_equal(playlist_add(PL_FAVORITED, track), (bool)false); test_equal(queue_size(q), 1); - playlist_add(PL_FAVORITED, track_get(1)); + test_equal(playlist_add(PL_FAVORITED, track_get(1)), (bool)true); test_equal(queue_size(q), 2); track = track_get(2); @@ -60,7 +60,7 @@ static void test_add() test_equal(queue_size(q), 0); test_equal(queue_size(c), 13); test_equal(playlist_has(PL_BANNED, track), (bool)false); - playlist_add(PL_BANNED, track); + test_equal(playlist_add(PL_BANNED, track), (bool)true); test_equal(playlist_has(PL_BANNED, track), (bool)true); test_equal(queue_size(q), 1); test_equal(queue_size(c), 12); @@ -119,12 +119,14 @@ static void test_dynamic() /* Only one unplayed track (tr_track == 1) */ playlist_select(PL_UNPLAYED); + test_equal(playlist_add(PL_UNPLAYED, track_get(1)), (bool)false); test_equal(queue_size(q), 1); test_equal(queue_at(q, 0)->tr_track, 1); test_equal(queue_at(q, 0)->tr_count, 0); /* Five tracks have tr_count < average && tr_count > 0 */ playlist_select(PL_LEAST_PLAYED); + test_equal(playlist_add(PL_LEAST_PLAYED, track_get(0)), (bool)false); test_equal(queue_size(q), 5); for (i = 0; i < queue_size(q); i++) { test_loop_equal(queue_at(q, i)->tr_track, i + 2, i); @@ -133,6 +135,7 @@ static void test_dynamic() /* Six tracks have tr_count > average */ playlist_select(PL_MOST_PLAYED); + test_equal(playlist_add(PL_MOST_PLAYED, track_get(0)), (bool)false); test_equal(queue_size(q), 6); for (i = 0; i < queue_size(q); i++) { test_loop_equal(queue_at(q, i)->tr_track, i + 8, i);