Add echo test feature to check mobile phone's mic + speaker

Add '-e' to command line option, but do not select MNCC nor call device
This commit is contained in:
Andreas Eversberg 2017-09-21 19:22:03 +02:00
parent 274cb7992b
commit 08dd180ea0
4 changed files with 52 additions and 25 deletions

View File

@ -203,9 +203,10 @@ typedef struct call {
int test_audio_pos; /* position for test tone toward mobile */
int dial_digits; /* number of digits to be dialed */
int loopback; /* loopback test for echo */
int use_mncc_sock;
int send_patterns;
int release_on_disconnect;
int echo_test; /* send echo back to mobile phone */
int use_mncc_sock; /* use MNCC socket instead of built-in call control */
int send_patterns; /* send patterns towards fixed network */
int release_on_disconnect; /* release towards mobile phone, if MNCC call disconnects, don't send disconnect tone */
} call_t;
@ -486,7 +487,7 @@ static void process_timeout(struct timer *timer)
}
}
int call_init(const char *station_id, const char *audiodev, int samplerate, int latency, int dial_digits, int loopback, int use_mncc_sock, int send_patterns, int release_on_disconnect)
int call_init(const char *station_id, const char *audiodev, int samplerate, int latency, int dial_digits, int loopback, int use_mncc_sock, int send_patterns, int release_on_disconnect, int echo_test)
{
int rc = 0;
@ -497,13 +498,30 @@ int call_init(const char *station_id, const char *audiodev, int samplerate, int
call.latspl = latency * samplerate / 1000;
call.dial_digits = dial_digits;
call.loopback = loopback;
call.echo_test = echo_test;
call.use_mncc_sock = use_mncc_sock;
call.send_patterns = send_patterns;
call.release_on_disconnect = release_on_disconnect;
call.samplerate = samplerate;
strncpy(call.audiodev, audiodev, sizeof(call.audiodev) - 1);
if (call.use_mncc_sock)
if (use_mncc_sock && audiodev[0]) {
PDEBUG(DSENDER, DEBUG_ERROR, "You selected MNCC interface, but it cannot be used with call device (headset).\n");
rc = -EINVAL;
goto error;
}
if (use_mncc_sock && echo_test) {
PDEBUG(DSENDER, DEBUG_ERROR, "You selected MNCC interface, but it cannot be used with echo test.\n");
rc = -EINVAL;
goto error;
}
if (audiodev[0] && echo_test) {
PDEBUG(DSENDER, DEBUG_ERROR, "You selected call device (headset), but it cannot be used with echo test.\n");
rc = -EINVAL;
goto error;
}
if (use_mncc_sock)
return 0;
if (!audiodev[0])
@ -963,6 +981,7 @@ void call_tx_audio(int callref, sample_t *samples, int count)
if (!callref)
return;
/* is MNCC us used, forward audio */
if (call.use_mncc_sock) {
uint8_t buf[sizeof(struct gsm_data_frame) + count * sizeof(int16_t)];
struct gsm_data_frame *data = (struct gsm_data_frame *)buf;
@ -981,15 +1000,17 @@ void call_tx_audio(int callref, sample_t *samples, int count)
samples_to_int16((int16_t *)data->data, samples, count);
mncc_write(buf, sizeof(buf));
return;
}
/* save audio from transceiver to jitter buffer */
} else
/* else, save audio from transceiver to jitter buffer */
if (call.sound) {
sample_t up[(int)((double)count * call.srstate.factor + 0.5) + 10];
count = samplerate_upsample(&call.srstate, samples, count, up);
jitter_save(&call.dejitter, up, count);
} else
/* else, if echo test is used, send echo back to mobile */
if (call.echo_test) {
call_rx_audio(callref, samples, count);
} else
/* else, if no sound is used, send test tone to mobile */
if (call.state == CALL_CONNECT) {
int16_t spl[count];
@ -1162,7 +1183,7 @@ void call_mncc_recv(uint8_t *buf, int length)
PDEBUG(DMNCC, DEBUG_INFO, "Received MNCC disconnect from Network with cause %d\n", mncc->cause.value);
if (is_process_state(callref) == CALL_CONNECT && call.release_on_disconnect) {
PDEBUG(DCALL, DEBUG_INFO, "Releaseing, because we don't send disconnect tones to mobile phone\n");
PDEBUG(DCALL, DEBUG_INFO, "Releasing, because we don't send disconnect tones to mobile phone\n");
PDEBUG(DMNCC, DEBUG_INFO, "Releasing MNCC call towards Network\n");
mncc->msg_type = MNCC_REL_IND;

View File

@ -9,7 +9,7 @@ enum number_type {
TYPE_INTERNATIONAL,
};
int call_init(const char *station_id, const char *audiodev, int samplerate, int latency, int dial_digits, int loopback, int use_mncc_sock, int send_patterns, int release_on_disconnect);
int call_init(const char *station_id, const char *audiodev, int samplerate, int latency, int dial_digits, int loopback, int use_mncc_sock, int send_patterns, int release_on_disconnect, int echo_test);
void call_cleanup(void);
int call_open_audio(int latspl);
int call_start_audio(void);

View File

@ -49,19 +49,20 @@ int kanal[MAX_SENDER];
int num_audiodev = 0;
const char *audiodev[MAX_SENDER] = { "hw:0,0" };
int use_sdr = 0;
const char *call_audiodev = "";
static const char *call_audiodev = "";
int samplerate = 48000;
int call_samplerate = 48000;
static int call_samplerate = 48000;
int interval = 1;
int latency = 50;
int uses_emphasis = 1;
int do_pre_emphasis = 0;
int do_de_emphasis = 0;
double rx_gain = 1.0;
int use_mncc_sock = 0;
static int echo_test = 0;
static int use_mncc_sock = 0;
const char *mncc_name = "";
int send_patterns = 1;
int release_on_disconnect = 1;
static int send_patterns = 1;
static int release_on_disconnect = 1;
int loopback = 0;
int rt_prio = 0;
const char *write_tx_wave = NULL;
@ -115,15 +116,18 @@ void main_mobile_print_help(const char *arg0, const char *ext_usage)
printf(" Raise receiver RX level by given gain in dB. This is useful if input\n");
printf(" level of the sound device is too low, even after setting maximum level\n");
printf(" with the mixer settings. (Works with sound card only.)\n");
printf(" -e --echo-test\n");
printf(" Use echo test, to send back audio from mobile phone's microphone to\n");
printf(" the speaker. (German: 'Blasprobe').\n");
printf(" -c --call-device hw:<card>,<device>\n");
printf(" Sound card and device number for headset (default = '%s')\n", call_audiodev);
printf(" --call-samplerate <rate>\n");
printf(" Sample rate of sound device for headset (default = '%d')\n", call_samplerate);
printf(" -m --mncc-sock\n");
printf(" Disable built-in call contol and offer socket (to LCR)\n");
printf(" --mncc-name <name>\n");
printf(" '/tmp/bsc_mncc' is used by default, give name to change socket to\n");
printf(" '/tmp/bsc_mncc_<name>'. (Useful to run multiple networks.)\n");
printf(" -c --call-device hw:<card>,<device>\n");
printf(" Sound card and device number for headset (default = '%s')\n", call_audiodev);
printf(" --call-samplerate <rate>\n");
printf(" Sample rate of sound device for headset (default = '%d')\n", call_samplerate);
printf(" -t --tones 0 | 1\n");
printf(" Connect call on setup/release to provide classic tones towards fixed\n");
printf(" network (default = '%d')\n", send_patterns);
@ -177,6 +181,7 @@ static struct option main_mobile_long_options[] = {
{"pre-emphasis", 0, 0, 'p'},
{"de-emphasis", 0, 0, 'd'},
{"rx-gain", 1, 0, 'g'},
{"echo-test", 0, 0, 'e'},
{"mncc-sock", 0, 0, 'm'},
{"mncc-name", 1, 0, OPT_MNCC_NAME},
{"call-device", 1, 0, 'c'},
@ -191,7 +196,7 @@ static struct option main_mobile_long_options[] = {
{0, 0, 0, 0}
};
static const char *main_mobile_optstring = "hv:k:a:s:i:b:pdg:mc:t:l:r:";
static const char *main_mobile_optstring = "hv:k:a:s:i:b:pdg:mec:t:l:r:";
struct option *long_options;
char *optstring;
@ -309,6 +314,10 @@ void main_mobile_opt_switch(int c, char *arg0, int *skip_args)
rx_gain = pow(10, gain_db / 20.0);
*skip_args += 2;
break;
case 'e':
echo_test = 1;
*skip_args += 1;
break;
case 'm':
use_mncc_sock = 1;
*skip_args += 1;
@ -431,7 +440,7 @@ void main_mobile(int *quit, int latency, int interval, void (*myhandler)(void),
}
/* init call device */
rc = call_init(station_id, call_audiodev, call_samplerate, latency, station_id_digits, loopback, use_mncc_sock, send_patterns, release_on_disconnect);
rc = call_init(station_id, call_audiodev, call_samplerate, latency, station_id_digits, loopback, use_mncc_sock, send_patterns, release_on_disconnect, echo_test);
if (rc < 0) {
fprintf(stderr, "Failed to create call control instance. Quitting!\n");
return;

View File

@ -5,7 +5,6 @@ extern int swap_links;
extern int num_audiodev;
extern const char *audiodev[];
extern int use_sdr;
extern const char *call_audiodev;
extern int samplerate;
extern int interval;
extern int latency;
@ -13,8 +12,6 @@ extern int uses_emphasis;
extern int do_pre_emphasis;
extern int do_de_emphasis;
extern double rx_gain;
extern int use_mncc_sock;
extern int send_patterns;
extern int loopback;
extern int rt_prio;
extern const char *write_rx_wave;