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

Reply via email to