summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2020-03-03 17:17:06 +0100
committerVadim Yanitskiy <axilirator@gmail.com>2020-05-05 12:19:58 +0700
commit3622522664445d5c06e33ef1122c0960f1ff7df3 (patch)
treeabfe39bee0c12b96fb3b2429bc79ae8f111c0ebc
parent785450c4bfdbcde4923b60bcb25b6367c74bb961 (diff)
mobile: implement 'loopback' TCH frame I/O handler
Use newly added audio / loopback config vty node to provide audio loopback from mobile app. Only FR is supported for now. Change-Id: Icd0b8d00c855db1a6ff5e35e10c8ff67b7ad5c83
-rw-r--r--src/host/layer23/src/mobile/voice.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/src/host/layer23/src/mobile/voice.c b/src/host/layer23/src/mobile/voice.c
index 5106063e..4aae8aaa 100644
--- a/src/host/layer23/src/mobile/voice.c
+++ b/src/host/layer23/src/mobile/voice.c
@@ -36,18 +36,33 @@ static int gsm_recv_voice(struct osmocom_ms *ms, struct msgb *msg)
{
struct gsm_data_frame *mncc;
+ /* Drop the l1ctl_info_dl header */
+ msgb_pull_to_l2(msg);
+ /* push mncc header in front of data */
+ mncc = (struct gsm_data_frame *)
+ msgb_push(msg, sizeof(struct gsm_data_frame));
+ mncc->callref = ms->mncc_entity.ref;
+
+ /* FIXME: FR only! */
+ switch (ms->rrlayer.cd_now.mode) {
+ case GSM48_CMODE_SPEECH_V1:
+ mncc->msg_type = GSM_TCHF_FRAME;
+ break;
+ default:
+ /* TODO: print error message here */
+ goto exit_free;
+ }
+
+ /* send voice frame back, if appropriate */
+ if (ms->settings.audio.io_handler == AUDIO_IOH_LOOPBACK)
+ gsm_send_voice(ms, mncc);
+
/* distribute and then free */
if (ms->mncc_entity.mncc_recv && ms->mncc_entity.ref) {
- /* Drop the l1ctl_info_dl header */
- msgb_pull_to_l2(msg);
- /* push mncc header in front of data */
- mncc = (struct gsm_data_frame *)
- msgb_push(msg, sizeof(struct gsm_data_frame));
- mncc->msg_type = GSM_TCHF_FRAME;
- mncc->callref = ms->mncc_entity.ref;
ms->mncc_entity.mncc_recv(ms, mncc->msg_type, mncc);
}
+exit_free:
msgb_free(msg);
return 0;
}