From eec246718ac2f51892bc3f63b89c6f6cef28a9d3 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Sat, 4 Oct 2014 21:21:21 +1000 Subject: [PATCH 1/2] Fix track transitions with gstreamer-1.0. The segment-start event is now a stream-start bus message. Fixes #4542 --- src/engines/gstenginepipeline.cpp | 42 ++++++++++++++++++------------- src/engines/gstenginepipeline.h | 2 +- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/engines/gstenginepipeline.cpp b/src/engines/gstenginepipeline.cpp index 3ef257c26..70854ed27 100644 --- a/src/engines/gstenginepipeline.cpp +++ b/src/engines/gstenginepipeline.cpp @@ -53,7 +53,7 @@ GstEnginePipeline::GstEnginePipeline(GstEngine* engine) sink_(GstEngine::kAutoSink), segment_start_(0), segment_start_received_(false), - emit_track_ended_on_segment_start_(false), + emit_track_ended_on_stream_start_(false), emit_track_ended_on_time_discontinuity_(false), last_buffer_offset_(0), eq_enabled_(false), @@ -540,6 +540,15 @@ GstBusSyncReply GstEnginePipeline::BusCallbackSync(GstBus*, GstMessage* msg, instance->StreamStatusMessageReceived(msg); break; + case GST_MESSAGE_STREAM_START: + if (instance->emit_track_ended_on_stream_start_) { + qLog(Debug) << "New segment started, EOS will signal on next buffer " + "discontinuity"; + instance->emit_track_ended_on_stream_start_ = false; + instance->emit_track_ended_on_time_discontinuity_ = true; + } + break; + default: break; } @@ -792,21 +801,20 @@ GstPadProbeReturn GstEnginePipeline::EventHandoffCallback(GstPad*, qLog(Debug) << instance->id() << "event" << GST_EVENT_TYPE_NAME(e); - if (GST_EVENT_TYPE(e) == GST_EVENT_SEGMENT && - !instance->segment_start_received_) { - // The segment start time is used to calculate the proper offset of data - // buffers from the start of the stream - const GstSegment* segment = nullptr; - gst_event_parse_segment(e, &segment); - instance->segment_start_ = segment->start; - instance->segment_start_received_ = true; + switch (GST_EVENT_TYPE(e)) { + case GST_EVENT_SEGMENT: + if (!instance->segment_start_received_) { + // The segment start time is used to calculate the proper offset of data + // buffers from the start of the stream + const GstSegment* segment = nullptr; + gst_event_parse_segment(e, &segment); + instance->segment_start_ = segment->start; + instance->segment_start_received_ = true; + } + break; - 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; - instance->emit_track_ended_on_time_discontinuity_ = true; - } + default: + break; } return GST_PAD_PROBE_OK; @@ -886,9 +894,9 @@ void GstEnginePipeline::TransitionToNext() { next_end_offset_nanosec_ = 0; // This function gets called when the source has been drained, even if the - // song hasn't finished playing yet. We'll get a new segment when it really + // song hasn't finished playing yet. We'll get a new stream when it really // does finish, so emit TrackEnded then. - emit_track_ended_on_segment_start_ = true; + emit_track_ended_on_stream_start_ = true; // This has to happen *after* the gst_element_set_state on the new bin to // fix an occasional race condition deadlock. diff --git a/src/engines/gstenginepipeline.h b/src/engines/gstenginepipeline.h index ab4ea6d99..60bf70a78 100644 --- a/src/engines/gstenginepipeline.h +++ b/src/engines/gstenginepipeline.h @@ -193,7 +193,7 @@ signals: QMutex buffer_consumers_mutex_; qint64 segment_start_; bool segment_start_received_; - bool emit_track_ended_on_segment_start_; + bool emit_track_ended_on_stream_start_; bool emit_track_ended_on_time_discontinuity_; qint64 last_buffer_offset_; From 0b97a29aa16b824d26bae097da720815ba808563 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Sat, 4 Oct 2014 21:22:29 +1000 Subject: [PATCH 2/2] Set log levels after commandline options are parsed. Fixes --verbose, --quiet and --log-levels --- src/main.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 61675cf91..3eb1a9bf9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -286,14 +286,14 @@ int main(int argc, char* argv[]) { RegisterMetaTypes(); - CommandlineOptions options(argc, argv); - - // Initialise logging + // Initialise logging. Log levels are set after the commandline options are + // parsed below. logging::Init(); - logging::SetLevels(options.log_levels()); g_log_set_default_handler(reinterpret_cast(&logging::GLog), nullptr); + CommandlineOptions options(argc, argv); + { // Only start a core application now so we can check if there's another // Clementine running without needing an X server. @@ -306,6 +306,7 @@ int main(int argc, char* argv[]) { // Parse commandline options - need to do this before starting the // full QApplication so it works without an X server if (!options.Parse()) return 1; + logging::SetLevels(options.log_levels()); if (a.isRunning()) { if (options.is_empty()) {