From 019137e4ed20872b6ae8351a2be3a6a74cb44b09 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Fri, 10 Jun 2016 11:01:03 -0400 Subject: [PATCH] core/playlists/generic: Add a playlist_generic_update() function Signed-off-by: Anna Schumaker --- core/playlists/generic.c | 36 ++++++++++++++++ core/playlists/system.c | 76 ++++++++++++++++++--------------- include/core/playlists/system.h | 1 + include/core/playlists/type.h | 4 ++ 4 files changed, 82 insertions(+), 35 deletions(-) diff --git a/core/playlists/generic.c b/core/playlists/generic.c index fc68bcb4..a7b07078 100644 --- a/core/playlists/generic.c +++ b/core/playlists/generic.c @@ -1,6 +1,7 @@ /* * Copyright 2016 (c) Anna Schumaker. */ +#include #include @@ -43,6 +44,41 @@ 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_unset_flag(&pud->pud_playlist->pl_queue, Q_ADD_FRONT); + 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 30fbb1a4..1aef0bbe 100644 --- a/core/playlists/system.c +++ b/core/playlists/system.c @@ -86,6 +86,14 @@ static bool sys_pl_collection_add(struct playlist *playlist, struct track *track return sys_pl_generic_add(playlist, track); } +static bool sys_pl_collection_update(struct playlist *playlist, + struct track *track) +{ + if (track->tr_library->li_enabled != true) + return false; + return sys_pl_generic_add(playlist, track) || true; +} + static void sys_pl_collection_set_flag(struct playlist *playlist, enum queue_flags flag, bool enabled) { @@ -130,6 +138,14 @@ static bool sys_pl_unplayed_add(struct playlist *playlist, struct track *track) return sys_pl_generic_add(playlist, track); } +static bool sys_pl_unplayed_update(struct playlist *playlist, + struct track *track) +{ + if (track->tr_count > 0) + return false; + return sys_pl_generic_add(playlist, track) || true; +} + /* * Most played tracks playlist operations. @@ -142,6 +158,15 @@ static bool sys_pl_most_played_add(struct playlist *playlist, struct track *trac return sys_pl_generic_add(playlist, track); } +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(playlist, track) || true; +} + /* * Least played tracks playlist operations. @@ -154,6 +179,15 @@ static bool sys_pl_least_played_add(struct playlist *playlist, struct track *tra return sys_pl_generic_add(playlist, track); } +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(playlist, track) || true; +} + static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = { [SYS_PL_FAVORITES] = { @@ -177,6 +211,7 @@ static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = { .spl_init = sys_pl_generic_init, .spl_add = sys_pl_collection_add, .spl_remove = playlist_generic_remove_track, + .spl_update = sys_pl_collection_update, .spl_set_flag = sys_pl_collection_set_flag, .spl_sort = sys_pl_collection_sort, }, @@ -193,6 +228,7 @@ static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = { .spl_init = sys_pl_generic_init, .spl_add = sys_pl_unplayed_add, .spl_remove = playlist_generic_remove_track, + .spl_update = sys_pl_unplayed_update, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, }, @@ -201,6 +237,7 @@ static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = { .spl_init = sys_pl_generic_init, .spl_add = sys_pl_most_played_add, .spl_remove = playlist_generic_remove_track, + .spl_update = sys_pl_most_played_update, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, }, @@ -209,6 +246,7 @@ static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = { .spl_init = sys_pl_generic_init, .spl_add = sys_pl_least_played_add, .spl_remove = playlist_generic_remove_track, + .spl_update = sys_pl_least_played_update, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, }, @@ -309,36 +347,6 @@ static bool __sys_pl_load() return true; } -static bool __sys_pl_can_add(enum sys_playlist_t plist, struct track *track, - unsigned int average) -{ - if (plist == SYS_PL_COLLECTION) - return track->tr_library->li_enabled; - else if (track->tr_count == 0) - return plist == SYS_PL_UNPLAYED; - else if (track->tr_count <= average) - return plist == SYS_PL_LEAST_PLAYED; - /* track->tr_count > average */ - return plist == SYS_PL_MOST_PLAYED; -} - -static bool __sys_pl_update(enum sys_playlist_t plist) -{ - struct sys_playlist *sys_pl = &sys_playlists[plist]; - unsigned int average = track_db_average_plays(); - struct db_entry *dbe, *next; - - db_for_each(dbe, next, track_db_get()) { - if (__sys_pl_can_add(plist, TRACK(dbe), average)) - sys_pl->spl_add(&sys_pl->spl_playlist, TRACK(dbe)); - else - sys_pl->spl_remove(&sys_pl->spl_playlist, TRACK(dbe)); - } - - queue_unset_flag(__sys_pl_queue(plist), Q_ADD_FRONT); - return true; -} - static struct queue *pl_system_get_queue(const gchar *name) { @@ -365,11 +373,9 @@ static bool pl_system_remove_track(const gchar *name, struct track *track) static void pl_system_update(const gchar *name) { - enum sys_playlist_t plist = __sys_pl_convert(name); - if (plist != SYS_PL_FAVORITES && plist != SYS_PL_HIDDEN && - plist != SYS_PL_HISTORY) - idle_schedule(IDLE_SYNC, IDLE_FUNC(__sys_pl_update), - GUINT_TO_POINTER(plist)); + struct sys_playlist *sys_pl = __sys_pl_lookup(name); + if (sys_pl) + playlist_generic_update(&sys_pl->spl_playlist, sys_pl->spl_update); } static void pl_system_set_flag(const gchar *name, enum queue_flags flag, diff --git a/include/core/playlists/system.h b/include/core/playlists/system.h index fd9d168b..e948e605 100644 --- a/include/core/playlists/system.h +++ b/include/core/playlists/system.h @@ -23,6 +23,7 @@ struct sys_playlist { void (*spl_init)(struct playlist *, unsigned int, struct queue_ops *); bool (*spl_add)(struct playlist *, struct track *); bool (*spl_remove)(struct playlist *, struct track *); + bool (*spl_update)(struct playlist *, struct track *); void (*spl_set_flag)(struct playlist *, enum queue_flags, bool); void (*spl_sort)(struct playlist *, enum compare_t, bool); }; diff --git a/include/core/playlists/type.h b/include/core/playlists/type.h index e7868d92..2881a450 100644 --- a/include/core/playlists/type.h +++ b/include/core/playlists/type.h @@ -70,6 +70,10 @@ bool playlist_generic_add_track(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);