deck: Implement basic deck features

- Add playlists
- Remove playlists
- Rearrange playlists
- Get a playlist based on id

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2013-12-22 22:21:19 -05:00 committed by Anna Schumaker
parent 0c01751946
commit fecc10ab5e
9 changed files with 250 additions and 9 deletions

1
config
View File

@ -35,6 +35,7 @@ class Config:
def reset(self, TEST = False):
self.DATABASE = False
self.DECK = False
self.FILE = False
self.FILTER = False
self.GROUP = False

View File

@ -15,26 +15,30 @@ Deck: (lib/deck.cpp)
- Deck:
list<Playlist> deck;
unsigned int current_track;
File << current_track << deck.size() << endl;
File << deck[0] << endl;
File << deck[N] << endl;
- API
void deck :: init();
Read in the playlist file.
void deck :: read(File &);
void deck :: write(File &);
Read or write the playlist file. This will be called
from the audio layer to store state.
unsigned int deck :: new();
Adds a new playlist to the end of the deck and returns its id.
The id is only valid until the deck is changed in some way.
Playlist *deck :: create();
Adds a new playlist to the end of the deck and returns a
pointer to it.
void deck :: rm(N);
void deck :: remove(N);
Remove playlist N from the deck.
Playlist *deck :: get(N);
Return playlist N from the deck.
void deck :: move(M, N);
Move playlist at index M to index N.
unsigned int deck :: next();
Iterate through the deck until you find a playlist with the
flag PL_ENABLED set. Call next() on this playlist and return
@ -42,3 +46,11 @@ Deck: (lib/deck.cpp)
If the playlist is empty after calling next(), remove it from
the deck.
void deck :: reset();
This function only exists if CONFIG_DEBUG is enabled. Erase
all the playlist information and reset the deck list.
void deck :: print_info();
This function only exists if CONFIG_DEBUG is enabled. Print
out helpful stats about the current state of the playlist deck.

23
include/deck.h Normal file
View File

@ -0,0 +1,23 @@
/*
* Copyright 2013 (c) Anna Schumaker.
*/
#ifndef OCARINA_DECK_H
#define OCARINA_DECK_H
#include <playlist.h>
namespace deck
{
Playlist *create();
void remove(unsigned int);
Playlist *get(unsigned int);
void move(unsigned int, unsigned int);
#ifdef CONFIG_DEBUG
void print_info();
#endif /* CONFIG_DEBUG */
};
#endif /* OCARINA_DECK_H */

View File

@ -16,6 +16,7 @@ modules = {
###########################
"DATABASE" : Module("database.cpp", depends = [ "FILE" ]),
"DECK" : Module("deck.cpp", depends = [ "PLAYLIST" ]),
"FILE" : Module("file.cpp", package = "glib-2.0"),
"FILTER" : Module("filter.cpp", depends = [ "DATABASE" ]),
"GROUP" : Module("group.cpp", depends = [ "DATABASE" ]),

63
lib/deck.cpp Normal file
View File

@ -0,0 +1,63 @@
/*
* Copyright 2013 (c) Anna Schumaker.
*/
#include <deck.h>
#include <print.h>
#include <list>
static std::list<Playlist> playlist_deck;
Playlist *deck :: create()
{
playlist_deck.push_back(Playlist(PL_ENABLED));
return &playlist_deck.back();
}
void deck :: remove(unsigned int id)
{
std::list<Playlist>::iterator it = playlist_deck.begin();
for (unsigned int i = 0; i < id; i++)
it++;
playlist_deck.erase(it);
}
Playlist *deck :: get(unsigned int id)
{
std::list<Playlist>::iterator it = playlist_deck.begin();
for (unsigned int i = 0; i < id; i++)
it++;
return &(*it);
}
void deck :: move(unsigned int old_pos, unsigned int new_pos)
{
std::list<Playlist>::iterator it_old = playlist_deck.begin();
std::list<Playlist>::iterator it_new = playlist_deck.begin();
for (unsigned int i = 0; i < playlist_deck.size(); i++) {
if (i < old_pos)
it_old++;
if (i < new_pos)
it_new++;
}
if (new_pos > old_pos)
it_new++;
playlist_deck.splice(it_new, playlist_deck, it_old);
}
#ifdef CONFIG_DEBUG
void deck :: print_info()
{
unsigned int i = 0;
std::list<Playlist>::iterator it;
for (it = playlist_deck.begin(); it != playlist_deck.end(); it++) {
print("deck[%u] = Playlist { size = %u, flags = %u }\n",
i, it->size(), it->get_flags());
i++;
}
}
#endif /* CONFIG_DEBUG */

View File

@ -57,8 +57,8 @@ rm_test_dir(xdg.BaseDirectory.xdg_data_home);
#
# Read SConscript files
#
scripts = [ "database", "file", "filter", "group", "idle", "index", "library",
"playlist", "print" ]
scripts = [ "database", "deck", "file", "filter", "group", "idle", "index",
"library", "playlist", "print" ]
for s in scripts:
CONFIG.reset(TEST = True)
SConscript("%s/Sconscript" % s)

6
tests/deck/Sconscript Normal file
View File

@ -0,0 +1,6 @@
#!/usr/bin/python
Import("Test", "CONFIG")
CONFIG.DECK = True
Test("deck", "deck.cpp")

78
tests/deck/deck.cpp Normal file
View File

@ -0,0 +1,78 @@
/*
* Copyright 2013 (c) Anna Schumaker.
*/
#include <deck.h>
#include <print.h>
void test_add_playlist(unsigned int size)
{
Playlist *plist = deck :: create();
for (unsigned i = 0; i < size; i++)
plist->add(i);
}
/* Test creating a deck of playlists */
void test_0()
{
for (unsigned int i = 0; i < 10; i++)
test_add_playlist(10 + i);
print("Test 0:\n");
deck :: print_info();
print("\n");
}
/* Test removing playlists from the deck */
void test_1()
{
print("Test 1:\n");
deck :: remove(3);
deck :: remove(7);
deck :: remove(1);
deck :: remove(5);
deck :: print_info();
print("\n");
}
/* Get a specific playlist from the deck */
void test_2()
{
Playlist *plist;
print("Test 2: ");
plist = deck :: get(3);
print("Playlist { size = %u, flags = %u }", plist->size(), plist->get_flags());
print("\n\n");
}
/* Move a playlist to a new position in the deck */
void test_3()
{
print("Test 3:\n");
deck :: move(4, 0);
deck :: print_info();
print("\n");
deck :: move(5, 1);
deck :: print_info();
print("\n");
deck :: move(2, 5);
deck :: print_info();
print("\n");
deck :: move(3, 4);
deck :: print_info();
print("\n");
deck :: move(4, 3);
deck :: print_info();
print("\n");
deck :: move(4, 4);
deck :: print_info();
print("\n");
}
int main(int argc, char **argv)
{
test_0();
test_1();
test_2();
test_3();
return 0;
}

57
tests/deck/deck.good Normal file
View File

@ -0,0 +1,57 @@
Test 0:
deck[0] = Playlist { size = 10, flags = 1 }
deck[1] = Playlist { size = 11, flags = 1 }
deck[2] = Playlist { size = 12, flags = 1 }
deck[3] = Playlist { size = 13, flags = 1 }
deck[4] = Playlist { size = 14, flags = 1 }
deck[5] = Playlist { size = 15, flags = 1 }
deck[6] = Playlist { size = 16, flags = 1 }
deck[7] = Playlist { size = 17, flags = 1 }
deck[8] = Playlist { size = 18, flags = 1 }
deck[9] = Playlist { size = 19, flags = 1 }
Test 1:
deck[0] = Playlist { size = 10, flags = 1 }
deck[1] = Playlist { size = 12, flags = 1 }
deck[2] = Playlist { size = 14, flags = 1 }
deck[3] = Playlist { size = 15, flags = 1 }
deck[4] = Playlist { size = 16, flags = 1 }
deck[5] = Playlist { size = 19, flags = 1 }
Test 2: Playlist { size = 15, flags = 1 }
Test 3:
deck[0] = Playlist { size = 16, flags = 1 }
deck[1] = Playlist { size = 10, flags = 1 }
deck[2] = Playlist { size = 12, flags = 1 }
deck[3] = Playlist { size = 14, flags = 1 }
deck[4] = Playlist { size = 15, flags = 1 }
deck[5] = Playlist { size = 19, flags = 1 }
deck[0] = Playlist { size = 16, flags = 1 }
deck[1] = Playlist { size = 19, flags = 1 }
deck[2] = Playlist { size = 10, flags = 1 }
deck[3] = Playlist { size = 12, flags = 1 }
deck[4] = Playlist { size = 14, flags = 1 }
deck[5] = Playlist { size = 15, flags = 1 }
deck[0] = Playlist { size = 16, flags = 1 }
deck[1] = Playlist { size = 19, flags = 1 }
deck[2] = Playlist { size = 12, flags = 1 }
deck[3] = Playlist { size = 14, flags = 1 }
deck[4] = Playlist { size = 15, flags = 1 }
deck[5] = Playlist { size = 10, flags = 1 }
deck[0] = Playlist { size = 16, flags = 1 }
deck[1] = Playlist { size = 19, flags = 1 }
deck[2] = Playlist { size = 12, flags = 1 }
deck[3] = Playlist { size = 15, flags = 1 }
deck[4] = Playlist { size = 14, flags = 1 }
deck[5] = Playlist { size = 10, flags = 1 }
deck[0] = Playlist { size = 16, flags = 1 }
deck[1] = Playlist { size = 19, flags = 1 }
deck[2] = Playlist { size = 12, flags = 1 }
deck[3] = Playlist { size = 14, flags = 1 }
deck[4] = Playlist { size = 15, flags = 1 }
deck[5] = Playlist { size = 10, flags = 1 }