playlist: Create a playqueue to store the current playlist

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2014-02-02 14:05:56 -05:00 committed by Anna Schumaker
parent 3fb8dfa534
commit 3894c4ac97
4 changed files with 44 additions and 0 deletions

View File

@ -108,6 +108,7 @@ namespace library
struct Song {
unsigned int track_id;
library :: Album *album;
library :: AGInfo *artist;
library :: AGInfo *genre;

View File

@ -4,6 +4,8 @@
#ifndef OCARINA_PLAYLIST_H
#define OCARINA_PLAYLIST_H
#include <playqueue.h>
#include <list>
#include <set>
#include <string>
@ -14,7 +16,9 @@ namespace playlist
void init();
void add(const std::string &, unsigned int);
void del(const std::string &, unsigned int);
void select(const std::string &);
const std::set<unsigned int> &get_tracks(const std::string &);
Playqueue *get_pq();
#ifdef CONFIG_TEST
void clear();

View File

@ -564,6 +564,7 @@ void library :: lookup(unsigned int id, library :: Song *song)
if (song->track->valid == false)
throw -E_EXIST;
song->track_id = id;
song->artist = &artist_db[song->track->artist_id];
song->album = &album_db[song->track->album_id];
song->genre = &genre_db[song->track->genre_id];

View File

@ -7,10 +7,26 @@
static std::set<unsigned int> empty_set;
static Database<IndexEntry> playlist_db("playlist.db");
static Playqueue playlist_pq(PQ_ENABLED);
static std::string cur_pq;
void playlist :: init()
{
std::set<unsigned int> ids;
std::set<unsigned int>::iterator it;
playlist_pq.add_sort(SORT_ARTIST);
playlist_pq.add_sort(SORT_YEAR);
playlist_pq.add_sort(SORT_TRACK);
playlist_pq.set_flag(PQ_NEVER_SORT);
playlist_db.load();
if (cur_pq == "")
return;
ids = get_tracks(cur_pq);
for (it = ids.begin(); it != ids.end(); it++)
playlist_pq.add(*it);
}
void playlist :: add(const std::string &name, unsigned int track_id)
@ -18,6 +34,8 @@ void playlist :: add(const std::string &name, unsigned int track_id)
if ((name == "Banned") || (name == "Favorites")) {
index_insert(playlist_db, name, track_id);
playlist_db.save();
if (name == cur_pq)
playlist_pq.add(track_id);
} else
throw -E_EXIST;
}
@ -27,10 +45,25 @@ void playlist :: del(const std::string &name, unsigned int track_id)
if ((name == "Banned") || (name == "Favorites")) {
index_remove(playlist_db, name, track_id);
playlist_db.save();
if (name == cur_pq)
playlist_pq.del_track(track_id);
} else
throw -E_EXIST;
}
void playlist :: select(const std::string &name)
{
std::set<unsigned int> ids = get_tracks(name);
std::set<unsigned int>::iterator it;
while (playlist_pq.size() > 0)
playlist_pq.del(0);
for (it = ids.begin(); it != ids.end(); it++)
playlist_pq.add(*it);
cur_pq = name;
}
const std::set<unsigned int> &playlist :: get_tracks(const std::string &name)
{
if ((name == "Banned") || (name == "Favorites")) {
@ -43,6 +76,11 @@ const std::set<unsigned int> &playlist :: get_tracks(const std::string &name)
throw -E_EXIST;
}
Playqueue *playlist :: get_pq()
{
return &playlist_pq;
}
#ifdef CONFIG_TEST
void playlist :: clear()
{