diff --git a/core/audio.cpp b/core/audio.cpp index 162b0ea9..dc233500 100644 --- a/core/audio.cpp +++ b/core/audio.cpp @@ -207,13 +207,14 @@ int64_t audio_duration() return 0; } -void audio :: next() +struct track *audio_next() { struct track *track = tempq_next(); if (!track) track = queue_next(collection_get_queue()); if (__audio_load(track, audio_cur_state())) history_add(audio_track); + return track; } void audio :: prev() diff --git a/gui/gst.cpp b/gui/gst.cpp index b7bc47c3..b2e82f58 100644 --- a/gui/gst.cpp +++ b/gui/gst.cpp @@ -104,7 +104,7 @@ static gboolean on_gst_message(GstBus *bus, GstMessage *message, gpointer data) case GST_MESSAGE_ERROR: if (parse_gst_error(message) < 0) break; - audio :: next(); + audio_next(); gst :: play(); break; case GST_MESSAGE_EOS: @@ -171,7 +171,7 @@ void gst :: stop() { void gst :: next() { - audio :: next(); + audio_next(); gst :: play(); } diff --git a/gui/playlist.cpp b/gui/playlist.cpp index 469c1111..e5bb8a77 100644 --- a/gui/playlist.cpp +++ b/gui/playlist.cpp @@ -140,7 +140,7 @@ static void on_ban() struct track *track = audio_cur_track(); if (o_ban->get_active()) { if (collection_ban(track)) - audio :: next(); + audio_next(); } else collection_unban(track); } diff --git a/include/core/audio.h b/include/core/audio.h index 1dabe0ce..ede6599a 100644 --- a/include/core/audio.h +++ b/include/core/audio.h @@ -40,7 +40,6 @@ public: namespace audio { - void next(); /**< Find and load the next track that should be played. */ void prev(); /**< Call the deck :: previous() function and load the result. */ /** @@ -109,5 +108,9 @@ gint64 audio_position(); /* Called to find the duration of the current track. */ gint64 audio_duration(); + +/* Called to load the next track. */ +struct track *audio_next(); + GstElement *audio_get_player(); #endif /* OCARINA_CORE_AUDIO_H */ diff --git a/tests/core/audio.cpp b/tests/core/audio.cpp index 7147a5ed..95179ea0 100644 --- a/tests/core/audio.cpp +++ b/tests/core/audio.cpp @@ -6,6 +6,7 @@ extern "C" { #include #include #include +#include } #include #include "test.h" @@ -58,10 +59,12 @@ static void test_init() test_equal(audio_get_player(), NULL); test_equal(audio_cur_track(), NULL); test_equal(audio_cur_state(), GST_STATE_NULL); + test_equal(audio_next(), NULL); core :: init(NULL, NULL, &test_init_data); test_equal(audio_load(NULL), false); + test_equal(audio_next(), NULL); test_equal(audio_play(), false); test_equal(audio_pause(), false); test_equal(audio_stop(), false); @@ -124,6 +127,36 @@ static void test_playback() test_equal(audio_duration(), track_get(0)->tr_length * GST_SECOND); } +static void test_next() +{ + struct queue *history_q = history_get_queue(); + struct queue *temp_q = tempq_alloc(NULL, 0); + int i; + + /* First, let's test getting tracks from a temporary queue. */ + queue_add(temp_q, track_get(2)); + queue_add(temp_q, track_get(1)); + queue_add(temp_q, track_get(0)); + + for (i = 2; i >= 0; i--) { + test_loop_equal(queue_size(temp_q), i + 1, i); + test_loop_equal(audio_next()->tr_dbe.dbe_index, i, i); + test_loop_equal(queue_at(history_q, 0), track_get(i), i); + test_loop_equal(audio_cur_state(), GST_STATE_PAUSED, i); + test_loop_equal(audio_cur_track(), track_get(i), i); + } test_loop_passed(); + test_equal(tempq_get(0), NULL); + + test_equal(audio_play(), true); + /* Tracks should now be picked from the collection. */ + for (i = 1; i <= 3; i++) { + test_loop_equal(audio_next()->tr_track, i, i); + test_loop_equal(queue_at(history_q, 0)->tr_track, i, i); + test_loop_equal(audio_cur_state(), GST_STATE_PLAYING, i); + test_loop_equal(audio_cur_track()->tr_track, i, i); + } test_loop_passed(); +} + static void test_deinit() { core :: deinit(); @@ -154,7 +187,7 @@ void test_pre_init() test_equal(audio_duration(), (long)0); - audio :: next(); + audio_next(); test_equal(audio_cur_track(), TRACK_NULL); audio :: prev(); @@ -184,12 +217,12 @@ void test_track_controls() queue_unset_flag(collection_get_queue(), Q_RANDOM); driver->playing = audio_pause(); - audio :: next(); + audio_next(); test_not_equal(audio_cur_track()->tr_dbe.dbe_index, (unsigned)2); test_equal(driver->is_playing(), false); audio_play(); - audio :: next(); + audio_next(); test_equal(driver->is_playing(), true); audio_load(track); @@ -247,6 +280,7 @@ void test_autopause() DECLARE_UNIT_TESTS( UNIT_TEST("Audio Initialization", test_init), UNIT_TEST("Audio Playback", test_playback), + UNIT_TEST("Audio Next", test_next), UNIT_TEST("Audio Deinitialization", test_deinit), UNIT_TEST("Test Audio Pre-Init", test_pre_init), UNIT_TEST("Test Audio Init 2", test_init2),