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;
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);
}