diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2020-03-03 17:17:06 +0100 |
---|---|---|
committer | Vadim Yanitskiy <axilirator@gmail.com> | 2020-05-05 12:19:58 +0700 |
commit | 3622522664445d5c06e33ef1122c0960f1ff7df3 (patch) | |
tree | abfe39bee0c12b96fb3b2429bc79ae8f111c0ebc /src/host/layer23 | |
parent | 785450c4bfdbcde4923b60bcb25b6367c74bb961 (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
Diffstat (limited to 'src/host/layer23')
-rw-r--r-- | src/host/layer23/src/mobile/voice.c | 29 |
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; } |