From 5330d674656f13820c3426723f7c03bb54a9ef59 Mon Sep 17 00:00:00 2001 Message-Id: <5330d674656f13820c3426723f7c03bb54a9ef59.1714030270.git.mdw@distorted.org.uk> From: Mark Wooding Date: Tue, 10 Jul 2007 22:53:42 +0100 Subject: [PATCH] New configuration option sox_generation to choose between different sox syntaxes. Organization: Straylight/Edgeware From: rjk@greenend.org.uk <> --- configure.ac | 1 + doc/disorder_config.5.in | 5 +++++ lib/configuration.c | 1 + lib/configuration.h | 1 + server/speaker.c | 35 ++++++++++++++++++++++++++++++----- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 6a393e5..7bf4ebf 100644 --- a/configure.ac +++ b/configure.ac @@ -199,6 +199,7 @@ fi AC_C_CONST AC_TYPE_SIZE_T AC_C_INLINE +AC_C_BIGENDIAN AC_CHECK_TYPES([struct sockaddr_in6],,,[AC_INCLUDES_DEFAULT #include ]) diff --git a/doc/disorder_config.5.in b/doc/disorder_config.5.in index 29af21e..8a03b49 100644 --- a/doc/disorder_config.5.in +++ b/doc/disorder_config.5.in @@ -323,6 +323,11 @@ scratched. The default is \fBSIGKILL\fR. Signals are specified by their full C name, i.e. \fBSIGINT\fR and not \fBINT\fR or \fBInterrupted\fR or whatever. .TP +.B sox_generation \fB0\fR|\fB1 +Determines whether calls to \fBsox\fR(1) should use \fB-b\fR, \fB-x\fR, etc (if +the generation is 0) or \fB-\fIbits\fR, \fB-L\fR etc (if it is 1). The default +is 0. +.TP .B speaker_command \fICOMMAND Causes the speaker subprocess to pipe audio data into shell command \fICOMMAND\fR, rather than writing to a local sound card. The sample format is diff --git a/lib/configuration.c b/lib/configuration.c index 99e6d40..0282630 100644 --- a/lib/configuration.c +++ b/lib/configuration.c @@ -754,6 +754,7 @@ static const struct conf conf[] = { { C(sample_format), &type_sample_format, validate_sample_format }, { C(scratch), &type_string_accum, validate_isreg }, { C(signal), &type_signal, validate_any }, + { C(sox_generation), &type_integer, validate_non_negative }, { C(speaker_command), &type_string, validate_any }, { C(stopword), &type_string_accum, validate_any }, { C(templates), &type_string_accum, validate_isdir }, diff --git a/lib/configuration.h b/lib/configuration.h index 75e066c..dbdb65b 100644 --- a/lib/configuration.h +++ b/lib/configuration.h @@ -101,6 +101,7 @@ struct config { long nice_speaker; /* nice value for speaker */ const char *speaker_command; /* command for speaker to run */ ao_sample_format sample_format; /* sample format to enforce */ + long sox_generation; /* sox syntax generation */ /* shared client/server config */ const char *home; /* home directory for state files */ /* client config */ diff --git a/server/speaker.c b/server/speaker.c index 2d4c6ea..055b08a 100644 --- a/server/speaker.c +++ b/server/speaker.c @@ -57,6 +57,12 @@ #include #endif +#ifdef WORDS_BIGENDIAN +# define MACHINE_AO_FMT AO_FMT_BIG +#else +# define MACHINE_AO_FMT AO_FMT_LITTLE +#endif + #define BUFFER_SECONDS 5 /* How many seconds of input to * buffer. */ @@ -300,20 +306,39 @@ static void log_params(snd_pcm_hw_params_t *hwparams, } #endif -static void soxargs(const char ***pp, char **qq, ao_sample_format *ao) -{ +static void soxargs(const char ***pp, char **qq, ao_sample_format *ao) { int n; *(*pp)++ = "-t.raw"; *(*pp)++ = "-s"; *(*pp)++ = *qq; n = sprintf(*qq, "-r%d", ao->rate); *qq += n + 1; - switch(ao->byte_format) { + *(*pp)++ = *qq; n = sprintf(*qq, "-c%d", ao->channels); *qq += n + 1; + /* sox 12.17.9 insists on -b etc; CVS sox insists on - etc; both are + * deployed! */ + switch(config->sox_generation) { + case 0: + if(ao->bits != 8 + && ao->byte_format != AO_FMT_NATIVE + && ao->byte_format != MACHINE_AO_FMT) { + *(*pp)++ = "-x"; + } + switch(ao->bits) { + case 8: *(*pp)++ = "-b"; break; + case 16: *(*pp)++ = "-w"; break; + case 32: *(*pp)++ = "-l"; break; + case 64: *(*pp)++ = "-d"; break; + default: fatal(0, "cannot handle sample size %d", (int)ao->bits); + } + break; + case 1: + switch(ao->byte_format) { case AO_FMT_NATIVE: break; case AO_FMT_BIG: *(*pp)++ = "-B"; break; case AO_FMT_LITTLE: *(*pp)++ = "-L"; break; + } + *(*pp)++ = *qq; n = sprintf(*qq, "-%d", ao->bits/8); *qq += n + 1; + break; } - *(*pp)++ = *qq; n = sprintf(*qq, "-%d", ao->bits/8); *qq += n + 1; - *(*pp)++ = *qq; n = sprintf(*qq, "-c%d", ao->channels); *qq += n + 1; } /* Make sure the sound device is open and has the right sample format. Return -- [mdw]