diff --git a/core/playlist.cpp b/core/playlist.cpp index e68d77ad..ecfd5dba 100644 --- a/core/playlist.cpp +++ b/core/playlist.cpp @@ -21,6 +21,9 @@ public: struct set_iter it; clear(); + if (!ent) + return; + queue_set_flag(this, Q_ADD_FRONT); set_for_each(&ent->ie_set, &it) @@ -125,16 +128,16 @@ void playlist_deinit() db_deinit(&playlist_db); } -void playlist :: add(struct track *track, const std::string &name) +void playlist_add(const gchar *name, struct track *track) { - if (!( (name == "Banned") || (name == "Favorites") )) + if (!track || !name || !__playlist_is_static(name)) return; - if (!playlist_has(name.c_str(), track)) { - index_insert(&playlist_db, name.c_str(), track->tr_dbe.dbe_index); + if (!playlist_has(name, track)) { + index_insert(&playlist_db, name, track->tr_dbe.dbe_index); if (cur_plist == name) queue_add(&playlist_q, track); - if (name == "Banned") + if (string_compare(name, "Banned") == 0) queue_remove_all(collection_get_queue(), track); } } diff --git a/gui/collection.cpp b/gui/collection.cpp index c5571fdc..6a739da8 100644 --- a/gui/collection.cpp +++ b/gui/collection.cpp @@ -41,7 +41,7 @@ public: tab_selected_ids(ids); for (unsigned int i = 0; i < ids.size(); i++) - playlist :: add(track_get(ids[i]), "Banned"); + playlist_add("Banned", track_get(ids[i])); return true; } diff --git a/gui/playlist.cpp b/gui/playlist.cpp index cdf986f9..7f806706 100644 --- a/gui/playlist.cpp +++ b/gui/playlist.cpp @@ -127,7 +127,7 @@ static void on_ban() struct track *track = audio :: current_track(); if (o_ban->get_active()) { if (!playlist_has("Banned", track)) { - playlist :: add(track, "Banned"); + playlist_add("Banned", track); audio :: next(); } } else @@ -138,7 +138,7 @@ static void on_favorite() { struct track *track = audio :: current_track(); if (o_fav->get_active()) - playlist :: add(track, "Favorites"); + playlist_add("Favorites", track); else playlist :: del(track, "Favorites"); } diff --git a/gui/tabs.cpp b/gui/tabs.cpp index dbaece37..ffa3c7b2 100644 --- a/gui/tabs.cpp +++ b/gui/tabs.cpp @@ -226,7 +226,7 @@ bool Tab :: tab_add_to_playlist(const std::string &playlist) tab_selected_ids(ids); for (unsigned int i = 0; i < ids.size(); i++) - playlist :: add(track_get(ids[i]), playlist); + playlist_add(playlist.c_str(), track_get(ids[i])); return true; } diff --git a/include/core/playlist.h b/include/core/playlist.h index 1eaf0b14..d1688a24 100644 --- a/include/core/playlist.h +++ b/include/core/playlist.h @@ -26,17 +26,6 @@ extern "C" { namespace playlist { - /** - * Add a track to a playlist. - * - * Tracks added to the Banned playlist will be removed from - * the library queue. - * - * @param track The track to add. - * @param name The name of the playlist to add to. - */ - void add(struct track *, const std::string &); - /** * Remove a track from a playlist. * @@ -65,6 +54,10 @@ void playlist_init(struct queue_ops *); void playlist_deinit(); +/* Called to add a track to a playlist. */ +void playlist_add(const gchar *, struct track *); + + /* Called to check if a specific track is in the playlist. */ bool playlist_has(const gchar *, struct track *); diff --git a/tests/core/playlist.cpp b/tests/core/playlist.cpp index 3db968ce..4ffee164 100644 --- a/tests/core/playlist.cpp +++ b/tests/core/playlist.cpp @@ -4,6 +4,7 @@ extern "C" { #include #include +#include #include } #include @@ -35,6 +36,48 @@ static void test_init() list = g_slist_next(list); test_equal(GPOINTER_TO_INT(list->data), COMPARE_TRACK); + /* Add tracks to the collection. */ + collection_add("tests/Music/Hyrule Symphony/"); + while (idle_run_task()); +} + +static void test_add() +{ + struct queue *c = collection_get_queue(); + struct queue *q = playlist_get_queue(); + struct track *track = track_get(0); + + playlist_add(NULL, track); + test_equal(playlist_has(NULL, track), false); + + playlist_add("Favorites", NULL); + test_equal(playlist_has("Favorites", NULL), false); + + playlist_add("No Playlist", track); + test_equal(playlist_has("No Playlist", track), false); + + test_equal(playlist_has("Favorites", track), false); + playlist_add("Favorites", track); + test_equal(playlist_has("Favorites", track), true); + test_equal(queue_size(q), 0); + + playlist_select("Favorites"); + test_equal(queue_size(q), 1); + playlist_add("Favorites", track); + test_equal(queue_size(q), 1); + playlist_add("Favorites", track_get(1)); + test_equal(queue_size(q), 2); + + track = track_get(2); + playlist_select("Banned"); + test_equal(queue_size(q), 0); + test_equal(queue_size(c), 13); + test_equal(playlist_has("Banned", track), false); + playlist_add("Banned", track); + test_equal(playlist_has("Banned", track), true); + test_equal(queue_size(q), 1); + test_equal(queue_size(c), 12); + playlist_deinit(); collection_deinit(); tags_deinit(); @@ -71,7 +114,7 @@ static void test_queue() test_equal(queue_size(q), (unsigned)12); } -static void test_add() +static void test_add_old() { queue *l = collection_get_queue(); queue *q = playlist_get_queue(); @@ -79,19 +122,19 @@ static void test_add() playlist_select("Favorites"); - playlist :: add(track_get(5), "Banned"); + playlist_add("Banned", track_get(5)); ent = playlist :: get_tracks("Banned"); test_equal(set_size(&ent->ie_set), (size_t)5); test_equal(queue_size(q), (unsigned)8); test_equal(queue_size(l), (unsigned)19); - playlist :: add(track_get(16), "Favorites"); - playlist :: add(track_get(5), "Favorites"); + playlist_add("Favorites", track_get(16)); + playlist_add("Favorites", track_get(5)); ent = playlist :: get_tracks("Favorites"); test_equal(set_size(&ent->ie_set), (size_t)9); test_equal(queue_size(q), (unsigned)9); - playlist :: add(track_get(6), "No Playlist"); + playlist_add("No Playlist", track_get(6)); test_equal(playlist :: get_tracks("No Playlist"), IDX_NULL); } @@ -152,8 +195,9 @@ static void test_deinit() DECLARE_UNIT_TESTS( UNIT_TEST("Playlist Initialization", test_init), + UNIT_TEST("Playlist Add Track", test_add), UNIT_TEST("Playlist Queue", test_queue), - UNIT_TEST("Playlist Add", test_add), + UNIT_TEST("Playlist Add", test_add_old), UNIT_TEST("Playlist Delete", test_delete), UNIT_TEST("Playlist Has", test_has), UNIT_TEST("Playlist Deinit", test_deinit),