From b3d95a06d40058b0f55b30f5f30ec2a5360fb3cb Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Mon, 14 Dec 2015 10:24:36 -0500 Subject: [PATCH] core/tempq: Move tempq_next() out of the deck namespace Signed-off-by: Anna Schumaker --- core/audio.cpp | 12 +++++- core/deck.cpp | 43 +++++++++++----------- gui/queue.cpp | 11 +++--- gui/tabs.cpp | 10 ++--- gui/window.cpp | 10 ++--- include/core/deck.h | 17 +++------ tests/core/deck.cpp | 89 ++++++++++++++++++++------------------------- 7 files changed, 92 insertions(+), 100 deletions(-) diff --git a/core/audio.cpp b/core/audio.cpp index c2108f82..53ee6199 100644 --- a/core/audio.cpp +++ b/core/audio.cpp @@ -68,12 +68,17 @@ AudioDriver :: ~AudioDriver() void AudioDriver :: eos() { + struct track *track; + if (cur_track) { track_played(cur_track); queue_updated(collection_get_queue(), cur_track); } - _load_track(deck :: next(), continue_playback()); + track = tempq_next(); + if (!track) + track = queue_next(collection_get_queue()); + _load_track(track, continue_playback()); } @@ -131,7 +136,10 @@ int64_t audio :: duration() void audio :: next() { - _load_track(deck :: next(), cur_driver->is_playing()); + struct track *track = tempq_next(); + if (!track) + track = queue_next(collection_get_queue()); + _load_track(track, cur_driver->is_playing()); if (cur_track) history_add(cur_track); } diff --git a/core/deck.cpp b/core/deck.cpp index 16c687a9..31b9297c 100644 --- a/core/deck.cpp +++ b/core/deck.cpp @@ -98,6 +98,7 @@ void tempq_free(struct queue *queue) for (it = queue_deck.begin(); it != queue_deck.end(); it++) { if (&(*it) == queue) { + queue_deinit(&(*it)); queue_deck.erase(it); deck :: write(); return; @@ -141,6 +142,24 @@ void tempq_move(struct queue *queue, unsigned int index) deck :: write(); } +struct track *tempq_next() +{ + struct track *track = NULL; + std::list::iterator it; + + for (it = queue_deck.begin(); it != queue_deck.end(); it++) { + if (queue_has_flag(&(*it), Q_ENABLED) == false) + continue; + + track = queue_next(&(*it)); + if (queue_size(&(*it)) == 0) + tempq_free(&(*it)); + break; + } + + return track; +} + void deck :: write() { std::list::iterator it; @@ -162,27 +181,7 @@ void deck :: save(struct queue *queue, enum queue_flags flag) deck :: write(); } -struct track *deck :: next() +unsigned int tempq_count() { - struct track *track = NULL; - std::list::iterator it; - - for (it = queue_deck.begin(); it != queue_deck.end(); it++) { - if (queue_has_flag(&(*it), Q_ENABLED) == false) - continue; - - track = queue_next(&(*it)); - if (queue_size(&(*it)) == 0) - tempq_free(&(*it)); - break; - } - - if (!track) - track = queue_next(collection_get_queue()); - return track; -} - -std::list &deck :: get_queues() -{ - return queue_deck; + return queue_deck.size(); } diff --git a/gui/queue.cpp b/gui/queue.cpp index fa81af5a..5c3b2095 100644 --- a/gui/queue.cpp +++ b/gui/queue.cpp @@ -199,8 +199,8 @@ static void on_page_reordered(Gtk::Widget *page, int num) { Gtk::Notebook *notebook = gui :: get_widget("o_notebook"); - if ((unsigned int)num >= deck :: get_queues().size()) { - notebook->reorder_child(*page, deck::get_queues().size() - 1); + if ((unsigned int)num >= tempq_count()) { + notebook->reorder_child(*page, tempq_count() - 1); return; } @@ -220,9 +220,8 @@ void init_queue_tabs() void post_init_queue_tabs() { - std::list::iterator it; - unsigned int i = 0; + unsigned int i; - for (it = deck :: get_queues().begin(); it != deck :: get_queues().end(); it++) - on_pq_created(&(*it), i++); + for (i = 0; i < tempq_count(); i++) + on_pq_created(tempq_get(i), i); } diff --git a/gui/tabs.cpp b/gui/tabs.cpp index 79436b3b..33eb3f0d 100644 --- a/gui/tabs.cpp +++ b/gui/tabs.cpp @@ -203,18 +203,18 @@ void Tab :: tab_queue_add(queue *pq) bool Tab :: tab_queue_selected(bool random) { unsigned int flags = random ? 0 : Q_RANDOM; - if (deck :: get_queues().size() >= 10) + if (tempq_count() >= 10) return true; queue *pq = tempq_alloc(&tempq_ops, flags); - on_pq_created(pq, deck :: get_queues().size() - 1); + on_pq_created(pq, tempq_count() - 1); tab_queue_add(pq); return true; } bool Tab :: tab_add_to_queue(unsigned int n) { - if (n >= deck :: get_queues().size()) + if (n >= tempq_count()) return true; queue *pq = tempq_get(n); @@ -271,7 +271,7 @@ bool Tab :: on_key_press_event(const std::string &key) void Tab :: on_show_rc_menu() { std::string item; - unsigned int size = deck :: get_queues().size(); + unsigned int size = tempq_count(); if (size == 0) { gui :: get_widget("o_add_to_pq")->hide(); @@ -463,7 +463,7 @@ void post_init_tabs() post_init_queue_tabs(); unsigned int tab = 0; - for (tab = 0; tab < deck::get_queues().size(); tab++) { + for (tab = 0; tab < tempq_count(); tab++) { if (queue_has_flag(tempq_get(tab), Q_ENABLED)) break; } diff --git a/gui/window.cpp b/gui/window.cpp index 6614eb4b..bf5d4216 100644 --- a/gui/window.cpp +++ b/gui/window.cpp @@ -26,20 +26,20 @@ static bool on_window_key_pressed(GdkEventKey *event) tab_focus_search(); else if (key >= "0" && key <= "9") { unsigned int n = atoi(key.c_str()); - if (n < deck::get_queues().size()) + if (n < tempq_count()) notebook->set_current_page(n); } else if (key == "c") - notebook->set_current_page(deck::get_queues().size()); + notebook->set_current_page(tempq_count()); else if (key == "h") - notebook->set_current_page(deck::get_queues().size() + 1); + notebook->set_current_page(tempq_count() + 1); else if (key == "m") - notebook->set_current_page(deck::get_queues().size() + 3); + notebook->set_current_page(tempq_count() + 3); else if (key == "n") gst :: next(); else if (key == "N") audio :: prev(); else if (key == "p") - notebook->set_current_page(deck::get_queues().size() + 2); + notebook->set_current_page(tempq_count() + 2); else return false; return true; diff --git a/include/core/deck.h b/include/core/deck.h index b3f3ae10..d3abeb94 100644 --- a/include/core/deck.h +++ b/include/core/deck.h @@ -46,17 +46,6 @@ namespace deck void write(); void save(struct queue *, enum queue_flags); - /** - * @return A track from the first enabled queue. If no queues are - * enabled, return a track from the Library. - */ - struct track *next(); - - /** - * @return The deck of queues. - */ - std::list &get_queues(); - }; @@ -76,4 +65,10 @@ struct queue *tempq_get(unsigned int); /* Called to move a temporary queue to a new index in the list. */ void tempq_move(struct queue *, unsigned int); +/* Called to find the next track to play. */ +struct track *tempq_next(); + +/* Called to find the number of temporary queues currently allocated. */ +unsigned int tempq_count(); + #endif /* OCARINA_CORE_DECK_H */ diff --git a/tests/core/deck.cpp b/tests/core/deck.cpp index 56aa316e..ababcf21 100644 --- a/tests/core/deck.cpp +++ b/tests/core/deck.cpp @@ -12,7 +12,6 @@ extern "C" { } #include "test.h" -static queue *Q_NULL = NULL; static void test_init() { @@ -22,12 +21,12 @@ static void test_init() collection_init(NULL); history_init(NULL); - test_equal(deck :: next(), NULL); + test_equal(tempq_next(), NULL); tempq_init(NULL); - test_equal(deck :: next(), NULL); + test_equal(tempq_next(), NULL); tempq_move(NULL, 1); test_equal(tempq_get(0), NULL); - test_equal(deck :: get_queues().size(), (size_t)0); + test_equal(tempq_count(), 0); } static void test_tempq() @@ -41,6 +40,7 @@ static void test_tempq() test_equal(queue_has_flag(q0, Q_SAVE_SORT), true); test_equal(queue_has_flag(q0, Q_SAVE_FLAGS), true); test_equal(tempq_get(0), q0); + test_equal(tempq_count(), 1); q1 = tempq_alloc(NULL, Q_RANDOM); test_not_equal(q1, NULL); @@ -49,6 +49,7 @@ static void test_tempq() test_equal(queue_has_flag(q1, Q_SAVE_SORT), true); test_equal(queue_has_flag(q1, Q_SAVE_FLAGS), true); test_equal(tempq_get(1), q1); + test_equal(tempq_count(), 2); tempq_move(q1, 0); test_equal(tempq_get(0), q1); @@ -62,9 +63,43 @@ static void test_tempq() tempq_free(q0); test_equal(tempq_get(0), q1); + test_equal(tempq_count(), 1); tempq_free(q1); test_equal(tempq_get(0), NULL); + test_equal(tempq_count(), 0); +} + +static void test_next() +{ + const struct database *track_db = track_db_get(); + struct queue *q0, *q1; + unsigned int i; + + collection_add("tests/Music/Hyrule Symphony"); + while (idle_run_task()) {}; + + q0 = tempq_alloc(NULL, 0); + q1 = tempq_alloc(NULL, 0); + for (i = 0; i < track_db->db_size; i++) { + queue_add(q0, track_get(i)); + queue_add(q1, track_get(i)); + } + + for (i = 0; i < track_db->db_size; i++) { + test_loop_equal(queue_size(q0), track_db->db_size - i, i); + test_loop_equal(tempq_next(), track_get(i), i); + } test_loop_passed(); + test_equal(tempq_get(0), q1); + test_equal(tempq_count(), 1); + test_equal(queue_size(q1), track_db->db_size); + + for (i = 0; i < track_db->db_size; i++) { + test_loop_equal(queue_size(q1), track_db->db_size - i, i); + test_loop_equal(tempq_next(), track_get(i), i); + } test_loop_passed(); + test_equal(tempq_get(0), NULL); + test_equal(tempq_count(), 0); history_deinit(); collection_deinit(); @@ -73,52 +108,8 @@ static void test_tempq() filter_deinit(); } -static void test_next_prev() -{ - test_cp_data_dir(); - filter_init(); - tags_init(); - playlist_init(NULL); - collection_init(NULL); - history_init(NULL); - tempq_init(NULL); - - std::list::iterator it = deck :: get_queues().begin(); - queue *q = history_get_queue(); - queue *q0 = tempq_get(0); - queue *q1 = tempq_get(1); - - queue_unset_flag(q0, Q_RANDOM); - for (unsigned int i = 0; i < 4; i++) - queue_add(q0, track_get(i)); - - test_not_equal(q, Q_NULL); - test_equal(queue_size(q), (unsigned)0); - - for (unsigned int i = 0; i < 2; i++) { - test_equal(deck :: next()->tr_dbe.dbe_index, (unsigned)0); - test_equal(deck :: next()->tr_dbe.dbe_index, (unsigned)1); - test_equal(deck :: next()->tr_dbe.dbe_index, (unsigned)2); - test_equal(deck :: next()->tr_dbe.dbe_index, (unsigned)3); - } - - test_equal(deck :: get_queues().size(), (size_t)1); - - queue_unset_flag(q1, Q_ENABLED); - queue_unset_flag(collection_get_queue(), Q_RANDOM); - - test_equal(queue_size(q1), (unsigned)5); - deck :: next(); - test_equal(queue_size(q1), (unsigned)5); - - queue_set_flag(q1, Q_ENABLED); - for (unsigned int i = 0; i < 5; i++) - deck :: next(); - test_equal(deck :: get_queues().size(), (size_t)0); -} - DECLARE_UNIT_TESTS( UNIT_TEST("Temporary Queue Initialization", test_init), UNIT_TEST("Temporary Queue", test_tempq), - UNIT_TEST("Deck Next and Prev", test_next_prev), + UNIT_TEST("Temporary Queue Next Track", test_next), );