diff --git a/include/library.h b/include/library.h index 0cee9bc5..f48b427f 100644 --- a/include/library.h +++ b/include/library.h @@ -108,6 +108,7 @@ namespace library struct Song { + unsigned int track_id; library :: Album *album; library :: AGInfo *artist; library :: AGInfo *genre; diff --git a/include/playlist.h b/include/playlist.h index eacbae95..c9fec9e7 100644 --- a/include/playlist.h +++ b/include/playlist.h @@ -4,6 +4,8 @@ #ifndef OCARINA_PLAYLIST_H #define OCARINA_PLAYLIST_H +#include + #include #include #include @@ -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 &get_tracks(const std::string &); + Playqueue *get_pq(); #ifdef CONFIG_TEST void clear(); diff --git a/lib/library.cpp b/lib/library.cpp index eb322041..103625a7 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -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]; diff --git a/lib/playlist.cpp b/lib/playlist.cpp index 78f819d4..5a1a8b57 100644 --- a/lib/playlist.cpp +++ b/lib/playlist.cpp @@ -7,10 +7,26 @@ static std::set empty_set; static Database playlist_db("playlist.db"); +static Playqueue playlist_pq(PQ_ENABLED); +static std::string cur_pq; void playlist :: init() { + std::set ids; + std::set::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 ids = get_tracks(name); + std::set::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 &playlist :: get_tracks(const std::string &name) { if ((name == "Banned") || (name == "Favorites")) { @@ -43,6 +76,11 @@ const std::set &playlist :: get_tracks(const std::string &name) throw -E_EXIST; } +Playqueue *playlist :: get_pq() +{ + return &playlist_pq; +} + #ifdef CONFIG_TEST void playlist :: clear() {