diff --git a/core/playlist.c b/core/playlist.c index f7b5d433..ce6f1be6 100644 --- a/core/playlist.c +++ b/core/playlist.c @@ -11,22 +11,23 @@ static struct file playlist_f = FILE_INIT("playlist.db", 0, 0); static struct queue playlist_q; static enum playlist_t playlist_cur; 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); } -static inline struct set *__playlist_alloc(const gchar *name) +static inline struct queue *__playlist_alloc(const gchar *name) { - struct set *set = __playlist_lookup(name); - if (!set) { - set = g_malloc(sizeof(struct set)); - set_init(set); - g_hash_table_insert(playlist_db, (gpointer)name, set); + struct queue *queue = __playlist_lookup(name); + if (!queue) { + queue = g_malloc(sizeof(struct queue)); + queue_init(queue, Q_ENABLED | Q_REPEAT, playlist_ops); + g_hash_table_insert(playlist_db, (gpointer)name, queue); } - return set; + return queue; } 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) { - struct set *set = __playlist_lookup(playlist_names[plist]); - struct set_iter it; + struct queue *queue = __playlist_lookup(playlist_names[plist]); + struct queue_iter it; - if (set) { - set_for_each(set, &it) - queue_add(&playlist_q, track_get(it.it_val)); + if (queue) { + queue_for_each(queue, &it) + 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() { - struct set *set; + struct queue *queue; unsigned int i; if (!file_open(&playlist_f, OPEN_WRITE)) return; file_writef(&playlist_f, "%u\n", g_hash_table_size(playlist_db)); - for (i = 0; i < 2; i++) { - set = __playlist_lookup(playlist_names[i]); - if (!set) + queue = __playlist_lookup(playlist_names[i]); + if (!queue) continue; 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"); } @@ -94,7 +94,7 @@ static void __playlist_save() static bool __playlist_init_idle() { unsigned int i, n, valid; - struct set *set; + struct queue *queue; gchar *name; if (!file_open(&playlist_f, OPEN_READ)) @@ -105,9 +105,10 @@ static bool __playlist_init_idle() file_readf(&playlist_f, "%u ", &valid); if (!valid) continue; - name = file_readl(&playlist_f); - set = __playlist_alloc(name); - set_read(&playlist_f, set); + + name = file_readl(&playlist_f); + queue = __playlist_alloc(name); + queue_load_tracks(queue, &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_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); } void playlist_deinit() { - struct set *set; + struct queue *queue; unsigned int i; for (i = 0; i < 2; i++) { - set = __playlist_lookup(playlist_names[i]); - if (set) - set_deinit(set); + queue = __playlist_lookup(playlist_names[i]); + if (queue) + queue_deinit(queue); + g_free(queue); } g_hash_table_destroy(playlist_db); @@ -144,13 +147,14 @@ void playlist_deinit() bool playlist_add(enum playlist_t plist, struct track *track) { - struct set *set; + struct queue *queue; if (!track || __playlist_is_dynamic(plist)) return false; - set = __playlist_alloc(playlist_names[plist]); - if (!set_insert(set, track->tr_dbe.dbe_index)) + queue = __playlist_alloc(playlist_names[plist]); + if (queue_has(queue, track)) return false; + queue_add(queue, track); __playlist_save(); if (playlist_cur == plist) 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) { - struct set *set; + struct queue *queue; if (!track || __playlist_is_dynamic(plist)) return false; - set = __playlist_lookup(playlist_names[plist]); - if (!set) + queue = __playlist_lookup(playlist_names[plist]); + if (!queue) return true; - if (!set_remove(set, track->tr_dbe.dbe_index)) + if (!queue_remove_all(queue, track)) return false; __playlist_save(); 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) { - 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 set_has(set, track->tr_dbe.dbe_index); + return queue_has(queue, track); } void playlist_select(enum playlist_t plist)