Forward DTMF as message directly from GSM BS to SIP.
authorAndreas Eversberg <jolly@eversberg.eu>
Sun, 15 Jan 2012 09:51:58 +0000 (10:51 +0100)
committerAndreas Eversberg <jolly@eversberg.eu>
Sun, 15 Jan 2012 09:51:58 +0000 (10:51 +0100)
In case rtp-bridge is used, tones cannot be generated. Instead,
a message is forwarded to SIP endpoint, so it generates it itself.

gsm_bs.cpp
port.cpp
port.h
sip.cpp

index 902065b..ed1d2c0 100644 (file)
@@ -65,7 +65,6 @@ Pgsm_bs::~Pgsm_bs()
 /* DTMF INDICATION */
 void Pgsm_bs::start_dtmf_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc *mncc)
 {
-       struct lcr_msg *message;
        struct gsm_mncc *resp;
 
        gsm_trace_header(p_g_interface_name, this, msg_type, DIRECTION_IN);
@@ -84,10 +83,16 @@ void Pgsm_bs::start_dtmf_ind(unsigned int msg_type, unsigned int callref, struct
        send_and_free_mncc(p_g_lcr_gsm, resp->msg_type, resp);
 
        if (p_g_rtp_bridge) {
-               /* send dtmf information, because we bridge RTP directly */
-               message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_DTMF);
-               message->param.dtmf = mncc->keypad;
-               message_put(message);
+               class Port *remote = bridge_remote();
+
+               if (remote) {
+                       struct lcr_msg *message;
+
+                       /* send dtmf information, because we bridge RTP directly */
+                       message = message_create(0, remote->p_serial, EPOINT_TO_PORT, MESSAGE_DTMF);
+                       message->param.dtmf = mncc->keypad;
+                       message_put(message);
+               }
        } else {
                /* generate DTMF tones, since we do audio forwarding inside LCR */
                switch (mncc->keypad) {
index 4afca9c..d6b70c8 100644 (file)
--- a/port.cpp
+++ b/port.cpp
@@ -1264,23 +1264,31 @@ void Port::bridge(unsigned int bridge_id)
        p_bridge = NULL;
 }
 
-/* send data to remote Port */
-int Port::bridge_tx(unsigned char *data, int len)
+class Port *Port::bridge_remote(void)
 {
-       class Port *to_port = NULL;
+       class Port *remote = NULL;
 
        /* get remote port from bridge */
        if (!p_bridge)
-               return -EINVAL;
+               return NULL;
        if (p_bridge->sunrise == this)
-               to_port = p_bridge->sunset;
+               remote = p_bridge->sunset;
        if (p_bridge->sunset == this)
-               to_port = p_bridge->sunrise;
-       if (!to_port)
+               remote = p_bridge->sunrise;
+
+       return remote;
+}
+
+/* send data to remote Port */
+int Port::bridge_tx(unsigned char *data, int len)
+{
+       class Port *remote = bridge_remote();
+
+       if (!remote)
                return -EINVAL;
 
 //     printf("Traffic: %u -> %u (bridge %u)\n", p_serial, to_port->p_serial, p_bridge->bridge_id);
-       return to_port->bridge_rx(data, len);
+       return remote->bridge_rx(data, len);
 }
 
 /* receive data from remote Port (dummy, needs to be inherited) */
diff --git a/port.h b/port.h
index d09ba0c..6757e9b 100644 (file)
--- a/port.h
+++ b/port.h
@@ -204,6 +204,7 @@ class Port
        /* audio bridging */
        struct port_bridge *p_bridge;           /* linked to a port bridge or NULL */
        void bridge(unsigned int bridge_id);    /* join a bridge */
+       class Port *bridge_remote(void);        /* get remote port */
        int bridge_tx(unsigned char *data, int len); /* used to transmit data to remote port */
        virtual int bridge_rx(unsigned char *data, int len); /* function to be inherited, so data is received */
 
diff --git a/sip.cpp b/sip.cpp
index e39f19c..48ce05d 100644 (file)
--- a/sip.cpp
+++ b/sip.cpp
@@ -1027,17 +1027,9 @@ int Psip::message_dtmf(unsigned int epoint_id, int message_id, union parameter *
 
 int Psip::message_epoint(unsigned int epoint_id, int message_id, union parameter *param)
 {
-       class Endpoint *epoint;
-
        if (Port::message_epoint(epoint_id, message_id, param))
                return 1;
 
-       epoint = find_epoint_id(epoint_id);
-       if (!epoint) {
-               PDEBUG(DEBUG_SIP, "PORT(%s) no endpoint object found where the message is from.\n", p_name);
-               return 0;
-       }
-
        switch(message_id) {
                case MESSAGE_ALERTING: /* call is ringing on LCR side */
                if (p_state != PORT_STATE_IN_SETUP