diff --git a/core/playlist.c b/core/playlist.c index 9928f620..240a6673 100644 --- a/core/playlist.c +++ b/core/playlist.c @@ -59,56 +59,76 @@ static void __playlist_fill_dynamic(enum playlist_t plist) } } -static void __pl_system_save_queue(const gchar *name) +static void __pl_system_load_queue() { - struct queue *queue = __playlist_lookup(name); + struct queue *queue; + unsigned int valid; + gchar *name; - if (!queue) + file_readf(&playlist_f, "%u ", &valid); + if (!valid) return; - file_writef(&playlist_f, "1 %s\n", name); + name = file_readl(&playlist_f); + queue = __playlist_alloc(name); + queue_load_tracks(queue, &playlist_f); +} + +static void __pl_system_save_queue(gpointer key, gpointer value, + gpointer data) +{ + struct queue *queue = (struct queue *)value; + + file_writef(&playlist_f, "1 %s\n", (gchar *)key); queue_save_tracks(queue, &playlist_f); file_writef(&playlist_f, "\n"); } static void __pl_system_save() { - 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++) - __pl_system_save_queue(playlist_names[i]); - + g_hash_table_foreach(playlist_db, __pl_system_save_queue, NULL); file_close(&playlist_f); } -static bool __playlist_init_idle() +static bool __pl_system_init_idle() { - unsigned int i, n, valid; - struct queue *queue; - gchar *name; + unsigned int i, n; if (!file_open(&playlist_f, OPEN_READ)) return true; file_readf(&playlist_f, "%u\n", &n); - for (i = 0; i < n; i++) { - file_readf(&playlist_f, "%u ", &valid); - if (!valid) - continue; - - name = file_readl(&playlist_f); - queue = __playlist_alloc(name); - queue_load_tracks(queue, &playlist_f); - } + for (i = 0; i < n; i++) + __pl_system_load_queue(); file_close(&playlist_f); return true; } +static void __pl_system_init() +{ + playlist_db = g_hash_table_new(g_str_hash, g_str_equal); + idle_schedule(IDLE_SYNC, __pl_system_init_idle, NULL); +} + +static int __pl_system_deinit_queue(gpointer key, gpointer value, gpointer data) +{ + struct queue *queue = (struct queue *)value; + queue_deinit(queue); + g_free(queue); + return true; +} + +static void __pl_system_deinit() +{ + g_hash_table_foreach_remove(playlist_db, __pl_system_deinit_queue, NULL); + g_hash_table_destroy(playlist_db); +} + static bool __pl_system_add(const gchar *name, struct track *track) { struct queue *queue = __playlist_alloc(name); @@ -144,24 +164,13 @@ 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_ops = ops; - idle_schedule(IDLE_SYNC, __playlist_init_idle, NULL); + __pl_system_init(); } void playlist_deinit() { - struct queue *queue; - unsigned int i; - - for (i = 0; i < 2; i++) { - queue = __playlist_lookup(playlist_names[i]); - if (queue) - queue_deinit(queue); - g_free(queue); - } - - g_hash_table_destroy(playlist_db); + __pl_system_deinit(); queue_deinit(&playlist_q); }