From 2d188bdb3f6fe4f84f28cee8e7f44840078c82bd Mon Sep 17 00:00:00 2001 From: Dmytro Poplavskiy Date: Fri, 10 Feb 2012 16:17:01 +1000 Subject: Fixed gst bus helper when qt build without glib support The bus helper should not be singleton. Also combined glib and non glib cases. Change-Id: Ie18a94bfdb5413a92a5c4ff4283527360737d52d Reviewed-by: Michael Goddard --- src/gsttools/qgstreamerbushelper.cpp | 131 +++++++++++------------------------ 1 file changed, 39 insertions(+), 92 deletions(-) (limited to 'src') diff --git a/src/gsttools/qgstreamerbushelper.cpp b/src/gsttools/qgstreamerbushelper.cpp index b572de634..daf721309 100644 --- a/src/gsttools/qgstreamerbushelper.cpp +++ b/src/gsttools/qgstreamerbushelper.cpp @@ -48,34 +48,55 @@ QT_BEGIN_NAMESPACE -#ifndef QT_NO_GLIB + class QGstreamerBusHelperPrivate : public QObject { Q_OBJECT - public: - void addWatch(GstBus* bus, QGstreamerBusHelper* helper) + QGstreamerBusHelperPrivate(QGstreamerBusHelper *parent, GstBus* bus) : + QObject(parent), + m_bus(bus), + m_helper(parent) { - setParent(helper); +#ifdef QT_NO_GLIB + Q_UNUSED(bus); + + m_intervalTimer = new QTimer(this); + m_intervalTimer->setInterval(250); + + connect(m_intervalTimer, SIGNAL(timeout()), SLOT(interval())); + m_intervalTimer->start(); +#else m_tag = gst_bus_add_watch_full(bus, 0, busCallback, this, NULL); - m_helper = helper; +#endif + } - void removeWatch(QGstreamerBusHelper* helper) + ~QGstreamerBusHelperPrivate() { - Q_UNUSED(helper); + m_helper = 0; +#ifdef QT_NO_GLIB + m_intervalTimer->stop(); +#else g_source_remove(m_tag); +#endif } - static QGstreamerBusHelperPrivate* instance() + GstBus* bus() const { return m_bus; } + +private slots: + void interval() { - return new QGstreamerBusHelperPrivate; + GstMessage* message; + while ((message = gst_bus_poll(m_bus, GST_MESSAGE_ANY, 0)) != 0) { + processMessage(message); + gst_message_unref(message); + } } private: - void processMessage(GstBus* bus, GstMessage* message) + void processMessage(GstMessage* message) { - Q_UNUSED(bus); QGstreamerMessage msg(message); foreach (QGstreamerBusMessageFilter *filter, busFilters) { if (filter->processBusMessage(msg)) @@ -86,91 +107,21 @@ private: static gboolean busCallback(GstBus *bus, GstMessage *message, gpointer data) { - reinterpret_cast(data)->processMessage(bus, message); + Q_UNUSED(bus); + reinterpret_cast(data)->processMessage(message); return TRUE; } - guint m_tag; + guint m_tag; + GstBus* m_bus; QGstreamerBusHelper* m_helper; - -public: - GstBus* bus; - QMutex filterMutex; - QList syncFilters; - QList busFilters; -}; - -#else - -class QGstreamerBusHelperPrivate : public QObject -{ - Q_OBJECT - typedef QMap HelperMap; - -public: - void addWatch(GstBus* bus, QGstreamerBusHelper* helper) - { - m_helperMap.insert(helper, bus); - - if (m_helperMap.size() == 1) - m_intervalTimer->start(); - } - - void removeWatch(QGstreamerBusHelper* helper) - { - m_helperMap.remove(helper); - - if (m_helperMap.size() == 0) - m_intervalTimer->stop(); - } - - static QGstreamerBusHelperPrivate* instance() - { - static QGstreamerBusHelperPrivate self; - - return &self; - } - -private slots: - void interval() - { - for (HelperMap::iterator it = m_helperMap.begin(); it != m_helperMap.end(); ++it) { - GstMessage* message; - - while ((message = gst_bus_poll(it.value(), GST_MESSAGE_ANY, 0)) != 0) { - QGstreamerMessage msg(message); - foreach (QGstreamerBusMessageFilter *filter, busFilters) { - if (filter->processBusMessage(msg)) - break; - } - emit it.key()->message(msg); - - gst_message_unref(message); - } - - emit it.key()->message(QGstreamerMessage()); - } - } - -private: - QGstreamerBusHelperPrivate() - { - m_intervalTimer = new QTimer(this); - m_intervalTimer->setInterval(250); - - connect(m_intervalTimer, SIGNAL(timeout()), SLOT(interval())); - } - - HelperMap m_helperMap; QTimer* m_intervalTimer; public: - GstBus* bus; QMutex filterMutex; QList syncFilters; QList busFilters; }; -#endif static GstBusSyncReply syncGstBusFilter(GstBus* bus, GstMessage* message, QGstreamerBusHelperPrivate *d) @@ -193,19 +144,15 @@ static GstBusSyncReply syncGstBusFilter(GstBus* bus, GstMessage* message, QGstre */ QGstreamerBusHelper::QGstreamerBusHelper(GstBus* bus, QObject* parent): - QObject(parent), - d(QGstreamerBusHelperPrivate::instance()) + QObject(parent) { - d->bus = bus; - d->addWatch(bus, this); - + d = new QGstreamerBusHelperPrivate(this, bus); gst_bus_set_sync_handler(bus, (GstBusSyncHandler)syncGstBusFilter, d); } QGstreamerBusHelper::~QGstreamerBusHelper() { - d->removeWatch(this); - gst_bus_set_sync_handler(d->bus,0,0); + gst_bus_set_sync_handler(d->bus(),0,0); } void QGstreamerBusHelper::installMessageFilter(QObject *filter) -- cgit v1.2.3