shithub: sox

Download patch

ref: 2d5ec4081c7598dbd55945f23676d5b54542f574
parent: 210336f9b78b4089163bc16804a1e76984c6c46d
author: rrt <rrt>
date: Mon Nov 27 12:41:24 EST 2006

Change lengths to st_size_t from st_ssize_t (apart from the sheer
logic, it makes the types match fread and fwrite).

Remove st_wveread as it was just calling st_rawread.

Make PRC header check publically accessible as a function, and use it
in auto.c. Fix it to work properly (just check the first 16 bytes).

Tidy the auto.c code a little.

Remove ability to disable internal GSM library (no need, it's tiny,
machine-independent, and doesn't affect the license).

--- a/TODO
+++ b/TODO
@@ -26,8 +26,6 @@
     so that you don't have to put 100% in each channel.  Similar
     for 2->4.
 
-  o Remove FFT code from stat effect and use new FFT.c code.
-
   o Modify noiseprof and noisered so that they can read
     and write from stdin/out.  This would allow to run
     them in scripts without intermediate files required.
@@ -85,8 +83,6 @@
 
   o Add a FIFO/buffer to audio drivers to prevent losing audio data.
     Perhaps mpg123 could be used as an example.
-
-  o Add new PRC format in to auto.c.
 
   o Lots of effects are using "double" to prevent overflow of
     st_sample_t math.  With ststdint.h we now have a portable way
--- a/configure.in
+++ b/configure.in
@@ -3,20 +3,14 @@
 dnl configure.in
 dnl
 
-AC_REVISION(1.9)
+AC_INIT(sox, 12.18.3, cbagwell@users.sourceforge.net, "sox-12.18.3")
 
-AC_INIT(sox, 12.18.2, cbagwell@users.sourceforge.net, "sox-12.18.2")
-
 AC_CONFIG_SRCDIR(sox.1)
 
 dnl Parameters to configure
 
 AC_ARG_ENABLE(gsm,
-	[  --disable-gsm           Disable GSM support],
-	enable_gsm=$enableval, enable_gsm=yes)
-
-AC_ARG_ENABLE(gsm,
-	[  --disable-external-gsm  Disable external GSM support],
+	[  --disable-external-gsm  Disable detection of external GSM library],
 	enable_external_gsm=$enableval, enable_external_gsm=yes)
 
 AC_ARG_ENABLE(alsa_dsp,
@@ -40,7 +34,7 @@
 	[enable_ogg_vorbis=yes])
 
 AC_ARG_ENABLE(flac,
-	[  --disable-flac    Disable detection of FLAC],
+	[  --disable-flac          Disable detection of FLAC],
 	[enable_flac=$enableval],
 	[enable_flac=yes])
 
@@ -228,36 +222,28 @@
     fi
 fi
 
-if test "$enable_gsm" = yes
+if test "$enable_external_gsm" = yes
 then
-    if test "$enable_external_gsm" = yes
+    AC_CHECK_HEADERS(gsm/gsm.h, found_libgsm=yes)
+
+    if test "$found_libgsm" = yes
     then
-        AC_CHECK_HEADERS(gsm/gsm.h, found_libgsm=yes)
+        AC_CHECK_LIB(gsm, gsm_create,
+                     LIBS="$LIBS -lgsm"
+                     GSM_SUPPORT=ext
+        )
+    fi
 
-        if test "$found_libgsm" = yes
-        then
-            AC_CHECK_LIB(gsm, gsm_create,
-                         LIBS="$LIBS -lgsm"
-                         GSM_SUPPORT=ext
-                         AC_DEFINE([EXTERNAL_GSM], 1, 
-                                   [Define if you have libgsm library installed])
-            )
-            fi
-        fi
-
-        if test "$GSM_SUPPORT" = 0
-        then
-            dnl use internal libgsm
-            GSM_SUPPORT=1
-        fi
-        AC_DEFINE([ENABLE_GSM], 1, 
-                  [Define if you want to use internal GSM library])
+    if test "$GSM_SUPPORT" = 0
+    then
+        dnl use internal libgsm
+        GSM_SUPPORT=1
+    fi
 fi
 
 AC_SUBST(NEED_OSS)
 AC_SUBST(NEED_SUNAU)
 AC_SUBST(NEED_ALSA)
-AC_SUBST(GSM_SUPPORT)
 AC_SUBST(PLAY_SUPPORT)
 
 dnl Generate output files...
@@ -277,7 +263,6 @@
 if test ! -f src/monkey.wav; then cp ${srcdir}/src/monkey.wav src/monkey.wav; fi
 
 echo
-echo "GSM Support.......................   $enable_gsm"
 echo "ALSA Driver.......................   $enable_alsa_dsp"
 echo "OSS Driver........................   $enable_oss_dsp"
 echo "SUN /dev/audio....................   $enable_sun_audio"
--- a/src/8svx.c
+++ b/src/8svx.c
@@ -22,7 +22,7 @@
         FILE *ch[4];
 }*svx_t;
 
-static void svxwriteheader(ft_t, st_ssize_t);
+static void svxwriteheader(ft_t, st_size_t);
 
 /*======================================================================*/
 /*                         8SVXSTARTREAD                                */
@@ -213,7 +213,7 @@
 /*======================================================================*/
 /*                         8SVXREAD                                     */
 /*======================================================================*/
-st_ssize_t st_svxread(ft_t ft, st_sample_t *buf, st_ssize_t nsamp) 
+st_ssize_t st_svxread(ft_t ft, st_sample_t *buf, st_size_t nsamp) 
 {
         unsigned char datum;
         int done = 0;
@@ -290,7 +290,7 @@
 /*                         8SVXWRITE                                    */
 /*======================================================================*/
 
-st_ssize_t st_svxwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_svxwrite(ft_t ft, const st_sample_t *buf, st_size_t len)
 {
         svx_t p = (svx_t ) ft->priv;
 
@@ -356,7 +356,7 @@
 /*                         8SVXWRITEHEADER                              */
 /*======================================================================*/
 #define SVXHEADERSIZE 100
-static void svxwriteheader(ft_t ft, st_ssize_t nsamples)
+static void svxwriteheader(ft_t ft, st_size_t nsamples)
 {
         int32_t formsize =  nsamples + SVXHEADERSIZE - 8;
 
--- a/src/aiff.c
+++ b/src/aiff.c
@@ -638,7 +638,7 @@
   return(ST_SUCCESS);
 }
 
-st_ssize_t st_aiffread(ft_t ft, st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_aiffread(ft_t ft, st_sample_t *buf, st_size_t len)
 {
         aiff_t aiff = (aiff_t ) ft->priv;
         st_ssize_t done;
@@ -735,7 +735,7 @@
         return(aiffwriteheader(ft, 0x7f000000L / (ft->info.size*ft->info.channels)));
 }
 
-st_ssize_t st_aiffwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_aiffwrite(ft_t ft, const st_sample_t *buf, st_size_t len)
 {
         aiff_t aiff = (aiff_t ) ft->priv;
         aiff->nsamples += len;
--- a/src/alsa.c
+++ b/src/alsa.c
@@ -29,14 +29,14 @@
 
 static int get_format(ft_t ft, snd_pcm_format_mask_t *fmask, int *fmt);
 
-extern void st_ub_write_buf(char* buf1, const st_sample_t *buf2, st_ssize_t len, char swap);
-extern void st_sb_write_buf(char *buf1, const st_sample_t *buf2, st_ssize_t len, char swap);
-extern void st_uw_write_buf(char *buf1, const st_sample_t *buf2, st_ssize_t len, char swap);
-extern void st_sw_write_buf(char *buf1, const st_sample_t *buf2, st_ssize_t len, char swap);
-extern void st_ub_read_buf(st_sample_t *buf1, char *buf2, st_ssize_t len, char swap);
-extern void st_sb_read_buf(st_sample_t *buf1, char *buf2, st_ssize_t len, char swap);
-extern void st_uw_read_buf(st_sample_t *buf1, char *buf2, st_ssize_t len, char swap);
-extern void st_sw_read_buf(st_sample_t *buf1, char *buf2, st_ssize_t len, char swap);
+extern void st_ub_write_buf(char* buf1, const st_sample_t *buf2, st_size_t len, char swap);
+extern void st_sb_write_buf(char *buf1, const st_sample_t *buf2, st_size_t len, char swap);
+extern void st_uw_write_buf(char *buf1, const st_sample_t *buf2, st_size_t len, char swap);
+extern void st_sw_write_buf(char *buf1, const st_sample_t *buf2, st_size_t len, char swap);
+extern void st_ub_read_buf(st_sample_t *buf1, char *buf2, st_size_t len, char swap);
+extern void st_sb_read_buf(st_sample_t *buf1, char *buf2, st_size_t len, char swap);
+extern void st_uw_read_buf(st_sample_t *buf1, char *buf2, st_size_t len, char swap);
+extern void st_sw_read_buf(st_sample_t *buf1, char *buf2, st_size_t len, char swap);
 
 int st_alsasetup(ft_t ft, snd_pcm_stream_t mode)
 {
@@ -302,12 +302,12 @@
     return st_alsasetup(ft, SND_PCM_STREAM_CAPTURE);
 }
 
-st_ssize_t st_alsaread(ft_t ft, st_sample_t *buf, st_ssize_t nsamp)
+st_ssize_t st_alsaread(ft_t ft, st_sample_t *buf, st_size_t nsamp)
 {
-    st_ssize_t len;
+    st_size_t len;
     int err;
     alsa_priv_t alsa = (alsa_priv_t)ft->priv;
-    void (*read_buf)(st_sample_t *, char *, st_ssize_t, char) = 0;
+    void (*read_buf)(st_sample_t *, char *, st_size_t, char) = 0;
 
     switch(ft->info.size) {
         case ST_SIZE_BYTE:
@@ -390,12 +390,12 @@
     return st_alsasetup(ft, SND_PCM_STREAM_PLAYBACK);
 }
 
-st_ssize_t st_alsawrite(ft_t ft, const st_sample_t *buf, st_ssize_t nsamp)
+st_ssize_t st_alsawrite(ft_t ft, const st_sample_t *buf, st_size_t nsamp)
 {
-    st_ssize_t len;
+    st_size_t len;
     int err;
     alsa_priv_t alsa = (alsa_priv_t)ft->priv;
-    void (*write_buf)(char *, const st_sample_t *, st_ssize_t, char) = 0;
+    void (*write_buf)(char *, const st_sample_t *, st_size_t, char) = 0;
 
     switch(ft->info.size) {
         case ST_SIZE_BYTE:
--- a/src/au.c
+++ b/src/au.c
@@ -342,7 +342,7 @@
         return (p->in_bits > 0);
 }
 
-st_ssize_t st_auread(ft_t ft, st_sample_t *buf, st_ssize_t samp)
+st_ssize_t st_auread(ft_t ft, st_sample_t *buf, st_size_t samp)
 {
         au_t p = (au_t ) ft->priv;
         unsigned char code;
@@ -360,7 +360,7 @@
         return done;
 }
 
-st_ssize_t st_auwrite(ft_t ft, const st_sample_t *buf, st_ssize_t samp)
+st_ssize_t st_auwrite(ft_t ft, const st_sample_t *buf, st_size_t samp)
 {
         au_t p = (au_t ) ft->priv;
         p->data_size += samp * ft->info.size;
--- a/src/auto.c
+++ b/src/auto.c
@@ -25,13 +25,10 @@
 
 int st_autostartread(ft_t ft)
 {
-    char *type;
+    char *type = NULL;
     char header[20];
-    int rc;
-    int loop;
+    int rc, loop;
 
-    type = 0;
-
     /* Attempt to auto-detect filetype using magic values.  Abort loop
      * and use file extension if any errors are detected.
      */
@@ -50,9 +47,7 @@
                  (strncmp(header+1, "ds.", 3) == 0)) ||
                 ((strncmp(header, "sd.", 3) == 0) && 
                  (header[3] == '\0')))
-            {
                 type = "au";
-            }
             else if (strncmp(header, "FORM", 4) == 0) 
             {
                 /* Need to read more data to see what type of FORM file */
@@ -71,18 +66,14 @@
             else if (strncmp(header, "RIFF", 4) == 0)
             {
                 if (st_readbuf(ft, header, 1, 8) == 8)
-                {
                     if (strncmp(header + 4, "WAVE", 4) == 0)
                         type = "wav";
-                }
             }
             else if (strncmp(header, "Crea", 4) == 0) 
             {
                 if (st_readbuf(ft, header, 1, 15) == 15)
-                {
                     if (strncmp(header, "tive Voice File", 15) == 0) 
                         type = "voc";
-                }
             }
             else if (strncmp(header, "SOUN", 4) == 0)
             {
@@ -102,72 +93,59 @@
                 }
             }
             else if (strncmp(header, "2BIT", 4) == 0) 
-            {
                 type = "avr";
-            }
             else if (strncmp(header, "NIST", 4) == 0) 
             {
                 if (st_readbuf(ft, header, 1, 3) == 3)
-                {
                     if (strncmp(header, "_1A", 3) == 0) 
                         type = "sph";
-                }
             }
             else if (strncmp(header, "ALaw", 4) == 0)
             {
                 if (st_readbuf(ft, header, 1, 11) == 11)
-                {
                     if (strncmp(header, "SoundFile**", 11) == 0)
-                    {
                         type = "wve";
-                    }
-                }
             }
             else if (strncmp(header, "Ogg", 3) == 0)
-            {
                 type = "ogg";
-            }
             else if (strncmp(header, "fLaC", 4) == 0)
-            {
                 type = "flac";
-            }
             else if ((memcmp(header, "XAI\0", 4) == 0) ||
                      (memcmp(header, "XAJ\0", 4) == 0) ||
                      (memcmp(header, "XA\0\0", 4) == 0))
-            {
                 type = "xa";
-            }
         } /* read 4-byte header */
 
         /* If we didn't find type yet then start looking for file
          * formats that the magic header is deeper in the file.
          */
-        if (type == 0)
+        if (type == NULL)
         {
-            loop = 61;
-            while (loop--)
-            {
+            for (loop = 0; loop < 60; loop++)
                 if (st_readbuf(ft, header, 1, 1) != 1)
-                    loop = 0;
-            }
+                    break;
             if (st_readbuf(ft, header, 1, 4) == 4 && 
                 strncmp(header, "FSSD", 4) == 0)
             {
-                loop = 63;
-                while (loop--)
-                {
+                for (loop = 0; loop < 62; loop++)
                     if (st_readbuf(ft, header, 1, 1) != 1)
-                        loop = 0;
-                }
+                        break;
                 if (st_readbuf(ft, header, 1, 4) == 0 && 
                     strncmp(header, "HCOM", 4) == 0)
                     type = "hcom";
             }
         }
+
         st_rewind(ft);
+
+        if (type == NULL) {
+          if (prc_checkheader(ft, header))
+            type = "prc";
+          st_rewind(ft);
+        }        
     } /* if (seekable) */
 
-    if (type == 0)
+    if (type == NULL)
     {
         /* Use filename extension to determine audio type. */
 
@@ -183,7 +161,7 @@
             type = NULL;
     }
 
-    if(!type)
+    if (type == NULL)
     {
         st_fail_errno(ft,ST_EFMT, "Could not determine file type.");
         return (ST_EOF);
--- a/src/avr.c
+++ b/src/avr.c
@@ -260,7 +260,7 @@
   return(ST_SUCCESS);
 }
 
-st_ssize_t st_avrwrite(ft_t ft, const st_sample_t *buf, st_ssize_t nsamp) 
+st_ssize_t st_avrwrite(ft_t ft, const st_sample_t *buf, st_size_t nsamp) 
 {
   avr_t avr = (avr_t)ft->priv;
 
--- a/src/cdr.c
+++ b/src/cdr.c
@@ -78,7 +78,7 @@
  * Return number of samples read.
  */
 
-st_ssize_t st_cdrread(ft_t ft, st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_cdrread(ft_t ft, st_sample_t *buf, st_size_t len) 
 {
 
         return st_rawread(ft, buf, len);
@@ -121,7 +121,7 @@
         return(ST_SUCCESS);
 }
 
-st_ssize_t st_cdrwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_cdrwrite(ft_t ft, const st_sample_t *buf, st_size_t len) 
 {
         cdr_t cdr = (cdr_t) ft->priv;
 
--- a/src/cvsd.c
+++ b/src/cvsd.c
@@ -237,7 +237,7 @@
 
 /* ---------------------------------------------------------------------- */
 
-st_ssize_t st_cvsdread(ft_t ft, st_sample_t *buf, st_ssize_t nsamp) 
+st_ssize_t st_cvsdread(ft_t ft, st_sample_t *buf, st_size_t nsamp) 
 {
         struct cvsdpriv *p = (struct cvsdpriv *) ft->priv;
         int done = 0;
@@ -296,7 +296,7 @@
 
 /* ---------------------------------------------------------------------- */
 
-st_ssize_t st_cvsdwrite(ft_t ft, const st_sample_t *buf, st_ssize_t nsamp) 
+st_ssize_t st_cvsdwrite(ft_t ft, const st_sample_t *buf, st_size_t nsamp) 
 {
         struct cvsdpriv *p = (struct cvsdpriv *) ft->priv;
         int done = 0;
--- a/src/dat.c
+++ b/src/dat.c
@@ -91,7 +91,7 @@
     return (ST_SUCCESS);
 }
 
-st_ssize_t st_datread(ft_t ft, st_sample_t *buf, st_ssize_t nsamp)
+st_ssize_t st_datread(ft_t ft, st_sample_t *buf, st_size_t nsamp)
 {
     char inpstr[LINEWIDTH];
     int  inpPtr = 0;
@@ -138,7 +138,7 @@
     return (done);
 }
 
-st_ssize_t st_datwrite(ft_t ft, const st_sample_t *buf, st_ssize_t nsamp)
+st_ssize_t st_datwrite(ft_t ft, const st_sample_t *buf, st_size_t nsamp)
 {
     dat_t dat = (dat_t) ft->priv;
     int done = 0;
--- a/src/flac.c
+++ b/src/flac.c
@@ -176,7 +176,7 @@
 }
 
 
-static st_ssize_t st_format_read(ft_t const format, st_sample_t * sampleBuffer, st_ssize_t const requested)
+static st_ssize_t st_format_read(ft_t const format, st_sample_t * sampleBuffer, st_size_t const requested)
 {
   Decoder * decoder = (Decoder *) format->priv;
   int actual = 0;
@@ -423,7 +423,7 @@
 
 
 
-static st_ssize_t st_format_write(ft_t const format, st_sample_t const * const sampleBuffer, st_ssize_t const len)
+static st_ssize_t st_format_write(ft_t const format, st_sample_t const * const sampleBuffer, st_size_t const len)
 {
   Encoder * encoder = (Encoder *) format->priv;
   unsigned i;
--- a/src/gsm.c
+++ b/src/gsm.c
@@ -28,8 +28,6 @@
 
 #include "st_i.h"
 
-#if defined(ENABLE_GSM)
-
 #if defined(EXTERNAL_GSM)
 #include <gsm/gsm.h>
 #else
@@ -109,7 +107,7 @@
  * Return number of samples read.
  */
 
-st_ssize_t st_gsmread(ft_t ft, st_sample_t *buf, st_ssize_t samp)
+st_ssize_t st_gsmread(ft_t ft, st_sample_t *buf, st_size_t samp)
 {
         int done = 0;
         int r, ch, chans;
@@ -187,7 +185,7 @@
         return (ST_SUCCESS);
 }
 
-st_ssize_t st_gsmwrite(ft_t ft, const st_sample_t *buf, st_ssize_t samp)
+st_ssize_t st_gsmwrite(ft_t ft, const st_sample_t *buf, st_size_t samp)
 {
         int done = 0;
         struct gsmpriv *p = (struct gsmpriv *) ft->priv;
@@ -261,4 +259,3 @@
 {
     return &st_gsm_format;
 }
-#endif /* ENABLE_GSM */
--- a/src/hcom.c
+++ b/src/hcom.c
@@ -176,7 +176,7 @@
         return(ST_SUCCESS);
 }
 
-st_ssize_t st_hcomread(ft_t ft, st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_hcomread(ft_t ft, st_sample_t *buf, st_size_t len)
 {
         register struct readpriv *p = (struct readpriv *) ft->priv;
         int done = 0;
@@ -307,7 +307,7 @@
         return (ST_SUCCESS);
 }
 
-st_ssize_t st_hcomwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_hcomwrite(ft_t ft, const st_sample_t *buf, st_size_t len)
 {
         register struct writepriv *p = (struct writepriv *) ft->priv;
         st_sample_t datum;
--- a/src/maud.c
+++ b/src/maud.c
@@ -227,7 +227,7 @@
  * Return number of samples read.
  */
 
-st_ssize_t st_maudread(ft_t ft, st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_maudread(ft_t ft, st_sample_t *buf, st_size_t len) 
 {
         return (st_rawread(ft, buf, len));
 }
@@ -284,7 +284,7 @@
         return (ST_SUCCESS);
 }
 
-st_ssize_t st_maudwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_maudwrite(ft_t ft, const st_sample_t *buf, st_size_t len) 
 {
         struct maudstuff * p = (struct maudstuff *) ft->priv;
         
--- a/src/misc.c
+++ b/src/misc.c
@@ -81,7 +81,7 @@
  * Returns number of elements read, not bytes read.
  */
 
-st_ssize_t st_readbuf(ft_t ft, void *buf, size_t size, st_ssize_t len)
+st_ssize_t st_readbuf(ft_t ft, void *buf, size_t size, st_size_t len)
 {
     return fread(buf, size, len, ft->fp);
 }
@@ -90,7 +90,7 @@
  * Returns number of elements writen, not bytes writen.
  */
 
-st_ssize_t st_writebuf(ft_t ft, void const *buf, size_t size, st_ssize_t len)
+st_ssize_t st_writebuf(ft_t ft, void const *buf, size_t size, st_size_t len)
 {
     return fwrite(buf, size, len, ft->fp);
 }
@@ -140,7 +140,7 @@
 /* Read n-char string (and possibly null-terminating).
  * Stop reading and null-terminate string if either a 0 or \n is reached.
  */
-int st_reads(ft_t ft, char *c, st_ssize_t len)
+int st_reads(ft_t ft, char *c, st_size_t len)
 {
     char *sc;
     char in;
@@ -357,8 +357,8 @@
 
 /* dummy format routines for do-nothing functions */
 int st_format_nothing(ft_t ft) { return(ST_SUCCESS); }
-st_ssize_t st_format_nothing_read_io(ft_t ft, st_sample_t *buf, st_ssize_t len) { return(0); }
-st_ssize_t st_format_nothing_write_io(ft_t ft, const st_sample_t *buf, st_ssize_t len) { return(0); }
+st_ssize_t st_format_nothing_read_io(ft_t ft, st_sample_t *buf, st_size_t len) { return(0); }
+st_ssize_t st_format_nothing_write_io(ft_t ft, const st_sample_t *buf, st_size_t len) { return(0); }
 int st_format_nothing_seek(ft_t ft, st_size_t offset) { st_fail_errno(ft, ST_ENOTSUP, "operation not supported"); return(ST_EOF); }
 
 /* dummy effect routine for do-nothing functions */
@@ -439,7 +439,7 @@
 
 /* This was very painful.  We need a sine library. */
 
-void st_sine(int *buf, st_ssize_t len, int max, int depth)
+void st_sine(int *buf, st_size_t len, int max, int depth)
 {
     st_ssize_t i;
     int offset;
@@ -452,7 +452,7 @@
     }
 }
 
-void st_triangle(int *buf, st_ssize_t len, int max, int depth)
+void st_triangle(int *buf, st_size_t len, int max, int depth)
 {
     st_ssize_t i;
     int offset;
--- a/src/mp3.c
+++ b/src/mp3.c
@@ -279,7 +279,7 @@
  * Place in buf[].
  * Return number of samples read.
  */
-st_ssize_t st_mp3read(ft_t ft, st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_mp3read(ft_t ft, st_sample_t *buf, st_size_t len)
 {
     struct mp3priv *p = (struct mp3priv *) ft->priv;
     st_ssize_t donow,i,done=0;
@@ -365,7 +365,7 @@
   return ST_EOF;
 }
 
-st_ssize_t st_mp3read(ft_t ft, st_sample_t *buf, st_ssize_t samp)
+st_ssize_t st_mp3read(ft_t ft, st_sample_t *buf, st_size_t samp)
 {
   st_fail_errno(ft,ST_EOF,"SoX was compiled without MP3 decoding support");
   return ST_EOF;
@@ -431,7 +431,7 @@
   return(ST_SUCCESS);
 }
 
-st_ssize_t st_mp3write(ft_t ft, const st_sample_t *buf, st_ssize_t samp)
+st_ssize_t st_mp3write(ft_t ft, const st_sample_t *buf, st_size_t samp)
 {
     struct mp3priv *p = (struct mp3priv *)ft->priv;
     char *mp3buffer;
--- a/src/nulfile.c
+++ b/src/nulfile.c
@@ -29,7 +29,7 @@
   return ST_SUCCESS;
 }
 
-st_ssize_t st_nulread(ft_t ft, st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_nulread(ft_t ft, st_sample_t *buf, st_size_t len) 
 {
   /* Reading from null generates silence i.e. (st_sample_t)0. */
   memset(buf, 0, sizeof(st_sample_t) * len);
@@ -36,7 +36,7 @@
   return len; /* Return number of samples "read". */
 }
 
-st_ssize_t st_nulwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_nulwrite(ft_t ft, const st_sample_t *buf, st_size_t len) 
 {
   /* Writing to null just discards the samples */
   return len; /* Return number of samples "written". */
--- a/src/prc.c
+++ b/src/prc.c
@@ -1,15 +1,27 @@
 /*
- * Psion record.app format (format of files needed for Revo,Revo+,Mako in 
- * System/Alarms to provide new alarm sounds. Note that the file normally
+ * Psion Record format (format of files used for Revo,Revo+,Mako in 
+ * System/Alarms to provide alarm sounds. Note that the file normally
  * has no extension, so I've made it .prc for now (Psion ReCord), until
- * somebody can come up with a better one. Also, I have absolutely no idea
- * what the header format is, I just looked at a few files, saw they all
- * had identical headers except for two places where the length words go,
- * so its very likely that most of this is wrong. It has worked for me,
- * however.
+ * somebody can come up with a better one.
  * Based (heavily) on the wve.c format file. 
  * Hacked by Bert van Leeuwen (bert@e.co.za)
- */
+ * Header check truncated to first 16 bytes (i.e. EPOC file header)
+ * and other improvements by Reuben Thomas <rrt@sc3d.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, write to the Free Software
+ * Foundation, Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301,
+ * USA.  */
 
 #include "st_i.h"
 #include "g72x.h"
@@ -18,9 +30,6 @@
 #include <errno.h>
 #endif
 
-/* Magic numbers used in Psion audio files */
-#define PSION_PRC_HDRSIZE   72
-
 typedef struct prcpriv
     {
     uint32_t length;
@@ -30,16 +39,19 @@
         st_size_t dataStart;
     } *prc_t;
 
-char header[]={
+/* 16 bytes header = 3 UIDs plus checksum, standard Symbian/EPOC file
+   header */
+static const char prc_header[]={
   0x37,0x00,0x00,0x10,0x6d,0x00,0x00,0x10,
-  0x7e,0x00,0x00,0x10,0xcf,0xac,0x08,0x55,
-  0x14,0x00,0x00,0x00,0x04,0x52,0x00,0x00,
-  0x10,0x34,0x00,0x00,0x00,0x89,0x00,0x00,
-  0x10,0x25,0x00,0x00,0x00,0x7e,0x00,0x00,
-  0x10,0x2a,0x52,0x65,0x63,0x6f,0x72,0x64,
-  0x2e,0x61,0x70,0x70
+  0x7e,0x00,0x00,0x10,0xcf,0xac,0x08,0x55
 };
 
+int prc_checkheader(ft_t ft, char *head)
+{
+  st_readbuf(ft, head, 1, sizeof(prc_header));
+  return memcmp(head, prc_header, sizeof(prc_header)) == 0;
+}
+
 static void prcwriteheader(ft_t ft);
 
 int st_prcseek(ft_t ft, st_size_t offset)
@@ -48,7 +60,7 @@
     st_size_t new_offset, channel_block, alignment;
 
     new_offset = offset * ft->info.size;
-    /* Make sure request aligns to a channel block (ie left+right) */
+    /* Make sure request aligns to a channel block (i.e. left+right) */
     channel_block = ft->info.channels * ft->info.size;
     alignment = new_offset % channel_block;
     /* Most common mistaken is to compute something like
@@ -65,7 +77,7 @@
 int st_prcstartread(ft_t ft)
 {
         prc_t p = (prc_t ) ft->priv;
-        char head[sizeof(header)];
+        char head[sizeof(prc_header)];
         int rc;
 
         uint16_t len;
@@ -84,10 +96,8 @@
         }
 
         /* Check the header */
-        st_readbuf(ft, head,1, sizeof(header));
-        if (memcmp(head, header, sizeof(header))==0) {
-                st_debug("Found Psion record.app header");
-        }
+        if (prc_checkheader(ft, head))
+                st_debug("Found Psion Record header");
         else
         {
                 st_fail_errno(ft,ST_EHDR,"Psion header doesn't start with the correct bytes\nTry the '.al' (A-law raw) file type with '-t al -r 8000 filename'");
@@ -163,12 +173,12 @@
         return ST_SUCCESS;
 }
 
-st_ssize_t st_prcread(ft_t ft, st_sample_t *buf, st_ssize_t samp)
+st_ssize_t st_prcread(ft_t ft, st_sample_t *buf, st_size_t samp)
 {
         return st_rawread(ft, buf, samp);
 }
 
-st_ssize_t st_prcwrite(ft_t ft, const st_sample_t *buf, st_ssize_t samp)
+st_ssize_t st_prcwrite(ft_t ft, const st_sample_t *buf, st_size_t samp)
 {
         prc_t p = (prc_t ) ft->priv;
         p->length += samp * ft->info.size;
@@ -203,7 +213,7 @@
 
   st_debug("Final length=%d",p->length);
   memset(nullbuf,0,14);
-  st_writebuf(ft, header, 1, sizeof(header));
+  st_writebuf(ft, prc_header, 1, sizeof(prc_header));
   st_writew(ft, p->length);
   st_writebuf(ft, nullbuf,1,14);
   st_writew(ft, p->length);
--- a/src/raw.c
+++ b/src/raw.c
@@ -140,7 +140,7 @@
     return ST_SUCCESS;
 }
 
-void st_ub_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len, char swap)
+void st_ub_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -154,7 +154,7 @@
     }
 }
 
-void st_sb_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len, char swap)
+void st_sb_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -168,7 +168,7 @@
     }
 }
 
-void st_ulaw_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len,
+void st_ulaw_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len,
                       char swap)
 {
     while (len)
@@ -183,7 +183,7 @@
     }
 }
 
-void st_alaw_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len,
+void st_alaw_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len,
                       char swap)
 {
     while (len)
@@ -198,7 +198,7 @@
     }
 }
 
-void st_inv_ulaw_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len,
+void st_inv_ulaw_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len,
                           char swap)
 {
     while (len)
@@ -213,7 +213,7 @@
     }
 }
 
-void st_inv_alaw_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len,
+void st_inv_alaw_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len,
                           char swap)
 {
     while (len)
@@ -229,7 +229,7 @@
 }
 
 
-void st_uw_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len, char swap)
+void st_uw_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -245,7 +245,7 @@
     }
 }
 
-void st_sw_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len, char swap)
+void st_sw_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -281,7 +281,7 @@
 
 
 
-void st_u24_read_buf(st_sample_t * buf1, char const * buf2, st_ssize_t len, char const swap)
+void st_u24_read_buf(st_sample_t * buf1, char const * buf2, st_size_t len, char const swap)
 {
   while (len--)
   {
@@ -292,7 +292,7 @@
 
 
 
-void st_s24_read_buf(st_sample_t * buf1, char const * buf2, st_ssize_t len, char const swap)
+void st_s24_read_buf(st_sample_t * buf1, char const * buf2, st_size_t len, char const swap)
 {
   while (len--)
   {
@@ -303,7 +303,7 @@
 
 
 
-void st_udw_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len, char swap)
+void st_udw_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -319,7 +319,7 @@
     }
 }
 
-void st_dw_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len, char swap)
+void st_dw_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -335,7 +335,7 @@
     }
 }
 
-void st_f32_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len, char swap)
+void st_f32_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -351,7 +351,7 @@
     }
 }
 
-void st_f64_read_buf(st_sample_t *buf1, char const * buf2, st_ssize_t len, char swap)
+void st_f64_read_buf(st_sample_t *buf1, char const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -376,10 +376,10 @@
  * functions will cause a loss of data!  Need to have sox implement
  * a consistent buffering protocol.
  */
-st_ssize_t st_rawread(ft_t ft, st_sample_t *buf, st_ssize_t nsamp)
+st_ssize_t st_rawread(ft_t ft, st_sample_t *buf, st_size_t nsamp)
 {
-    st_ssize_t len, done = 0;
-    void (*read_buf)(st_sample_t *, char const *, st_ssize_t, char) = 0;
+    st_size_t len, done = 0;
+    void (*read_buf)(st_sample_t *, char const *, st_size_t, char) = 0;
     size_t i;
 
     if (nsamp < 0)
@@ -537,7 +537,7 @@
         return ST_SUCCESS;
 }
 
-void st_ub_write_buf(char* buf1, st_sample_t const * buf2, st_ssize_t len, char swap)
+void st_ub_write_buf(char* buf1, st_sample_t const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -546,7 +546,7 @@
     }
 }
 
-void st_sb_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len, char swap)
+void st_sb_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -555,7 +555,7 @@
     }
 }
 
-void st_ulaw_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len,
+void st_ulaw_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len,
                        char swap)
 {
     while (len)
@@ -565,7 +565,7 @@
     }
 }
 
-void st_alaw_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len,
+void st_alaw_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len,
                        char swap)
 {
     while (len)
@@ -575,7 +575,7 @@
     }
 }
 
-void st_inv_ulaw_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len,
+void st_inv_ulaw_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len,
                            char swap)
 {
     while (len)
@@ -585,7 +585,7 @@
     }
 }
 
-void st_inv_alaw_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len,
+void st_inv_alaw_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len,
                            char swap)
 {
     while (len)
@@ -595,7 +595,7 @@
     }
 }
 
-void st_uw_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len, char swap)
+void st_uw_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -611,7 +611,7 @@
     }
 }
 
-void st_sw_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len, char swap)
+void st_sw_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -649,7 +649,7 @@
 
 
 
-void st_u24_write_buf(char * buf1, st_sample_t const * buf2, st_ssize_t len, char const swap)
+void st_u24_write_buf(char * buf1, st_sample_t const * buf2, st_size_t len, char const swap)
 {
   while (len--)
   {
@@ -660,7 +660,7 @@
 
 
 
-void st_s24_write_buf(char * buf1, st_sample_t const * buf2, st_ssize_t len, char const swap)
+void st_s24_write_buf(char * buf1, st_sample_t const * buf2, st_size_t len, char const swap)
 {
   while (len--)
   {
@@ -671,7 +671,7 @@
 
 
 
-void st_udw_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len, char swap)
+void st_udw_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -687,7 +687,7 @@
     }
 }
 
-void st_dw_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len, char swap)
+void st_dw_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -703,7 +703,7 @@
     }
 }
 
-void st_f32_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len, char swap)
+void st_f32_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -719,7 +719,7 @@
     }
 }
 
-void st_f64_write_buf(char *buf1, st_sample_t const * buf2, st_ssize_t len, char swap)
+void st_f64_write_buf(char *buf1, st_sample_t const * buf2, st_size_t len, char swap)
 {
     while (len)
     {
@@ -754,10 +754,10 @@
  * functions will cause a loss of data!  Need to have sox implement
  * a consistent buffering protocol.
  */
-st_ssize_t st_rawwrite(ft_t ft, const st_sample_t *buf, st_ssize_t nsamp)
+st_ssize_t st_rawwrite(ft_t ft, const st_sample_t *buf, st_size_t nsamp)
 {
-    st_ssize_t len, done = 0;
-    void (*write_buf)(char *, st_sample_t const *, st_ssize_t, char) = 0;
+    st_size_t len, done = 0;
+    void (*write_buf)(char *, st_sample_t const *, st_size_t, char) = 0;
 
     switch(ft->info.size) {
         case ST_SIZE_BYTE:
--- a/src/skel.c
+++ b/src/skel.c
@@ -68,7 +68,7 @@
  * Place in buf[].
  * Return number of samples read.
  */
-st_ssize_t st_skelread(ft_t ft, st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_skelread(ft_t ft, st_sample_t *buf, st_size_t len) 
 {
     skel_t sk = (skel_t)ft->priv;
     int done = 0;
@@ -145,10 +145,10 @@
 
 }
 
-st_ssize_t st_skelwrite(ft_t ft, st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_skelwrite(ft_t ft, st_sample_t *buf, st_size_t len) 
 {
     skel_t sk = (skel_t) ft->priv;
-    st_ssize_t len = 0;
+    st_size_t len = 0;
 
     switch (ft->info.size)
     {
--- a/src/smp.c
+++ b/src/smp.c
@@ -333,7 +333,7 @@
  * Place in buf[].
  * Return number of samples read.
  */
-st_ssize_t st_smpread(ft_t ft, st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_smpread(ft_t ft, st_sample_t *buf, st_size_t len) 
 {
         smp_t smp = (smp_t) ft->priv;
         unsigned short datum;
@@ -397,7 +397,7 @@
         return(ST_SUCCESS);
 }
 
-st_ssize_t st_smpwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_smpwrite(ft_t ft, const st_sample_t *buf, st_size_t len) 
 {
         smp_t smp = (smp_t) ft->priv;
         register int datum;
--- a/src/sndrtool.c
+++ b/src/sndrtool.c
@@ -200,7 +200,7 @@
 /*                         SNDTWRITE                                     */
 /*======================================================================*/
 
-st_ssize_t st_sndtwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_sndtwrite(ft_t ft, const st_sample_t *buf, st_size_t len)
 {
         snd_t p = (snd_t ) ft->priv;
         p->nsamples += len;
--- a/src/sphere.c
+++ b/src/sphere.c
@@ -191,7 +191,7 @@
  * Return number of samples read.
  */
 
-st_ssize_t st_sphereread(ft_t ft, st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_sphereread(ft_t ft, st_sample_t *buf, st_size_t len) 
 {
     sphere_t sphere = (sphere_t) ft->priv;
 
@@ -244,7 +244,7 @@
         
 }
 
-st_ssize_t st_spherewrite(ft_t ft, const st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_spherewrite(ft_t ft, const st_sample_t *buf, st_size_t len) 
 {
     sphere_t sphere = (sphere_t) ft->priv;
 
--- a/src/st.h
+++ b/src/st.h
@@ -212,10 +212,10 @@
     char         *usage;
     unsigned int flags;
     int          (*startread)(ft_t ft);
-    st_ssize_t   (*read)(ft_t ft, st_sample_t *buf, st_ssize_t len);
+    st_ssize_t   (*read)(ft_t ft, st_sample_t *buf, st_size_t len);
     int          (*stopread)(ft_t ft);
     int          (*startwrite)(ft_t ft);
-    st_ssize_t   (*write)(ft_t ft, const st_sample_t *buf, st_ssize_t len);
+    st_ssize_t   (*write)(ft_t ft, const st_sample_t *buf, st_size_t len);
     int          (*stopwrite)(ft_t ft);
     int          (*seek)(ft_t ft, st_size_t offset);
 } st_format_t;
@@ -342,8 +342,8 @@
                                 const char *filetype, const char *comment, 
                                 const st_instrinfo_t *instr,
                                 const st_loopinfo_t *loops);
-extern st_ssize_t st_read(ft_t ft, st_sample_t *buf, st_ssize_t len);
-extern st_ssize_t st_write(ft_t ft, const st_sample_t *buf, st_ssize_t len);
+extern st_ssize_t st_read(ft_t ft, st_sample_t *buf, st_size_t len);
+extern st_ssize_t st_write(ft_t ft, const st_sample_t *buf, st_size_t len);
 extern int st_close(ft_t ft);
 
 #define ST_SEEK_SET 0
--- a/src/st_i.h
+++ b/src/st_i.h
@@ -38,8 +38,8 @@
 #endif
 
 /* declared in misc.c */
-void st_sine(int *buf, st_ssize_t len, int max, int depth);
-void st_triangle(int *buf, st_ssize_t len, int max, int depth);
+void st_sine(int *buf, st_size_t len, int max, int depth);
+void st_triangle(int *buf, st_size_t len, int max, int depth);
 
 st_sample_t st_gcd(st_sample_t a, st_sample_t b) REGPARM(2);
 st_sample_t st_lcm(st_sample_t a, st_sample_t b) REGPARM(2);
@@ -66,9 +66,9 @@
  * possible byte swapping.
  */
 /* declared in misc.c */
-st_ssize_t st_readbuf(ft_t ft, void *buf, size_t size, st_ssize_t len);
-st_ssize_t st_writebuf(ft_t ft, void const *buf, size_t size, st_ssize_t len);
-int st_reads(ft_t ft, char *c, st_ssize_t len);
+st_ssize_t st_readbuf(ft_t ft, void *buf, size_t size, st_size_t len);
+st_ssize_t st_writebuf(ft_t ft, void const *buf, size_t size, st_size_t len);
+int st_reads(ft_t ft, char *c, st_size_t len);
 int st_writes(ft_t ft, char *c);
 int st_readb(ft_t ft, uint8_t *ub);
 int st_writeb(ft_t ft, uint8_t ub);
@@ -164,6 +164,9 @@
  *=============================================================================
  */
 
+/* Psion record header check, defined in prc.c */
+int prc_checkheader(ft_t ft, char *head);
+
 typedef const st_format_t *(*st_format_fn_t)(void);
 
 extern st_format_fn_t st_format_fns[];
@@ -228,10 +231,10 @@
 /* Raw I/O
  */
 int st_rawstartread(ft_t ft);
-st_ssize_t st_rawread(ft_t ft, st_sample_t *buf, st_ssize_t nsamp);
+st_ssize_t st_rawread(ft_t ft, st_sample_t *buf, st_size_t nsamp);
 int st_rawstopread(ft_t ft);
 int st_rawstartwrite(ft_t ft);
-st_ssize_t st_rawwrite(ft_t ft, const st_sample_t *buf, st_ssize_t nsamp);
+st_ssize_t st_rawwrite(ft_t ft, const st_sample_t *buf, st_size_t nsamp);
 int st_rawstopwrite(ft_t ft);
 int st_rawseek(ft_t ft, st_size_t offset);
 
@@ -239,8 +242,8 @@
  * a file handler or effect doesn't need to do anything special
  */
 int st_format_nothing(ft_t ft);
-st_ssize_t st_format_nothing_read_io(ft_t ft, st_sample_t *buf, st_ssize_t len);
-st_ssize_t st_format_nothing_write_io(ft_t ft, const st_sample_t *buf, st_ssize_t len);
+st_ssize_t st_format_nothing_read_io(ft_t ft, st_sample_t *buf, st_size_t len);
+st_ssize_t st_format_nothing_write_io(ft_t ft, const st_sample_t *buf, st_size_t len);
 int st_format_nothing_seek(ft_t ft, st_size_t offset);
 int st_effect_nothing(eff_t effp);
 int st_effect_nothing_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp);
--- a/src/stio.c
+++ b/src/stio.c
@@ -325,12 +325,12 @@
     return st_open_write_instr(path, info, filetype, comment, NULL, NULL);
 }
 
-st_ssize_t st_read(ft_t ft, st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_read(ft_t ft, st_sample_t *buf, st_size_t len)
 {
     return (*ft->h->read)(ft, buf, len);
 }
 
-st_ssize_t st_write(ft_t ft, const st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_write(ft_t ft, const st_sample_t *buf, st_size_t len)
 {
     return (*ft->h->write)(ft, buf, len);
 }
--- a/src/tx16w.c
+++ b/src/tx16w.c
@@ -186,7 +186,7 @@
  * Return number of samples read.
  */
 
-st_ssize_t st_txwread(ft_t ft, st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_txwread(ft_t ft, st_sample_t *buf, st_size_t len)
 {
     txw_t sk = (txw_t) ft->priv;
     int done = 0;
@@ -276,7 +276,7 @@
     return(ST_SUCCESS);
 }
 
-st_ssize_t st_txwwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_txwwrite(ft_t ft, const st_sample_t *buf, st_size_t len)
 {
     int i;
     unsigned int w1,w2;
--- a/src/voc.c
+++ b/src/voc.c
@@ -317,7 +317,7 @@
  * ANN:  Major changes here to support multi-part files and files
  *       that do not have audio in block 9's.
  *-----------------------------------------------------------------*/
-st_ssize_t st_vocread(ft_t ft, st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_vocread(ft_t ft, st_sample_t *buf, st_size_t len)
 {
         vs_t v = (vs_t) ft->priv;
         int done = 0;
@@ -466,7 +466,7 @@
 /*-----------------------------------------------------------------
  * st_vocstartread() -- start reading a VOC file
  *-----------------------------------------------------------------*/
-st_ssize_t st_vocwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len)
+st_ssize_t st_vocwrite(ft_t ft, const st_sample_t *buf, st_size_t len)
 {
         vs_t v = (vs_t) ft->priv;
         unsigned char uc;
--- a/src/vorbis.c
+++ b/src/vorbis.c
@@ -230,7 +230,7 @@
  * Return number of samples read.
  */
 
-st_ssize_t st_vorbisread(ft_t ft, st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_vorbisread(ft_t ft, st_sample_t *buf, st_size_t len) 
 {
         vorbis_t vb = (vorbis_t) ft->priv;
         int i;
@@ -399,7 +399,7 @@
         return(ST_SUCCESS);     
 }
 
-st_ssize_t st_vorbiswrite(ft_t ft, const st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_vorbiswrite(ft_t ft, const st_sample_t *buf, st_size_t len) 
 {
         vorbis_t vb = (vorbis_t) ft->priv;
         vorbis_enc_t *ve = vb->vorbis_enc_data;
--- a/src/vox.c
+++ b/src/vox.c
@@ -151,7 +151,7 @@
  * Notes      : 
  ******************************************************************************/
 
-st_ssize_t st_voxread (ft_t ft,st_sample_t *buffer,st_ssize_t length) 
+st_ssize_t st_voxread (ft_t ft,st_sample_t *buffer,st_size_t length) 
            { vox_t    state = (vox_t) ft->priv;
                  int      count = 0;
              int      N;
@@ -267,7 +267,7 @@
  * Notes      : 
  ******************************************************************************/
 
-st_ssize_t st_voxwrite (ft_t ft,const st_sample_t *buffer,st_ssize_t length) 
+st_ssize_t st_voxwrite (ft_t ft,const st_sample_t *buffer,st_size_t length) 
            { vox_t    state = (vox_t) ft->priv;
              int      count = 0;
              uint8_t  byte  = state->store.byte;
--- a/src/wav.c
+++ b/src/wav.c
@@ -282,7 +282,7 @@
     free(wav->gsmsample);
 }
 
-st_ssize_t wavgsmread(ft_t ft, st_sample_t *buf, st_ssize_t len)
+st_ssize_t wavgsmread(ft_t ft, st_sample_t *buf, st_size_t len)
 {
     wav_t       wav = (wav_t) ft->priv;
     int done=0;
@@ -350,7 +350,7 @@
     return (ST_SUCCESS);
 }
 
-st_ssize_t wavgsmwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len)
+st_ssize_t wavgsmwrite(ft_t ft, const st_sample_t *buf, st_size_t len)
 {
     wav_t       wav = (wav_t) ft->priv;
     int done = 0;
@@ -1102,7 +1102,7 @@
  * Return number of samples read.
  */
 
-st_ssize_t st_wavread(ft_t ft, st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_wavread(ft_t ft, st_sample_t *buf, st_size_t len) 
 {
         wav_t   wav = (wav_t) ft->priv;
         st_ssize_t done;
@@ -1679,7 +1679,7 @@
     return ST_SUCCESS;
 }
 
-st_ssize_t st_wavwrite(ft_t ft, const st_sample_t *buf, st_ssize_t len) 
+st_ssize_t st_wavwrite(ft_t ft, const st_sample_t *buf, st_size_t len) 
 {
         wav_t   wav = (wav_t) ft->priv;
         st_ssize_t total_len = len;
--- a/src/wve.c
+++ b/src/wve.c
@@ -174,13 +174,8 @@
         return ST_SUCCESS;
 }
 
-st_ssize_t st_wveread(ft_t ft, st_sample_t *buf, st_ssize_t samp)
+st_ssize_t st_wvewrite(ft_t ft, const st_sample_t *buf, st_size_t samp)
 {
-        return st_rawread(ft, buf, samp);
-}
-
-st_ssize_t st_wvewrite(ft_t ft, const st_sample_t *buf, st_ssize_t samp)
-{
         wve_t p = (wve_t ) ft->priv;
         p->length += samp * ft->info.size;
         return st_rawwrite(ft, buf, samp);
@@ -243,7 +238,7 @@
   NULL,
   ST_FILE_SEEK,
   st_wvestartread,
-  st_wveread,
+  st_rawread,
   st_rawstopread,
   st_wvestartwrite,
   st_wvewrite,
--- a/src/xa.c
+++ b/src/xa.c
@@ -210,7 +210,7 @@
  * Read up to len samples from a file, converted to signed longs.
  * Return the number of samples read.
  */
-static st_ssize_t st_xaread(ft_t ft, st_sample_t *buf, st_ssize_t len)
+static st_ssize_t st_xaread(ft_t ft, st_sample_t *buf, st_size_t len)
 {
     xa_t xa = (xa_t) ft->priv;
     st_ssize_t done;
@@ -312,7 +312,7 @@
     return ST_EOF;
 }
 
-static st_ssize_t st_xawrite(ft_t ft, const st_sample_t *buf, st_ssize_t len)
+static st_ssize_t st_xawrite(ft_t ft, const st_sample_t *buf, st_size_t len)
 {
     st_fail_errno(ft, ST_ENOTSUP, ".XA writing not supported");
     return ST_EOF;