diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2021-01-31 08:28:14 +0100 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2021-03-14 11:20:55 +0100 |
commit | 2017066db5d60f017031800c65c3f7dc4bb1c1b0 (patch) | |
tree | 2fa9f62fc379c1ed7b654a526b17458133d96aa7 /src/libosmocc | |
parent | 027846d895469f020b68bfaee8a097f17a1df130 (diff) |
Updated libs
Diffstat (limited to 'src/libosmocc')
-rw-r--r-- | src/libosmocc/helper.c | 50 | ||||
-rw-r--r-- | src/libosmocc/message.c | 54 | ||||
-rw-r--r-- | src/libosmocc/message.h | 3 | ||||
-rw-r--r-- | src/libosmocc/session.c | 3 |
4 files changed, 94 insertions, 16 deletions
diff --git a/src/libosmocc/helper.c b/src/libosmocc/helper.c index cde8b27..6317ed3 100644 --- a/src/libosmocc/helper.c +++ b/src/libosmocc/helper.c @@ -56,10 +56,10 @@ const char *osmo_cc_helper_audio_accept(void *priv, struct osmo_cc_helper_audio_ { char offer_sdp[65536]; const char *accept_sdp; - osmo_cc_session_media_t *media, *selected_media = NULL; - osmo_cc_session_codec_t *codec, *selected_codec = NULL; + osmo_cc_session_media_t *media, *selected_media; + osmo_cc_session_codec_t *codec, *selected_codec, *telephone_event; int rc; - int i, selected_i; + int i, selected_codec_i, telephone_event_i; if (*session_p) { PDEBUG(DCC, DEBUG_ERROR, "Session already set, please fix!\n"); @@ -83,33 +83,53 @@ const char *osmo_cc_helper_audio_accept(void *priv, struct osmo_cc_helper_audio_ return NULL; } - selected_i = -1; + selected_media = NULL; osmo_cc_session_for_each_media((*session_p)->media_list, media) { /* only audio */ if (media->description.type != osmo_cc_session_media_type_audio) continue; + selected_codec_i = -1; + selected_codec = NULL; + telephone_event_i = -1; + telephone_event = NULL; osmo_cc_session_for_each_codec(media->codec_list, codec) { - for (i = 0; codecs[i].payload_name; i++) { - if (osmo_cc_session_if_codec(codec, codecs[i].payload_name, codecs[i].payload_rate, codecs[i].payload_channels)) { - /* select the first matchting codec or the one we prefer */ - if (selected_i < 0 || i < selected_i) { - selected_codec = codec; - selected_media = media; - selected_i = i; + if (!!strcasecmp(codec->payload_name, "telephone-event")) { + for (i = 0; codecs[i].payload_name; i++) { + if (osmo_cc_session_if_codec(codec, codecs[i].payload_name, codecs[i].payload_rate, codecs[i].payload_channels)) { + /* select the first matchting codec or the one we prefer */ + if (selected_codec_i < 0 || i < selected_codec_i) { + selected_codec = codec; + selected_codec_i = i; + selected_media = media; + } + /* if we don't force our preferred codec, use the preferred one from the remote */ + if (!force_our_codec) + break; } - /* if we don't force our preferred codec, use the preferred one from the remote */ - if (!force_our_codec) - break; + } + } else { + /* special case: add telephone-event, if supported */ + for (i = 0; codecs[i].payload_name; i++) { + if (!!strcasecmp(codecs[i].payload_name, "telephone-event")) + continue; + telephone_event = codec; + telephone_event_i = i; + break; } } } + /* codec is selected within this media, we are done */ + if (selected_codec) + break; } if (!selected_codec) { PDEBUG(DCC, DEBUG_ERROR, "No codec found in setup message that we support.\n"); osmo_cc_free_session(*session_p); return NULL; } - osmo_cc_session_accept_codec(selected_codec, codecs[selected_i].encoder, codecs[selected_i].decoder); + osmo_cc_session_accept_codec(selected_codec, codecs[selected_codec_i].encoder, codecs[selected_codec_i].decoder); + if (telephone_event) + osmo_cc_session_accept_codec(telephone_event, codecs[telephone_event_i].encoder, codecs[telephone_event_i].decoder); osmo_cc_session_accept_media(selected_media, 0, 0, NULL, 1, 1, receiver); osmo_cc_rtp_open(selected_media); osmo_cc_rtp_connect(selected_media); diff --git a/src/libosmocc/message.c b/src/libosmocc/message.c index 0eb25ac..afee718 100644 --- a/src/libosmocc/message.c +++ b/src/libosmocc/message.c @@ -98,6 +98,60 @@ const char *osmo_cc_msg_name(uint8_t msg_type) } } +const char *osmo_cc_network_type_name(uint8_t type) +{ + switch (type) { + case OSMO_CC_NETWORK_UNDEFINED: + return ""; + case OSMO_CC_NETWORK_ALSA_NONE: + return "alsa"; + case OSMO_CC_NETWORK_POTS_NONE: + return "pots"; + case OSMO_CC_NETWORK_ISDN_NONE: + return "isdn"; + case OSMO_CC_NETWORK_SIP_NONE: + return "sip"; + case OSMO_CC_NETWORK_GSM_IMSI: + return "gsm-imsi"; + case OSMO_CC_NETWORK_GSM_IMEI: + return "gsm-imei"; + case OSMO_CC_NETWORK_WEB_NONE: + return "web"; + case OSMO_CC_NETWORK_DECT_NONE: + return "decs"; + case OSMO_CC_NETWORK_BLUETOOTH_NONE: + return "bluetooth"; + case OSMO_CC_NETWORK_SS5_NONE: + return "ss5"; + case OSMO_CC_NETWORK_ANETZ_NONE: + return "anetz"; + case OSMO_CC_NETWORK_BNETZ_MUENZ: + return "bnetz"; + case OSMO_CC_NETWORK_CNETZ_NONE: + return "cnetz"; + case OSMO_CC_NETWORK_NMT_NONE: + return "nmt"; + case OSMO_CC_NETWORK_R2000_NONE: + return "radiocom2000"; + case OSMO_CC_NETWORK_AMPS_ESN: + return "amps"; + case OSMO_CC_NETWORK_MTS_NONE: + return "mts"; + case OSMO_CC_NETWORK_IMTS_NONE: + return "imts"; + case OSMO_CC_NETWORK_EUROSIGNAL_NONE: + return "eurosignal"; + case OSMO_CC_NETWORK_JOLLYCOM_NONE: + return "jollycom"; + case OSMO_CC_NETWORK_MPT1327_PSTN: + return "mpt1327-pstn"; + case OSMO_CC_NETWORK_MPT1327_PBX: + return "mpt1327-pbx"; + default: + return "<unknown>"; + } +} + /* create message with maximum size */ osmo_cc_msg_t *osmo_cc_new_msg(uint8_t msg_type) { diff --git a/src/libosmocc/message.h b/src/libosmocc/message.h index 7821988..7f0b228 100644 --- a/src/libosmocc/message.h +++ b/src/libosmocc/message.h @@ -251,6 +251,8 @@ enum osmo_cc_ie_type { #define OSMO_CC_NETWORK_IMTS_NONE 0x87 #define OSMO_CC_NETWORK_EUROSIGNAL_NONE 0x88 #define OSMO_CC_NETWORK_JOLLYCOM_NONE 0x89 /* call from JollyCom... */ +#define OSMO_CC_NETWORK_MPT1327_PSTN 0x8a /* call from MPT1327 */ +#define OSMO_CC_NETWORK_MPT1327_PBX 0x8b /* id is selected PBX number */ typedef struct osmo_cc_msg { uint8_t type; @@ -379,6 +381,7 @@ struct osmo_cc_ie_private { uint32_t osmo_cc_new_callref(void); const char *osmo_cc_msg_name(uint8_t msg_type); +const char *osmo_cc_network_type_name(uint8_t type); osmo_cc_msg_t *osmo_cc_new_msg(uint8_t msg_type); osmo_cc_msg_t *osmo_cc_clone_msg(osmo_cc_msg_t *msg); osmo_cc_msg_t *osmo_cc_msg_list_dequeue(osmo_cc_msg_list_t **mlp, uint32_t *callref_p); diff --git a/src/libosmocc/session.c b/src/libosmocc/session.c index 9751845..1438ae2 100644 --- a/src/libosmocc/session.c +++ b/src/libosmocc/session.c @@ -26,6 +26,7 @@ #include <inttypes.h> #include "../libtimer/timer.h" #include "../libdebug/debug.h" +#include "../liboptions/options.h" #include "endpoint.h" #define NTP_OFFSET 2208988800 @@ -38,7 +39,7 @@ void osmo_cc_set_local_peer(enum osmo_cc_session_nettype nettype, enum osmo_cc_s { default_nettype = nettype; default_addrtype = addrtype; - default_unicast_address = strdup(address); + default_unicast_address = options_strdup(address); } osmo_cc_session_t *osmo_cc_new_session(void *priv, const char *username, const char *sess_id, const char *sess_version, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *unicast_address, const char *session_name, int debug) |