core/playlist: Store a struct queue in the playlist_db

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2016-04-22 14:17:17 -04:00 committed by Anna Schumaker
parent 90fc9bff0a
commit e5dc36ca6e
1 changed files with 41 additions and 37 deletions

View File

@ -11,22 +11,23 @@ static struct file playlist_f = FILE_INIT("playlist.db", 0, 0);
static struct queue playlist_q; static struct queue playlist_q;
static enum playlist_t playlist_cur; static enum playlist_t playlist_cur;
static const gchar *playlist_names[2] = { "Favorites", "Banned" }; static const gchar *playlist_names[2] = { "Favorites", "Banned" };
static struct queue_ops *playlist_ops;
static inline struct set *__playlist_lookup(const gchar *name) static inline struct queue *__playlist_lookup(const gchar *name)
{ {
return g_hash_table_lookup(playlist_db, name); return g_hash_table_lookup(playlist_db, name);
} }
static inline struct set *__playlist_alloc(const gchar *name) static inline struct queue *__playlist_alloc(const gchar *name)
{ {
struct set *set = __playlist_lookup(name); struct queue *queue = __playlist_lookup(name);
if (!set) { if (!queue) {
set = g_malloc(sizeof(struct set)); queue = g_malloc(sizeof(struct queue));
set_init(set); queue_init(queue, Q_ENABLED | Q_REPEAT, playlist_ops);
g_hash_table_insert(playlist_db, (gpointer)name, set); g_hash_table_insert(playlist_db, (gpointer)name, queue);
} }
return set; return queue;
} }
static inline bool __playlist_is_static(enum playlist_t plist) static inline bool __playlist_is_static(enum playlist_t plist)
@ -41,12 +42,12 @@ static inline bool __playlist_is_dynamic(enum playlist_t plist)
static void __playlist_fill_static(enum playlist_t plist) static void __playlist_fill_static(enum playlist_t plist)
{ {
struct set *set = __playlist_lookup(playlist_names[plist]); struct queue *queue = __playlist_lookup(playlist_names[plist]);
struct set_iter it; struct queue_iter it;
if (set) { if (queue) {
set_for_each(set, &it) queue_for_each(queue, &it)
queue_add(&playlist_q, track_get(it.it_val)); queue_add(&playlist_q, queue_iter_val(&it));
} }
} }
@ -71,20 +72,19 @@ static void __playlist_fill_dynamic(enum playlist_t plist)
static void __playlist_save() static void __playlist_save()
{ {
struct set *set; struct queue *queue;
unsigned int i; unsigned int i;
if (!file_open(&playlist_f, OPEN_WRITE)) if (!file_open(&playlist_f, OPEN_WRITE))
return; return;
file_writef(&playlist_f, "%u\n", g_hash_table_size(playlist_db)); file_writef(&playlist_f, "%u\n", g_hash_table_size(playlist_db));
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
set = __playlist_lookup(playlist_names[i]); queue = __playlist_lookup(playlist_names[i]);
if (!set) if (!queue)
continue; continue;
file_writef(&playlist_f, "1 %s\n", playlist_names[i]); file_writef(&playlist_f, "1 %s\n", playlist_names[i]);
set_write(&playlist_f, set); queue_save_tracks(queue, &playlist_f);
file_writef(&playlist_f, "\n"); file_writef(&playlist_f, "\n");
} }
@ -94,7 +94,7 @@ static void __playlist_save()
static bool __playlist_init_idle() static bool __playlist_init_idle()
{ {
unsigned int i, n, valid; unsigned int i, n, valid;
struct set *set; struct queue *queue;
gchar *name; gchar *name;
if (!file_open(&playlist_f, OPEN_READ)) if (!file_open(&playlist_f, OPEN_READ))
@ -105,9 +105,10 @@ static bool __playlist_init_idle()
file_readf(&playlist_f, "%u ", &valid); file_readf(&playlist_f, "%u ", &valid);
if (!valid) if (!valid)
continue; continue;
name = file_readl(&playlist_f);
set = __playlist_alloc(name); name = file_readl(&playlist_f);
set_read(&playlist_f, set); queue = __playlist_alloc(name);
queue_load_tracks(queue, &playlist_f);
} }
file_close(&playlist_f); file_close(&playlist_f);
@ -123,19 +124,21 @@ void playlist_init(struct queue_ops *ops)
queue_sort(&playlist_q, COMPARE_TRACK, false); queue_sort(&playlist_q, COMPARE_TRACK, false);
queue_set_flag(&playlist_q, Q_NO_SORT); queue_set_flag(&playlist_q, Q_NO_SORT);
playlist_db = g_hash_table_new(g_str_hash, g_str_equal); playlist_db = g_hash_table_new(g_str_hash, g_str_equal);
playlist_ops = ops;
idle_schedule(IDLE_SYNC, __playlist_init_idle, NULL); idle_schedule(IDLE_SYNC, __playlist_init_idle, NULL);
} }
void playlist_deinit() void playlist_deinit()
{ {
struct set *set; struct queue *queue;
unsigned int i; unsigned int i;
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
set = __playlist_lookup(playlist_names[i]); queue = __playlist_lookup(playlist_names[i]);
if (set) if (queue)
set_deinit(set); queue_deinit(queue);
g_free(queue);
} }
g_hash_table_destroy(playlist_db); g_hash_table_destroy(playlist_db);
@ -144,13 +147,14 @@ void playlist_deinit()
bool playlist_add(enum playlist_t plist, struct track *track) bool playlist_add(enum playlist_t plist, struct track *track)
{ {
struct set *set; struct queue *queue;
if (!track || __playlist_is_dynamic(plist)) if (!track || __playlist_is_dynamic(plist))
return false; return false;
set = __playlist_alloc(playlist_names[plist]); queue = __playlist_alloc(playlist_names[plist]);
if (!set_insert(set, track->tr_dbe.dbe_index)) if (queue_has(queue, track))
return false; return false;
queue_add(queue, track);
__playlist_save(); __playlist_save();
if (playlist_cur == plist) if (playlist_cur == plist)
queue_add(&playlist_q, track); queue_add(&playlist_q, track);
@ -159,14 +163,14 @@ bool playlist_add(enum playlist_t plist, struct track *track)
bool playlist_remove(enum playlist_t plist, struct track *track) bool playlist_remove(enum playlist_t plist, struct track *track)
{ {
struct set *set; struct queue *queue;
if (!track || __playlist_is_dynamic(plist)) if (!track || __playlist_is_dynamic(plist))
return false; return false;
set = __playlist_lookup(playlist_names[plist]); queue = __playlist_lookup(playlist_names[plist]);
if (!set) if (!queue)
return true; return true;
if (!set_remove(set, track->tr_dbe.dbe_index)) if (!queue_remove_all(queue, track))
return false; return false;
__playlist_save(); __playlist_save();
if (playlist_cur == plist) if (playlist_cur == plist)
@ -176,11 +180,11 @@ bool playlist_remove(enum playlist_t plist, struct track *track)
bool playlist_has(enum playlist_t plist, struct track *track) bool playlist_has(enum playlist_t plist, struct track *track)
{ {
struct set *set = __playlist_lookup(playlist_names[plist]); struct queue *queue = __playlist_lookup(playlist_names[plist]);
if (!set || !track) if (!queue || !track)
return false; return false;
return set_has(set, track->tr_dbe.dbe_index); return queue_has(queue, track);
} }
void playlist_select(enum playlist_t plist) void playlist_select(enum playlist_t plist)