From e7dcac4f15c6f210aeb9265c53d3b040e401cca7 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Tue, 4 Jun 2013 22:17:44 +1000 Subject: [PATCH] When transitioning to a preloaded song, emit the EOS event at the time the audio actually changes to the next song instead of when the src changes songs. Fixes issue 3716 --- src/engines/gstengine.h | 2 +- src/engines/gstenginepipeline.cpp | 13 ++++++++++++- src/engines/gstenginepipeline.h | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/engines/gstengine.h b/src/engines/gstengine.h index 467866b61..94c3a93bc 100644 --- a/src/engines/gstengine.h +++ b/src/engines/gstengine.h @@ -157,7 +157,7 @@ class GstEngine : public Engine::Base, public BufferConsumer { private: static const qint64 kTimerIntervalNanosec = 1000 * kNsecPerMsec; // 1s - static const qint64 kPreloadGapNanosec = 1000 * kNsecPerMsec; // 1s + static const qint64 kPreloadGapNanosec = 2000 * kNsecPerMsec; // 2s static const qint64 kSeekDelayNanosec = 100 * kNsecPerMsec; // 100msec static const char* kHypnotoadPipeline; diff --git a/src/engines/gstenginepipeline.cpp b/src/engines/gstenginepipeline.cpp index 63be96532..8b956762b 100644 --- a/src/engines/gstenginepipeline.cpp +++ b/src/engines/gstenginepipeline.cpp @@ -55,6 +55,7 @@ GstEnginePipeline::GstEnginePipeline(GstEngine* engine) segment_start_(0), segment_start_received_(false), emit_track_ended_on_segment_start_(false), + emit_track_ended_on_time_discontinuity_(false), eq_enabled_(false), eq_preamp_(0), stereo_balance_(0.0f), @@ -718,6 +719,14 @@ bool GstEnginePipeline::HandoffCallback(GstPad*, GstBuffer* buf, gpointer self) } } + if (instance->emit_track_ended_on_time_discontinuity_) { + if (GST_BUFFER_FLAG_IS_SET(buf, GST_BUFFER_FLAG_DISCONT)) { + qLog(Debug) << "Buffer discontinuity - emitting EOS"; + instance->emit_track_ended_on_time_discontinuity_ = false; + emit instance->EndOfStreamReached(instance->id(), true); + } + } + return true; } @@ -735,8 +744,10 @@ bool GstEnginePipeline::EventHandoffCallback(GstPad*, GstEvent* e, gpointer self instance->segment_start_received_ = true; if (instance->emit_track_ended_on_segment_start_) { + qLog(Debug) << "New segment started, EOS will signal on next buffer " + "discontinuity"; instance->emit_track_ended_on_segment_start_ = false; - emit instance->EndOfStreamReached(instance->id(), true); + instance->emit_track_ended_on_time_discontinuity_ = true; } } diff --git a/src/engines/gstenginepipeline.h b/src/engines/gstenginepipeline.h index 081e8048c..76e9f81d9 100644 --- a/src/engines/gstenginepipeline.h +++ b/src/engines/gstenginepipeline.h @@ -188,6 +188,7 @@ class GstEnginePipeline : public QObject { qint64 segment_start_; bool segment_start_received_; bool emit_track_ended_on_segment_start_; + bool emit_track_ended_on_time_discontinuity_; // Equalizer bool eq_enabled_;