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
{ 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 },
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 */
#include <alsa/asoundlib.h>
#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. */
}
#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 -<n> 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