core/tempq: Move tempq_next() out of the deck namespace

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2015-12-14 10:24:36 -05:00
parent ecda136015
commit b3d95a06d4
7 changed files with 92 additions and 100 deletions

View File

@ -68,12 +68,17 @@ AudioDriver :: ~AudioDriver()
void AudioDriver :: eos() void AudioDriver :: eos()
{ {
struct track *track;
if (cur_track) { if (cur_track) {
track_played(cur_track); track_played(cur_track);
queue_updated(collection_get_queue(), 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() 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) if (cur_track)
history_add(cur_track); history_add(cur_track);
} }

View File

@ -98,6 +98,7 @@ void tempq_free(struct queue *queue)
for (it = queue_deck.begin(); it != queue_deck.end(); it++) { for (it = queue_deck.begin(); it != queue_deck.end(); it++) {
if (&(*it) == queue) { if (&(*it) == queue) {
queue_deinit(&(*it));
queue_deck.erase(it); queue_deck.erase(it);
deck :: write(); deck :: write();
return; return;
@ -141,6 +142,24 @@ void tempq_move(struct queue *queue, unsigned int index)
deck :: write(); deck :: write();
} }
struct track *tempq_next()
{
struct track *track = NULL;
std::list<TempQueue>::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() void deck :: write()
{ {
std::list<TempQueue>::iterator it; std::list<TempQueue>::iterator it;
@ -162,27 +181,7 @@ void deck :: save(struct queue *queue, enum queue_flags flag)
deck :: write(); deck :: write();
} }
struct track *deck :: next() unsigned int tempq_count()
{ {
struct track *track = NULL; return queue_deck.size();
std::list<TempQueue>::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<TempQueue> &deck :: get_queues()
{
return queue_deck;
} }

View File

@ -199,8 +199,8 @@ static void on_page_reordered(Gtk::Widget *page, int num)
{ {
Gtk::Notebook *notebook = gui :: get_widget<Gtk::Notebook>("o_notebook"); Gtk::Notebook *notebook = gui :: get_widget<Gtk::Notebook>("o_notebook");
if ((unsigned int)num >= deck :: get_queues().size()) { if ((unsigned int)num >= tempq_count()) {
notebook->reorder_child(*page, deck::get_queues().size() - 1); notebook->reorder_child(*page, tempq_count() - 1);
return; return;
} }
@ -220,9 +220,8 @@ void init_queue_tabs()
void post_init_queue_tabs() void post_init_queue_tabs()
{ {
std::list<TempQueue>::iterator it; unsigned int i;
unsigned int i = 0;
for (it = deck :: get_queues().begin(); it != deck :: get_queues().end(); it++) for (i = 0; i < tempq_count(); i++)
on_pq_created(&(*it), i++); on_pq_created(tempq_get(i), i);
} }

View File

@ -203,18 +203,18 @@ void Tab :: tab_queue_add(queue *pq)
bool Tab :: tab_queue_selected(bool random) bool Tab :: tab_queue_selected(bool random)
{ {
unsigned int flags = random ? 0 : Q_RANDOM; unsigned int flags = random ? 0 : Q_RANDOM;
if (deck :: get_queues().size() >= 10) if (tempq_count() >= 10)
return true; return true;
queue *pq = tempq_alloc(&tempq_ops, flags); 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); tab_queue_add(pq);
return true; return true;
} }
bool Tab :: tab_add_to_queue(unsigned int n) bool Tab :: tab_add_to_queue(unsigned int n)
{ {
if (n >= deck :: get_queues().size()) if (n >= tempq_count())
return true; return true;
queue *pq = tempq_get(n); 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() void Tab :: on_show_rc_menu()
{ {
std::string item; std::string item;
unsigned int size = deck :: get_queues().size(); unsigned int size = tempq_count();
if (size == 0) { if (size == 0) {
gui :: get_widget<Gtk::MenuItem>("o_add_to_pq")->hide(); gui :: get_widget<Gtk::MenuItem>("o_add_to_pq")->hide();
@ -463,7 +463,7 @@ void post_init_tabs()
post_init_queue_tabs(); post_init_queue_tabs();
unsigned int tab = 0; 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)) if (queue_has_flag(tempq_get(tab), Q_ENABLED))
break; break;
} }

View File

@ -26,20 +26,20 @@ static bool on_window_key_pressed(GdkEventKey *event)
tab_focus_search(); tab_focus_search();
else if (key >= "0" && key <= "9") { else if (key >= "0" && key <= "9") {
unsigned int n = atoi(key.c_str()); unsigned int n = atoi(key.c_str());
if (n < deck::get_queues().size()) if (n < tempq_count())
notebook->set_current_page(n); notebook->set_current_page(n);
} else if (key == "c") } else if (key == "c")
notebook->set_current_page(deck::get_queues().size()); notebook->set_current_page(tempq_count());
else if (key == "h") else if (key == "h")
notebook->set_current_page(deck::get_queues().size() + 1); notebook->set_current_page(tempq_count() + 1);
else if (key == "m") else if (key == "m")
notebook->set_current_page(deck::get_queues().size() + 3); notebook->set_current_page(tempq_count() + 3);
else if (key == "n") else if (key == "n")
gst :: next(); gst :: next();
else if (key == "N") else if (key == "N")
audio :: prev(); audio :: prev();
else if (key == "p") else if (key == "p")
notebook->set_current_page(deck::get_queues().size() + 2); notebook->set_current_page(tempq_count() + 2);
else else
return false; return false;
return true; return true;

View File

@ -46,17 +46,6 @@ namespace deck
void write(); void write();
void save(struct queue *, enum queue_flags); 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<TempQueue> &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. */ /* Called to move a temporary queue to a new index in the list. */
void tempq_move(struct queue *, unsigned int); 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 */ #endif /* OCARINA_CORE_DECK_H */

View File

@ -12,7 +12,6 @@ extern "C" {
} }
#include "test.h" #include "test.h"
static queue *Q_NULL = NULL;
static void test_init() static void test_init()
{ {
@ -22,12 +21,12 @@ static void test_init()
collection_init(NULL); collection_init(NULL);
history_init(NULL); history_init(NULL);
test_equal(deck :: next(), NULL); test_equal(tempq_next(), NULL);
tempq_init(NULL); tempq_init(NULL);
test_equal(deck :: next(), NULL); test_equal(tempq_next(), NULL);
tempq_move(NULL, 1); tempq_move(NULL, 1);
test_equal(tempq_get(0), NULL); test_equal(tempq_get(0), NULL);
test_equal(deck :: get_queues().size(), (size_t)0); test_equal(tempq_count(), 0);
} }
static void test_tempq() 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_SORT), true);
test_equal(queue_has_flag(q0, Q_SAVE_FLAGS), true); test_equal(queue_has_flag(q0, Q_SAVE_FLAGS), true);
test_equal(tempq_get(0), q0); test_equal(tempq_get(0), q0);
test_equal(tempq_count(), 1);
q1 = tempq_alloc(NULL, Q_RANDOM); q1 = tempq_alloc(NULL, Q_RANDOM);
test_not_equal(q1, NULL); 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_SORT), true);
test_equal(queue_has_flag(q1, Q_SAVE_FLAGS), true); test_equal(queue_has_flag(q1, Q_SAVE_FLAGS), true);
test_equal(tempq_get(1), q1); test_equal(tempq_get(1), q1);
test_equal(tempq_count(), 2);
tempq_move(q1, 0); tempq_move(q1, 0);
test_equal(tempq_get(0), q1); test_equal(tempq_get(0), q1);
@ -62,9 +63,43 @@ static void test_tempq()
tempq_free(q0); tempq_free(q0);
test_equal(tempq_get(0), q1); test_equal(tempq_get(0), q1);
test_equal(tempq_count(), 1);
tempq_free(q1); tempq_free(q1);
test_equal(tempq_get(0), NULL); 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(); history_deinit();
collection_deinit(); collection_deinit();
@ -73,52 +108,8 @@ static void test_tempq()
filter_deinit(); 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<TempQueue>::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( DECLARE_UNIT_TESTS(
UNIT_TEST("Temporary Queue Initialization", test_init), UNIT_TEST("Temporary Queue Initialization", test_init),
UNIT_TEST("Temporary Queue", test_tempq), UNIT_TEST("Temporary Queue", test_tempq),
UNIT_TEST("Deck Next and Prev", test_next_prev), UNIT_TEST("Temporary Queue Next Track", test_next),
); );