Author: dzzinstant
Date: Tue Jun  3 21:25:59 2014
New Revision: 13

URL: http://svn.gna.org/viewcvs/pidgin-zrtp?rev=13&view=rev
Log:
Handling of secondary streams fixed: audio+video calls work

Modified:
    trunk/Changelog
    trunk/src/zrtp-conf/zrtp-call.c
    trunk/src/zrtp-conf/zrtp-call.h

Modified: trunk/Changelog
URL: 
http://svn.gna.org/viewcvs/pidgin-zrtp/trunk/Changelog?rev=13&r1=12&r2=13&view=diff
==============================================================================
--- trunk/Changelog     (original)
+++ trunk/Changelog     Tue Jun  3 21:25:59 2014
@@ -23,3 +23,5 @@
 * pidgin-mediawindow.diff makes PidginMedia available for plugin, so
   ZRTP controlbox can be added to the PidginMedia window.
   Occasionally freezes Pidgin window!
+* Handling of secondary streams fixed => audio+video calls work
+

Modified: trunk/src/zrtp-conf/zrtp-call.c
URL: 
http://svn.gna.org/viewcvs/pidgin-zrtp/trunk/src/zrtp-conf/zrtp-call.c?rev=13&r1=12&r2=13&view=diff
==============================================================================
--- trunk/src/zrtp-conf/zrtp-call.c     (original)
+++ trunk/src/zrtp-conf/zrtp-call.c     Tue Jun  3 21:25:59 2014
@@ -94,6 +94,11 @@
 
 static GstElement* create_zrtpfilter(ZrtpCall *self, guint id);
 
+static void
+zrtp_status (GstElement *element, gint severity, gint subCode, gpointer data);
+static void
+zrtp_slaveStatus (GstElement *element, gint severity, gint subCode, gpointer 
data);
+
 static GstPad* get_zrtppad(ZrtpCall *self, guint sess_id, 
                gboolean is_recv, gboolean is_rtp, gboolean is_src); 
 
@@ -194,8 +199,7 @@
 {
        GstElement *zrtpfilter;
 
-       g_object_get(self,
-                       "zrtpmaster", &zrtpfilter, NULL);
+       g_object_get(self, "zrtpmaster", &zrtpfilter, NULL);
        return zrtpfilter;
 }
 /* ** */
@@ -466,24 +470,42 @@
 };
 
 static void 
-zrtp_connect_slave_cb (GstElement *element, gpointer data)  {
+connect_slave (ZrtpCall *self, GstElement *element)  {
+       GstElement *zrtpmaster = find_master(self);
        GByteArray *mspArr = NULL;
-       ZrtpCall *self = ZRTP_CALL(data);
-       ZrtpCallPrivate *priv = ZRTP_CALL_GET_PRIVATE(self);
-       GstElement *zrtpmaster = find_master(self);
-
-       if (!element || !zrtpmaster)
-               return;
+       guint32 masterssrc, slavessrc;
+       gulong signal_id;
+       g_return_if_fail(GST_IS_ELEMENT(zrtpmaster));
+       g_return_if_fail(GST_IS_ELEMENT(element));
+
+       signal_id = g_signal_handler_find(G_OBJECT(element),
+                       G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0,
+                       NULL, G_CALLBACK(zrtp_status), self);
+       g_signal_handler_disconnect(G_OBJECT(element), signal_id);
+       g_signal_connect(G_OBJECT(element),
+                       "status", G_CALLBACK(zrtp_slaveStatus), self);
 
        g_object_get(G_OBJECT(zrtpmaster), "multi-param", &mspArr, NULL);
-       DEBUG_ZRTPCALL(self, "connect_slave_cb(zrtpfilter=%p): zrtpmaster=%p 
Application pointers %p, %d bytes", 
+       DEBUG_ZRTPCALL(self, "connect_slave(zrtpfilter=%p): zrtpmaster=%p 
Application pointers %p, %d bytes", 
                        element, zrtpmaster, mspArr->data, mspArr->len);
 
-       g_object_set(G_OBJECT(element), 
+       g_object_set(G_OBJECT(element),
                        "multi-param", mspArr,
-                       "enable", priv->do_enable,
-                       "start", priv->do_enable,
+                       "enable", TRUE,
                        NULL);
+       
+       g_object_get(G_OBJECT(zrtpmaster), "local-ssrc", &masterssrc, NULL);
+       g_object_get(G_OBJECT(element), "local-ssrc", &slavessrc, NULL);
+       if (slavessrc == masterssrc)
+               DEBUG_ZRTPCALL(self, "connect_slave(zrtpfilter=%p): Same 
SSRC=0x%08x!",
+                               element, slavessrc);
+}
+
+static void
+zrtp_slaveStatus (GstElement *element, gint severity, gint subCode, gpointer 
data)
+{
+       DEBUG_ZRTPCALL(NULL, "_slaveStatus(filter=%p): Called with severity=%d, 
subCode=%d", 
+                       element, severity, subCode);
 }
 
 static void
@@ -496,51 +518,48 @@
                case ZRTPINFO_HelloReceived:
                        // TODO: move to an unambiguous point between 
                        // "stream-info": NEW_STREAM and the first 
"new-zrtpfilter"
-                       g_signal_emit_by_name(priv->conference, "new-zrtpcall",
-                                       self);
-                       break;
+                       if (!find_master(self))
+                               g_signal_emit_by_name(priv->conference, 
"new-zrtpcall",
+                                               self);
+                       break;
+
                case ZRTPINFO_InitConf1Received:
                case ZRTPINFO_RespConf2Received:
                case ZRTPINFO_RSMatchFound:
-               {
-                       /* First zrtpfilter that establishes an encrypted 
connection will become master */
                        if (!find_master(self)) {
+                               /* First zrtpfilter that establishes an 
encrypted connection */
                                zrtp_call_set_master(self, element);
+                               /* Exclude zrtpmaster from pendinglist */
+                               self->zrtp_pending = 
g_list_remove(self->zrtp_pending, element);
                                
-                               DEBUG_ZRTPCALL(self, 
-                                               "_statusInfo(): emit 
'new-zrtpmaster': participant=%s", 
-                                               priv->participant);
                                g_signal_emit_by_name(priv->conference, 
"new-zrtpmaster",
                                                self);
-
-                               /* Exclude zrtpmaster from pendinglist */
-                               self->zrtp_pending = 
g_list_remove(self->zrtp_pending, element);
-
                        }
                        break;
-               }
+
                case ZRTPINFO_SecureStateOn:
-               {
+               {
                        GList *link;
 
                        DEBUG_ZRTPCALL(self, "_handleInfo(filter=%p): security 
is set to on (subCode=%d)",
-                               element, subCode);
+                                       element, subCode);
                        zrtp_call_set_state(self, ZRTPSTATE_ENCRYPTED);
-                       
+
                        DEBUG_ZRTPCALL(self, "_statusInfo(): Iterate through 
all %d slave elements",
                                        g_list_length(self->zrtp_pending)); 
                        for (link = g_list_first(self->zrtp_pending); link; 
                                        link = g_list_delete_link(link, link)) {
-                               GstElement *slave = link->data;
-                               zrtp_connect_slave_cb(slave, self);
+                               connect_slave(self, GST_ELEMENT(link->data));
                        }
                        break;
                }
                case ZRTPINFO_SecureStateOff:
-                       zrtp_call_set_state(self, ZRTPSTATE_CLEAR);
+                       zrtp_call_set_state(self, ZRTPSTATE_CONFIGURED);
                        zrtp_call_set_master(self, NULL);
+
                        DEBUG_ZRTPCALL(self, "_handleInfo(filter=%p): security 
is set to off (subCode=%d)",
-                                  element,     subCode);
+                                       element, subCode);
+                       break;
                default:
                        break;
        }
@@ -579,8 +598,8 @@
 
 void zrtp_signals_connect(ZrtpCall *self, GstElement *zrtp)
 {
-       g_signal_connect(zrtp, "status",        G_CALLBACK(zrtp_status), self);
-       g_signal_connect(zrtp, "sas",                   G_CALLBACK(zrtp_sas), 
self);
+       g_signal_connect(zrtp, "status",        G_CALLBACK(zrtp_status), self);
+       g_signal_connect(zrtp, "sas",           G_CALLBACK(zrtp_sas), self);
        g_signal_connect(zrtp, "algorithm",     G_CALLBACK(zrtp_algorithm), 
self);
 }
 /* */
@@ -622,12 +641,12 @@
 
        /* Copy mspArr directly if zrtp master has already set up encryption */
        if (self->zrtp_state == ZRTPSTATE_ENCRYPTED) {
-               zrtp_connect_slave_cb(zrtpfilter, self);
+               connect_slave(self, zrtpfilter);
        } else {
                self->zrtp_pending = g_list_append(self->zrtp_pending, 
zrtpfilter);
                DEBUG_ZRTPCALL(self, 
-                               "create_zrtpfilter(): Added (id=%d, 
participant=%s) to pending list (now %d elements)", 
-                               id, priv->participant, 
g_list_length(self->zrtp_pending) ); 
+                               "create_zrtpfilter(): %p (id=%d, 
participant=%s) to pending list (now %d elements)", 
+                               zrtpfilter, id, priv->participant, 
g_list_length(self->zrtp_pending) ); 
        }
        zrtpfilter_configure(self, id);
 
@@ -672,18 +691,18 @@
        GstElement *zrtpfilter = find_zrtpfilter(self, id);
 
        if (self->zrtp_state == ZRTPSTATE_INIT) {
-               // First zrtpfilter may start negotiation
+               /* Only first zrtpfilter may start negotiation */
                g_object_set(G_OBJECT(zrtpfilter),
                                "cache-name", priv->cachename,  
                                "enable", priv->do_enable, 
                                "initialize", priv->do_initialize,
                                NULL);
-               zrtp_call_set_state(self, ZRTPSTATE_CLEAR);
+               zrtp_call_set_state(self, ZRTPSTATE_CONFIGURED);
        } else {
                g_object_set(G_OBJECT(zrtpfilter), 
-                               "cache-name", priv->cachename,  
+                               "cache-name", priv->cachename,
                                "enable", priv->do_enable, 
-                               "start", priv->do_enable, 
+                               "initialize", FALSE,
                                NULL);
        }
 }

Modified: trunk/src/zrtp-conf/zrtp-call.h
URL: 
http://svn.gna.org/viewcvs/pidgin-zrtp/trunk/src/zrtp-conf/zrtp-call.h?rev=13&r1=12&r2=13&view=diff
==============================================================================
--- trunk/src/zrtp-conf/zrtp-call.h     (original)
+++ trunk/src/zrtp-conf/zrtp-call.h     Tue Jun  3 21:25:59 2014
@@ -36,7 +36,7 @@
 enum ZrtpState {
        ZRTPSTATE_NONE = 0,
        ZRTPSTATE_INIT,
-       ZRTPSTATE_CLEAR,
+       ZRTPSTATE_CONFIGURED,
        ZRTPSTATE_ENCRYPTED,
 };
 


_______________________________________________
Pidgin-zrtp-commits mailing list
Pidgin-zrtp-commits@gna.org
https://mail.gna.org/listinfo/pidgin-zrtp-commits

Reply via email to