bat: Add 'readcapture' option to support analyzing external audio

If audio data is captured on another device (ie we are NOT using
loopback mode), then allow alsabat to analyze that data, by passing
a filename reference on the command line.

Add the '--readcapture' option to the argument parser. When
this option is specified, avoid doing a local capture, and instead
just read the audio data from the indicated file, and analyze that.

Fixes: https://github.com/alsa-project/alsa-utils/pull/166
Signed-off-by: Tim Bird <tim.bird@sony.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Tim Bird 2022-05-17 09:50:49 -06:00 committed by Jaroslav Kysela
parent e3d30315ff
commit 9e525074d2
2 changed files with 20 additions and 0 deletions

View file

@ -331,6 +331,8 @@ _("Usage: alsabat [-options]...\n"
" --log=# file that both stdout and strerr redirecting to\n"
" --file=# file for playback\n"
" --saveplay=# file that storing playback content, for debug\n"
" --readcapture=# file with previously captured content. File data\n"
" is used for analysis instead of capturing it.\n"
" --local internal loop, set to bypass pcm hardware devices\n"
" --standalone standalone mode, to bypass analysis\n"
" --roundtriplatency round trip latency mode\n"
@ -397,6 +399,7 @@ static void parse_arguments(struct bat *bat, int argc, char *argv[])
{"roundtriplatency", 0, 0, OPT_ROUNDTRIPLATENCY},
{"snr-db", 1, 0, OPT_SNRTHD_DB},
{"snr-pc", 1, 0, OPT_SNRTHD_PC},
{"readcapture", 1, 0, OPT_READCAPTURE},
{0, 0, 0, 0}
};
@ -412,6 +415,11 @@ static void parse_arguments(struct bat *bat, int argc, char *argv[])
case OPT_SAVEPLAY:
bat->debugplay = optarg;
break;
case OPT_READCAPTURE:
bat->capturefile = optarg;
bat->capture.mode = MODE_ANALYZE_ONLY;
bat->playback.mode = MODE_ANALYZE_ONLY;
break;
case OPT_LOCAL:
bat->local = true;
break;
@ -708,6 +716,15 @@ int main(int argc, char *argv[])
goto analyze;
}
if (bat.capture.mode == MODE_ANALYZE_ONLY && bat.capturefile) {
bat.capture.file = strdup(bat.capturefile);
fprintf(bat.log,
_("Using data from file %s for analysis\n"),
bat.capture.file);
fprintf(bat.log, _("Skipping playback and capture\n"));
goto analyze;
}
/* loopback thread: playback and capture in a loop */
if (bat.local == false)
test_loopback(&bat);

View file

@ -25,6 +25,7 @@
#define OPT_ROUNDTRIPLATENCY (OPT_BASE + 6)
#define OPT_SNRTHD_DB (OPT_BASE + 7)
#define OPT_SNRTHD_PC (OPT_BASE + 8)
#define OPT_READCAPTURE (OPT_BASE + 9)
#define COMPOSE(a, b, c, d) ((a) | ((b)<<8) | ((c)<<16) | ((d)<<24))
#define WAV_RIFF COMPOSE('R', 'I', 'F', 'F')
@ -151,6 +152,7 @@ enum _bat_op_mode {
MODE_UNKNOWN = -1,
MODE_SINGLE = 0,
MODE_LOOPBACK,
MODE_ANALYZE_ONLY,
MODE_LAST
};
@ -223,6 +225,7 @@ struct bat {
char *narg; /* argument string of duration */
char *logarg; /* path name of log file */
char *debugplay; /* path name to store playback signal */
char *capturefile; /* path name for previously saved recording */
bool standalone; /* enable to bypass analysis */
bool roundtriplatency; /* enable round trip latency */