From 4bc704d7e3b1a03d5112327d55948ca375e427f8 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Mon, 19 Apr 2010 12:04:35 +0000 Subject: [PATCH] Actually show error messages that come from gstreamer. Fixes issue #230 --- src/engines/gstengine.cpp | 2 ++ src/engines/gstenginepipeline.cpp | 32 +++++++++++++++++++------------ src/engines/gstenginepipeline.h | 2 ++ 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/engines/gstengine.cpp b/src/engines/gstengine.cpp index 403cb3339..2007fd3a0 100644 --- a/src/engines/gstengine.cpp +++ b/src/engines/gstengine.cpp @@ -435,6 +435,8 @@ void GstEngine::HandlePipelineError(const QString& message) { qWarning() << "Gstreamer error:" << message; current_pipeline_.reset(); + emit Error(message); + emit StateChanged(Engine::Empty); } diff --git a/src/engines/gstenginepipeline.cpp b/src/engines/gstenginepipeline.cpp index 4f1630f2d..7cca4531a 100644 --- a/src/engines/gstenginepipeline.cpp +++ b/src/engines/gstenginepipeline.cpp @@ -72,8 +72,8 @@ bool GstEnginePipeline::Init(const QUrl &url) { } else { src_ = GstEngine::CreateElement("giosrc"); } - if (!src_) - return false; + if (!src_) // CreateElement will have shown an error dialog, so no need + return false; // one of our own. g_object_set(G_OBJECT(src_), "location", url.toEncoded().constData(), NULL); gst_bin_add(GST_BIN(pipeline_), src_); @@ -135,7 +135,7 @@ bool GstEnginePipeline::Init(const QUrl &url) { audioscale_, convert, audiosink_, NULL); gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), BusCallbackSync, this); - gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), BusCallback, this); + bus_cb_id_ = gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), BusCallback, this); return true; } @@ -149,6 +149,8 @@ GstEnginePipeline::~GstEnginePipeline() { } if (pipeline_) { + gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), NULL, NULL); + g_source_remove(bus_cb_id_); gst_element_set_state(pipeline_, GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipeline_)); } @@ -160,16 +162,9 @@ gboolean GstEnginePipeline::BusCallback(GstBus*, GstMessage* msg, gpointer self) GstEnginePipeline* instance = reinterpret_cast(self); switch ( GST_MESSAGE_TYPE(msg)) { - case GST_MESSAGE_ERROR: { - GError* error; - gchar* debugs; - - gst_message_parse_error(msg, &error, &debugs); - qWarning() << "ERROR RECEIVED IN BUS_CB <" << error->message << ">" ; - - emit instance->Error(QString::fromAscii(error->message)); + case GST_MESSAGE_ERROR: + instance->ErrorMessageReceived(msg); break; - } case GST_MESSAGE_TAG: instance->TagMessageReceived(msg); @@ -192,6 +187,10 @@ GstBusSyncReply GstEnginePipeline::BusCallbackSync(GstBus*, GstMessage* msg, gpo instance->TagMessageReceived(msg); break; + case GST_MESSAGE_ERROR: + instance->ErrorMessageReceived(msg); + break; + default: break; } @@ -199,6 +198,15 @@ GstBusSyncReply GstEnginePipeline::BusCallbackSync(GstBus*, GstMessage* msg, gpo return GST_BUS_PASS; } +void GstEnginePipeline::ErrorMessageReceived(GstMessage* msg) { + GError* error; + gchar* debugs; + + gst_message_parse_error(msg, &error, &debugs); + + emit Error(QString::fromAscii(error->message)); +} + void GstEnginePipeline::TagMessageReceived(GstMessage* msg) { GstTagList* taglist = NULL; gst_message_parse_tag(msg, &taglist); diff --git a/src/engines/gstenginepipeline.h b/src/engines/gstenginepipeline.h index 08037a74d..809137a7c 100644 --- a/src/engines/gstenginepipeline.h +++ b/src/engines/gstenginepipeline.h @@ -77,6 +77,7 @@ class GstEnginePipeline : public QObject { static void EventCallback(GstPad*, GstEvent*, gpointer); void TagMessageReceived(GstMessage*); QString ParseTag(GstTagList* list, const char* tag) const; + void ErrorMessageReceived(GstMessage*); void UpdateVolume(); @@ -112,6 +113,7 @@ class GstEnginePipeline : public QObject { GstElement* audiosink_; uint event_cb_id_; + uint bus_cb_id_; }; #endif // GSTENGINEPIPELINE_H