From eb537eb0a0e55dca2ab7e2fd09faedca19a96f52 Mon Sep 17 00:00:00 2001 From: Mark Furneaux Date: Thu, 2 Jul 2015 20:25:14 -0400 Subject: [PATCH] Add mono output support in the engine Mono playback was removed from the pipeline in the transition to gst 1.0. --- src/engines/gstenginepipeline.cpp | 36 ++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/engines/gstenginepipeline.cpp b/src/engines/gstenginepipeline.cpp index b9b1bd898..83a5c3b93 100644 --- a/src/engines/gstenginepipeline.cpp +++ b/src/engines/gstenginepipeline.cpp @@ -77,6 +77,7 @@ GstEnginePipeline::GstEnginePipeline(GstEngine* engine) pipeline_is_initialised_(false), pipeline_is_connected_(false), pending_seek_nanosec_(-1), + last_known_position_ns_(0), volume_percent_(100), volume_modifier_(1.0), pipeline_(nullptr), @@ -386,7 +387,18 @@ bool GstEnginePipeline::Init() { gst_element_link(probe_queue, probe_converter); gst_element_link_many(audio_queue, equalizer_preamp_, equalizer_, stereo_panorama_, volume_, audioscale_, convert, - audiosink_, nullptr); + nullptr); + + // add caps for mono, but only if requested + if (mono_playback_) { + GstCaps* caps32 = gst_caps_new_simple("audio/x-raw", "format", + G_TYPE_STRING, "S32LE", nullptr); + gst_caps_set_simple(caps32, "channels", G_TYPE_INT, 1, nullptr); + gst_element_link_filtered(convert, audiosink_, caps32); + gst_caps_unref(caps32); + } else { + gst_element_link(convert, audiosink_); + } // Add probes and handlers. gst_pad_add_probe(gst_element_get_static_pad(probe_converter, "src"), @@ -622,10 +634,7 @@ QPair ParseAkamaiTag(const QString& tag) { return qMakePair(tag, QString()); } -bool IsAkamaiTag(const QString& tag) { - return tag.contains("- text=\""); -} - +bool IsAkamaiTag(const QString& tag) { return tag.contains("- text=\""); } } void GstEnginePipeline::TagMessageReceived(GstMessage* msg) { @@ -926,9 +935,9 @@ void GstEnginePipeline::SourceSetupCallback(GstURIDecodeBin* bin, if (g_object_class_find_property(G_OBJECT_GET_CLASS(element), "extra-headers") && instance->url().host().contains("amazonaws.com")) { - GstStructure* headers = gst_structure_new( - "extra-headers", "Authorization", G_TYPE_STRING, - instance->url().fragment().toAscii().data(), nullptr); + GstStructure* headers = + gst_structure_new("extra-headers", "Authorization", G_TYPE_STRING, + instance->url().fragment().toAscii().data(), nullptr); g_object_set(element, "extra-headers", headers, nullptr); gst_structure_free(headers); } @@ -941,7 +950,8 @@ void GstEnginePipeline::SourceSetupCallback(GstURIDecodeBin* bin, nullptr); #ifdef Q_OS_DARWIN - g_object_set(element, "tls-database", instance->engine_->tls_database(), nullptr); + g_object_set(element, "tls-database", instance->engine_->tls_database(), + nullptr); g_object_set(element, "ssl-use-system-ca-file", false, nullptr); g_object_set(element, "ssl-strict", TRUE, nullptr); #endif @@ -976,10 +986,11 @@ void GstEnginePipeline::TransitionToNext() { } qint64 GstEnginePipeline::position() const { - gint64 value = 0; - gst_element_query_position(pipeline_, GST_FORMAT_TIME, &value); + if (pipeline_is_initialised_) + gst_element_query_position(pipeline_, GST_FORMAT_TIME, + &last_known_position_ns_); - return value; + return last_known_position_ns_; } qint64 GstEnginePipeline::length() const { @@ -1033,6 +1044,7 @@ bool GstEnginePipeline::Seek(qint64 nanosec) { } pending_seek_nanosec_ = -1; + last_known_position_ns_ = nanosec; return gst_element_seek_simple(pipeline_, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, nanosec); }