From d928442c511fbe7a0d0d0f9e701412b9b494457c Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Sun, 15 Jan 2012 10:51:58 +0100 Subject: [PATCH] Forward DTMF as message directly from GSM BS to SIP. 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 | 15 ++++++++++----- port.cpp | 24 ++++++++++++++++-------- port.h | 1 + sip.cpp | 8 -------- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/gsm_bs.cpp b/gsm_bs.cpp index 902065b..ed1d2c0 100644 --- a/gsm_bs.cpp +++ b/gsm_bs.cpp @@ -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) { diff --git a/port.cpp b/port.cpp index 4afca9c..d6b70c8 100644 --- 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 --- 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 --- 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 -- 2.13.6