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");