Package: sox
Version: 12.17.7-2
Severity: normal
Tags: patch
Hello,
here is the patch to get the "-x" command line switch working.
Oliver
diff -u -NbwBur sox-12.17.7/src/sox.c sox-12.17.7-x/src/sox.c
--- sox-12.17.7/src/sox.c 2004-10-17 23:58:17.000000000 +0200
+++ sox-12.17.7-x/src/sox.c 2005-01-24 02:13:02.000000000 +0100
@@ -291,6 +291,7 @@
file_desc[offset]->filetype = "auto";
else
file_desc[offset]->filetype = strdup(file_opts[offset]->filetype);
+ file_desc[offset]->swap = file_opts[offset]->swap;
if (st_gettype(file_desc[offset]))
st_fail("Unknown input file format for '%s': %s",
@@ -330,6 +331,7 @@
file_desc[offset]->info = file_opts[offset]->info;
file_desc[offset]->filename = file_opts[offset]->filename;
file_desc[offset]->filetype = file_opts[offset]->filetype;
+ file_desc[offset]->swap = file_opts[offset]->swap;
if (writing && !file_desc[offset]->filetype) {
/* Use filename extension to determine audio type. */
diff -u -NbwBur sox-12.17.7/src/wav.c sox-12.17.7-x/src/wav.c
--- sox-12.17.7/src/wav.c 2004-11-28 23:13:01.000000000 +0100
+++ sox-12.17.7-x/src/wav.c 2005-05-09 04:04:36.000000000 +0200
@@ -457,12 +460,20 @@
if (ST_IS_BIGENDIAN) ft->swap = ft->swap ? 0 : 1;
- if (st_reads(ft, magic, 4) == ST_EOF || strncmp("RIFF", magic, 4))
+ if (st_reads(ft, magic, 4) == ST_EOF || (strncmp("RIFF", magic, 4) != 0 &&
+ strncmp("RIFX", magic, 4) != 0))
{
st_fail_errno(ft,ST_EHDR,"WAVE: RIFF header not found");
return ST_EOF;
}
+ /* RIFX is a Big-endian RIFF */
+ if (strncmp("RIFX", magic, 4) == 0)
+ {
+ st_report("Found RIFX header, swapping bytes");
+ ft->swap = ft->swap ? 0 : 1;
+ }
+
st_readdw(ft, &dwRiffLength);
if (st_reads(ft, magic, 4) == ST_EOF || strncmp("WAVE", magic, 4))
@@ -1240,7 +1261,7 @@
/* wavwritehdr: write .wav headers as follows:
bytes variable description
-0 - 3 'RIFF'
+0 - 3 'RIFF'/'RIFX' Little/Big-endian
4 - 7 wRiffLength length of file minus the 8 byte riff header
8 - 11 'WAVE'
12 - 15 'fmt '
@@ -1492,6 +1513,19 @@
dwAvgBytesPerSec = (double)wBlockAlign*ft->info.rate /
(double)wSamplesPerBlock + 0.5;
/* figured out header info, so write it */
+
+
+ /* If user specified opposite swap then we think, assume they are
+ * asking to write a RIFX file.
+ */
+ if ((!ST_IS_BIGENDIAN && ft->swap) ||
+ (ST_IS_BIGENDIAN && !ft->swap))
+ {
+ if (!second_header)
+ st_report("Requested to swap bytes so writing RIFX header");
+ st_writes(ft, "RIFX");
+ }
+ else
st_writes(ft, "RIFF");
st_writedw(ft, wRiffLength);
st_writes(ft, "WAVE");