From d1b8ed8250336f29fc3c027e3b015775d510b807 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Wed, 15 Nov 2023 20:37:40 +0100 Subject: [PATCH] Add option to disable L16 codec (linear 16 bit PCM) Yate uses wrong byte order, so the codec fails. Disable it if you have problems with Yate or other defective peers. --- src/libmobile/call.c | 9 ++++++--- src/libmobile/call.h | 2 +- src/libmobile/main_mobile.c | 10 +++++++++- src/libosmocc/helper.c | 7 +++++-- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/libmobile/call.c b/src/libmobile/call.c index 15aa1df..853a628 100644 --- a/src/libmobile/call.c +++ b/src/libmobile/call.c @@ -97,6 +97,8 @@ static struct osmo_cc_helper_audio_codecs codecs[] = { { NULL, 0, 0, NULL, NULL}, }; +static int no_l16 = 0; + /* stream patterns/announcements */ int16_t *ringback_spl = NULL; int ringback_size = 0; @@ -421,7 +423,7 @@ static void indicate_setup(process_t *process, const char *callerid, const char /* bearer capability */ osmo_cc_add_ie_bearer(msg, OSMO_CC_CODING_ITU_T, OSMO_CC_CAPABILITY_AUDIO, OSMO_CC_MODE_CIRCUIT); /* sdp offer */ - process->session = osmo_cc_helper_audio_offer(&ep->session_config, process, codecs, down_audio, msg, 1); + process->session = osmo_cc_helper_audio_offer(&ep->session_config, process, codecs + no_l16, down_audio, msg, 1); PDEBUG(DCALL, DEBUG_INFO, "Indicate OSMO-CC setup towards fixed network\n"); osmo_cc_ll_msg(ep, process->callref, msg); @@ -708,7 +710,7 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref, const char *sdp; /* sdp accept */ - sdp = osmo_cc_helper_audio_accept(&ep->session_config, process, codecs, down_audio, msg, &process->session, &process->codec, 0); + sdp = osmo_cc_helper_audio_accept(&ep->session_config, process, codecs + no_l16, down_audio, msg, &process->session, &process->codec, 0); if (!sdp) { disconnect_process(callref, 47); indicate_disconnect_release(callref, 47, OSMO_CC_MSG_REJ_IND); @@ -898,7 +900,7 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref, osmo_cc_free_msg(msg); } -int call_init(const char *name, int _send_patterns, int _release_on_disconnect, int use_socket, int argc, const char *argv[]) +int call_init(const char *name, int _send_patterns, int _release_on_disconnect, int use_socket, int argc, const char *argv[], int _no_l16) { int rc; @@ -907,6 +909,7 @@ int call_init(const char *name, int _send_patterns, int _release_on_disconnect, g711_init(); + no_l16 = !!_no_l16; ep = &endpoint; rc = osmo_cc_new(ep, OSMO_CC_VERSION, name, OSMO_CC_LOCATION_PRIV_SERV_LOC_USER, ll_msg_cb, (use_socket) ? NULL : console_msg, NULL, argc, argv); if (rc > 0) diff --git a/src/libmobile/call.h b/src/libmobile/call.h index d38f8ab..fe26161 100644 --- a/src/libmobile/call.h +++ b/src/libmobile/call.h @@ -9,7 +9,7 @@ enum number_type { TYPE_INTERNATIONAL, }; -int call_init(const char *name, int _send_patterns, int _release_on_disconnect, int use_socket, int argc, const char *argv[]); +int call_init(const char *name, int _send_patterns, int _release_on_disconnect, int use_socket, int argc, const char *argv[], int no_l16); void call_exit(void); int call_handle(void); void call_media_handle(void); diff --git a/src/libmobile/main_mobile.c b/src/libmobile/main_mobile.c index 85eeace..a27acb8 100644 --- a/src/libmobile/main_mobile.c +++ b/src/libmobile/main_mobile.c @@ -72,6 +72,7 @@ static int use_osmocc_sock = 0; #define MAX_CC_ARGS 1024 static int cc_argc = 0; static const char *cc_argv[MAX_CC_ARGS]; +int no_l16 = 0; int send_patterns = 1; static int release_on_disconnect = 1; int loopback = 0; @@ -276,6 +277,8 @@ void main_mobile_print_help(const char *arg0, const char *ext_usage) printf(" Disable built-in call control and offer socket\n"); printf(" --cc \"\" [--cc ...]\n"); printf(" Pass arguments to Osmo-CC endpoint. Use '-cc help' for description.\n"); + printf(" --no-l16\n"); + printf(" Disable L16 (linear 16 bit) codec.\n"); printf(" -t --tones 0 | 1\n"); printf(" Connect call on setup/release to provide classic tones towards fixed\n"); printf(" network (default = '%d')\n", send_patterns); @@ -358,6 +361,7 @@ void main_mobile_print_hotkeys(void) #define OPT_CALL_SAMPLERATE 1008 #define OPT_CALL_BUFFER 1009 #define OPT_FAST_MATH 1010 +#define OPT_NO_L16 1011 #define OPT_LIMESDR 1100 #define OPT_LIMESDR_MINI 1101 @@ -379,6 +383,7 @@ void main_mobile_add_options(void) option_add('x', "osmocc-cross", 0); option_add('o', "osmocc-sock", 0); option_add(OPT_OSMO_CC, "cc", 1); + option_add(OPT_NO_L16, "no-l16", 0); option_add('c', "call-device", 1); option_add(OPT_CALL_SAMPLERATE, "call-samplerate", 1); option_add(OPT_CALL_BUFFER, "call-buffer", 1); @@ -480,6 +485,9 @@ int main_mobile_handle_options(int short_option, int argi, char **argv) } cc_argv[cc_argc++] = options_strdup(argv[argi]); break; + case OPT_NO_L16: + no_l16 = 1; + break; case 'c': call_device = options_strdup(argv[argi]); break; @@ -658,7 +666,7 @@ void main_mobile_loop(const char *name, int *quit, void (*myhandler)(void), cons console_init(call_device, call_samplerate, call_buffer, loopback, echo_test, number_digits, number_lengths, station_id); /* init call control instance */ - rc = call_init(name, (use_osmocc_sock) ? send_patterns : 0, release_on_disconnect, use_osmocc_sock, cc_argc, cc_argv); + rc = call_init(name, (use_osmocc_sock) ? send_patterns : 0, release_on_disconnect, use_osmocc_sock, cc_argc, cc_argv, no_l16); if (rc < 0) { fprintf(stderr, "Failed to create call control instance. Quitting!\n"); return; diff --git a/src/libosmocc/helper.c b/src/libosmocc/helper.c index c2e7bf3..468eca0 100644 --- a/src/libosmocc/helper.c +++ b/src/libosmocc/helper.c @@ -27,7 +27,9 @@ #include "../libtimer/timer.h" #include "../libselect/select.h" #include "../libdebug/debug.h" -#include "endpoint.h" +#include "session.h" +#include "message.h" +#include "rtp.h" #include "helper.h" osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug) @@ -44,8 +46,9 @@ osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, vo media = osmo_cc_add_media(session, 0, 0, NULL, osmo_cc_session_media_type_audio, 0, osmo_cc_session_media_proto_rtp, 1, 1, receiver, debug); osmo_cc_rtp_open(media); - for (i = 0; codecs[i].payload_name; i++) + for (i = 0; codecs[i].payload_name; i++) { osmo_cc_add_codec(media, codecs[i].payload_name, codecs[i].payload_rate, codecs[i].payload_channels, codecs[i].encoder, codecs[i].decoder, debug); + } sdp = osmo_cc_session_send_offer(session); osmo_cc_add_ie_sdp(msg, sdp);