diff --git a/core/audio.cpp b/core/audio.cpp index 1ea72b14..561a6b25 100644 --- a/core/audio.cpp +++ b/core/audio.cpp @@ -28,6 +28,21 @@ static void __audio_save() file_close(&audio_file); } +static GstState __audio_cur_state() +{ + GstState cur; + gst_element_get_state(audio_player, &cur, NULL, GST_CLOCK_TIME_NONE); + return cur; +} + +static bool __audio_change_state(GstState state) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_FAILURE; + if (__audio_cur_state() != state) + ret = gst_element_set_state(audio_player, state); + return ret != GST_STATE_CHANGE_FAILURE; +} + static bool __audio_load(struct track *track, GstState state) { gchar *path, *uri; @@ -41,7 +56,7 @@ static bool __audio_load(struct track *track, GstState state) gst_element_set_state(audio_player, GST_STATE_NULL); g_object_set(G_OBJECT(audio_player), "uri", uri, NULL); - gst_element_set_state(audio_player, state); + __audio_change_state(state); audio_ops->on_load(track, state); __audio_save(); @@ -133,10 +148,11 @@ bool audio_load(struct track *track) return false; } -void audio :: play() +bool audio_play() { - if (audio_track) - cur_driver->play(); + if (!audio_track) + return false; + return __audio_change_state(GST_STATE_PLAYING); } void audio :: pause() diff --git a/gui/gst.cpp b/gui/gst.cpp index b75c192b..629f7944 100644 --- a/gui/gst.cpp +++ b/gui/gst.cpp @@ -76,14 +76,6 @@ static void on_load(struct track *track, GstState state) class GSTDriver : public AudioDriver { public: - void play() - { - if (gst_change_state(GST_STATE_PLAYING)) { - o_play->hide(); - o_pause->show(); - } - } - void pause() { if (gst_change_state(GST_STATE_PAUSED)) { @@ -166,7 +158,7 @@ static gboolean on_gst_message(GstBus *bus, GstMessage *message, gpointer data) if (parse_gst_error(message) < 0) break; audio :: next(); - audio :: play(); + gst :: play(); break; case GST_MESSAGE_EOS: gst_driver->eos(); @@ -210,10 +202,18 @@ static bool on_timeout() +void gst :: play() +{ + if (audio_play()) { + o_play->hide(); + o_pause->show(); + } +} + void gst :: next() { audio :: next(); - audio :: play(); + gst :: play(); } void gst :: toggle() @@ -221,7 +221,7 @@ void gst :: toggle() if (gst_driver->is_playing()) audio :: pause(); else - audio :: play(); + gst :: play(); } void gst :: init_pre() @@ -247,7 +247,7 @@ void gst :: init_pre() o_next->signal_clicked().connect(sigc::ptr_fun(next)); o_pause->signal_clicked().connect(sigc::ptr_fun(audio :: pause)); - o_play->signal_clicked().connect(sigc::ptr_fun(audio :: play)); + o_play->signal_clicked().connect(sigc::ptr_fun(gst :: play)); o_prev->signal_clicked().connect(sigc::ptr_fun(audio :: prev)); o_seek->signal_change_value().connect(sigc::ptr_fun(on_seek)); o_stop->signal_clicked().connect(sigc::ptr_fun(audio :: stop)); diff --git a/gui/queue/model.cpp b/gui/queue/model.cpp index ccb23504..9d50ed73 100644 --- a/gui/queue/model.cpp +++ b/gui/queue/model.cpp @@ -9,6 +9,7 @@ extern "C" { #include } #include +#include #include @@ -58,7 +59,7 @@ void QueueModel::on_path_selected(const Gtk::TreePath &path) { audio_load(track_get(path_to_id(path))); queue_selected(_queue, path[0]); - audio :: play(); + gst :: play(); } unsigned int QueueModel :: iter_to_id(const Gtk::TreeIter &iter) const diff --git a/include/core/audio.h b/include/core/audio.h index a3229e75..fb4008ac 100644 --- a/include/core/audio.h +++ b/include/core/audio.h @@ -31,11 +31,6 @@ public: virtual ~AudioDriver(); /**< AudioDriver destructor. */ - /** - * Called to begin playback on the currently loaded track. - */ - virtual void play() = 0; - /** * Called to pause playback on the currently loaded track. */ @@ -83,7 +78,6 @@ public: namespace audio { - void play(); /**< Begin playback. */ void pause(); /**< Pause playback. */ /** @@ -157,5 +151,8 @@ void audio_deinit(); /* Called to load a track for playback. */ bool audio_load(struct track *); +/* Called to begin playback. */ +bool audio_play(); + GstElement *audio_get_player(); #endif /* OCARINA_CORE_AUDIO_H */ diff --git a/include/gui/ocarina.h b/include/gui/ocarina.h index 058613ea..0f6306c7 100644 --- a/include/gui/ocarina.h +++ b/include/gui/ocarina.h @@ -43,6 +43,7 @@ void post_init_queue_tabs(); /* gst.cpp */ namespace gst { + void play(); void next(); void toggle(); void init_pre(); diff --git a/tests/core/audio.cpp b/tests/core/audio.cpp index 098ff614..dd1c9b39 100644 --- a/tests/core/audio.cpp +++ b/tests/core/audio.cpp @@ -25,7 +25,6 @@ public: TestDriver() : playing(false), cur_pos(0), cur_duration(0) {} ~TestDriver() {}; - void play() { playing = true; } void pause() { playing = false; } bool is_playing() { return playing; } @@ -62,7 +61,9 @@ static void test_init() core :: init(NULL, NULL, &test_init_data); test_equal(audio_load(NULL), false); + test_equal(audio_play(), false); test_equal(audio :: current_track(), NULL); + test_equal(load_count, 0); collection_add("tests/Music/Hyrule Symphony"); while (idle_run_task()) {}; @@ -103,7 +104,7 @@ void test_pre_init() test_equal(audio :: current_track(), TRACK_NULL); - audio :: play(); + audio_play(); test_equal(driver->playing, false); driver->playing = true; @@ -150,7 +151,7 @@ void test_playback_controls() { TestDriver *driver = (TestDriver *)audio :: get_driver(); - audio :: play(); + driver->playing = audio_play(); test_equal(driver->playing, true); audio :: pause(); @@ -160,7 +161,7 @@ void test_playback_controls() test_equal(driver->cur_pos, (long)4242); test_equal(audio :: position(), (long)4242); - audio :: play(); + audio_play(); audio :: stop(); test_equal(driver->playing, false); test_equal(driver->cur_pos, (long)0); @@ -183,7 +184,7 @@ void test_track_controls() test_not_equal(audio :: current_track()->tr_dbe.dbe_index, (unsigned)2); test_equal(driver->is_playing(), false); - audio :: play(); + audio_play(); audio :: next(); test_equal(driver->is_playing(), true); @@ -210,7 +211,7 @@ void test_autopause() { TestDriver *driver = (TestDriver *)audio :: get_driver(); - audio :: play(); + audio_play(); test_equal(audio :: pause_enabled(), false); test_equal(audio :: pause_count(), (unsigned)0);