From 0c017519468d07b8fa7f3bd6e4ca3f71ed968702 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sun, 22 Dec 2013 20:53:06 -0500 Subject: [PATCH] playlist: Implement next() Random and sequential next, for both locked and unlocked playlists. Signed-off-by: Anna Schumaker --- design/playlist.txt | 2 + include/playlist.h | 3 ++ lib/playlist.cpp | 26 ++++++++++- tests/playlist/playlist.cpp | 52 ++++++++++++++++++++- tests/playlist/playlist.good | 90 ++++++++++++++++++++++++++++++++++++ 5 files changed, 170 insertions(+), 3 deletions(-) diff --git a/design/playlist.txt b/design/playlist.txt index d0310fab..5c076254 100644 --- a/design/playlist.txt +++ b/design/playlist.txt @@ -70,6 +70,8 @@ Playlist: (lib/playlist.cpp) Sort a playlist in Artist -> Year -> Track number order. unsigned int next(); + Return the next track_id to play. + if (flags & PL_RANDOM): cur += rand() % tracks.size(); else: diff --git a/include/playlist.h b/include/playlist.h index 96d9082b..74e45858 100644 --- a/include/playlist.h +++ b/include/playlist.h @@ -17,6 +17,7 @@ class Playlist { private: std :: vector tracks; unsigned int flags; + unsigned int cur; public: Playlist(playlist_flags); @@ -31,6 +32,8 @@ public: unsigned int add(unsigned int); void del(unsigned int); unsigned int size(); + + unsigned int next(); }; #endif /* OCARINA_PLAYLIST_H */ diff --git a/lib/playlist.cpp b/lib/playlist.cpp index da9fdfea..c2b8c341 100644 --- a/lib/playlist.cpp +++ b/lib/playlist.cpp @@ -1,11 +1,11 @@ /* * Copyright 2013 (c) Anna Schumaker. */ - #include +#include Playlist :: Playlist(playlist_flags f) - : flags(f) + : flags(f), cur(-1) { } @@ -59,3 +59,25 @@ unsigned int Playlist :: size() { return tracks.size(); } + +unsigned int Playlist :: next() +{ + unsigned int res; + + if (tracks.size() == 1) + cur = 0; + else if (flags & PL_RANDOM) + cur += rand() % (tracks.size() / 2) + 1; + else + cur++; + + if (cur >= tracks.size()) + cur -= tracks.size(); + + res = tracks[cur]; + if (!(flags & PL_LOCKED)) { + tracks.erase(tracks.begin() + cur); + cur--; + } + return res; +} diff --git a/tests/playlist/playlist.cpp b/tests/playlist/playlist.cpp index 38b481ee..5282b1b7 100644 --- a/tests/playlist/playlist.cpp +++ b/tests/playlist/playlist.cpp @@ -4,6 +4,7 @@ #include #include +#include #include void test_flags(const std :: string &test, Playlist &plist, unsigned int expected) @@ -102,13 +103,62 @@ void test_2() return; } - print("SUCCESS\n"); + print("SUCCESS\n\n"); +} + +/* Sequential next() without removing tracks */ +void test_3() +{ + Playlist plist(PL_ENABLED); + plist.set_flag(PL_LOCKED); + test_add_tracks("3", plist, 0, 15); + for (unsigned int i = 0; i < 20; i++) + print("Selecting id: %u\n", plist.next()); + print("\n"); +} + +/* Sequential next() with removal */ +void test_4() +{ + Playlist plist(PL_ENABLED); + test_add_tracks("4", plist, 0, 15); + while (plist.size() > 0) + print("Selecting id: %u\n", plist.next()); + print("\n"); +} + +/* Random next() without removing tracks */ +void test_5() +{ + Playlist plist(PL_ENABLED); + plist.set_flag(PL_RANDOM); + plist.set_flag(PL_LOCKED); + test_add_tracks("5", plist, 0, 15); + for (unsigned int i = 0; i < 30; i++) + print("Selecting id: %u\n", plist.next()); + print("\n"); +} + +/* Random next() with removal */ +void test_6() +{ + Playlist plist(PL_ENABLED); + plist.set_flag(PL_RANDOM); + test_add_tracks("6", plist, 0, 15); + while (plist.size() > 0) + print("Selecting id: %u\n", plist.next()); } int main(int argc, char **argv) { + srand(42); + test_0(); test_1(); test_2(); + test_3(); + test_4(); + test_5(); + test_6(); return 0; } diff --git a/tests/playlist/playlist.good b/tests/playlist/playlist.good index 3bd31c5f..29e5b4bf 100644 --- a/tests/playlist/playlist.good +++ b/tests/playlist/playlist.good @@ -10,3 +10,93 @@ Test 1c: SUCCESS Test 2a: SUCCESS Test 2b: SUCCESS + +Test 3: SUCCESS +Selecting id: 0 +Selecting id: 1 +Selecting id: 2 +Selecting id: 3 +Selecting id: 4 +Selecting id: 5 +Selecting id: 6 +Selecting id: 7 +Selecting id: 8 +Selecting id: 9 +Selecting id: 10 +Selecting id: 11 +Selecting id: 12 +Selecting id: 13 +Selecting id: 14 +Selecting id: 15 +Selecting id: 0 +Selecting id: 1 +Selecting id: 2 +Selecting id: 3 + +Test 4: SUCCESS +Selecting id: 0 +Selecting id: 1 +Selecting id: 2 +Selecting id: 3 +Selecting id: 4 +Selecting id: 5 +Selecting id: 6 +Selecting id: 7 +Selecting id: 8 +Selecting id: 9 +Selecting id: 10 +Selecting id: 11 +Selecting id: 12 +Selecting id: 13 +Selecting id: 14 +Selecting id: 15 + +Test 5: SUCCESS +Selecting id: 6 +Selecting id: 11 +Selecting id: 13 +Selecting id: 15 +Selecting id: 4 +Selecting id: 11 +Selecting id: 1 +Selecting id: 6 +Selecting id: 14 +Selecting id: 6 +Selecting id: 9 +Selecting id: 1 +Selecting id: 7 +Selecting id: 8 +Selecting id: 9 +Selecting id: 12 +Selecting id: 1 +Selecting id: 2 +Selecting id: 5 +Selecting id: 9 +Selecting id: 13 +Selecting id: 14 +Selecting id: 0 +Selecting id: 2 +Selecting id: 10 +Selecting id: 14 +Selecting id: 0 +Selecting id: 1 +Selecting id: 7 +Selecting id: 8 + +Test 6: SUCCESS +Selecting id: 1 +Selecting id: 2 +Selecting id: 4 +Selecting id: 9 +Selecting id: 10 +Selecting id: 11 +Selecting id: 0 +Selecting id: 5 +Selecting id: 7 +Selecting id: 8 +Selecting id: 13 +Selecting id: 15 +Selecting id: 6 +Selecting id: 12 +Selecting id: 14 +Selecting id: 3