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()
{
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);
}

View File

@ -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<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()
{
std::list<TempQueue>::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<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;
return queue_deck.size();
}

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");
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<TempQueue>::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);
}

View File

@ -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<Gtk::MenuItem>("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;
}

View File

@ -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;

View File

@ -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<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. */
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 */

View File

@ -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<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(
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),
);