diff --git a/core/playlist.c b/core/playlist.c index b73d5e25..d3071f9c 100644 --- a/core/playlist.c +++ b/core/playlist.c @@ -91,12 +91,12 @@ void playlist_sort(enum playlist_type_t type, const gchar *name, struct track *playlist_next(void) { - return queue_next(playlist_get_queue(PL_SYSTEM, "Collection")); + return playlist_types[PL_SYSTEM]->pl_next("Collection"); } struct track *playlist_prev(void) { - return queue_next(playlist_get_queue(PL_SYSTEM, "History")); + return playlist_types[PL_SYSTEM]->pl_next("History"); } struct queue *playlist_get_queue(enum playlist_type_t type, const gchar *name) diff --git a/core/playlists/artist.c b/core/playlists/artist.c index b1ba5f6f..466470b9 100644 --- a/core/playlists/artist.c +++ b/core/playlists/artist.c @@ -82,6 +82,12 @@ static void pl_artist_sort(const gchar *name, enum compare_t sort, bool reset) playlist_generic_sort(playlist, sort, reset); } +static struct track *pl_artist_next(const gchar *name) +{ + struct playlist *playlist = __artist_pl_lookup(name); + return playlist_generic_next(playlist); +} + struct playlist_type pl_artist = { .pl_get_queue = pl_artist_get_queue, @@ -92,6 +98,7 @@ struct playlist_type pl_artist = { .pl_update = pl_artist_update, .pl_set_flag = pl_artist_set_flag, .pl_sort = pl_artist_sort, + .pl_next = pl_artist_next, }; diff --git a/core/playlists/generic.c b/core/playlists/generic.c index a7b07078..c62f200b 100644 --- a/core/playlists/generic.c +++ b/core/playlists/generic.c @@ -92,3 +92,8 @@ void playlist_generic_sort(struct playlist *playlist, { queue_sort(&playlist->pl_queue, sort, reset); } + +struct track *playlist_generic_next(struct playlist *playlist) +{ + return queue_next(&playlist->pl_queue); +} diff --git a/core/playlists/library.c b/core/playlists/library.c index 797ccca2..ad264c6e 100644 --- a/core/playlists/library.c +++ b/core/playlists/library.c @@ -204,6 +204,12 @@ static void pl_library_sort(const gchar *name, enum compare_t sort, bool reset) playlist_generic_sort(playlist, sort, reset); } +static struct track *pl_library_next(const gchar *name) +{ + struct playlist *playlist = __lib_pl_lookup(name); + return playlist_generic_next(playlist); +} + struct playlist_type pl_library = { .pl_get_queue = pl_library_get_queue, @@ -214,6 +220,7 @@ struct playlist_type pl_library = { .pl_update = pl_library_update, .pl_set_flag = pl_library_set_flag, .pl_sort = pl_library_sort, + .pl_next = pl_library_next, }; diff --git a/core/playlists/system.c b/core/playlists/system.c index 1fa20355..c84cdec2 100644 --- a/core/playlists/system.c +++ b/core/playlists/system.c @@ -64,6 +64,7 @@ static struct sys_playlist sys_favorites = { .spl_remove = sys_pl_favorites_remove, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, + .spl_next = playlist_generic_next, }; @@ -99,6 +100,7 @@ static struct sys_playlist sys_hidden = { .spl_remove = sys_pl_hidden_remove, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, + .spl_next = playlist_generic_next, }; @@ -164,6 +166,7 @@ static struct sys_playlist sys_collection = { .spl_update = sys_pl_collection_update, .spl_set_flag = sys_pl_collection_set_flag, .spl_sort = sys_pl_collection_sort, + .spl_next = playlist_generic_next, }; @@ -192,6 +195,7 @@ static struct sys_playlist sys_history = { .spl_remove = playlist_generic_remove_track, .spl_set_flag = playlist_noop_set_flag, .spl_sort = playlist_noop_sort, + .spl_next = playlist_generic_next, }; @@ -221,6 +225,7 @@ static struct sys_playlist sys_unplayed = { .spl_update = sys_pl_unplayed_update, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, + .spl_next = playlist_generic_next, }; @@ -252,6 +257,7 @@ static struct sys_playlist sys_most_played = { .spl_update = sys_pl_most_played_update, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, + .spl_next = playlist_generic_next, }; @@ -283,6 +289,7 @@ static struct sys_playlist sys_least_played = { .spl_update = sys_pl_least_played_update, .spl_set_flag = playlist_generic_set_flag, .spl_sort = playlist_generic_sort, + .spl_next = playlist_generic_next, }; @@ -399,6 +406,14 @@ static void pl_system_sort(const gchar *name, enum compare_t sort, bool reset) sys_pl->spl_sort(&sys_pl->spl_playlist, sort, reset); } +static struct track *pl_system_next(const gchar *name) +{ + struct sys_playlist *sys_pl = __sys_pl_lookup(name); + if (sys_pl) + return sys_pl->spl_next(&sys_pl->spl_playlist); + return NULL; +} + struct playlist_type pl_system = { .pl_get_queue = pl_system_get_queue, @@ -409,6 +424,7 @@ struct playlist_type pl_system = { .pl_update = pl_system_update, .pl_set_flag = pl_system_set_flag, .pl_sort = pl_system_sort, + .pl_next = pl_system_next, }; diff --git a/include/core/playlists/system.h b/include/core/playlists/system.h index e948e605..86d7b58b 100644 --- a/include/core/playlists/system.h +++ b/include/core/playlists/system.h @@ -26,6 +26,7 @@ struct sys_playlist { 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); + struct track *(*spl_next)(struct playlist *); }; diff --git a/include/core/playlists/type.h b/include/core/playlists/type.h index 2881a450..1f870a4c 100644 --- a/include/core/playlists/type.h +++ b/include/core/playlists/type.h @@ -51,6 +51,9 @@ struct playlist_type { /* Called to sort a playlist. */ void (*pl_sort)(const gchar *, enum compare_t, bool); + + /* Called to pick the next track from a playlist. */ + struct track *(*pl_next)(const gchar *); }; @@ -80,5 +83,8 @@ void playlist_generic_set_flag(struct playlist *, enum queue_flags, bool); /* Generic playlist sorting operation. */ void playlist_generic_sort(struct playlist *, enum compare_t, bool); +/* Generic playlist next track operation. */ +struct track *playlist_generic_next(struct playlist *); + #endif /* OCARINA_CORE_PLAYLISTS_TYPE_H */