diff --git a/core/playlists/artist.c b/core/playlists/artist.c index 1d6832a4..91685c23 100644 --- a/core/playlists/artist.c +++ b/core/playlists/artist.c @@ -44,7 +44,7 @@ static bool __artist_pl_add(void *data) db_for_each(dbe, next, track_db_get()) { if (TRACK(dbe)->tr_album->al_artist == artist) - queue_add_front(&playlist->pl_queue, TRACK(dbe)); + playlist_generic_add_front(playlist, TRACK(dbe)); } playlist_generic_resort(playlist); diff --git a/core/playlists/generic.c b/core/playlists/generic.c index 51a7b841..85cf22c3 100644 --- a/core/playlists/generic.c +++ b/core/playlists/generic.c @@ -154,12 +154,15 @@ bool playlist_generic_add_track(struct playlist *playlist, struct track *track) return true; } -bool playlist_generic_add_track_front(struct playlist *playlist, - struct track *track) +bool playlist_generic_add_front(struct playlist *playlist, struct track *track) { - if (playlist_has(playlist, track)) + if (!playlist || !track) return false; - queue_add_front(&playlist->pl_queue, track); + + playlist->pl_queue.q_length += track->tr_length; + g_queue_push_head(&playlist->pl_queue.q_tracks, track); + if (callbacks) + callbacks->pl_cb_added(playlist, track); return true; } diff --git a/core/playlists/library.c b/core/playlists/library.c index 056a932a..1f36812f 100644 --- a/core/playlists/library.c +++ b/core/playlists/library.c @@ -49,7 +49,7 @@ static bool __lib_pl_add(void *data) db_for_each(dbe, next, track_db_get()) { if (TRACK(dbe)->tr_library == library) - queue_add_front(&playlist->pl_queue, TRACK(dbe)); + playlist_generic_add_front(playlist, TRACK(dbe)); } playlist_generic_resort(playlist); diff --git a/core/playlists/system.c b/core/playlists/system.c index 908235a0..c4622103 100644 --- a/core/playlists/system.c +++ b/core/playlists/system.c @@ -47,11 +47,11 @@ static bool sys_pl_update_func(void *data) db_for_each(dbe, next, track_db_get()) { struct track *track = TRACK(dbe); - if (sys_pl_update_check(playlist, track) && - !playlist_has(pl_system_get(SYS_PL_HIDDEN), track)) - playlist_generic_add_track_front(playlist, track); - else + if (!sys_pl_update_check(playlist, track)) playlist_generic_remove(playlist, track); + else if (!playlist_has(pl_system_get(SYS_PL_HIDDEN), track) && + !playlist_has(playlist, track)) + playlist_generic_add_front(playlist, track); } playlist_generic_resort(playlist); @@ -200,7 +200,7 @@ static struct playlist_ops collection_ops = { */ static bool sys_pl_history_add(struct playlist *playlist, struct track *track) { - queue_add_front(&playlist->pl_queue, track); + playlist_generic_add_front(playlist, track); queue_iter_set(&playlist->pl_queue, &playlist->pl_queue.q_cur, 0); return true; } diff --git a/core/queue.c b/core/queue.c index 96c55096..eb5ba22a 100644 --- a/core/queue.c +++ b/core/queue.c @@ -51,13 +51,6 @@ static inline unsigned int __queue_added(struct queue *queue, return pos; } -static inline unsigned int __queue_add_head(struct queue *queue, - struct track *track) -{ - g_queue_push_head(&queue->q_tracks, track); - return __queue_added(queue, track, 0); -} - static inline unsigned int __queue_add_tail(struct queue *queue, struct track *track) { @@ -105,8 +98,3 @@ unsigned int queue_add(struct queue *queue, struct track *track) return __queue_add_sorted(queue, track); return __queue_add_tail(queue, track); } - -unsigned int queue_add_front(struct queue *queue, struct track *track) -{ - return __queue_add_head(queue, track); -} diff --git a/gui/model.c b/gui/model.c index 67a85ce8..52320fd0 100644 --- a/gui/model.c +++ b/gui/model.c @@ -275,7 +275,7 @@ GType gui_model_get_type() return gui_model_type; } -void gui_model_add(struct playlist *playlist, unsigned int row) +void gui_model_add(struct playlist *playlist, struct track *track) { GtkTreePath *path; GtkTreeIter iter; @@ -283,11 +283,12 @@ void gui_model_add(struct playlist *playlist, unsigned int row) if (cur_playlist != playlist) return; - path = gtk_tree_path_new_from_indices(row, -1); + path = gtk_tree_path_new_from_indices(0, -1); __gui_model_get_iter(GTK_TREE_MODEL(gui_model), &iter, path); gtk_tree_model_row_inserted(GTK_TREE_MODEL(gui_model), path, &iter); - __gui_model_set_runtime(); gtk_tree_path_free(path); + + __gui_model_set_runtime(); } void gui_model_remove(struct playlist *playlist, struct track *track, diff --git a/gui/playlist.c b/gui/playlist.c index 435672b8..ae08b875 100644 --- a/gui/playlist.c +++ b/gui/playlist.c @@ -42,10 +42,15 @@ static void __gui_playlist_deinit(struct queue *queue) gui_filter_clear_search(queue->q_private); } -static void __gui_playlist_added(struct queue *queue, unsigned int row) +static void __gui_playlist_added(struct playlist *playlist, struct track *track) { - gui_model_add(queue->q_private, row); - __gui_playlist_update_size(queue->q_private); + gui_model_add(playlist, track); + __gui_playlist_update_size(playlist); +} + +static void __gui_playlist_track_added(struct queue *queue, unsigned int row) +{ + __gui_playlist_added(queue->q_private, queue_at(queue, row)); } static void __gui_playlist_removed(struct playlist *playlist, struct track *track, @@ -59,10 +64,11 @@ static void __gui_playlist_removed(struct playlist *playlist, struct track *trac struct queue_ops playlist_ops = { .qop_init = __gui_playlist_init, .qop_deinit = __gui_playlist_deinit, - .qop_added = __gui_playlist_added, + .qop_added = __gui_playlist_track_added, }; struct playlist_callbacks playlist_cb = { + .pl_cb_added = __gui_playlist_added, .pl_cb_removed = __gui_playlist_removed, .pl_cb_updated = gui_model_update, }; diff --git a/include/core/playlists/generic.h b/include/core/playlists/generic.h index 7b1bbe38..b6f2fe1e 100644 --- a/include/core/playlists/generic.h +++ b/include/core/playlists/generic.h @@ -14,6 +14,9 @@ enum playlist_save_flags { #define PL_SAVE_ALL (PL_SAVE_TRACKS | PL_SAVE_METADATA) struct playlist_callbacks { + /* Called to notify that a track has been added. */ + void (*pl_cb_added)(struct playlist *, struct track *); + /* * Called to notify that N instances of a track have been removed. * Track may be NULL to indicate that several different tracks were @@ -49,7 +52,7 @@ void playlist_generic_clear(struct playlist *); /* Generic playlist add track operations. */ bool playlist_generic_add_track(struct playlist *, struct track *); -bool playlist_generic_add_track_front(struct playlist *, struct track *); +bool playlist_generic_add_front(struct playlist *, struct track *); /* Generic playlist remove track operation. */ bool playlist_generic_remove(struct playlist *, struct track *); diff --git a/include/core/queue.h b/include/core/queue.h index 25d2e0e1..be657837 100644 --- a/include/core/queue.h +++ b/include/core/queue.h @@ -107,7 +107,4 @@ static inline struct track *queue_at(struct queue *queue, unsigned int index) /* Called to add a track to the queue. */ unsigned int queue_add(struct queue *, struct track *); -/* Called to add a track to the front of the queue. */ -unsigned int queue_add_front(struct queue *, struct track *); - #endif /* OCARINA_CORE_QUEUE_H */ diff --git a/include/gui/model.h b/include/gui/model.h index 464ffe16..ff9deffa 100644 --- a/include/gui/model.h +++ b/include/gui/model.h @@ -52,7 +52,7 @@ GuiModel *gui_model_get(void); GType gui_model_get_type(); /* Called to add a row to the model */ -void gui_model_add(struct playlist *, unsigned int); +void gui_model_add(struct playlist *, struct track *); /* Called to remove a row from the model */ void gui_model_remove(struct playlist *, struct track *, unsigned int); diff --git a/tests/core/playlist.c b/tests/core/playlist.c index 022032f6..86f3218a 100644 --- a/tests/core/playlist.c +++ b/tests/core/playlist.c @@ -30,6 +30,7 @@ static struct playlist_ops test_ops = { .pl_sort = playlist_generic_sort, }; static struct playlist_callbacks test_cb = { + .pl_cb_added = test_pl_callback, .pl_cb_removed = test_pl_removed, .pl_cb_updated = test_pl_callback, }; @@ -65,6 +66,7 @@ static void test_null() playlist_generic_resort(NULL); playlist_clear_sort(NULL); + g_assert_false(playlist_generic_add_front(NULL, NULL)); g_assert_false(playlist_generic_remove(NULL, NULL)); playlist_generic_update(NULL, NULL); playlist_generic_clear(NULL); @@ -82,10 +84,14 @@ static void test_playlist() playlist_generic_init(&p, NULL); for (i = 0; i < 13; i++) { - playlist_generic_add_track_front(&p, track_get(i)); - g_assert_true(playlist_has(&p, track_get(i))); ex_length += track_get(i)->tr_length; + playlist_generic_add_front(&p, track_get(i)); + g_assert_true(playlist_has(&p, track_get(i))); + g_assert_cmpuint(p.pl_queue.q_length, ==, ex_length); + g_assert(cb_playlist == &p); + g_assert(cb_track == track_get(i)); } + g_assert_false(playlist_generic_add_front(&p, NULL)); /* Trigger an update for each track. */ for (i = 0; i < 13; i++) { @@ -120,7 +126,7 @@ static void test_playlist() /* Re-add the tracks! */ for (i = 0; i < 13; i++) { - playlist_generic_add_track_front(&p, track_get(i)); + playlist_generic_add_front(&p, track_get(i)); g_assert_true(playlist_has(&p, track_get(i))); ex_length += track_get(i)->tr_length; } @@ -144,15 +150,16 @@ static void test_sorting() g_assert_cmpuint(g_slist_length(p.pl_queue.q_sort), ==, 3); playlist_clear_sort(&p); g_assert_cmpuint(g_slist_length(p.pl_queue.q_sort), ==, 0); - cb_playlist = NULL; for (i = 0; i < 13; i++) { track = track_get(i); track->tr_count = (track->tr_track % 2) ? 4 : 2; - playlist_generic_add_track_front(&p, track); + playlist_generic_add_front(&p, track); } - p.pl_ops = &test_noop; + cb_playlist = NULL; + cb_track = NULL; + p.pl_ops = &test_noop; g_assert_false(playlist_sort(&p, COMPARE_TRACK)); g_assert_null(cb_playlist); g_assert_null(cb_track); diff --git a/tests/gui/filter.c b/tests/gui/filter.c index 7e84a0be..e4931f26 100644 --- a/tests/gui/filter.c +++ b/tests/gui/filter.c @@ -13,7 +13,7 @@ void *test_queue_init(struct queue *queue, void *data) void test_queue_deinit(struct queue *queue) { gui_filter_clear_search(queue->q_private); } void test_queue_add(struct queue *queue, unsigned int n) - { gui_model_add(queue->q_private, n); } + { gui_model_add(queue->q_private, queue_at(queue, n)); } struct queue_ops test_ops = { .qop_init = test_queue_init, diff --git a/tests/gui/model.c b/tests/gui/model.c index 5ca04dc3..19405267 100644 --- a/tests/gui/model.c +++ b/tests/gui/model.c @@ -28,7 +28,7 @@ void *test_queue_init(struct queue *queue, void *data) void test_queue_deinit(struct queue *queue) { } void test_queue_add(struct queue *queue, unsigned int n) - { gui_model_add(queue->q_private, n); } + { gui_model_add(queue->q_private, queue_at(queue, n)); } void test_on_load(struct track *track) {} void test_on_state_change(GstState state) {} void test_on_config_pause(int count) {} @@ -40,6 +40,7 @@ struct queue_ops test_ops = { }; struct playlist_callbacks test_cb = { + .pl_cb_added = gui_model_add, .pl_cb_removed = gui_model_remove, .pl_cb_updated = gui_model_update, };