core/playlist: Access playlists through a string

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2016-04-27 09:25:37 -04:00 committed by Anna Schumaker
parent 90e0b3ed78
commit 5e9b6bc975
13 changed files with 85 additions and 98 deletions

View File

@ -217,7 +217,7 @@ struct track *audio_eos()
/* Mark current track as played */ /* Mark current track as played */
if (audio_track) { if (audio_track) {
track_played(audio_track); track_played(audio_track);
playlist_update(PL_UNPLAYED); playlist_update("Unplayed");
} }
/* Check pause count and pick the next track */ /* Check pause count and pick the next track */

View File

@ -56,7 +56,7 @@ static void __scan_path(struct scan_data *scan, const gchar *name)
track = track_add(scan->sd_lib, path); track = track_add(scan->sd_lib, path);
if (track) { if (track) {
queue_add(&c_queue, track); queue_add(&c_queue, track);
playlist_add(PL_UNPLAYED, track); playlist_add("Unplayed", track);
} }
} }
@ -110,9 +110,11 @@ static bool __validate_library(void *data)
if (collection_check_library(library) < 0) if (collection_check_library(library) < 0)
return true; return true;
queue_remove_all(&c_queue, track); queue_remove_all(&c_queue, track);
playlist_remove(PL_UNPLAYED, track); playlist_remove("Favorites", track);
playlist_remove(PL_MOST_PLAYED, track); playlist_remove("Hidden", track);
playlist_remove(PL_LEAST_PLAYED, track); playlist_remove("Least Played", track);
playlist_remove("Most Played", track);
playlist_remove("Unplayed", track);
track_remove(track); track_remove(track);
} }
} }
@ -128,7 +130,7 @@ bool __collection_init_idle(void *data)
db_for_each(track, next, track_db_get()) { db_for_each(track, next, track_db_get()) {
if (TRACK(track)->tr_library->li_enabled && if (TRACK(track)->tr_library->li_enabled &&
!playlist_has(PL_HIDDEN, TRACK(track))) !playlist_has("Hidden", TRACK(track)))
queue_add(&c_queue, TRACK(track)); queue_add(&c_queue, TRACK(track));
} }
queue_unset_flag(&c_queue, Q_ADD_FRONT); queue_unset_flag(&c_queue, Q_ADD_FRONT);
@ -234,7 +236,7 @@ void collection_update_all()
bool collection_ban(struct track *track) bool collection_ban(struct track *track)
{ {
bool ret = playlist_add(PL_HIDDEN, track); bool ret = playlist_add("Hidden", track);
if (ret) if (ret)
queue_remove_all(&c_queue, track); queue_remove_all(&c_queue, track);
return ret; return ret;
@ -242,7 +244,7 @@ bool collection_ban(struct track *track)
bool collection_unban(struct track *track) bool collection_unban(struct track *track)
{ {
bool ret = playlist_remove(PL_HIDDEN, track); bool ret = playlist_remove("Hidden", track);
if (ret) if (ret)
queue_add(&c_queue, track); queue_add(&c_queue, track);
return ret; return ret;
@ -265,7 +267,7 @@ void collection_set_enabled(struct library *library, bool enabled)
track = TRACK(dbe); track = TRACK(dbe);
if (track->tr_library == library) { if (track->tr_library == library) {
if (enabled) { if (enabled) {
if (!playlist_has(PL_HIDDEN, track)) if (!playlist_has("Hidden", track))
queue_add(&c_queue, track); queue_add(&c_queue, track);
} else } else
queue_remove_all(&c_queue, track); queue_remove_all(&c_queue, track);

View File

@ -4,10 +4,6 @@
#include <core/playlist.h> #include <core/playlist.h>
#include <core/playlists/system.h> #include <core/playlists/system.h>
static enum playlist_t playlist_cur;
static const gchar *playlist_names[5] =
{ "Favorites", "Hidden", "Unplayed", "Most Played", "Least Played" };
void playlist_init(struct queue_ops *ops) void playlist_init(struct queue_ops *ops)
{ {
@ -19,39 +15,34 @@ void playlist_deinit()
pl_system_deinit(); pl_system_deinit();
} }
bool playlist_add(enum playlist_t plist, struct track *track) bool playlist_add(const gchar *name, struct track *track)
{ {
if (!track) if (!track)
return false; return false;
return pl_system.pl_add_track(playlist_names[plist], track); return pl_system.pl_add_track(name, track);
} }
bool playlist_remove(enum playlist_t plist, struct track *track) bool playlist_remove(const gchar *name, struct track *track)
{ {
if (!track) if (!track)
return false; return false;
return pl_system.pl_remove_track(playlist_names[plist], track); return pl_system.pl_remove_track(name, track);
} }
void playlist_update(enum playlist_t plist) void playlist_update(const gchar *name)
{ {
pl_system.pl_update(playlist_names[plist]); pl_system.pl_update(name);
} }
bool playlist_has(enum playlist_t plist, struct track *track) bool playlist_has(const gchar *name, struct track *track)
{ {
struct queue *queue = pl_system.pl_get_queue(playlist_names[plist]); struct queue *queue = pl_system.pl_get_queue(name);
if (!track || !queue) if (!track || !queue)
return false; return false;
return queue_has(queue, track); return queue_has(queue, track);
} }
void playlist_select(enum playlist_t plist) struct queue *playlist_get_queue(const gchar *name)
{ {
playlist_cur = plist; return pl_system.pl_get_queue(name);
}
struct queue *playlist_get_queue(enum playlist_t plist)
{
return pl_system.pl_get_queue(playlist_names[plist]);
} }

View File

@ -102,9 +102,9 @@ static void __audio_load(struct track *track)
__audio_set_time_label("o_duration", track->tr_length); __audio_set_time_label("o_duration", track->tr_length);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gui_builder_widget("o_hide")), gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gui_builder_widget("o_hide")),
playlist_has(PL_HIDDEN, track)); playlist_has("Hidden", track));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gui_builder_widget("o_favorite")), gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gui_builder_widget("o_favorite")),
playlist_has(PL_FAVORITED, track)); playlist_has("Favorites", track));
gui_view_scroll(); gui_view_scroll();
__audio_set_cover(); __audio_set_cover();
@ -141,9 +141,9 @@ void __audio_seek(GtkRange *range, GtkScrollType type, double value, gpointer da
void __audio_favorite(GtkToggleButton *toggle, gpointer data) void __audio_favorite(GtkToggleButton *toggle, gpointer data)
{ {
if (gtk_toggle_button_get_active(toggle)) if (gtk_toggle_button_get_active(toggle))
playlist_add(PL_FAVORITED, audio_cur_track()); playlist_add("Favorites", audio_cur_track());
else else
playlist_remove(PL_FAVORITED, audio_cur_track()); playlist_remove("Favorites", audio_cur_track());
} }
void __audio_hide(GtkToggleButton *toggle, gpointer data) void __audio_hide(GtkToggleButton *toggle, gpointer data)

View File

@ -182,7 +182,7 @@ static void __collection_added(struct queue *queue, unsigned int pos)
static bool __collection_erase(struct queue *queue, struct track *track) static bool __collection_erase(struct queue *queue, struct track *track)
{ {
return playlist_add(PL_HIDDEN, track); return playlist_add("Hidden", track);
} }
static void __collection_removed(struct queue *queue, unsigned int pos) static void __collection_removed(struct queue *queue, unsigned int pos)

View File

@ -2,6 +2,7 @@
* Copyright 2016 (c) Anna Schumaker. * Copyright 2016 (c) Anna Schumaker.
*/ */
#include <core/collection.h> #include <core/collection.h>
#include <core/string.h>
#include <gui/builder.h> #include <gui/builder.h>
#include <gui/playlist.h> #include <gui/playlist.h>
#include <gui/sidebar.h> #include <gui/sidebar.h>
@ -12,8 +13,8 @@ enum playlist_sidebar_columns {
P_SB_PLAYLIST, P_SB_PLAYLIST,
}; };
static GtkTreeStore *p_store; static GtkTreeStore *p_store;
static enum playlist_t p_cur; static gchar *p_name;
static void __playlist_set(GtkTreeIter *iter, const gchar *name, static void __playlist_set(GtkTreeIter *iter, const gchar *name,
const gchar *image, enum playlist_t plist) const gchar *image, enum playlist_t plist)
@ -38,12 +39,11 @@ void __playlist_selection_changed(GtkTreeSelection *selection, gpointer data)
GtkTreeIter iter; GtkTreeIter iter;
if (gtk_tree_selection_get_selected(selection, &model, &iter)) { if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
gtk_tree_model_get(model, &iter, P_SB_PLAYLIST, &p_cur, -1); gtk_tree_model_get(model, &iter, P_SB_NAME, &p_name, -1);
gtk_stack_set_visible_child_name(stack, "queues"); gtk_stack_set_visible_child_name(stack, "queues");
gui_sidebar_selected(SB_PLAYLIST, gui_sidebar_selected(SB_PLAYLIST,
gui_queue(playlist_get_queue(p_cur))); gui_queue(playlist_get_queue(p_name)));
playlist_select(p_cur);
} }
} }
@ -55,7 +55,7 @@ static void *__playlist_init(struct queue *queue)
static bool __playlist_erase(struct queue *queue, struct track *track) static bool __playlist_erase(struct queue *queue, struct track *track)
{ {
/* collection_unban() and playlist_remove() handle queue changes */ /* collection_unban() and playlist_remove() handle queue changes */
if (gui_playlist_cur() == PL_HIDDEN) if (string_match(gui_playlist_cur(), "Hidden"))
collection_unban(track); collection_unban(track);
else else
playlist_remove(gui_playlist_cur(), track); playlist_remove(gui_playlist_cur(), track);
@ -91,9 +91,9 @@ void gui_playlist_init()
gtk_tree_store_insert(p_store, &parent, NULL, -1); gtk_tree_store_insert(p_store, &parent, NULL, -1);
} }
enum playlist_t gui_playlist_cur() gchar *gui_playlist_cur()
{ {
return p_cur; return p_name;
} }
struct queue_ops playlist_ops = { struct queue_ops playlist_ops = {

View File

@ -196,7 +196,7 @@ static void __view_add_to_queue(GtkTreeModel *model, GtkTreePath *path,
static void __view_add_to_playlist(GtkTreeModel *model, GtkTreePath *path, static void __view_add_to_playlist(GtkTreeModel *model, GtkTreePath *path,
GtkTreeIter *iter, gpointer data) GtkTreeIter *iter, gpointer data)
{ {
playlist_add(GPOINTER_TO_UINT(data), __view_filter_get_track(path)); playlist_add((gchar *)data, __view_filter_get_track(path));
} }
static void __view_delete_selection(GtkTreeSelection *selection) static void __view_delete_selection(GtkTreeSelection *selection)
@ -231,7 +231,7 @@ static void __view_process_selection(GtkTreeView *treeview, unsigned int keyval)
case GDK_KEY_f: case GDK_KEY_f:
gtk_tree_selection_selected_foreach(selection, gtk_tree_selection_selected_foreach(selection,
__view_add_to_playlist, __view_add_to_playlist,
GUINT_TO_POINTER(PL_FAVORITED)); "Favorites");
break; break;
case GDK_KEY_r: case GDK_KEY_r:
flags = Q_RANDOM; flags = Q_RANDOM;

View File

@ -28,23 +28,20 @@ void playlist_deinit();
/* Called to add a track to a playlist. */ /* Called to add a track to a playlist. */
bool playlist_add(enum playlist_t, struct track *); bool playlist_add(const gchar *, struct track *);
/* Called to remove a track from a playlist. */ /* Called to remove a track from a playlist. */
bool playlist_remove(enum playlist_t, struct track *); bool playlist_remove(const gchar *, struct track *);
/* Called to update tracks on a playlist. */ /* Called to update tracks on a playlist. */
void playlist_update(enum playlist_t); void playlist_update(const gchar *);
/* Called to check if a specific track is in the playlist. */ /* Called to check if a specific track is in the playlist. */
bool playlist_has(enum playlist_t, struct track *); bool playlist_has(const gchar *, struct track *);
/* Called to fill the queue with a specific playlist. */
void playlist_select(enum playlist_t);
/* Called to access the playlist queue. */ /* Called to access the playlist queue. */
struct queue *playlist_get_queue(enum playlist_t); struct queue *playlist_get_queue(const gchar *);
#endif /* OCARINA_CORE_PLAYLIST_H */ #endif /* OCARINA_CORE_PLAYLIST_H */

View File

@ -10,7 +10,7 @@
void gui_playlist_init(); void gui_playlist_init();
/* Called to get the currently selected playlist. */ /* Called to get the currently selected playlist. */
enum playlist_t gui_playlist_cur(); gchar *gui_playlist_cur();
/* Playlist operations passed to core_init() */ /* Playlist operations passed to core_init() */
extern struct queue_ops playlist_ops; extern struct queue_ops playlist_ops;

View File

@ -133,10 +133,10 @@ static void test_ban()
db_for_each(dbe, next, track_db) { db_for_each(dbe, next, track_db) {
track = TRACK(dbe); track = TRACK(dbe);
test_loop_equal(playlist_has(PL_HIDDEN, track), (bool)false, i); test_loop_equal(playlist_has("Hidden", track), (bool)false, i);
test_loop_equal(collection_ban(track), (bool)true, i); test_loop_equal(collection_ban(track), (bool)true, i);
test_loop_equal(collection_ban(track), (bool)false, i); test_loop_equal(collection_ban(track), (bool)false, i);
test_loop_equal(playlist_has(PL_HIDDEN, track), (bool)true, i); test_loop_equal(playlist_has("Hidden", track), (bool)true, i);
test_loop_equal(queue_size(q), track_db->db_size - (i + 1), i); test_loop_equal(queue_size(q), track_db->db_size - (i + 1), i);
i++; i++;
} test_loop_passed(); } test_loop_passed();
@ -145,10 +145,10 @@ static void test_ban()
i = 0; i = 0;
db_for_each(dbe, next, track_db) { db_for_each(dbe, next, track_db) {
track = TRACK(dbe); track = TRACK(dbe);
test_loop_equal(playlist_has(PL_HIDDEN, track), (bool)true, i); test_loop_equal(playlist_has("Hidden", track), (bool)true, i);
test_loop_equal(collection_unban(track), (bool)true, i); test_loop_equal(collection_unban(track), (bool)true, i);
test_loop_equal(collection_unban(track), (bool)false, i); test_loop_equal(collection_unban(track), (bool)false, i);
test_loop_equal(playlist_has(PL_HIDDEN, track), (bool)false, i); test_loop_equal(playlist_has("Hidden", track), (bool)false, i);
test_loop_equal(queue_size(q), i + 1, i); test_loop_equal(queue_size(q), i + 1, i);
i++; i++;
} test_loop_passed(); } test_loop_passed();

View File

@ -9,7 +9,7 @@
static void test_init() static void test_init()
{ {
struct queue *q = playlist_get_queue(PL_MOST_PLAYED); struct queue *q = playlist_get_queue("Most Played");
struct library *library; struct library *library;
GSList *list; GSList *list;
@ -19,11 +19,11 @@ static void test_init()
playlist_init(NULL); playlist_init(NULL);
while (idle_run_task()) {}; while (idle_run_task()) {};
test_not_equal((void *)playlist_get_queue(PL_FAVORITED), NULL); test_not_equal((void *)playlist_get_queue("Favorites"), NULL);
test_not_equal((void *)playlist_get_queue(PL_HIDDEN), NULL); test_not_equal((void *)playlist_get_queue("Hidden"), NULL);
test_not_equal((void *)playlist_get_queue(PL_UNPLAYED), NULL); test_not_equal((void *)playlist_get_queue("Unplayed"), NULL);
test_not_equal((void *)playlist_get_queue(PL_MOST_PLAYED), NULL); test_not_equal((void *)playlist_get_queue("Most Played"), NULL);
test_not_equal((void *)playlist_get_queue(PL_LEAST_PLAYED), NULL); test_not_equal((void *)playlist_get_queue("Least Played"), NULL);
test_not_equal((void *)q, NULL); test_not_equal((void *)q, NULL);
test_equal(queue_has_flag(q, Q_ENABLED), (bool)true); test_equal(queue_has_flag(q, Q_ENABLED), (bool)true);
@ -59,64 +59,61 @@ static void test_init()
static void test_add() static void test_add()
{ {
struct queue *q = playlist_get_queue(PL_FAVORITED); struct queue *q = playlist_get_queue("Favorites");
struct track *track = track_get(0); struct track *track = track_get(0);
test_equal(playlist_add(PL_FAVORITED, NULL), (bool)false); test_equal(playlist_add("Favorites", NULL), (bool)false);
test_equal(playlist_has(PL_FAVORITED, NULL), (bool)false); test_equal(playlist_has("Favorites", NULL), (bool)false);
test_equal(playlist_has(PL_FAVORITED, track), (bool)false); test_equal(playlist_has("Favorites", track), (bool)false);
test_equal(playlist_add(PL_FAVORITED, track), (bool)true); test_equal(playlist_add("Favorites", track), (bool)true);
test_equal(playlist_has(PL_FAVORITED, track), (bool)true); test_equal(playlist_has("Favorites", track), (bool)true);
q = playlist_get_queue(PL_FAVORITED); q = playlist_get_queue("Favorites");
test_equal(queue_size(q), 1); test_equal(queue_size(q), 1);
test_equal(playlist_add(PL_FAVORITED, track), (bool)false); test_equal(playlist_add("Favorites", track), (bool)false);
test_equal(queue_size(q), 1); test_equal(queue_size(q), 1);
test_equal(playlist_add(PL_FAVORITED, track_get(1)), (bool)true); test_equal(playlist_add("Favorites", track_get(1)), (bool)true);
test_equal(queue_size(q), 2); test_equal(queue_size(q), 2);
track = track_get(2); track = track_get(2);
playlist_select(PL_HIDDEN); q = playlist_get_queue("Hidden");
q = playlist_get_queue(PL_HIDDEN); test_equal(playlist_has("Hidden", track), (bool)false);
test_equal(playlist_has(PL_HIDDEN, track), (bool)false); test_equal(playlist_add("Hidden", track), (bool)true);
test_equal(playlist_add(PL_HIDDEN, track), (bool)true); test_equal(playlist_has("Hidden", track), (bool)true);
test_equal(playlist_has(PL_HIDDEN, track), (bool)true); q = playlist_get_queue("Hidden");
q = playlist_get_queue(PL_HIDDEN);
test_equal(queue_size(q), 1); test_equal(queue_size(q), 1);
} }
static void test_remove() static void test_remove()
{ {
struct queue *q = playlist_get_queue(PL_FAVORITED); struct queue *q = playlist_get_queue("Favorites");
struct track *track = track_get(0); struct track *track = track_get(0);
/* The important thing here is that we don't crash */ /* The important thing here is that we don't crash */
test_equal(playlist_remove(PL_FAVORITED, NULL), (bool)false); test_equal(playlist_remove("Favorites", NULL), (bool)false);
playlist_select(PL_FAVORITED);
test_equal(queue_size(q), 2); test_equal(queue_size(q), 2);
test_equal(playlist_has(PL_FAVORITED, track), (bool)true); test_equal(playlist_has("Favorites", track), (bool)true);
test_equal(playlist_remove(PL_FAVORITED, track), (bool)true); test_equal(playlist_remove("Favorites", track), (bool)true);
test_equal(playlist_has(PL_FAVORITED, track), (bool)false); test_equal(playlist_has("Favorites", track), (bool)false);
test_equal(queue_size(q), 1); test_equal(queue_size(q), 1);
test_equal(playlist_remove(PL_FAVORITED, track), (bool)false); test_equal(playlist_remove("Favorites", track), (bool)false);
test_equal(queue_size(q), 1); test_equal(queue_size(q), 1);
test_equal(playlist_remove(PL_FAVORITED, track_get(1)), (bool)true); test_equal(playlist_remove("Favorites", track_get(1)), (bool)true);
test_equal(queue_size(q), 0); test_equal(queue_size(q), 0);
q = playlist_get_queue(PL_HIDDEN); q = playlist_get_queue("Hidden");
track = track_get(2); track = track_get(2);
playlist_select(PL_HIDDEN);
test_equal(queue_size(q), 1); test_equal(queue_size(q), 1);
test_equal(playlist_has(PL_HIDDEN, track), (bool)true); test_equal(playlist_has("Hidden", track), (bool)true);
test_equal(playlist_remove(PL_HIDDEN, track), (bool)true); test_equal(playlist_remove("Hidden", track), (bool)true);
test_equal(playlist_has(PL_HIDDEN, track), (bool)false); test_equal(playlist_has("Hidden", track), (bool)false);
test_equal(queue_size(q), 0); test_equal(queue_size(q), 0);
} }
static void test_deinit() static void test_deinit()
{ {
struct queue *q = playlist_get_queue(PL_UNPLAYED); struct queue *q = playlist_get_queue("Unplayed");
playlist_deinit(); playlist_deinit();
tags_deinit(); tags_deinit();

View File

@ -73,8 +73,8 @@ static void test_audio()
while (idle_run_task()) {}; while (idle_run_task()) {};
track = track_get(0); track = track_get(0);
playlist_add(PL_FAVORITED, track); playlist_add("Favorites", track);
playlist_add(PL_HIDDEN, track); playlist_add("Hidden", track);
audio_load(track); audio_load(track);
duration = string_sec2str(track->tr_length); duration = string_sec2str(track->tr_length);

View File

@ -38,23 +38,23 @@ static void test_playlist_sidebar()
gtk_tree_path_down(path); gtk_tree_path_down(path);
gtk_tree_selection_select_path(selection, path); gtk_tree_selection_select_path(selection, path);
test_equal(gui_playlist_cur(), PL_FAVORITED); test_equal(gui_playlist_cur(), "Favorites");
gtk_tree_path_next(path); gtk_tree_path_next(path);
gtk_tree_selection_select_path(selection, path); gtk_tree_selection_select_path(selection, path);
test_equal(gui_playlist_cur(), PL_HIDDEN); test_equal(gui_playlist_cur(), "Hidden");
gtk_tree_path_next(path); gtk_tree_path_next(path);
gtk_tree_selection_select_path(selection, path); gtk_tree_selection_select_path(selection, path);
test_equal(gui_playlist_cur(), PL_MOST_PLAYED); test_equal(gui_playlist_cur(), "Most Played");
gtk_tree_path_next(path); gtk_tree_path_next(path);
gtk_tree_selection_select_path(selection, path); gtk_tree_selection_select_path(selection, path);
test_equal(gui_playlist_cur(), PL_LEAST_PLAYED); test_equal(gui_playlist_cur(), "Least Played");
gtk_tree_path_next(path); gtk_tree_path_next(path);
gtk_tree_selection_select_path(selection, path); gtk_tree_selection_select_path(selection, path);
test_equal(gui_playlist_cur(), PL_UNPLAYED); test_equal(gui_playlist_cur(), "Unplayed");
gtk_tree_path_free(path); gtk_tree_path_free(path);
gui_builder_deinit(); gui_builder_deinit();