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.
This commit is contained in:
Andreas Eversberg
2023-11-15 20:37:40 +01:00
parent a9573aa5cb
commit d1b8ed8250
4 changed files with 21 additions and 7 deletions

View File

@@ -97,6 +97,8 @@ static struct osmo_cc_helper_audio_codecs codecs[] = {
{ NULL, 0, 0, NULL, NULL}, { NULL, 0, 0, NULL, NULL},
}; };
static int no_l16 = 0;
/* stream patterns/announcements */ /* stream patterns/announcements */
int16_t *ringback_spl = NULL; int16_t *ringback_spl = NULL;
int ringback_size = 0; int ringback_size = 0;
@@ -421,7 +423,7 @@ static void indicate_setup(process_t *process, const char *callerid, const char
/* bearer capability */ /* bearer capability */
osmo_cc_add_ie_bearer(msg, OSMO_CC_CODING_ITU_T, OSMO_CC_CAPABILITY_AUDIO, OSMO_CC_MODE_CIRCUIT); osmo_cc_add_ie_bearer(msg, OSMO_CC_CODING_ITU_T, OSMO_CC_CAPABILITY_AUDIO, OSMO_CC_MODE_CIRCUIT);
/* sdp offer */ /* 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"); PDEBUG(DCALL, DEBUG_INFO, "Indicate OSMO-CC setup towards fixed network\n");
osmo_cc_ll_msg(ep, process->callref, msg); 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; const char *sdp;
/* sdp accept */ /* 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) { if (!sdp) {
disconnect_process(callref, 47); disconnect_process(callref, 47);
indicate_disconnect_release(callref, 47, OSMO_CC_MSG_REJ_IND); 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); 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; int rc;
@@ -907,6 +909,7 @@ int call_init(const char *name, int _send_patterns, int _release_on_disconnect,
g711_init(); g711_init();
no_l16 = !!_no_l16;
ep = &endpoint; 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); 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) if (rc > 0)

View File

@@ -9,7 +9,7 @@ enum number_type {
TYPE_INTERNATIONAL, 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); void call_exit(void);
int call_handle(void); int call_handle(void);
void call_media_handle(void); void call_media_handle(void);

View File

@@ -72,6 +72,7 @@ static int use_osmocc_sock = 0;
#define MAX_CC_ARGS 1024 #define MAX_CC_ARGS 1024
static int cc_argc = 0; static int cc_argc = 0;
static const char *cc_argv[MAX_CC_ARGS]; static const char *cc_argv[MAX_CC_ARGS];
int no_l16 = 0;
int send_patterns = 1; int send_patterns = 1;
static int release_on_disconnect = 1; static int release_on_disconnect = 1;
int loopback = 0; 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(" Disable built-in call control and offer socket\n");
printf(" --cc \"<osmo-cc arg>\" [--cc ...]\n"); printf(" --cc \"<osmo-cc arg>\" [--cc ...]\n");
printf(" Pass arguments to Osmo-CC endpoint. Use '-cc help' for description.\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(" -t --tones 0 | 1\n");
printf(" Connect call on setup/release to provide classic tones towards fixed\n"); printf(" Connect call on setup/release to provide classic tones towards fixed\n");
printf(" network (default = '%d')\n", send_patterns); 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_SAMPLERATE 1008
#define OPT_CALL_BUFFER 1009 #define OPT_CALL_BUFFER 1009
#define OPT_FAST_MATH 1010 #define OPT_FAST_MATH 1010
#define OPT_NO_L16 1011
#define OPT_LIMESDR 1100 #define OPT_LIMESDR 1100
#define OPT_LIMESDR_MINI 1101 #define OPT_LIMESDR_MINI 1101
@@ -379,6 +383,7 @@ void main_mobile_add_options(void)
option_add('x', "osmocc-cross", 0); option_add('x', "osmocc-cross", 0);
option_add('o', "osmocc-sock", 0); option_add('o', "osmocc-sock", 0);
option_add(OPT_OSMO_CC, "cc", 1); option_add(OPT_OSMO_CC, "cc", 1);
option_add(OPT_NO_L16, "no-l16", 0);
option_add('c', "call-device", 1); option_add('c', "call-device", 1);
option_add(OPT_CALL_SAMPLERATE, "call-samplerate", 1); option_add(OPT_CALL_SAMPLERATE, "call-samplerate", 1);
option_add(OPT_CALL_BUFFER, "call-buffer", 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]); cc_argv[cc_argc++] = options_strdup(argv[argi]);
break; break;
case OPT_NO_L16:
no_l16 = 1;
break;
case 'c': case 'c':
call_device = options_strdup(argv[argi]); call_device = options_strdup(argv[argi]);
break; 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); console_init(call_device, call_samplerate, call_buffer, loopback, echo_test, number_digits, number_lengths, station_id);
/* init call control instance */ /* 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) { if (rc < 0) {
fprintf(stderr, "Failed to create call control instance. Quitting!\n"); fprintf(stderr, "Failed to create call control instance. Quitting!\n");
return; return;

View File

@@ -27,7 +27,9 @@
#include "../libtimer/timer.h" #include "../libtimer/timer.h"
#include "../libselect/select.h" #include "../libselect/select.h"
#include "../libdebug/debug.h" #include "../libdebug/debug.h"
#include "endpoint.h" #include "session.h"
#include "message.h"
#include "rtp.h"
#include "helper.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) 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); 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); 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); 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); sdp = osmo_cc_session_send_offer(session);
osmo_cc_add_ie_sdp(msg, sdp); osmo_cc_add_ie_sdp(msg, sdp);