ocarina/libsaria/deck.cpp
Bryan Schumaker 98934ff42d libsaria: Move the rest of the deck code over
I also clean up the garbage collect code a bit.

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
2012-11-18 12:27:14 -05:00

200 lines
4.0 KiB
C++

// Copyright (c) 2012 Bryan Schumaker.
#include <deck.h>
#include <track.h>
#include <library.h>
#include <vector>
using namespace std;
static AutoPauseType pause_type;
static unsigned short pause_count = 0;
static vector<libsaria::Playlist *> playlist_deck;
static libsaria::Playlist recent_playlist(PL_STATIC | PL_NO_DRAIN | PL_UNIQUE);
static libsaria::Playlist *get_active_playlist()
{
for (unsigned int i = 0; i < playlist_deck.size(); i++) {
if (!playlist_deck[i]->check_flag(PL_DISABLED))
return playlist_deck[i];
}
return libsaria::library::get_playlist();
}
static bool check_play()
{
switch(pause_type) {
case PS_AFTER_N:
if (pause_count == 0) {
libsaria::deck::set_pause_type(PS_NONE, 0);
return false;
} else {
pause_count--;
libsaria::notify(PAUSE_COUNT, &pause_count);
}
default:
break;
}
return true;
}
static void remove_playlist(libsaria::Playlist *plist)
{
for (unsigned int i = 0; i < playlist_deck.size(); i++) {
if (playlist_deck[i] == plist) {
playlist_deck.erase(playlist_deck.begin() + i);
break;
}
}
}
static void renumber_playlists()
{
for (unsigned int i = 0; i < playlist_deck.size(); i++)
playlist_deck[i]->renumber(i);
}
static void read_playlist(ifstream &stream)
{
libsaria::Playlist *plist = new libsaria::Playlist(0);
playlist_deck.push_back(plist);
notify(PLAYLIST_NEW, plist);
plist->load(stream);
plist->renumber(playlist_deck.size() - 1);
}
namespace libsaria
{
void deck::garbage_collect()
{
for (unsigned int i = 0; i < playlist_deck.size(); i++) {
Playlist *plist = playlist_deck[i];
if (plist->get_size() == 0) {
plist->prepare_for_removal();
notify(PLAYLIST_DELETE, plist);
delete plist;
playlist_deck.erase(playlist_deck.begin() + i);
}
}
renumber_playlists();
}
void deck::next()
{
Playlist *plist = get_active_playlist();
Track *track = plist->next();
if (track)
track->load(check_play());
garbage_collect();
}
void deck::prev()
{
Track *track = recent_playlist.next();
if (track)
track->load_unlisted(true);
}
Playlist *deck::new_playlist(list<Track *> &tracks, unsigned int flags, bool front)
{
Playlist *plist;
if (playlist_deck.size() == MAX_PLAYLISTS)
return NULL;
plist = new Playlist(flags);
if (front)
playlist_deck.insert(playlist_deck.begin(), plist);
else
playlist_deck.push_back(plist);
notify(PLAYLIST_NEW, plist);
renumber_playlists();
plist->push_back(tracks);
return plist;
}
void deck::delete_playlist(Playlist *plist)
{
plist->prepare_for_removal();
notify(PLAYLIST_DELETE, plist);
remove_playlist(plist);
garbage_collect();
}
unsigned int deck::move_playlist(Playlist *plist, unsigned int index)
{
if (index >= playlist_deck.size())
index = playlist_deck.size() - 1;
remove_playlist(plist);
playlist_deck.insert(playlist_deck.begin() + index, plist);
renumber_playlists();
return index;
}
void deck::track_removed(Track *track)
{
for (unsigned int i = 0; i < playlist_deck.size(); i++)
playlist_deck[i]->remove_track(track);
}
Playlist *deck::get_recent_plist()
{
return &recent_playlist;
}
void deck::list_recent(Track *track)
{
recent_playlist.push_front(track);
recent_playlist.reset_iterator();
}
Playlist *deck::get_playlist(unsigned int n)
{
if (n >= playlist_deck.size())
return NULL;
return playlist_deck[n];
}
unsigned int deck::get_playlist_index(Playlist *plist)
{
for (unsigned int i = 0; i < playlist_deck.size(); i++) {
if (playlist_deck[i] == plist)
return i;
}
return -1;
}
unsigned int deck::size()
{
return playlist_deck.size();
}
void deck::init()
{
app::mkdir("playlist");
app::read_numdir("playlist", read_playlist);
}
void deck::set_pause_type(AutoPauseType type, unsigned int count)
{
pause_type = type;
pause_count = count;
notify(PAUSE_TYPE, &pause_type);
notify(PAUSE_COUNT, &count);
}
AutoPauseType deck::get_pause_type()
{
return pause_type;
}
unsigned short deck::get_pause_count()
{
return pause_count;
}
}; /* Namespace: Libsaria */