fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmocom-bb/+/34912?usp=email )
Change subject: mobile: clarify TCH I/O {handler,format} naming ......................................................................
mobile: clarify TCH I/O {handler,format} naming
Before we add handling of TCH I/O for data calls, let's rename the existing voice related symbols, fields, and the VTY commands to have 'voice' in their names. Add backward compatibility aliases.
Change-Id: If6c799d11e225ad00ca5da5ae63dca20568a0ce0 Related: OS#4396 --- M src/host/layer23/include/osmocom/bb/common/settings.h M src/host/layer23/src/common/settings.c M src/host/layer23/src/mobile/gapk_io.c M src/host/layer23/src/mobile/gsm48_rr.c M src/host/layer23/src/mobile/voice.c M src/host/layer23/src/mobile/vty_interface.c 6 files changed, 128 insertions(+), 91 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/12/34912/1
diff --git a/src/host/layer23/include/osmocom/bb/common/settings.h b/src/host/layer23/include/osmocom/bb/common/settings.h index e56e201..aeb4abd 100644 --- a/src/host/layer23/include/osmocom/bb/common/settings.h +++ b/src/host/layer23/include/osmocom/bb/common/settings.h @@ -26,39 +26,39 @@ MNCC_HANDLER_DUMMY, };
-/* TCH frame I/O handler */ -enum audio_io_handler { +/* TCH I/O handler for voice calls */ +enum tch_voice_io_handler { /* No handler, drop frames */ - AUDIO_IOH_NONE = 0, + TCH_VOICE_IOH_NONE = 0, /* libosmo-gapk based handler */ - AUDIO_IOH_GAPK, + TCH_VOICE_IOH_GAPK, /* L1 PHY (e.g. Calypso DSP) */ - AUDIO_IOH_L1PHY, + TCH_VOICE_IOH_L1PHY, /* External MNCC app (via MNCC socket) */ - AUDIO_IOH_MNCC_SOCK, + TCH_VOICE_IOH_MNCC_SOCK, /* Return to sender */ - AUDIO_IOH_LOOPBACK, + TCH_VOICE_IOH_LOOPBACK, };
-extern const struct value_string audio_io_handler_names[]; -static inline const char *audio_io_handler_name(enum audio_io_handler val) -{ return get_value_string(audio_io_handler_names, val); } +extern const struct value_string tch_voice_io_handler_names[]; +static inline const char *tch_voice_io_handler_name(enum tch_voice_io_handler val) +{ return get_value_string(tch_voice_io_handler_names, val); }
-/* TCH frame I/O format */ -enum audio_io_format { - /* RTP format (RFC3551 for FR/EFR, RFC5993 for HR, RFC4867 for AMR) */ - AUDIO_IOF_RTP, +/* TCH I/O frame format */ +enum tch_io_frame_format { + /* RFC3551 for FR/EFR, RFC5993 for HR, RFC4867 for AMR, packed bits for data */ + TCH_IOFF_RTP, /* Texas Instruments format, used by Calypso based phones (e.g. Motorola C1xx) */ - AUDIO_IOF_TI, + TCH_IOFF_TI, };
-extern const struct value_string audio_io_format_names[]; -static inline const char *audio_io_format_name(enum audio_io_format val) -{ return get_value_string(audio_io_format_names, val); } +extern const struct value_string tch_io_frame_format_names[]; +static inline const char *tch_io_frame_format_name(enum tch_io_frame_format val) +{ return get_value_string(tch_io_frame_format_names, val); }
-struct audio_settings { - enum audio_io_handler io_handler; - enum audio_io_format io_format; +struct tch_settings { + enum tch_voice_io_handler voice_handler; + enum tch_io_frame_format frame_format; char alsa_output_dev[128]; char alsa_input_dev[128]; }; @@ -119,8 +119,8 @@ /* MNCC handler */ enum mncc_handler_t mncc_handler;
- /* Audio settings */ - struct audio_settings audio; + /* TCH settings */ + struct tch_settings tch;
/* IMEI */ char imei[GSM23003_IMEI_NUM_DIGITS + 1]; diff --git a/src/host/layer23/src/common/settings.c b/src/host/layer23/src/common/settings.c index 5bae325..6caaa00 100644 --- a/src/host/layer23/src/common/settings.c +++ b/src/host/layer23/src/common/settings.c @@ -48,10 +48,10 @@ snprintf(set->mncc_socket_path, sizeof(set->mncc_socket_path) - 1, "%s_%s", mncc_socket_path, ms->name);
- /* Audio settings: drop TCH frames by default */ - set->audio.io_handler = AUDIO_IOH_NONE; - OSMO_STRLCPY_ARRAY(set->audio.alsa_output_dev, alsa_dev_default); - OSMO_STRLCPY_ARRAY(set->audio.alsa_input_dev, alsa_dev_default); + /* TCH voice: drop frames by default */ + set->tch.voice_handler = TCH_VOICE_IOH_NONE; + OSMO_STRLCPY_ARRAY(set->tch.alsa_output_dev, alsa_dev_default); + OSMO_STRLCPY_ARRAY(set->tch.alsa_input_dev, alsa_dev_default);
/* Built-in MNCC handler */ set->mncc_handler = MNCC_HANDLER_INTERNAL; @@ -226,18 +226,18 @@ return 0; }
-const struct value_string audio_io_handler_names[] = { - { AUDIO_IOH_NONE, "none" }, - { AUDIO_IOH_GAPK, "gapk" }, - { AUDIO_IOH_L1PHY, "l1phy" }, - { AUDIO_IOH_MNCC_SOCK, "mncc-sock" }, - { AUDIO_IOH_LOOPBACK, "loopback" }, +const struct value_string tch_voice_io_handler_names[] = { + { TCH_VOICE_IOH_NONE, "none" }, + { TCH_VOICE_IOH_GAPK, "gapk" }, + { TCH_VOICE_IOH_L1PHY, "l1phy" }, + { TCH_VOICE_IOH_MNCC_SOCK, "mncc-sock" }, + { TCH_VOICE_IOH_LOOPBACK, "loopback" }, { 0, NULL } };
-const struct value_string audio_io_format_names[] = { - { AUDIO_IOF_RTP, "rtp" }, - { AUDIO_IOF_TI, "ti" }, +const struct value_string tch_io_frame_format_names[] = { + { TCH_IOFF_RTP, "rtp" }, + { TCH_IOFF_TI, "ti" }, { 0, NULL } };
diff --git a/src/host/layer23/src/mobile/gapk_io.c b/src/host/layer23/src/mobile/gapk_io.c index a2a4e84..e86d625 100644 --- a/src/host/layer23/src/mobile/gapk_io.c +++ b/src/host/layer23/src/mobile/gapk_io.c @@ -409,16 +409,16 @@ return -ENOTSUP; }
- switch (set->audio.io_format) { - case AUDIO_IOF_RTP: + switch (set->tch.frame_format) { + case TCH_IOFF_RTP: phy_fmt = phy_fmt_pick_rtp(codec); break; - case AUDIO_IOF_TI: + case TCH_IOFF_TI: phy_fmt = phy_fmt_pick_ti(codec); break; default: LOGP(DGAPK, LOGL_ERROR, "Unhandled I/O format %s\n", - audio_io_format_name(set->audio.io_format)); + tch_io_frame_format_name(set->tch.frame_format)); return -ENOTSUP; }
@@ -447,8 +447,8 @@ osmo_gapk_set_talloc_ctx(gapk_io);
/* Prepare both source and sink chains */ - rc |= prepare_audio_source(gapk_io, set->audio.alsa_input_dev); - rc |= prepare_audio_sink(gapk_io, set->audio.alsa_output_dev); + rc |= prepare_audio_source(gapk_io, set->tch.alsa_input_dev); + rc |= prepare_audio_sink(gapk_io, set->tch.alsa_output_dev);
/* Fall back to ms instance */ osmo_gapk_set_talloc_ctx(ms); diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c index 68670b7..b4eac3c 100644 --- a/src/host/layer23/src/mobile/gsm48_rr.c +++ b/src/host/layer23/src/mobile/gsm48_rr.c @@ -4434,7 +4434,7 @@
#ifdef WITH_GAPK_IO /* Poke GAPK audio back-end, if it is chosen */ - if (ms->settings.audio.io_handler == AUDIO_IOH_GAPK) { + if (ms->settings.tch.voice_handler == TCH_VOICE_IOH_GAPK) { int rc = gapk_io_init_ms_chan(ms, ch_type, mode); if (rc) return rc; @@ -4989,7 +4989,7 @@
#ifdef WITH_GAPK_IO /* Poke GAPK audio back-end, if it is chosen */ - if (ms->settings.audio.io_handler == AUDIO_IOH_GAPK) + if (ms->settings.tch.voice_handler == TCH_VOICE_IOH_GAPK) gapk_io_init_ms_chan(ms, ch_type, cda->mode); #endif
@@ -7028,16 +7028,16 @@ rr->tch_loop_mode = L1CTL_TCH_LOOP_OPEN;
/* Configure audio handling in the L1PHY */ - switch (ms->settings.audio.io_handler) { - case AUDIO_IOH_L1PHY: + switch (ms->settings.tch.voice_handler) { + case TCH_VOICE_IOH_L1PHY: rr->audio_mode = AUDIO_RX_SPEAKER | AUDIO_TX_MICROPHONE; break; - case AUDIO_IOH_MNCC_SOCK: - case AUDIO_IOH_LOOPBACK: - case AUDIO_IOH_GAPK: + case TCH_VOICE_IOH_MNCC_SOCK: + case TCH_VOICE_IOH_LOOPBACK: + case TCH_VOICE_IOH_GAPK: rr->audio_mode = AUDIO_RX_TRAFFIC_IND | AUDIO_TX_TRAFFIC_REQ; break; - case AUDIO_IOH_NONE: + case TCH_VOICE_IOH_NONE: rr->audio_mode = 0x00; }
@@ -7156,7 +7156,7 @@ struct gsm48_rrlayer *rr = &ms->rrlayer; uint8_t ch_type, ch_subch, ch_ts;
- if (ms->settings.audio.io_handler != AUDIO_IOH_NONE) + if (ms->settings.tch.voice_handler != TCH_VOICE_IOH_NONE) return 0;
LOGP(DRR, LOGL_INFO, "setting audio mode to %d\n", mode); diff --git a/src/host/layer23/src/mobile/voice.c b/src/host/layer23/src/mobile/voice.c index acc0dce..b838576 100644 --- a/src/host/layer23/src/mobile/voice.c +++ b/src/host/layer23/src/mobile/voice.c @@ -76,15 +76,15 @@ /* Receive a Downlink voice frame from the lower layers */ static int gsm_recv_voice(struct osmocom_ms *ms, struct msgb *msg) { - switch (ms->settings.audio.io_handler) { - case AUDIO_IOH_LOOPBACK: + switch (ms->settings.tch.voice_handler) { + case TCH_VOICE_IOH_LOOPBACK: /* Remove the DL info header */ msgb_pull_to_l2(msg); /* Send voice frame back */ return gsm_send_voice_msg(ms, msg); - case AUDIO_IOH_MNCC_SOCK: + case TCH_VOICE_IOH_MNCC_SOCK: return gsm_forward_mncc(ms, msg); - case AUDIO_IOH_GAPK: + case TCH_VOICE_IOH_GAPK: #ifdef WITH_GAPK_IO /* Enqueue a frame to the DL TCH buffer */ if (ms->gapk_io != NULL) @@ -93,8 +93,8 @@ msgb_free(msg); break; #endif - case AUDIO_IOH_L1PHY: - case AUDIO_IOH_NONE: + case TCH_VOICE_IOH_L1PHY: + case TCH_VOICE_IOH_NONE: /* Drop voice frame */ msgb_free(msg); } diff --git a/src/host/layer23/src/mobile/vty_interface.c b/src/host/layer23/src/mobile/vty_interface.c index 9a1652b..445ad4a 100644 --- a/src/host/layer23/src/mobile/vty_interface.c +++ b/src/host/layer23/src/mobile/vty_interface.c @@ -1476,15 +1476,15 @@ (set->asci_allow_any) ? "" : "no ", VTY_NEWLINE);
vty_out(vty, " tch%s", VTY_NEWLINE); - vty_out(vty, " io-handler %s%s", - audio_io_handler_name(set->audio.io_handler), VTY_NEWLINE); - if (set->audio.io_handler == AUDIO_IOH_GAPK) { + vty_out(vty, " voice-io-handler %s%s", + tch_voice_io_handler_name(set->tch.voice_handler), VTY_NEWLINE); + if (set->tch.voice_handler == TCH_VOICE_IOH_GAPK) { vty_out(vty, " io-tch-format %s%s", - audio_io_format_name(set->audio.io_format), VTY_NEWLINE); + tch_io_frame_format_name(set->tch.frame_format), VTY_NEWLINE); vty_out(vty, " alsa-output-dev %s%s", - set->audio.alsa_output_dev, VTY_NEWLINE); + set->tch.alsa_output_dev, VTY_NEWLINE); vty_out(vty, " alsa-input-dev %s%s", - set->audio.alsa_input_dev, VTY_NEWLINE); + set->tch.alsa_input_dev, VTY_NEWLINE); }
if (ms->lua_script) @@ -2478,26 +2478,29 @@ SUP_EN_DI(vbs, "vbs", "Voice Broadcast Service (VBS)", 0);
/* TCH config */ -DEFUN(cfg_ms_tch, cfg_ms_tch_cmd, "tch", +DEFUN(cfg_ms_tch, + cfg_ms_tch_cmd, + "tch", "Configure TCH (Traffic CHannel) settings\n") { vty->node = TCH_NODE; return CMD_SUCCESS; }
-ALIAS_DEPRECATED(cfg_ms_tch, cfg_ms_audio_cmd, - "audio", "Configure audio settings\n"); +ALIAS_DEPRECATED(cfg_ms_tch, + cfg_ms_audio_cmd, + "audio", + "Configure audio settings\n");
- -static int set_audio_io_handler(struct vty *vty, enum audio_io_handler val) +static int set_voice_io_handler(struct vty *vty, enum tch_voice_io_handler val) { struct osmocom_ms *ms = (struct osmocom_ms *) vty->index; struct gsm_settings *set = &ms->settings;
/* Don't restart on unchanged value */ - if (val == set->audio.io_handler) + if (val == set->tch.voice_handler) return CMD_SUCCESS; - set->audio.io_handler = val; + set->tch.voice_handler = val;
/* Restart required */ vty_restart_if_started(vty, ms); @@ -2505,59 +2508,77 @@ return CMD_SUCCESS; }
-DEFUN(cfg_ms_tch_io_handler, cfg_ms_tch_io_handler_cmd, - "io-handler (none|gapk|l1phy|mncc-sock|loopback)", - "Set TCH frame I/O handler\n" - "No handler, drop TCH frames (default)\n" - "libosmo-gapk based I/O handler (requires ALSA)\n" - "L1 PHY (e.g. Calypso DSP in Motorola C1xx phones)\n" - "External MNCC application (e.g. LCR) via MNCC socket\n" - "Return TCH frame payload back to sender\n") +#define TCH_VOICE_IOH_SEL \ + "(none|gapk|l1phy|mncc-sock|loopback)" +#define TCH_VOICE_IOH_SEL_DESC \ + "No handler, drop TCH frames (default)\n" \ + "libosmo-gapk based I/O handler (requires ALSA)\n" \ + "L1 PHY (e.g. Calypso DSP in Motorola C1xx phones)\n" \ + "External MNCC application (e.g. LCR) via MNCC socket\n" \ + "Return TCH frame payload back to sender\n" + +DEFUN(cfg_ms_tch_voice_io_handler, + cfg_ms_tch_voice_io_handler_cmd, + "voice-io-handler " TCH_VOICE_IOH_SEL, + "Set TCH I/O handler for voice calls\n" + TCH_VOICE_IOH_SEL_DESC) { struct osmocom_ms *ms = (struct osmocom_ms *) vty->index; - int val = get_string_value(audio_io_handler_names, argv[0]); + int val = get_string_value(tch_voice_io_handler_names, argv[0]);
- if (val == AUDIO_IOH_MNCC_SOCK) { + if (val == TCH_VOICE_IOH_MNCC_SOCK) { if (ms->settings.mncc_handler != MNCC_HANDLER_INTERNAL) { - vty_out(vty, "Audio I/O handler 'mncc-sock' can only be used " + vty_out(vty, "TCH I/O handler 'mncc-sock' can only be used " "with MNCC handler 'external'%s", VTY_NEWLINE); return CMD_WARNING; } }
#ifndef WITH_GAPK_IO - if (val == AUDIO_IOH_GAPK) { + if (val == TCH_VOICE_IOH_GAPK) { vty_out(vty, "GAPK I/O is not compiled in (--with-gapk-io)%s", VTY_NEWLINE); return CMD_WARNING; } #endif
- return set_audio_io_handler(vty, val); + return set_voice_io_handler(vty, val); }
-DEFUN(cfg_ms_tch_no_io_handler, cfg_ms_tch_no_io_handler_cmd, - "no io-handler", NO_STR "Disable TCH frame processing") +ALIAS_DEPRECATED(cfg_ms_tch_voice_io_handler, + cfg_ms_tch_io_handler_cmd, + "io-handler " TCH_VOICE_IOH_SEL, + "Set TCH I/O handler for voice calls\n" TCH_VOICE_IOH_SEL_DESC); + +DEFUN(cfg_ms_tch_no_voice_io_handler, + cfg_ms_tch_no_voice_io_handler_cmd, + "no voice-io-handler", + NO_STR "Disable TCH I/O handling for voice calls\n") { - return set_audio_io_handler(vty, AUDIO_IOH_NONE); + return set_voice_io_handler(vty, TCH_VOICE_IOH_NONE); }
+ALIAS_DEPRECATED(cfg_ms_tch_no_voice_io_handler, + cfg_ms_tch_no_io_handler_cmd, + "no io-handler", + NO_STR "Disable TCH I/O handling for voice calls\n"); + DEFUN(cfg_ms_tch_io_tch_format, cfg_ms_tch_io_tch_format_cmd, "io-tch-format (rtp|ti)", "Set TCH I/O frame format used by the L1 PHY (for GAPK only)\n" "RTP format (RFC3551 for FR/EFR, RFC5993 for HR, RFC4867 for AMR)\n" "Texas Instruments format, used by Calypso based phones (e.g. Motorola C1xx)\n") { - int val = get_string_value(audio_io_format_names, argv[0]); + int val = get_string_value(tch_io_frame_format_names, argv[0]); struct osmocom_ms *ms = (struct osmocom_ms *) vty->index; struct gsm_settings *set = &ms->settings;
- if (set->audio.io_handler != AUDIO_IOH_GAPK) { + if (set->tch.voice_handler != TCH_VOICE_IOH_GAPK) { vty_out(vty, "This parameter is only valid for GAPK%s", VTY_NEWLINE); return CMD_WARNING; }
OSMO_ASSERT(val >= 0); - set->audio.io_format = val; + set->tch.frame_format = val;
return CMD_SUCCESS; } @@ -2571,7 +2592,7 @@ struct osmocom_ms *ms = vty->index; struct gsm_settings *set = &ms->settings;
- OSMO_STRLCPY_ARRAY(set->audio.alsa_output_dev, argv[0]); + OSMO_STRLCPY_ARRAY(set->tch.alsa_output_dev, argv[0]);
return CMD_SUCCESS; } @@ -2585,7 +2606,7 @@ struct osmocom_ms *ms = vty->index; struct gsm_settings *set = &ms->settings;
- OSMO_STRLCPY_ARRAY(set->audio.alsa_input_dev, argv[0]); + OSMO_STRLCPY_ARRAY(set->tch.alsa_input_dev, argv[0]);
return CMD_SUCCESS; } @@ -2848,6 +2869,8 @@ install_element(MS_NODE, &cfg_ms_no_script_load_run_cmd);
install_node(&tch_node, config_write_dummy); + install_element(TCH_NODE, &cfg_ms_tch_voice_io_handler_cmd); + install_element(TCH_NODE, &cfg_ms_tch_no_voice_io_handler_cmd); install_element(TCH_NODE, &cfg_ms_tch_io_handler_cmd); install_element(TCH_NODE, &cfg_ms_tch_no_io_handler_cmd); install_element(TCH_NODE, &cfg_ms_tch_io_tch_format_cmd);