2013-12-31 15:44:44 -05:00
|
|
|
/*
|
|
|
|
* Copyright 2013 (c) Anna Schumaker.
|
|
|
|
*/
|
2014-01-19 11:03:14 -05:00
|
|
|
#include <callback.h>
|
2014-01-02 21:58:18 -05:00
|
|
|
#include <library.h>
|
2014-01-02 21:12:46 -05:00
|
|
|
#include <playqueue.h>
|
2013-12-31 15:44:44 -05:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
Playqueue :: Playqueue()
|
2014-01-02 21:58:18 -05:00
|
|
|
: flags(0), cur(-1), length(0)
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
Playqueue :: Playqueue(playqueue_flags f)
|
2014-01-02 21:58:18 -05:00
|
|
|
: flags(f), cur(-1), length(0)
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
Playqueue :: ~Playqueue()
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
void Playqueue :: write(File &f)
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
|
|
|
f << flags << " " << tracks.size();
|
|
|
|
for (unsigned int i = 0; i < tracks.size(); i++)
|
|
|
|
f << " " << tracks[i];
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
void Playqueue :: read(File &f)
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
|
|
|
unsigned int n;
|
|
|
|
f >> flags >> n;
|
|
|
|
tracks.resize(n);
|
|
|
|
for (unsigned int i = 0; i < n; i++)
|
|
|
|
f >> tracks[i];
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
void Playqueue :: set_flag(playqueue_flags f)
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
|
|
|
flags |= f;
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
void Playqueue :: unset_flag(playqueue_flags f)
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
|
|
|
flags &= ~f;
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
const unsigned int Playqueue :: get_flags()
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
|
|
|
return flags;
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:58:18 -05:00
|
|
|
unsigned int Playqueue :: get_length()
|
|
|
|
{
|
|
|
|
return length;
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
unsigned int Playqueue :: add(unsigned int track_id)
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
2014-01-20 19:06:52 -05:00
|
|
|
unsigned int id = tracks.size();
|
2014-01-02 21:58:18 -05:00
|
|
|
library :: Song song;
|
2013-12-31 15:44:44 -05:00
|
|
|
tracks.push_back(track_id);
|
2014-01-02 21:58:18 -05:00
|
|
|
|
|
|
|
library :: lookup(track_id, &song);
|
|
|
|
length += song.track->length;
|
2014-01-20 19:06:52 -05:00
|
|
|
get_callbacks()->on_queue_track_add(this, id);
|
|
|
|
return id;
|
2013-12-31 15:44:44 -05:00
|
|
|
}
|
|
|
|
|
2014-01-02 21:58:18 -05:00
|
|
|
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;
|
2014-01-20 19:06:52 -05:00
|
|
|
get_callbacks()->on_queue_track_add(this, 0);
|
2014-01-02 21:58:18 -05:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
void Playqueue :: del(unsigned int plist_id)
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
2014-01-02 21:58:18 -05:00
|
|
|
library :: Song song;
|
|
|
|
unsigned int track_id = tracks[plist_id];
|
|
|
|
|
2013-12-31 15:44:44 -05:00
|
|
|
tracks.erase(tracks.begin() + plist_id);
|
2014-01-02 21:58:18 -05:00
|
|
|
library :: lookup(track_id, &song);
|
|
|
|
length -= song.track->length;
|
2014-01-20 19:06:52 -05:00
|
|
|
get_callbacks()->on_queue_track_del(this, plist_id);
|
2013-12-31 15:44:44 -05:00
|
|
|
}
|
|
|
|
|
2014-01-16 22:05:36 -05:00
|
|
|
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++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
unsigned int Playqueue :: size()
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
|
|
|
return tracks.size();
|
|
|
|
}
|
|
|
|
|
2014-01-20 19:06:52 -05:00
|
|
|
unsigned int Playqueue :: operator[](unsigned int i)
|
|
|
|
{
|
|
|
|
return tracks[i];
|
|
|
|
}
|
|
|
|
|
2014-01-02 21:12:46 -05:00
|
|
|
unsigned int Playqueue :: next()
|
2013-12-31 15:44:44 -05:00
|
|
|
{
|
|
|
|
unsigned int res;
|
|
|
|
|
2014-01-04 13:09:44 -05:00
|
|
|
if (tracks.size() == 0)
|
|
|
|
throw -E_EXIST;
|
|
|
|
else if (tracks.size() == 1)
|
2013-12-31 15:44:44 -05:00
|
|
|
cur = 0;
|
2014-01-02 21:12:46 -05:00
|
|
|
else if (flags & PQ_RANDOM)
|
2013-12-31 15:44:44 -05:00
|
|
|
cur += rand() % (tracks.size() / 2) + 1;
|
|
|
|
else
|
|
|
|
cur++;
|
|
|
|
|
|
|
|
if (cur >= tracks.size())
|
|
|
|
cur -= tracks.size();
|
|
|
|
|
|
|
|
res = tracks[cur];
|
2014-01-02 21:12:46 -05:00
|
|
|
if (!(flags & PQ_REPEAT)) {
|
2014-01-02 21:58:18 -05:00
|
|
|
del(cur);
|
2013-12-31 15:44:44 -05:00
|
|
|
cur--;
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
2014-01-04 10:54:02 -05:00
|
|
|
|
|
|
|
void Playqueue :: reset_cur()
|
|
|
|
{
|
2014-01-04 13:57:51 -05:00
|
|
|
cur = 0;
|
2014-01-04 10:54:02 -05:00
|
|
|
}
|