diff --git a/src/engine/gstengine.cpp b/src/engine/gstengine.cpp index 4cfae4558..15a5140c6 100644 --- a/src/engine/gstengine.cpp +++ b/src/engine/gstengine.cpp @@ -349,7 +349,7 @@ void GstEngine::Pause() { StartFadeoutPause(); } else { - current_pipeline_->SetStateAsync(GST_STATE_PAUSED); + current_pipeline_->SetState(GST_STATE_PAUSED); Q_EMIT StateChanged(State::Paused); StopTimers(); } @@ -371,7 +371,7 @@ void GstEngine::Unpause() { has_faded_out_to_pause_ = false; } - current_pipeline_->SetStateAsync(GST_STATE_PLAYING); + current_pipeline_->SetState(GST_STATE_PLAYING); Q_EMIT StateChanged(State::Playing); @@ -688,7 +688,7 @@ void GstEngine::FadeoutPauseFinished() { if (!fadeout_pause_pipeline_) return; - fadeout_pause_pipeline_->SetStateAsync(GST_STATE_PAUSED); + fadeout_pause_pipeline_->SetState(GST_STATE_PAUSED); Q_EMIT StateChanged(State::Paused); StopTimers(); has_faded_out_to_pause_ = true; diff --git a/src/engine/gstenginepipeline.cpp b/src/engine/gstenginepipeline.cpp index f442a72f6..75002f389 100644 --- a/src/engine/gstenginepipeline.cpp +++ b/src/engine/gstenginepipeline.cpp @@ -408,7 +408,7 @@ bool GstEnginePipeline::Finish() { finished_ = true; } else { - SetStateAsync(GST_STATE_NULL); + SetState(GST_STATE_NULL); } return finished_.value(); @@ -1793,7 +1793,13 @@ bool GstEnginePipeline::IsStateNull() const { } -QFuture GstEnginePipeline::SetStateAsync(const GstState state) { +void GstEnginePipeline::SetStateAsync(const GstState state) { + + QMetaObject::invokeMethod(this, "SetState", Qt::QueuedConnection, Q_ARG(GstState, state)); + +} + +QFuture GstEnginePipeline::SetState(const GstState state) { qLog(Debug) << "Setting pipeline" << id() << "state to" << GstStateText(state); @@ -1801,7 +1807,7 @@ QFuture GstEnginePipeline::SetStateAsync(const GstState st QObject::connect(watcher, &QFutureWatcher::finished, this, [this, watcher, state]() { const GstStateChangeReturn state_change_return = watcher->result(); watcher->deleteLater(); - SetStateAsyncFinished(state, state_change_return); + SetStateFinishedSlot(state, state_change_return); }); QFuture future = QtConcurrent::run(&set_state_threadpool_, &gst_element_set_state, pipeline_, state); watcher->setFuture(future); @@ -1810,7 +1816,7 @@ QFuture GstEnginePipeline::SetStateAsync(const GstState st } -void GstEnginePipeline::SetStateAsyncFinished(const GstState state, const GstStateChangeReturn state_change_return) { +void GstEnginePipeline::SetStateFinishedSlot(const GstState state, const GstStateChangeReturn state_change_return) { switch (state_change_return) { case GST_STATE_CHANGE_SUCCESS: @@ -1840,7 +1846,7 @@ QFuture GstEnginePipeline::Play(const bool pause, const qu pending_state_ = GST_STATE_PLAYING; } - return SetStateAsync(GST_STATE_PAUSED); + return SetState(GST_STATE_PAUSED); } @@ -1858,7 +1864,7 @@ bool GstEnginePipeline::Seek(const qint64 nanosec) { if (next_uri_set_.value()) { pending_seek_nanosec_ = nanosec; - SetStateAsync(GST_STATE_READY); + SetState(GST_STATE_READY); return true; } @@ -1873,7 +1879,7 @@ bool GstEnginePipeline::Seek(const qint64 nanosec) { qLog(Debug) << "Seek succeeded"; if (pending_state_.value() != GST_STATE_NULL) { qLog(Debug) << "Setting state from pending state" << GstStateText(pending_state_.value()); - SetStateAsync(pending_state_.value()); + SetState(pending_state_.value()); pending_state_ = GST_STATE_NULL; } } diff --git a/src/engine/gstenginepipeline.h b/src/engine/gstenginepipeline.h index 4ba32356b..12bfbd78b 100644 --- a/src/engine/gstenginepipeline.h +++ b/src/engine/gstenginepipeline.h @@ -93,7 +93,7 @@ class GstEnginePipeline : public QObject { void RemoveAllBufferConsumers(); // Control the music playback - Q_INVOKABLE QFuture SetStateAsync(const GstState state); + Q_INVOKABLE QFuture SetState(const GstState state); Q_INVOKABLE QFuture Play(const bool pause, const quint64 offset_nanosec); Q_INVOKABLE bool Seek(const qint64 nanosec); void SeekAsync(const qint64 nanosec); @@ -165,6 +165,7 @@ class GstEnginePipeline : public QObject { bool IsStateNull() const; bool InitAudioBin(QString &error); void SetupVolume(GstElement *element); + void SetStateAsync(const GstState state); // Static callbacks. The GstEnginePipeline instance is passed in the last argument. static GstPadProbeReturn UpstreamEventsProbeCallback(GstPad *pad, GstPadProbeInfo *info, gpointer self); @@ -199,7 +200,7 @@ class GstEnginePipeline : public QObject { void ResumeFaderAsync(); private Q_SLOTS: - void SetStateAsyncFinished(const GstState state, const GstStateChangeReturn state_change_return); + void SetStateFinishedSlot(const GstState state, const GstStateChangeReturn state_change_return); void SetFaderVolume(const qreal volume); void FaderTimelineStateChanged(const QTimeLine::State state); void FaderTimelineFinished();