diff options
author | Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com> | 2012-02-10 16:17:01 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-10 08:02:07 +0100 |
commit | 2d188bdb3f6fe4f84f28cee8e7f44840078c82bd (patch) | |
tree | 6cdfced80ad4bfd367e5bdaf5f37d70b11b12711 /src/gsttools | |
parent | 32b68f17f59a7736de6b4928c6c97e7584e6eb6f (diff) |
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 <michael.goddard@nokia.com>
Diffstat (limited to 'src/gsttools')
-rw-r--r-- | src/gsttools/qgstreamerbushelper.cpp | 131 |
1 files changed, 39 insertions, 92 deletions
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<QGstreamerBusHelperPrivate*>(data)->processMessage(bus, message); + Q_UNUSED(bus); + reinterpret_cast<QGstreamerBusHelperPrivate*>(data)->processMessage(message); return TRUE; } - guint m_tag; + guint m_tag; + GstBus* m_bus; QGstreamerBusHelper* m_helper; - -public: - GstBus* bus; - QMutex filterMutex; - QList<QGstreamerSyncMessageFilter*> syncFilters; - QList<QGstreamerBusMessageFilter*> busFilters; -}; - -#else - -class QGstreamerBusHelperPrivate : public QObject -{ - Q_OBJECT - typedef QMap<QGstreamerBusHelper*, GstBus*> 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<QGstreamerSyncMessageFilter*> syncFilters; QList<QGstreamerBusMessageFilter*> 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) |