Dynamically allocate queue playlists

I only allow one queue instance right now, but this allows me to remove
the queue directory since it is no longer needed.  I also removed the
QUEUE_REFRESH callback since all this is handled through the libsaria
playlist code.  All that's left is reloading saved playlists on startup.

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-03-03 14:19:33 -05:00
parent d7725d9068
commit 83897633ce
12 changed files with 63 additions and 110 deletions

View File

@ -8,8 +8,8 @@ enum callback_t {
TRACK_LOADED,
IDLE_TASK_QUEUED,
LIBRARY_REFRESH,
QUEUE_REFRESH,
REFILTER,
NEW_PLAYLIST,
};
void set_cb_handler(void (*)(callback_t));

View File

@ -16,6 +16,8 @@ enum PlaylistFlags {
PL_FILTER = (1 << 3),
};
static const unsigned int PL_QUEUE = PL_DRAIN | PL_SEQUENTIAL;
namespace libsaria
{

View File

@ -1,31 +0,0 @@
#ifndef LIBSARIA_QUEUE_H
#define LIBSARIA_QUEUE_H
#include <libsaria/playlist.h>
#include <libsaria/track.h>
#include <list>
using namespace std;
namespace libsaria
{
namespace queue
{
namespace iter
{
void reset();
libsaria::Track *next();
bool end();
}
void add_ids(list<sid_t> &);
unsigned int size();
string next_file();
void save();
void load();
Playlist *get_playlist();
}
}
#endif /* LIBSARIA_QUEUE_H */

View File

@ -3,10 +3,17 @@
#include <libsaria/playlist.h>
#include <list>
using namespace std;
namespace libsaria
{
void stack_playlist(Playlist *);
Playlist *new_playlist(string, unsigned int);
void add_to_playlist(list<sid_t> &);
Playlist *stack_top();
string next_file();
}; /* Namespace: libsaria */

View File

@ -1,6 +1,8 @@
#ifndef OCARINA_QUEUE_H
#define OCARINA_QUEUE_H
#include <libsaria/playlist.h>
namespace ocarina
{
namespace queue
@ -8,6 +10,7 @@ namespace ocarina
void init();
void refresh();
void new_playlist(libsaria::Playlist *);
}
};

View File

@ -3,7 +3,7 @@
#include <libsaria/controls.h>
#include <libsaria/track.h>
#include <libsaria/library.h>
#include <libsaria/queue.h>
#include <libsaria/stack.h>
static bool pause_after_current = false;
@ -24,14 +24,6 @@ namespace libsaria
}
string next_file()
{
if (queue::size() > 0)
return queue::next_file();
else
return library::next_file();
}
void next()
{
string filepath = next_file();

View File

@ -6,7 +6,6 @@
#include <libsaria/path.h>
#include <libsaria/prefs.h>
#include <libsaria/print.h>
#include <libsaria/queue.h>
#include <libsaria/library.h>
#include <libsaria/format.h>
#include <libsaria/index.h>
@ -23,7 +22,6 @@ namespace libsaria
println("saria dir: %s", get_saria_dir().c_str());
make_saria_dir();
libsaria::library::init();
libsaria::queue::load();
}
void quit()

View File

@ -1,5 +1,6 @@
// Copyright (c) 2012 Bryan Schumaker.
#include <libsaria/playlist.h>
#include <libsaria/callback.h>
#include <list>
using namespace std;
@ -14,4 +15,39 @@ namespace libsaria
playlist_stack.push_front(plist);
}
Playlist *new_playlist(string file, unsigned int flags)
{
Playlist *plist = new Playlist(file, flags);
stack_playlist(plist);
return plist;
}
void add_to_playlist(list<sid_t> &ids)
{
Playlist *plist;
/* Only allow one queue and one library (for now) */
if (playlist_stack.size() == 1) {
plist = new_playlist("queue.q", PL_QUEUE);
plist->add_ids(ids);
trigger_callback(NEW_PLAYLIST);
} else {
plist = playlist_stack.front();
plist->add_ids(ids);
}
}
Playlist *stack_top()
{
return playlist_stack.front();
}
string next_file()
{
Playlist *plist = playlist_stack.front();
Track *track = plist->next();
if (plist->size() == 0)
playlist_stack.pop_front();
return track->get_filepath();
}
}; /* Namespace: libsaria */

View File

@ -1,50 +0,0 @@
// Copyright (c) 2011 Bryan Schumaker.
#include <list>
using namespace std;
#include <libsaria/queue.h>
#include <libsaria/task.h>
#include <libsaria/library.h>
#include <libsaria/callback.h>
#include <libsaria/playlist.h>
static libsaria::Playlist q_queue("queue.q", PL_DRAIN | PL_SEQUENTIAL);
static void refresh()
{
trigger_callback(QUEUE_REFRESH);
}
namespace libsaria
{
void queue::add_ids(list<sid_t> &ids)
{
q_queue.add_ids(ids);
refresh();
}
unsigned int queue::size()
{
return q_queue.apparent_size();
}
string queue::next_file()
{
Track *track = q_queue.next();
return track->get_filepath();
}
void queue::load()
{
IOTask *task = new IOTask(refresh);
q_queue.reload();
task->queue();
}
Playlist *queue::get_playlist()
{
return &q_queue;
}
} /* Namespace: libsaria */

View File

@ -2,6 +2,7 @@
#include <libsaria/libsaria.h>
#include <libsaria/callback.h>
#include <libsaria/print.h>
#include <libsaria/stack.h>
#include <ocarina/ocarina.h>
#include <ocarina/button.h>
#include <ocarina/library.h>
@ -33,9 +34,6 @@ static void handle_callback(gpointer obj, callback_t type, gpointer data)
ocarina::library::refresh();
library_settings_refresh();
break;
case QUEUE_REFRESH:
ocarina::queue::refresh();
break;
case REFILTER:
ocarina::library::refilter();
break;
@ -44,6 +42,8 @@ static void handle_callback(gpointer obj, callback_t type, gpointer data)
change_footer(current);
ocarina::library::scroll_to(current);
break;
case NEW_PLAYLIST:
ocarina::queue::new_playlist(libsaria::stack_top());
default:
break;
}

View File

@ -6,8 +6,8 @@
#include <ocarina/shortcut.h>
#include <libsaria/library.h>
#include <libsaria/queue.h>
#include <libsaria/track.h>
#include <libsaria/stack.h>
#include <libsaria/print.h>
#include <list>
@ -21,7 +21,7 @@ static void add_to_queue()
{
list<sid_t> selected;
library_list.list_selected_ids(selected);
libsaria::queue::add_ids(selected);
libsaria::add_to_playlist(selected);
}
static void add_to_queue_event(GtkMenuItem *menu, gpointer data)

View File

@ -5,8 +5,6 @@
#include <ocarina/songlist.h>
#include <ocarina/shortcut.h>
#include <libsaria/queue.h>
#include <list>
using namespace std;
@ -27,24 +25,22 @@ static void rm_from_queue_event(GtkMenuItem *menu, gpointer data)
namespace ocarina
{
void queue::new_playlist(libsaria::Playlist *plist)
{
queue_list = new SongList();
queue_list->set_playlist(plist);
queue_list->init("Queue", &queue_menu, false);
queue_list->fill();
}
void queue::refresh()
{
if (libsaria::queue::size() > 0) {
if (!queue_list) {
queue_list = new SongList();
queue_list->set_playlist(libsaria::queue::get_playlist());
queue_list->init("Queue", &queue_menu, false);
}
queue_list->fill();
} else if (queue_list)
delete queue_list;
}
void queue::init()
{
queue_menu.push_back(MenuItem("Remove from Queue", rm_from_queue_event));
register_shortcut("Delete", rm_from_queue);
ocarina::queue::refresh();
}
};