libsaria: Track recent songs using a playlist

This way people can see what has played recently and directly select
from a list.  Generic playlist classes are awesome!

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-03-25 10:06:37 -04:00
parent e5b91a5de9
commit 3b3beb4625
7 changed files with 83 additions and 14 deletions

View File

@ -46,6 +46,7 @@ namespace libsaria
Track *pick_sequential();
void add_sorted(list<Track *> &);
void add_to_end(list<Track *> &);
void add_to_front(list<Track *> &);
public:
Playlist(string, unsigned int);
@ -54,6 +55,7 @@ namespace libsaria
bool is_static();
void prepare_for_removal();
void reset_iterator();
virtual Track *next() = 0;
string &get_name();
@ -82,6 +84,15 @@ namespace libsaria
void add_tracks(list<Track *> &);
};
class List : public Playlist {
public:
List(string, unsigned int);
~List();
Track *next();
void add_tracks(list<Track *> &);
};
}; /* Namespace: libsaria */
#endif /* LIBSARIA_PLAYLIST_H */

View File

@ -14,6 +14,9 @@ namespace libsaria
void push(Playlist *);
void next();
void prev();
void init();
Playlist *get_recent_plist();
};
@ -21,10 +24,6 @@ namespace libsaria
void set_on_new_playlist(void (*)(Playlist *));
void create_new_playlist(list<Track *> &, PlaylistType);
Playlist *stack_top();
void stack_top_pop();
void stack_init();
}; /* Namespace: libsaria */
#endif /* LIBSARIA_PLAYLIST_STACK_H */

View File

@ -8,6 +8,7 @@
#include <libsaria/print.h>
#include <libsaria/audio.h>
#include <libsaria/track.h>
#include <libsaria/stack.h>
#include <libsaria/idle.h>
#include <libsaria/fs.h>
/*#include <libsaria/audio.h>
@ -41,6 +42,7 @@ namespace libsaria
/*println("saria dir: %s", get_saria_dir().c_str());
make_saria_dir();*/
libsaria::stack::init();
libsaria::library::init();
/*libsaria::stack_init();*/
}

View File

@ -60,4 +60,18 @@ namespace libsaria
RENDER(insert_done());
}
void Playlist::add_to_front(list<Track *> &tracks)
{
list<Track *>::iterator it;
RENDER(insert_prepare());
tracks.reverse();
for (it = tracks.begin(); it != tracks.end(); it++) {
plist.push_front(*it);
RENDER( insert(*it, 0) );
}
RENDER(insert_done());
}
}; /* namespace: libsaria */

View File

@ -0,0 +1,25 @@
// Copyright (c) 2012 Bryan Schumaker.
#include <libsaria/playlist.h>
namespace libsaria
{
List::List(string name, unsigned int flags) : Playlist(name, flags)
{
}
List::~List()
{
}
void List::add_tracks(list<Track *> &tracks)
{
add_to_front(tracks);
}
Track *List::next()
{
return pick_sequential();
}
}; /* Namespace: libsaria */

View File

@ -54,4 +54,9 @@ namespace libsaria
renderer = r;
}
void Playlist::reset_iterator()
{
cur = plist.begin();
}
}

View File

@ -12,6 +12,7 @@ static unsigned int next_playlist = 0;
static void (*on_new_playlist)(libsaria::Playlist *) = NULL;
static list<libsaria::Playlist *> playlist_stack;
static libsaria::List recent_plist("Recent", PL_STATIC | PL_NO_DRAIN);
static string get_next_name()
{
@ -20,6 +21,14 @@ static string get_next_name()
return s.str();
}
static void list_recent_track(libsaria::Track *track)
{
list<libsaria::Track *> tracks;
tracks.push_back(track);
recent_plist.add_tracks(tracks);
recent_plist.reset_iterator();
}
namespace libsaria
{
@ -32,8 +41,10 @@ namespace libsaria
{
Playlist *plist = playlist_stack.front();
Track *track = plist->next();
if (track)
if (track) {
track->play_now();
list_recent_track(track);
}
if ((plist->get_size() == 0) && (plist->is_static() == false)) {
println("Removing non-static playlist");
@ -43,6 +54,13 @@ namespace libsaria
};
}
void stack::prev()
{
Track *track = recent_plist.next();
if (track)
track->play_now();
}
void set_on_new_playlist(void (*func)(Playlist *))
{
on_new_playlist = func;
@ -68,19 +86,14 @@ namespace libsaria
next_playlist++;
}
Playlist *stack_top()
void stack::init()
{
return playlist_stack.front();
push(&recent_plist);
}
void stack_top_pop()
Playlist *stack::get_recent_plist()
{
//Playlist *plist = playlist_stack.front();
/*if (plist->size() == 0) {
plist->delete_renderer();
delete plist;
playlist_stack.pop_front();
}*/
return &recent_plist;
}
}; /* Namespace: libsaria */