core/playlists/generic: Add a playlist_generic_update() function
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
parent
dddb098354
commit
019137e4ed
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016 (c) Anna Schumaker.
|
* Copyright 2016 (c) Anna Schumaker.
|
||||||
*/
|
*/
|
||||||
|
#include <core/idle.h>
|
||||||
#include <core/playlists/type.h>
|
#include <core/playlists/type.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,6 +44,41 @@ bool playlist_generic_remove_track(struct playlist *playlist, struct track *trac
|
||||||
return queue_remove_all(&playlist->pl_queue, track);
|
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,
|
void playlist_generic_set_flag(struct playlist *playlist,
|
||||||
enum queue_flags flag, bool enabled)
|
enum queue_flags flag, bool enabled)
|
||||||
{
|
{
|
||||||
|
|
|
@ -86,6 +86,14 @@ static bool sys_pl_collection_add(struct playlist *playlist, struct track *track
|
||||||
return sys_pl_generic_add(playlist, 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,
|
static void sys_pl_collection_set_flag(struct playlist *playlist,
|
||||||
enum queue_flags flag, bool enabled)
|
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);
|
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.
|
* 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);
|
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.
|
* 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);
|
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] = {
|
static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = {
|
||||||
[SYS_PL_FAVORITES] = {
|
[SYS_PL_FAVORITES] = {
|
||||||
|
@ -177,6 +211,7 @@ static struct sys_playlist sys_playlists[SYS_PL_NUM_PLAYLISTS] = {
|
||||||
.spl_init = sys_pl_generic_init,
|
.spl_init = sys_pl_generic_init,
|
||||||
.spl_add = sys_pl_collection_add,
|
.spl_add = sys_pl_collection_add,
|
||||||
.spl_remove = playlist_generic_remove_track,
|
.spl_remove = playlist_generic_remove_track,
|
||||||
|
.spl_update = sys_pl_collection_update,
|
||||||
.spl_set_flag = sys_pl_collection_set_flag,
|
.spl_set_flag = sys_pl_collection_set_flag,
|
||||||
.spl_sort = sys_pl_collection_sort,
|
.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_init = sys_pl_generic_init,
|
||||||
.spl_add = sys_pl_unplayed_add,
|
.spl_add = sys_pl_unplayed_add,
|
||||||
.spl_remove = playlist_generic_remove_track,
|
.spl_remove = playlist_generic_remove_track,
|
||||||
|
.spl_update = sys_pl_unplayed_update,
|
||||||
.spl_set_flag = playlist_generic_set_flag,
|
.spl_set_flag = playlist_generic_set_flag,
|
||||||
.spl_sort = playlist_generic_sort,
|
.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_init = sys_pl_generic_init,
|
||||||
.spl_add = sys_pl_most_played_add,
|
.spl_add = sys_pl_most_played_add,
|
||||||
.spl_remove = playlist_generic_remove_track,
|
.spl_remove = playlist_generic_remove_track,
|
||||||
|
.spl_update = sys_pl_most_played_update,
|
||||||
.spl_set_flag = playlist_generic_set_flag,
|
.spl_set_flag = playlist_generic_set_flag,
|
||||||
.spl_sort = playlist_generic_sort,
|
.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_init = sys_pl_generic_init,
|
||||||
.spl_add = sys_pl_least_played_add,
|
.spl_add = sys_pl_least_played_add,
|
||||||
.spl_remove = playlist_generic_remove_track,
|
.spl_remove = playlist_generic_remove_track,
|
||||||
|
.spl_update = sys_pl_least_played_update,
|
||||||
.spl_set_flag = playlist_generic_set_flag,
|
.spl_set_flag = playlist_generic_set_flag,
|
||||||
.spl_sort = playlist_generic_sort,
|
.spl_sort = playlist_generic_sort,
|
||||||
},
|
},
|
||||||
|
@ -309,36 +347,6 @@ static bool __sys_pl_load()
|
||||||
return true;
|
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)
|
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)
|
static void pl_system_update(const gchar *name)
|
||||||
{
|
{
|
||||||
enum sys_playlist_t plist = __sys_pl_convert(name);
|
struct sys_playlist *sys_pl = __sys_pl_lookup(name);
|
||||||
if (plist != SYS_PL_FAVORITES && plist != SYS_PL_HIDDEN &&
|
if (sys_pl)
|
||||||
plist != SYS_PL_HISTORY)
|
playlist_generic_update(&sys_pl->spl_playlist, sys_pl->spl_update);
|
||||||
idle_schedule(IDLE_SYNC, IDLE_FUNC(__sys_pl_update),
|
|
||||||
GUINT_TO_POINTER(plist));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pl_system_set_flag(const gchar *name, enum queue_flags flag,
|
static void pl_system_set_flag(const gchar *name, enum queue_flags flag,
|
||||||
|
|
|
@ -23,6 +23,7 @@ struct sys_playlist {
|
||||||
void (*spl_init)(struct playlist *, unsigned int, struct queue_ops *);
|
void (*spl_init)(struct playlist *, unsigned int, struct queue_ops *);
|
||||||
bool (*spl_add)(struct playlist *, struct track *);
|
bool (*spl_add)(struct playlist *, struct track *);
|
||||||
bool (*spl_remove)(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_set_flag)(struct playlist *, enum queue_flags, bool);
|
||||||
void (*spl_sort)(struct playlist *, enum compare_t, bool);
|
void (*spl_sort)(struct playlist *, enum compare_t, bool);
|
||||||
};
|
};
|
||||||
|
|
|
@ -70,6 +70,10 @@ bool playlist_generic_add_track(struct playlist *, struct track *);
|
||||||
/* Generic playlist remove track operation. */
|
/* Generic playlist remove track operation. */
|
||||||
bool playlist_generic_remove_track(struct playlist *, struct track *);
|
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. */
|
/* Generic playlist set_flag operation. */
|
||||||
void playlist_generic_set_flag(struct playlist *, enum queue_flags, bool);
|
void playlist_generic_set_flag(struct playlist *, enum queue_flags, bool);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue