core/playlist: Split out system playlist load and save functions

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2016-04-24 09:25:56 -04:00 committed by Anna Schumaker
parent 8026207037
commit 140abe79bc
1 changed files with 44 additions and 35 deletions

View File

@ -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; 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); queue_save_tracks(queue, &playlist_f);
file_writef(&playlist_f, "\n"); file_writef(&playlist_f, "\n");
} }
static void __pl_system_save() static void __pl_system_save()
{ {
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++) g_hash_table_foreach(playlist_db, __pl_system_save_queue, NULL);
__pl_system_save_queue(playlist_names[i]);
file_close(&playlist_f); file_close(&playlist_f);
} }
static bool __playlist_init_idle() static bool __pl_system_init_idle()
{ {
unsigned int i, n, valid; unsigned int i, n;
struct queue *queue;
gchar *name;
if (!file_open(&playlist_f, OPEN_READ)) if (!file_open(&playlist_f, OPEN_READ))
return true; return true;
file_readf(&playlist_f, "%u\n", &n); file_readf(&playlist_f, "%u\n", &n);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++)
file_readf(&playlist_f, "%u ", &valid); __pl_system_load_queue();
if (!valid)
continue;
name = file_readl(&playlist_f);
queue = __playlist_alloc(name);
queue_load_tracks(queue, &playlist_f);
}
file_close(&playlist_f); file_close(&playlist_f);
return true; 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) static bool __pl_system_add(const gchar *name, struct track *track)
{ {
struct queue *queue = __playlist_alloc(name); 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_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_ops = ops; playlist_ops = ops;
idle_schedule(IDLE_SYNC, __playlist_init_idle, NULL); __pl_system_init();
} }
void playlist_deinit() void playlist_deinit()
{ {
struct queue *queue; __pl_system_deinit();
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);
queue_deinit(&playlist_q); queue_deinit(&playlist_q);
} }