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:
parent
0c01751946
commit
fecc10ab5e
1
config
1
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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 */
|
|
@ -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" ]),
|
||||
|
|
|
@ -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 */
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
#!/usr/bin/python
|
||||
Import("Test", "CONFIG")
|
||||
|
||||
CONFIG.DECK = True
|
||||
|
||||
Test("deck", "deck.cpp")
|
|
@ -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;
|
||||
}
|
|
@ -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 }
|
Loading…
Reference in New Issue