From 2a8288e1b3cd95f6759e96e38091a3ad2da3cf01 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Tue, 13 Sep 2016 12:59:32 -0400 Subject: [PATCH] core/playlists/system: Cleanup system playlist updating Signed-off-by: Anna Schumaker --- core/playlists/generic.c | 35 ------------ core/playlists/system.c | 99 +++++++++++++++------------------ include/core/playlists/system.h | 2 - include/core/playlists/type.h | 4 -- 4 files changed, 46 insertions(+), 94 deletions(-) diff --git a/core/playlists/generic.c b/core/playlists/generic.c index 2e7426d9..b59c3741 100644 --- a/core/playlists/generic.c +++ b/core/playlists/generic.c @@ -50,41 +50,6 @@ bool playlist_generic_remove_track(struct playlist *playlist, struct track *trac return queue_remove_all(&playlist->pl_queue, track); } -struct pl_update_data { - struct playlist *pud_playlist; - bool (*pud_func)(struct playlist *, struct track *); -}; - -static bool __playlist_generic_update(void *data) -{ - struct pl_update_data *pud = data; - struct db_entry *dbe, *next; - - db_for_each(dbe, next, track_db_get()) { - if (!pud->pud_func(pud->pud_playlist, TRACK(dbe))) - playlist_generic_remove_track(pud->pud_playlist, TRACK(dbe)); - } - - queue_resort(&pud->pud_playlist->pl_queue); - g_free(pud); - return true; -} - -void playlist_generic_update(struct playlist *playlist, - bool (*func)(struct playlist *, struct track *)) -{ - struct pl_update_data *data; - - if (!func) - return; - - data = g_malloc(sizeof(struct pl_update_data)); - data->pud_playlist = playlist; - data->pud_func = func; - - idle_schedule(IDLE_SYNC, __playlist_generic_update, data); -} - void playlist_generic_set_flag(struct playlist *playlist, enum queue_flags flag, bool enabled) { diff --git a/core/playlists/system.c b/core/playlists/system.c index 5bb962aa..b2c09afa 100644 --- a/core/playlists/system.c +++ b/core/playlists/system.c @@ -7,7 +7,6 @@ static struct playlist *pl_system_lookup(const gchar *); static struct playlist *pl_system_get(unsigned int); -static void pl_system_update(const gchar *); static void pl_system_save(); static struct file sys_file = FILE_INIT("playlist.db", 0); @@ -26,14 +25,51 @@ static bool sys_pl_delete_clear(struct playlist *playlist) return false; } -static bool sys_pl_generic_add_front(struct playlist *playlist, - struct track *track) +static bool sys_pl_update_check(struct playlist *playlist, struct track *track) { - if (queue_has(&pl_system_get(SYS_PL_HIDDEN)->pl_queue, track)) - return false; - return playlist_generic_add_track_front(playlist, track); + switch (playlist->pl_id) { + case SYS_PL_UNPLAYED: + return track->tr_count == 0; + case SYS_PL_LEAST_PLAYED: + return track->tr_count <= track_db_average_plays() && + track->tr_count > 0; + case SYS_PL_MOST_PLAYED: + return track->tr_count > track_db_average_plays(); + } + return true; } +static bool sys_pl_update_func(void *data) +{ + struct playlist *playlist = (struct playlist *)data; + struct db_entry *dbe, *next; + + db_for_each(dbe, next, track_db_get()) { + struct track *track = TRACK(dbe); + + if (sys_pl_update_check(playlist, track) && + !queue_has(&pl_system_get(SYS_PL_HIDDEN)->pl_queue, track)) + playlist_generic_add_track_front(playlist, track); + else + playlist_generic_remove_track(playlist, track); + } + + queue_resort(&playlist->pl_queue); + return true; +} + +static void sys_pl_update(struct playlist *playlist) +{ + switch (playlist->pl_id) { + case SYS_PL_COLLECTION: + case SYS_PL_UNPLAYED: + case SYS_PL_LEAST_PLAYED: + case SYS_PL_MOST_PLAYED: + idle_schedule(IDLE_SYNC, sys_pl_update_func, playlist); + default: + break; + } +} /* @@ -178,12 +214,6 @@ static bool sys_pl_collection_load() return true; } -static bool sys_pl_collection_update(struct playlist *playlist, - struct track *track) -{ - return sys_pl_generic_add_front(playlist, track) || true; -} - static struct playlist_ops collection_ops = { .pl_can_select = playlist_generic_can_select, .pl_next = playlist_generic_next, @@ -195,7 +225,6 @@ static struct playlist_ops collection_ops = { static struct sys_playlist sys_collection = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "Collection", SYS_PL_COLLECTION, &collection_ops), - .spl_update = sys_pl_collection_update, }; @@ -223,14 +252,6 @@ static struct sys_playlist sys_history = { /* * Unplayed tracks playlist operations. */ -static bool sys_pl_unplayed_update(struct playlist *playlist, - struct track *track) -{ - if (track->tr_count > 0) - return false; - return sys_pl_generic_add_front(playlist, track) || true; -} - static struct playlist_ops unplayed_ops = { .pl_can_select = playlist_generic_can_select, .pl_next = playlist_generic_next, @@ -241,22 +262,12 @@ static struct playlist_ops unplayed_ops = { static struct sys_playlist sys_unplayed = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "Unplayed", SYS_PL_UNPLAYED, &unplayed_ops), - .spl_update = sys_pl_unplayed_update, }; /* * Most played tracks playlist operations. */ -static bool sys_pl_most_played_update(struct playlist *playlist, - struct track *track) -{ - unsigned int average = track_db_average_plays(); - if (track->tr_count <= average) - return false; - return sys_pl_generic_add_front(playlist, track) || true; -} - static struct playlist_ops most_played_ops = { .pl_can_select = playlist_generic_can_select, .pl_next = playlist_generic_next, @@ -267,22 +278,12 @@ static struct playlist_ops most_played_ops = { static struct sys_playlist sys_most_played = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "Most Played", SYS_PL_MOST_PLAYED, &most_played_ops), - .spl_update = sys_pl_most_played_update, }; /* * Least played tracks playlist operations. */ -static bool sys_pl_least_played_update(struct playlist *playlist, - struct track *track) -{ - unsigned int average = track_db_average_plays(); - if (!track->tr_count || track->tr_count > average) - return false; - return sys_pl_generic_add_front(playlist, track) || true; -} - static struct playlist_ops least_played_ops = { .pl_can_select = playlist_generic_can_select, .pl_next = playlist_generic_next, @@ -293,7 +294,6 @@ static struct playlist_ops least_played_ops = { static struct sys_playlist sys_least_played = { .spl_playlist = DEFINE_PLAYLIST(PL_SYSTEM, "Least Played", SYS_PL_LEAST_PLAYED, &least_played_ops), - .spl_update = sys_pl_least_played_update, }; @@ -434,16 +434,9 @@ static void pl_system_played(struct track *track) for (i = 0; i < SYS_PL_NUM_PLAYLISTS; i++) queue_updated(&pl_system_get(i)->pl_queue, track); - pl_system_update("Unplayed"); - pl_system_update("Most Played"); - pl_system_update("Least Played"); -} - -static void pl_system_update(const gchar *name) -{ - struct sys_playlist *sys_pl = __sys_pl_lookup(name); - if (sys_pl) - playlist_generic_update(&sys_pl->spl_playlist, sys_pl->spl_update); + sys_pl_update(pl_system_lookup("Unplayed")); + sys_pl_update(pl_system_lookup("Most Played")); + sys_pl_update(pl_system_lookup("Least Played")); } @@ -474,7 +467,7 @@ void pl_system_init(struct queue_ops *ops) case SYS_PL_UNPLAYED: case SYS_PL_MOST_PLAYED: case SYS_PL_LEAST_PLAYED: - pl_system_update(playlist->pl_name); + sys_pl_update(playlist); case SYS_PL_FAVORITES: case SYS_PL_HIDDEN: playlist_generic_init(playlist, 0, ops); diff --git a/include/core/playlists/system.h b/include/core/playlists/system.h index d1c4c72a..ed396199 100644 --- a/include/core/playlists/system.h +++ b/include/core/playlists/system.h @@ -20,8 +20,6 @@ enum sys_playlist_t { struct sys_playlist { struct playlist spl_playlist; - - bool (*spl_update)(struct playlist *, struct track *); }; diff --git a/include/core/playlists/type.h b/include/core/playlists/type.h index 368ea4d4..dd2a8304 100644 --- a/include/core/playlists/type.h +++ b/include/core/playlists/type.h @@ -95,10 +95,6 @@ bool playlist_generic_add_track_front(struct playlist *, struct track *); /* Generic playlist remove track operation. */ bool playlist_generic_remove_track(struct playlist *, struct track *); -/* Generic playlist update operation. */ -void playlist_generic_update(struct playlist *, - bool (*)(struct playlist *, struct track *)); - /* Generic playlist set_flag operation. */ void playlist_generic_set_flag(struct playlist *, enum queue_flags, bool);