alsabat: add standalone mode

Add support for standalone mode where alsabat will run on a
different machine to the one being tested.
In standalone mode, the alsabat just generates, playback and
capture sound data like in normal mode, but does not analyze.
The alsabat being built without libfftw3 support is always work
in standalone mode.
The alsabat in normal mode can also bypass data analysis using
option "--standalone".

Signed-off-by: Lu, Han <han.lu@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Lu, Han 2016-03-15 11:18:53 +08:00 committed by Takashi Iwai
parent 333cd85d7d
commit 72800ad6bd
5 changed files with 34 additions and 5 deletions

View file

@ -6,7 +6,6 @@ EXTRA_DIST = alsabat.1
alsabat_SOURCES = \ alsabat_SOURCES = \
bat.c \ bat.c \
common.c \ common.c \
analyze.c \
signal.c \ signal.c \
convert.c \ convert.c \
alsa.c alsa.c
@ -15,8 +14,12 @@ noinst_HEADERS = \
common.h \ common.h \
bat-signal.h \ bat-signal.h \
alsa.h \ alsa.h \
convert.h \ convert.h
analyze.h
if HAVE_LIBFFTW3
alsabat_SOURCES += analyze.c
noinst_HEADERS += analyze.h
endif
AM_CPPFLAGS = \ AM_CPPFLAGS = \
-Wall -I$(top_srcdir)/include -Wall -I$(top_srcdir)/include

View file

@ -120,6 +120,15 @@ Internal loopback mode.
Playback, capture and analysis internal to ALSABAT only. This is intended Playback, capture and analysis internal to ALSABAT only. This is intended
for developers to test new ALSABAT features as no audio is routed outside for developers to test new ALSABAT features as no audio is routed outside
of ALSABAT. of ALSABAT.
.TP
\fI\-\-standalone\fP
Add support for standalone mode where ALSABAT will run on a different machine
to the one being tested.
In standalone mode, the sound data can be generated, playback and captured
just like in normal mode, but will not be analyzed.
The ALSABAT being built without libfftw3 support is always in standalone mode.
The ALSABAT in normal mode can also bypass data analysis using option
"--standalone".
.SH EXAMPLES .SH EXAMPLES

View file

@ -33,7 +33,9 @@
#include "alsa.h" #include "alsa.h"
#include "convert.h" #include "convert.h"
#ifdef HAVE_LIBFFTW3
#include "analyze.h" #include "analyze.h"
#endif
static int get_duration(struct bat *bat) static int get_duration(struct bat *bat)
{ {
@ -289,6 +291,7 @@ _("Usage: alsabat [-options]...\n"
" --file=# file for playback\n" " --file=# file for playback\n"
" --saveplay=# file that storing playback content, for debug\n" " --saveplay=# file that storing playback content, for debug\n"
" --local internal loop, set to bypass pcm hardware devices\n" " --local internal loop, set to bypass pcm hardware devices\n"
" --standalone standalone mode, to bypass analysis\n"
)); ));
fprintf(bat->log, _("Recognized sample formats are: %s %s %s %s\n"), fprintf(bat->log, _("Recognized sample formats are: %s %s %s %s\n"),
snd_pcm_format_name(SND_PCM_FORMAT_U8), snd_pcm_format_name(SND_PCM_FORMAT_U8),
@ -339,6 +342,7 @@ static void parse_arguments(struct bat *bat, int argc, char *argv[])
{"file", 1, 0, OPT_READFILE}, {"file", 1, 0, OPT_READFILE},
{"saveplay", 1, 0, OPT_SAVEPLAY}, {"saveplay", 1, 0, OPT_SAVEPLAY},
{"local", 0, 0, OPT_LOCAL}, {"local", 0, 0, OPT_LOCAL},
{"standalone", 0, 0, OPT_STANDALONE},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
@ -357,6 +361,9 @@ static void parse_arguments(struct bat *bat, int argc, char *argv[])
case OPT_LOCAL: case OPT_LOCAL:
bat->local = true; bat->local = true;
break; break;
case OPT_STANDALONE:
bat->standalone = true;
break;
case 'D': case 'D':
if (bat->playback.device == NULL) if (bat->playback.device == NULL)
bat->playback.device = optarg; bat->playback.device = optarg;
@ -601,7 +608,12 @@ int main(int argc, char *argv[])
test_loopback(&bat); test_loopback(&bat);
analyze: analyze:
#ifdef HAVE_LIBFFTW3
if (!bat.standalone)
err = analyze_capture(&bat); err = analyze_capture(&bat);
#else
fprintf(bat.log, _("No libfftw3 library. Exit without analysis.\n"));
#endif
out: out:
fprintf(bat.log, _("\nReturn value is %d\n"), err); fprintf(bat.log, _("\nReturn value is %d\n"), err);

View file

@ -23,6 +23,7 @@
#define OPT_READFILE (OPT_BASE + 2) #define OPT_READFILE (OPT_BASE + 2)
#define OPT_SAVEPLAY (OPT_BASE + 3) #define OPT_SAVEPLAY (OPT_BASE + 3)
#define OPT_LOCAL (OPT_BASE + 4) #define OPT_LOCAL (OPT_BASE + 4)
#define OPT_STANDALONE (OPT_BASE + 5)
#define COMPOSE(a, b, c, d) ((a) | ((b)<<8) | ((c)<<16) | ((d)<<24)) #define COMPOSE(a, b, c, d) ((a) | ((b)<<8) | ((c)<<16) | ((d)<<24))
#define WAV_RIFF COMPOSE('R', 'I', 'F', 'F') #define WAV_RIFF COMPOSE('R', 'I', 'F', 'F')
@ -150,6 +151,7 @@ struct bat {
char *narg; /* argument string of duration */ char *narg; /* argument string of duration */
char *logarg; /* path name of log file */ char *logarg; /* path name of log file */
char *debugplay; /* path name to store playback signal */ char *debugplay; /* path name to store playback signal */
bool standalone; /* enable to bypass analysis */
struct pcm playback; struct pcm playback;
struct pcm capture; struct pcm capture;

View file

@ -79,7 +79,9 @@ if test x$bat = xtrue; then
FFTW_INC="" FFTW_INC=""
FFTW_LIB="" FFTW_LIB=""
FFTW_CFLAGS="" FFTW_CFLAGS=""
AC_CHECK_LIB([fftw3], [fftw_malloc], , [AC_MSG_ERROR([Error: need FFTW3 library])]) dnl Check for libfftw3
have_libfftw3="yes"
AC_CHECK_LIB([fftw3], [fftw_malloc], , [have_libfftw3="no"])
AC_CHECK_LIB([m], [sqrtf], , [AC_MSG_ERROR([Error: Need sqrtf])]) AC_CHECK_LIB([m], [sqrtf], , [AC_MSG_ERROR([Error: Need sqrtf])])
AC_CHECK_LIB([pthread], [pthread_create], , [AC_MSG_ERROR([Error: need PTHREAD library])]) AC_CHECK_LIB([pthread], [pthread_create], , [AC_MSG_ERROR([Error: need PTHREAD library])])
FFTW_CFLAGS="$CFLAGS" FFTW_CFLAGS="$CFLAGS"
@ -92,6 +94,7 @@ if test x$bat = xtrue; then
AC_SUBST(FFTW_CFLAGS) AC_SUBST(FFTW_CFLAGS)
fi fi
AM_CONDITIONAL(HAVE_LIBFFTW3, test "$have_libfftw3" = "yes")
dnl Check for librt dnl Check for librt
LIBRT="" LIBRT=""