playlist: Implement next()

Random and sequential next, for both locked and unlocked playlists.

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2013-12-22 20:53:06 -05:00 committed by Anna Schumaker
parent 168f08392d
commit 0c01751946
5 changed files with 170 additions and 3 deletions

View File

@ -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:

View File

@ -17,6 +17,7 @@ class Playlist {
private:
std :: vector <unsigned int> 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 */

View File

@ -1,11 +1,11 @@
/*
* Copyright 2013 (c) Anna Schumaker.
*/
#include <playlist.h>
#include <stdlib.h>
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;
}

View File

@ -4,6 +4,7 @@
#include <playlist.h>
#include <print.h>
#include <stdlib.h>
#include <string>
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;
}

View File

@ -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