diff --git a/config b/config index 4def61ee..2b52c65e 100644 --- a/config +++ b/config @@ -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 diff --git a/design/deck.txt b/design/deck.txt index f157ed9f..1c15fa12 100644 --- a/design/deck.txt +++ b/design/deck.txt @@ -15,26 +15,30 @@ Deck: (lib/deck.cpp) - Deck: list 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. diff --git a/include/deck.h b/include/deck.h new file mode 100644 index 00000000..a2d53639 --- /dev/null +++ b/include/deck.h @@ -0,0 +1,23 @@ +/* + * Copyright 2013 (c) Anna Schumaker. + */ +#ifndef OCARINA_DECK_H +#define OCARINA_DECK_H + +#include + +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 */ diff --git a/lib/Sconscript b/lib/Sconscript index a0002646..f0344536 100644 --- a/lib/Sconscript +++ b/lib/Sconscript @@ -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" ]), diff --git a/lib/deck.cpp b/lib/deck.cpp new file mode 100644 index 00000000..409d8b5a --- /dev/null +++ b/lib/deck.cpp @@ -0,0 +1,63 @@ +/* + * Copyright 2013 (c) Anna Schumaker. + */ +#include +#include + +#include + +static std::list playlist_deck; + +Playlist *deck :: create() +{ + playlist_deck.push_back(Playlist(PL_ENABLED)); + return &playlist_deck.back(); +} + +void deck :: remove(unsigned int id) +{ + std::list::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::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::iterator it_old = playlist_deck.begin(); + std::list::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::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 */ diff --git a/tests/Sconscript b/tests/Sconscript index f3d67d1d..cbff13b2 100644 --- a/tests/Sconscript +++ b/tests/Sconscript @@ -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) diff --git a/tests/deck/Sconscript b/tests/deck/Sconscript new file mode 100644 index 00000000..08935ea3 --- /dev/null +++ b/tests/deck/Sconscript @@ -0,0 +1,6 @@ +#!/usr/bin/python +Import("Test", "CONFIG") + +CONFIG.DECK = True + +Test("deck", "deck.cpp") diff --git a/tests/deck/deck.cpp b/tests/deck/deck.cpp new file mode 100644 index 00000000..4d7db96f --- /dev/null +++ b/tests/deck/deck.cpp @@ -0,0 +1,78 @@ +/* + * Copyright 2013 (c) Anna Schumaker. + */ +#include +#include + +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; +} diff --git a/tests/deck/deck.good b/tests/deck/deck.good new file mode 100644 index 00000000..f7dfe37e --- /dev/null +++ b/tests/deck/deck.good @@ -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 }