Deliver GStreamer signals through Qt event loop

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>
This commit is contained in:
Sami Rosendahl
2012-03-26 14:05:27 +03:00
committed by Qt by Nokia
parent aa291c55b4
commit 13025c05c7

View 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;