From dc7dfd0bbdaf9318edc5211de775ae85174672cd Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Wed, 5 Jul 2023 12:36:49 +0200 Subject: [PATCH] ASCI: Add new mode for voice group/broadcast call The new mode "confecho" is similar to "sendrecv", except that it also echoes back RTP towards the sender. This is required for voice group or broadcast calls. Talker and listeners use the same timeslot, so that audio must be echoed from the talker to the listeners. It is different from "loopback", because a loopback only echoes back RTP towards the sender, but does not forward audio through the endpoint to the other connections. Also it does not forward RTP from senders of other connections. The current implementation of MGW does not support transcoding and mixing. This means that a sending connection must not send RTP that has been received by multiple receiving connections. The application that uses the MGW has to set the connection modes, so that only one connection receives RTP in case of a conference. Change-Id: I0639c663e119d85bef1010c7aa45e2f133a9daf0 Related: OS#4853 --- include/osmocom/mgcp/mgcp_common.h | 1 + src/libosmo-mgcp-client/mgcp_client.c | 1 + src/libosmo-mgcp/mgcp_msg.c | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/osmocom/mgcp/mgcp_common.h b/include/osmocom/mgcp/mgcp_common.h index 07d8d37c9..7de45f902 100644 --- a/include/osmocom/mgcp/mgcp_common.h +++ b/include/osmocom/mgcp/mgcp_common.h @@ -47,6 +47,7 @@ enum mgcp_connection_mode { MGCP_CONN_SEND_ONLY = 2, MGCP_CONN_RECV_SEND = MGCP_CONN_RECV_ONLY | MGCP_CONN_SEND_ONLY, MGCP_CONN_LOOPBACK = 4 | MGCP_CONN_RECV_SEND, + MGCP_CONN_CONFECHO = 8 | MGCP_CONN_RECV_SEND, }; #define MGCP_X_OSMO_IGN_HEADER "X-Osmo-IGN:" diff --git a/src/libosmo-mgcp-client/mgcp_client.c b/src/libosmo-mgcp-client/mgcp_client.c index 78652a112..5df4560cb 100644 --- a/src/libosmo-mgcp-client/mgcp_client.c +++ b/src/libosmo-mgcp-client/mgcp_client.c @@ -1548,6 +1548,7 @@ const struct value_string mgcp_client_connection_mode_strs[] = { { MGCP_CONN_RECV_SEND, "sendrecv" }, { MGCP_CONN_SEND_ONLY, "sendonly" }, { MGCP_CONN_RECV_ONLY, "recvonly" }, + { MGCP_CONN_CONFECHO, "confecho" }, { MGCP_CONN_LOOPBACK, "loopback" }, { 0, NULL } }; diff --git a/src/libosmo-mgcp/mgcp_msg.c b/src/libosmo-mgcp/mgcp_msg.c index 26a44c680..a46ffc22b 100644 --- a/src/libosmo-mgcp/mgcp_msg.c +++ b/src/libosmo-mgcp/mgcp_msg.c @@ -75,7 +75,7 @@ void mgcp_disp_msg(unsigned char *message, unsigned int len, char *preamble) } /*! Parse connection mode. - * \param[in] mode as string (recvonly, sendrecv, sendonly or loopback) + * \param[in] mode as string (recvonly, sendrecv, sendonly confecho or loopback) * \param[in] endp pointer to endpoint (only used for log output) * \param[out] associated connection to be modified accordingly * \returns 0 on success, -1 on error */ @@ -100,6 +100,8 @@ int mgcp_parse_conn_mode(const char *mode, struct mgcp_endpoint *endp, conn->mode = MGCP_CONN_RECV_SEND; else if (strcasecmp(mode, "sendonly") == 0) conn->mode = MGCP_CONN_SEND_ONLY; + else if (strcasecmp(mode, "confecho") == 0) + conn->mode = MGCP_CONN_CONFECHO; else if (strcasecmp(mode, "loopback") == 0) conn->mode = MGCP_CONN_LOOPBACK; else {