Deliver GStreamer signals through Qt event loop
authorSami Rosendahl <ext-sami.1.rosendahl@nokia.com>
Mon, 26 Mar 2012 11:05:27 +0000 (14:05 +0300)
committerQt by Nokia <qt-info@nokia.com>
Tue, 27 Mar 2012 04:28:31 +0000 (06:28 +0200)
Emitting a Qt signal directly from GLib callback causes issues to clients.
Queue the GStreamer signal and forward it to as a Qt signal from a handler
that is invoked via the Qt event loop.

Task-number: QTBUG-24927
Change-Id: I3c91efcce1261caf7b643fbff10663e1b093f2a8
Reviewed-by: Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com>
src/gsttools/qgstreamerbushelper.cpp

index 68c8795cef9c4114a0a1cb6c6df1b11630df4595..751e805ba9ca8e950a489a81b1f2c855cb22cbcd 100644 (file)
@@ -98,17 +98,20 @@ private:
     void processMessage(GstMessage* message)
     {
         QGstreamerMessage msg(message);
-        foreach (QGstreamerBusMessageFilter *filter, busFilters) {
-            if (filter->processBusMessage(msg))
-                break;
-        }
-        emit m_helper->message(msg);
+        doProcessMessage(msg);
+    }
+
+    void queueMessage(GstMessage* message)
+    {
+        QGstreamerMessage msg(message);
+        QMetaObject::invokeMethod(this, "doProcessMessage", Qt::QueuedConnection,
+                                  Q_ARG(QGstreamerMessage, msg));
     }
 
     static gboolean busCallback(GstBus *bus, GstMessage *message, gpointer data)
     {
         Q_UNUSED(bus);
-        reinterpret_cast<QGstreamerBusHelperPrivate*>(data)->processMessage(message);
+        reinterpret_cast<QGstreamerBusHelperPrivate*>(data)->queueMessage(message);
         return TRUE;
     }
 
@@ -117,6 +120,16 @@ private:
     QGstreamerBusHelper*  m_helper;
     QTimer*     m_intervalTimer;
 
+private slots:
+    void doProcessMessage(const QGstreamerMessage& msg)
+    {
+        foreach (QGstreamerBusMessageFilter *filter, busFilters) {
+            if (filter->processBusMessage(msg))
+                break;
+        }
+        emit m_helper->message(msg);
+    }
+
 public:
     QMutex filterMutex;
     QList<QGstreamerSyncMessageFilter*> syncFilters;