[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/network/kcall
From:       George Kiagiadakis <gkiagiad () csd ! uoc ! gr>
Date:       2009-07-19 12:56:47
Message-ID: 1248008207.725125.23584.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 999216 by gkiagia:

Monitor for pad removals from the FsConference and correctly emit and
handle the {audio,video}SrcPadRemoved() signals from QTfChannel.

 M  +6 -2      kcall_handler/farsight/farsightmediahandler.cpp  
 M  +2 -1      libqtgstreamer/qgstbus.cpp  
 M  +38 -0     libqtgstreamer/qgstelement.cpp  
 M  +8 -0      libqtgstreamer/qgstelement.h  
 M  +5 -0      libqtgstreamer/qgstpad.cpp  
 M  +3 -0      libqtgstreamer/qgstpad.h  
 M  +47 -1     libqtpfarsight/qtfchannel.cpp  
 M  +3 -0      libqtpfarsight/qtfchannel.h  


--- trunk/playground/network/kcall/kcall_handler/farsight/farsightmediahandler.cpp #999215:999216
@@ -41,6 +41,8 @@
     AudioBinPtr audioInputBin;
     AudioBinPtr audioOutputBin;
     QGstElementPtr audioAdder;
+
+    QHash<QByteArray, QGstPadPtr> audioAdderPadsMap;
 };
 
 FarsightMediaHandler::FarsightMediaHandler(const Tp::StreamedMediaChannelPtr & channel,
@@ -225,12 +227,14 @@
     Q_ASSERT(!d->audioAdder.isNull() && !d->audioOutputBin.isNull());
     QGstPadPtr sinkPad = d->audioAdder->getRequestPad("sink%d");
     srcPad->link(sinkPad);
+    d->audioAdderPadsMap.insert(srcPad->property<QByteArray>("name"), sinkPad);
 }
 
 void FarsightMediaHandler::audioSrcPadRemoved(QGstPadPtr srcPad)
 {
-    //TODO implement me
-    Q_UNUSED(srcPad);
+    QGstPadPtr sinkPad = d->audioAdderPadsMap.take(srcPad->property<QByteArray>("name"));
+    srcPad->unlink(sinkPad);
+    d->audioAdder->releaseRequestPad(sinkPad);
 }
 
 void FarsightMediaHandler::openVideoOutputDevice(bool *success)
--- trunk/playground/network/kcall/libqtgstreamer/qgstbus.cpp #999215:999216
@@ -35,7 +35,7 @@
 QGstBus::QGstBus(GstBus *gstBus)
     : QGstObject(GST_OBJECT(gstBus))
 {
-    g_signal_connect(gstBus, "message", G_CALLBACK(&QGstBusPrivate::bus_message), this);
+    g_signal_connect(m_object, "message", G_CALLBACK(&QGstBusPrivate::bus_message), this);
 }
 
 //static
@@ -46,6 +46,7 @@
 
 QGstBus::~QGstBus()
 {
+    g_signal_handlers_disconnect_by_func(m_object, (void*) &QGstBusPrivate::bus_message, this);
 }
 
 void QGstBus::addSignalWatch()
--- trunk/playground/network/kcall/libqtgstreamer/qgstelement.cpp #999215:999216
@@ -24,9 +24,39 @@
 
 namespace QtGstreamer {
 
+class QGstElementPrivate
+{
+public:
+    static void no_more_pads(GstElement *element, QGstElement *self);
+    static void pad_added(GstElement *element, GstPad *pad, QGstElement *self);
+    static void pad_removed(GstElement *element, GstPad *pad, QGstElement *self);
+};
+
+//static
+void QGstElementPrivate::no_more_pads(GstElement *element, QGstElement *self)
+{
+    emit self->noMorePads();
+}
+
+//static
+void QGstElementPrivate::pad_added(GstElement *element, GstPad *pad, QGstElement *self)
+{
+    emit self->padAdded(QGstPad::fromGstPad(pad));
+}
+
+//static
+void QGstElementPrivate::pad_removed(GstElement *element, GstPad *pad, QGstElement *self)
+{
+    emit self->padRemoved(QGstPad::fromGstPad(pad));
+}
+
+
 QGstElement::QGstElement(GstElement *gstElement)
     : QGstObject(GST_OBJECT(gstElement))
 {
+    g_signal_connect(m_object, "no-more-pads", G_CALLBACK(&QGstElementPrivate::no_more_pads), this);
+    g_signal_connect(m_object, "pad-added", G_CALLBACK(&QGstElementPrivate::pad_added), this);
+    g_signal_connect(m_object, "pad-removed", G_CALLBACK(&QGstElementPrivate::pad_removed), this);
 }
 
 //static
@@ -37,6 +67,9 @@
 
 QGstElement::~QGstElement()
 {
+    g_signal_handlers_disconnect_by_func(m_object, (void*) &QGstElementPrivate::no_more_pads, this);
+    g_signal_handlers_disconnect_by_func(m_object, (void*) &QGstElementPrivate::pad_added, this);
+    g_signal_handlers_disconnect_by_func(m_object, (void*) &QGstElementPrivate::pad_removed, this);
 }
 
 QGstElement::State QGstElement::currentState() const
@@ -75,6 +108,11 @@
     return QGstPad::fromGstPad(pad);
 }
 
+void QGstElement::releaseRequestPad(const QGstPadPtr & pad)
+{
+    gst_element_release_request_pad(GST_ELEMENT(m_object), GST_PAD(pad->m_object));
+}
+
 QGstBusPtr QGstElement::getBus()
 {
     return QGstBus::fromGstBus(gst_element_get_bus(GST_ELEMENT(m_object)));
--- trunk/playground/network/kcall/libqtgstreamer/qgstelement.h #999215:999216
@@ -29,12 +29,14 @@
 typedef QSharedPointer<QGstBus> QGstBusPtr;
 class QGstElement;
 typedef QSharedPointer<QGstElement> QGstElementPtr;
+class QGstElementPrivate;
 
 class QGstElement : public QGstObject
 {
     Q_OBJECT
     Q_DISABLE_COPY(QGstElement)
     friend class QGstBin;
+    friend class QGstElementPrivate;
 public:
     enum State { VoidPending, Null, Ready, Paused, Playing };
     enum StateChangeReturn { StateChangeFailure, StateChangeSuccess,
@@ -49,6 +51,7 @@
     bool addPad(const QGstPadPtr & pad);
     QGstPadPtr getStaticPad(const char *name);
     QGstPadPtr getRequestPad(const char *name);
+    void releaseRequestPad(const QGstPadPtr & pad);
 
     QGstBusPtr getBus();
 
@@ -72,6 +75,11 @@
                        const QGstElementPtr & element9 = QGstElementPtr(),
                        const QGstElementPtr & element10 = QGstElementPtr());
 
+Q_SIGNALS:
+    void noMorePads();
+    void padAdded(QtGstreamer::QGstPadPtr pad);
+    void padRemoved(QtGstreamer::QGstPadPtr pad);
+
 protected:
     QGstElement(GstElement *gstElement);
 };
--- trunk/playground/network/kcall/libqtgstreamer/qgstpad.cpp #999215:999216
@@ -34,6 +34,11 @@
 {
 }
 
+QGstPad::Direction QGstPad::direction() const
+{
+    return static_cast<Direction>(gst_pad_get_direction(GST_PAD(m_object)));
+}
+
 bool QGstPad::isLinked() const
 {
     return gst_pad_is_linked(GST_PAD(m_object));
--- trunk/playground/network/kcall/libqtgstreamer/qgstpad.h #999215:999216
@@ -36,10 +36,13 @@
 public:
     enum LinkReturn { Ok = 0, WrongHierarchy = -1, WasLinked = -2, WrongDirection = -3,
                       NoFormat = -4, NoSched = -5, Refused = -6 };
+    enum Direction { Unknown, Src, Sink };
 
     static QGstPadPtr fromGstPad(GstPad *gstPad);
     virtual ~QGstPad();
 
+    Direction direction() const;
+
     bool isLinked() const;
     LinkReturn link(const QGstPadPtr &other);
     bool unlink(const QGstPadPtr & other);
--- trunk/playground/network/kcall/libqtpfarsight/qtfchannel.cpp #999215:999216
@@ -30,7 +30,12 @@
     ~Private();
 
     void init(Tp::StreamedMediaChannelPtr channel, QGstBusPtr bus);
+
+    //slots
     void onBusMessage(GstMessage *message);
+    void onAudioSrcPadAdded(QtGstreamer::QGstPadPtr pad);
+    void onVideoSrcPadAdded(QtGstreamer::QGstPadPtr pad);
+    void onConferencePadRemoved(QtGstreamer::QGstPadPtr pad);
 
     static gboolean busWatch(GstBus *bus, GstMessage *message, QTfChannel::Private *self);
     static void onTfChannelClosed(TfChannel *tfChannel, QTfChannel::Private *self);
@@ -50,6 +55,10 @@
     QTfChannel *const q;
     QGstBusPtr m_bus;
 
+    QList<QByteArray> m_audioSrcPads;
+    QList<QByteArray> m_videoSrcPads;
+    QGstElementPtr m_conference;
+
     QMutex m_srcPadAddedMutex;
     bool m_audioOutputDeviceIsOpen;
     bool m_videoOutputDeviceIsOpen;
@@ -83,6 +92,11 @@
     m_bus = bus;
     connect(bus.data(), SIGNAL(message(GstMessage*)), q, SLOT(onBusMessage(GstMessage*)));
 
+    connect(q, SIGNAL(audioSrcPadAdded(QtGstreamer::QGstPadPtr)),
+            q, SLOT(onAudioSrcPadAdded(QtGstreamer::QGstPadPtr)));
+    connect(q, SIGNAL(videoSrcPadAdded(QtGstreamer::QGstPadPtr)),
+            q, SLOT(onVideoSrcPadAdded(QtGstreamer::QGstPadPtr)));
+
     qRegisterMetaType<QGstPadPtr>();
 }
 
@@ -91,6 +105,35 @@
     tf_channel_bus_message(m_tfChannel, message);
 }
 
+void QTfChannel::Private::onAudioSrcPadAdded(QGstPadPtr pad)
+{
+    m_audioSrcPads.append(pad->property<QByteArray>("name"));
+}
+
+void QTfChannel::Private::onVideoSrcPadAdded(QGstPadPtr pad)
+{
+    m_videoSrcPads.append(pad->property<QByteArray>("name"));
+}
+
+void QTfChannel::Private::onConferencePadRemoved(QGstPadPtr pad)
+{
+    if ( pad->direction() != QGstPad::Src ) {
+        return;
+    }
+
+    QByteArray name = pad->property<QByteArray>("name");
+    int index = -1;
+    if ( (index = m_audioSrcPads.indexOf(name)) != -1 ) {
+        m_audioSrcPads.removeAt(index);
+        emit q->audioSrcPadRemoved(pad);
+    } else if ( (index = m_videoSrcPads.indexOf(name)) != -1 ) {
+        m_videoSrcPads.removeAt(index);
+        emit q->videoSrcPadRemoved(pad);
+    } else {
+        Q_ASSERT(false);
+    }
+}
+
 void QTfChannel::Private::onTfChannelClosed(TfChannel *tfChannel, QTfChannel::Private *self)
 {
     Q_UNUSED(tfChannel);
@@ -104,7 +147,10 @@
     Q_UNUSED(tfChannel);
     Q_UNUSED(participant);
     self->m_bus->addSignalWatch();
-    emit self->q->sessionCreated(QGstElement::fromGstElement(GST_ELEMENT(conference)));
+    self->m_conference = QGstElement::fromGstElement(GST_ELEMENT(conference));
+    connect(self->m_conference.data(), SIGNAL(padRemoved(QtGstreamer::QGstPadPtr)),
+            self->q, SLOT(onConferencePadRemoved(QtGstreamer::QGstPadPtr)));
+    emit self->q->sessionCreated(self->m_conference);
 }
 
 
--- trunk/playground/network/kcall/libqtpfarsight/qtfchannel.h #999215:999216
@@ -57,6 +57,9 @@
     friend class Private;
     Private *const d;
     Q_PRIVATE_SLOT(d, void onBusMessage(GstMessage *message));
+    Q_PRIVATE_SLOT(d, void onAudioSrcPadAdded(QtGstreamer::QGstPadPtr pad));
+    Q_PRIVATE_SLOT(d, void onVideoSrcPadAdded(QtGstreamer::QGstPadPtr pad));
+    Q_PRIVATE_SLOT(d, void onConferencePadRemoved(QtGstreamer::QGstPadPtr pad));
 };
 
 #endif
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic