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);
--
To view, visit
https://gerrit.osmocom.org/c/osmocom-bb/+/34912?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: If6c799d11e225ad00ca5da5ae63dca20568a0ce0
Gerrit-Change-Number: 34912
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange