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:
parent
d7725d9068
commit
83897633ce
|
@ -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));
|
||||
|
|
|
@ -16,6 +16,8 @@ enum PlaylistFlags {
|
|||
PL_FILTER = (1 << 3),
|
||||
};
|
||||
|
||||
static const unsigned int PL_QUEUE = PL_DRAIN | PL_SEQUENTIAL;
|
||||
|
||||
namespace libsaria
|
||||
{
|
||||
|
||||
|
|
|
@ -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 */
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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 *);
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue