ocarina/lib/playqueue.cpp

137 lines
2.3 KiB
C++
Raw Normal View History

/*
* Copyright 2013 (c) Anna Schumaker.
*/
#include <callback.h>
#include <library.h>
#include <playqueue.h>
#include <stdlib.h>
Playqueue :: Playqueue()
: flags(0), cur(-1), length(0)
{
}
Playqueue :: Playqueue(playqueue_flags f)
: flags(f), cur(-1), length(0)
{
}
Playqueue :: ~Playqueue()
{
}
void Playqueue :: write(File &f)
{
f << flags << " " << tracks.size();
for (unsigned int i = 0; i < tracks.size(); i++)
f << " " << tracks[i];
}
void Playqueue :: read(File &f)
{
unsigned int n;
f >> flags >> n;
tracks.resize(n);
for (unsigned int i = 0; i < n; i++)
f >> tracks[i];
}
void Playqueue :: set_flag(playqueue_flags f)
{
flags |= f;
}
void Playqueue :: unset_flag(playqueue_flags f)
{
flags &= ~f;
}
const unsigned int Playqueue :: get_flags()
{
return flags;
}
unsigned int Playqueue :: get_length()
{
return length;
}
unsigned int Playqueue :: add(unsigned int track_id)
{
library :: Song song;
tracks.push_back(track_id);
library :: lookup(track_id, &song);
length += song.track->length;
get_callbacks()->on_queue_track_add(this);
return tracks.size() - 1;
}
unsigned int Playqueue :: add_front(unsigned int track_id)
{
library :: Song song;
tracks.insert(tracks.begin(), track_id);
library :: lookup(track_id, &song);
length += song.track->length;
get_callbacks()->on_queue_track_add(this);
return 0;
}
void Playqueue :: del(unsigned int plist_id)
{
library :: Song song;
unsigned int track_id = tracks[plist_id];
tracks.erase(tracks.begin() + plist_id);
library :: lookup(track_id, &song);
length -= song.track->length;
get_callbacks()->on_queue_track_del(this);
}
void Playqueue :: del_track(unsigned int track_id)
{
unsigned int i = 0;
while (i < tracks.size()) {
if (tracks[i] == track_id)
del(i);
else
i++;
}
get_callbacks()->on_queue_track_del(this);
}
unsigned int Playqueue :: size()
{
return tracks.size();
}
unsigned int Playqueue :: next()
{
unsigned int res;
if (tracks.size() == 0)
throw -E_EXIST;
else if (tracks.size() == 1)
cur = 0;
else if (flags & PQ_RANDOM)
cur += rand() % (tracks.size() / 2) + 1;
else
cur++;
if (cur >= tracks.size())
cur -= tracks.size();
res = tracks[cur];
if (!(flags & PQ_REPEAT)) {
del(cur);
cur--;
}
return res;
}
void Playqueue :: reset_cur()
{
cur = 0;
}