shithub: sox

Download patch

ref: c561f2900068530633992798e667ef3131a2420c
parent: da9ecc9768c7ec97a7d29e4e8a2dcb3659685e92
author: cbagwell <cbagwell>
date: Thu Sep 30 20:54:45 EDT 2004

Adding support for floats to wav handler.

--- a/TODO
+++ b/TODO
@@ -13,8 +13,6 @@
     of drain (ie. can't run the "reverse" effect twice
     on the same command line and have a good output file).
 
-  o Document how to play to audio device in man pages.
-
   o Have sox.c auto remove an resample effects when rates are the same
     (allows scripts to be dumper).
 
@@ -69,12 +67,12 @@
 
   o Make a global version of clip() instead of sprinked in all files.
 
-  o Add support to all file handlers to handle 32-bit and float
-    data types since raw functions can handle them.
+  o Fix conversions to and from st_sample_t to floats.  Currently,
+    its an approximation because it doesn't account from negative
+    side having 1 more value then positive side.  That means instead
+    of -1:1 range, its more like -0.999:1 or -1:0.9999.
 
-  o Comment strings.  Some file formats have space for embedded comments.
-    These are currently thrown away.  Printing them out, carrying them
-    forward, and an option to add new ones would be handy.
+  o Add command line option to override comment string.
 
   o Add support for .TXT format as Cooledit supports.  Not really fit for
     graphing since it is only a stream of ascii sample values but some
@@ -85,10 +83,6 @@
     a sound library called "ST" but libraries shouldn't exit a program,
     they should return error codes for users to handle.  Initial support
     for this has been added.  Needs to be completed.
-
-  o Enhance general robustness... For instance, malloc is called in
-    lots of places without checking its return value.  See last option
-    as well.
 
 SOX includes skeleton format files to assist you in supporting new 
 formats, sound effect loops, and special-purpose programs.
--- a/sox.1
+++ b/sox.1
@@ -194,7 +194,7 @@
 The option syntax is a little grotty, but in essence:
 .P
 .br
-	sox File.au file.wav
+	sox file.au file.wav
 .P
 .br
 translates a sound file in SUN Sparc .AU format 
@@ -374,6 +374,20 @@
 can have multiple audio and picture chunks.
 You may need a separate archiver to work with them.
 .TP 10
+.B .alsa
+ALSA /dev/snd/pcmCxDxp device driver
+.br
+This is a pseudo-file type and can be optionally compiled into SoX.  Run
+.B sox -h
+to see if you have support for this file type.  When this driver is used
+it allows you to open up the ALSA /dev/snd/pcmCxDxp file and configure it to
+use the same data format as passed in to \fBSoX\fR.
+It works for both playing and recording sound samples.  When playing sound
+files it attempts to set up the ALSA driver to use the same format as the
+input file.  It is suggested to always override the output values to use
+the highest quality samples your sound card can handle.  Example:
+.I sox infile -t alsa -w -s /dev/snd/pcmC0D0p
+.TP 10
 .B .au
 SUN Microsystems AU files.
 There are apparently many types of .au files;
@@ -502,7 +516,7 @@
 files it attempts to set up the OSS driver to use the same format as the
 input file.  It is suggested to always override the output values to use
 the highest quality samples your sound card can handle.  Example:
-.I -t ossdsp -w -s /dev/dsp
+.I sox infile -t ossdsp -w -s /dev/dsp
 .TP 10
 .B .prc
 Psion record.app
@@ -558,9 +572,9 @@
 files it attempts to set up the audio driver to use the same format as the
 input file.  It is suggested to always override the output values to use
 the highest quality samples your hardware can handle.  Example:
-.I -t sunau -w -s /dev/audio
+.I sox infile -t sunau -w -s /dev/audio
 or
-.I -t sunau -U -c 1 /dev/audio
+.I sox infile -t sunau -U -c 1 /dev/audio
 for older sun equipment.
 .TP 10
 .B .txw
--- a/sox.txt
+++ b/sox.txt
@@ -126,7 +126,7 @@
 OPTIONS
        The option syntax is a little grotty, but in essence:
 
-	    sox File.au file.wav
+	    sox file.au file.wav
 
        translates  a  sound file in SUN Sparc .AU format into a Microsoft .WAV
        file, while
@@ -286,6 +286,19 @@
 		 can have multiple audio and picture chunks.  You may  need  a
 		 separate archiver to work with them.
 
+       .alsa	 ALSA /dev/snd/pcmCxDxp device driver
+		 This  is  a  pseudo-file  type and can be optionally compiled
+		 into SoX.  Run sox -h to see if you  have  support  for  this
+		 file type.  When this driver is used it allows you to open up
+		 the ALSA /dev/snd/pcmCxDxp file and configure it to  use  the
+		 same  data  format  as	 passed	 in to SoX.  It works for both
+		 playing and recording	sound  samples.	  When	playing	 sound
+		 files	it  attempts to set up the ALSA driver to use the same
+		 format as the input file.  It is suggested to always override
+		 the  output  values  to  use the highest quality samples your
+		 sound card can handle.	 Example: sox infile  -t  alsa	-w  -s
+		 /dev/snd/pcmC0D0p
+
        .au	 SUN  Microsystems  AU files.  There are apparently many types
 		 of .au files; DEC has invented its own with a different magic
 		 number	 and word order.  The .au handler can read these files
@@ -384,7 +397,7 @@
 		 attempts to set up the OSS driver to use the same  format  as
 		 the  input file.  It is suggested to always override the out-
 		 put values to use the highest quality samples your sound card
-		 can handle.  Example: -t ossdsp -w -s /dev/dsp
+		 can handle.  Example: sox infile -t ossdsp -w -s /dev/dsp
 
        .prc	 Psion record.app
 		 Used in some Psion devices for System alarms.	This format is
@@ -430,109 +443,110 @@
 		 attempts to set up the audio driver to use the same format as
 		 the input file.  It is suggested to always override the  out-
 		 put  values  to use the highest quality samples your hardware
-		 can handle.  Example: -t sunau -w -s /dev/audio or  -t	 sunau
-		 -U -c 1 /dev/audio for older sun equipment.
+		 can handle.  Example: sox infile -t sunau -w -s /dev/audio or
+		 sox  infile  -t sunau -U -c 1 /dev/audio for older sun equip-
+		 ment.
 
        .txw	 Yamaha TX-16W sampler.
-		 A  file  format  from	a Yamaha sampling keyboard which wrote
-		 IBM-PC format 3.5" floppies.  Handles reading of files	 which
-		 do  not have the sample rate field set to one of the expected
-		 by looking at some other  bytes  in  the  attack/loop	length
-		 fields,  and  defaulting to 33kHz if the sample rate is still
+		 A file format from a Yamaha  sampling	keyboard  which	 wrote
+		 IBM-PC	 format 3.5" floppies.	Handles reading of files which
+		 do not have the sample rate field set to one of the  expected
+		 by  looking  at  some	other  bytes in the attack/loop length
+		 fields, and defaulting to 33kHz if the sample rate  is	 still
 		 unknown.
 
        .vms	 More info to come.
-		 Used to compress speech audio for applications such as	 voice
+		 Used  to compress speech audio for applications such as voice
 		 mail.
 
        .voc	 Sound Blaster VOC files.
-		 VOC  files are multi-part and contain silence parts, looping,
-		 and different sample rates for different chunks.   On	input,
-		 the  silence  parts  are  filled out, loops are rejected, and
+		 VOC files are multi-part and contain silence parts,  looping,
+		 and  different	 sample rates for different chunks.  On input,
+		 the silence parts are filled out,  loops  are	rejected,  and
 		 sample data with a new sample rate is rejected.  Silence with
-		 a  different sample rate is generated appropriately.  On out-
-		 put, silence is  not  detected,  nor  are  impossible	sample
-		 rates.	  Note,	 this  version	now supports playing VOC files
+		 a different sample rate is generated appropriately.  On  out-
+		 put,  silence	is  not	 detected,  nor	 are impossible sample
+		 rates.	 Note, this version now	 supports  playing  VOC	 files
 		 with multiple blocks and supports playing files containing u-
 		 law and A-law samples.
 
        vorbis	 See .ogg format.
 
-       vox	 A  headerless	file of Dialogic/OKI ADPCM audio data commonly
-		 comes with the extension .vox.	 This ADPCM  data  has	12-bit
+       vox	 A headerless file of Dialogic/OKI ADPCM audio	data  commonly
+		 comes	with  the  extension .vox.  This ADPCM data has 12-bit
 		 precision packed into only 4-bits.
 
        .wav	 Microsoft .WAV RIFF files.
-		 These	appear	to  be	very similar to IFF files, but not the
-		 same.	They are the native  sound  file  format  of  Windows.
-		 (Obviously,  Windows was of such incredible importance to the
+		 These appear to be very similar to IFF	 files,	 but  not  the
+		 same.	 They  are  the	 native	 sound file format of Windows.
+		 (Obviously, Windows was of such incredible importance to  the
 		 computer industry that it just had to have its own sound file
 		 format.)  Normally .wav files have all formatting information
 		 in their headers, and so do not need any format options spec-
-		 ified	for  an input file. If any are, they will override the
-		 file header, and you will be warned to this effect.  You  had
-		 better	 know  what  you are doing! Output format options will
-		 cause a format conversion, and the .wav will  written	appro-
-		 priately.   SoX currently can read PCM, ULAW, ALAW, MS ADPCM,
-		 and IMA (or DVI) ADPCM.  It can write all  of	these  formats
+		 ified for an input file. If any are, they will	 override  the
+		 file  header, and you will be warned to this effect.  You had
+		 better know what you are doing! Output	 format	 options  will
+		 cause	a  format conversion, and the .wav will written appro-
+		 priately.  SoX currently can read PCM, ULAW, ALAW, MS	ADPCM,
+		 and  IMA  (or	DVI) ADPCM.  It can write all of these formats
 		 including (NEW!)  the ADPCM encoding.
 
        .wve	 Psion 8-bit A-law
-		 These	are  8-bit  A-law  8khz	 sound files used on the Psion
+		 These are 8-bit A-law 8khz sound  files  used	on  the	 Psion
 		 palmtop portable computer.
 
        .raw	 Raw files (no header).
 		 The  sample  rate,  size  (byte,  word,  etc),	 and  encoding
-		 (signed,  unsigned,  etc.)  of the sample file must be given.
+		 (signed, unsigned, etc.)  of the sample file must  be	given.
 		 The number of channels defaults to 1.
 
        .ub, .sb, .uw, .sw, .ul, .al, .lu, .la, .sl
 		 These are several suffices which serve as a shorthand for raw
-		 files	with a given size and encoding.	 Thus, ub, sb, uw, sw,
-		 ul, al, lu, la and sl correspond to "unsigned byte",  "signed
-		 byte",	 "unsigned  word",  "signed word", "u-law" (byte), "A-
+		 files with a given size and encoding.	Thus, ub, sb, uw,  sw,
+		 ul,  al, lu, la and sl correspond to "unsigned byte", "signed
+		 byte", "unsigned word", "signed word",	 "u-law"  (byte),  "A-
 		 law" (byte), inverse bit order "u-law", inverse bit order "A-
 		 law", and "signed long".  The sample rate defaults to 8000 hz
 		 if not explicitly set, and the number of channels defaults to
-		 1.   There are lots of Sparc samples floating around in u-law
-		 format with no header and fixed at a sample rate of 8000  hz.
-		 (Certain  sound  management  software	cheerfully ignores the
-		 headers.)  Similarly, most Mac sound files  are  in  unsigned
+		 1.  There are lots of Sparc samples floating around in	 u-law
+		 format	 with no header and fixed at a sample rate of 8000 hz.
+		 (Certain sound management  software  cheerfully  ignores  the
+		 headers.)   Similarly,	 most  Mac sound files are in unsigned
 		 byte format with a sample rate of 11025 or 22050 hz.
 
-       .auto	 This  is  a  ‘‘meta-type’’: specifying this type for an input
-		 file triggers some code that tries to guess the real type  by
-		 looking  for magic words in the header.  If the type can’t be
-		 guessed, the program exits with an error message.  The	 input
-		 must  be  a  plain file, not a pipe.  This type can’t be used
+       .auto	 This is a ‘‘meta-type’’: specifying this type	for  an	 input
+		 file  triggers some code that tries to guess the real type by
+		 looking for magic words in the header.	 If the type can’t  be
+		 guessed,  the program exits with an error message.  The input
+		 must be a plain file, not a pipe.  This type  can’t  be  used
 		 for output files.
 
 EFFECTS
-       Multiple effects may be applied to the audio data  by  specifying  them
+       Multiple	 effects  may  be applied to the audio data by specifying them
        one after another at the end of the command line.
 
        avg [ -l | -r | -f | -b | -1 | -2 | -3 | -4 | n,n,...,n ]
-		 Reduce	 the  number  of channels by averaging the samples, or
-		 duplicate channels to increase the number of channels.	  This
-		 effect	 is  automatically used when the number of input chan-
-		 nels differ from the number of output channels.  When	reduc-
+		 Reduce the number of channels by averaging  the  samples,  or
+		 duplicate  channels to increase the number of channels.  This
+		 effect is automatically used when the number of  input	 chan-
+		 nels  differ from the number of output channels.  When reduc-
 		 ing the number of channels it is possible to manually specify
-		 the avg effect and use the -l, -r, -f, -b, -1,	 -2,  -3,  -4,
-		 options  to  select  only  the left, right, front, back chan-
-		 nel(s) or specific channel for the output instead of  averag-
-		 ing  the  channels.  The -l, and -r options will do averaging
-		 in quad-channel files so select the exact channel to  prevent
+		 the  avg  effect  and use the -l, -r, -f, -b, -1, -2, -3, -4,
+		 options to select only the left,  right,  front,  back	 chan-
+		 nel(s)	 or specific channel for the output instead of averag-
+		 ing the channels.  The -l, and -r options will	 do  averaging
+		 in  quad-channel files so select the exact channel to prevent
 		 this.
 
-		 The  avg effect can also be invoked with up to 16 double-pre-
-		 cision numbers, seperated by commas, which specify  the  pro-
-		 portion  (0.0 = 0% and 1.0 = 100%) of each input channel that
-		 is to be mixed into  each  output  channel.   In  two-channel
-		 mode,	4  numbers  are	 given:	 l->l,	l->r,  r->l, and r->r,
+		 The avg effect can also be invoked  with  up  to  16  double-
+		 precision  numbers,  seperated	 by  commas, which specify the
+		 proportion (0.0 = 0% and 1.0 = 100%) of  each	input  channel
+		 that is to be mixed into each output channel.	In two-channel
+		 mode, 4 numbers  are  given:  l->l,  l->r,  r->l,  and	 r->r,
 		 respectively.	In four-channel mode, the first 4 numbers give
-		 the  proportions  for	the left-front output channel, as fol-
-		 lows: lf->lf, rf->lf, lb->lf, and rb->rf.  The	 next  4  give
-		 the  right-front output in the same order, then left-back and
+		 the proportions for the left-front output  channel,  as  fol-
+		 lows:	lf->lf,	 rf->lf,  lb->lf, and rb->rf.  The next 4 give
+		 the right-front output in the same order, then left-back  and
 		 right-back.
 
 		 It is also possible to use the 16 numbers to expand or reduce
@@ -555,15 +569,15 @@
        band [ -n ] center [ width ]
 		 Apply a band-pass filter.  The frequency response drops loga-
 		 rithmically around the center frequency.  The width gives the
-		 slope of the drop.  The frequencies at	 center	 +  width  and
-		 center	 -  width  will	 be half of their original amplitudes.
-		 Band defaults to a mode oriented  to  pitched	signals,  i.e.
-		 voice,	 singing,  or  instrumental music.  The -n (for noise)
+		 slope	of  the	 drop.	 The frequencies at center + width and
+		 center - width will be half  of  their	 original  amplitudes.
+		 Band  defaults	 to  a	mode oriented to pitched signals, i.e.
+		 voice, singing, or instrumental music.	 The  -n  (for	noise)
 		 option uses the alternate mode for un-pitched signals.	 Warn-
-		 ing:  -n introduces a power-gain of about 11dB in the filter,
-		 so beware of output clipping.	Band introduces noise  in  the
+		 ing: -n introduces a power-gain of about 11dB in the  filter,
+		 so  beware  of output clipping.  Band introduces noise in the
 		 shape of the filter, i.e. peaking at the center frequency and
-		 settling around it.  See filter for a	bandpass  effect  with
+		 settling  around  it.	 See filter for a bandpass effect with
 		 steeper shoulders.
 
        bandpass frequency bandwidth
@@ -575,11 +589,11 @@
        chorus gain-in gain-out delay decay speed depth
 
 	      -s | -t [ delay decay speed depth -s | -t ... ]
-		 Add   a   chorus   to	 a   sound   sample.   Each  quadtuple
-		 delay/decay/speed/depth gives the delay in  milliseconds  and
+		 Add  a	 chorus	  to   a   sound   sample.    Each   quadtuple
+		 delay/decay/speed/depth  gives	 the delay in milliseconds and
 		 the decay (relative to gain-in) with a modulation speed in Hz
-		 using depth in milliseconds.  The modulation is either	 sinu-
-		 soidal	 (-s)  or  triangular (-t).  Gain-out is the volume of
+		 using	depth in milliseconds.	The modulation is either sinu-
+		 soidal (-s) or triangular (-t).  Gain-out is  the  volume  of
 		 the output.
 
        compand attack1,decay1[,attack2,decay2...]
@@ -587,63 +601,63 @@
 	       in-dB1,out-dB1[,in-dB2,out-dB2...]
 
 	       [gain [initial-volume [delay ] ] ]
-		 Compand (compress or expand) the dynamic range of  a  sample.
-		 The  attack  and decay time specify the integration time over
+		 Compand  (compress  or expand) the dynamic range of a sample.
+		 The attack and decay time specify the integration  time  over
 		 which the absolute value of the input signal is integrated to
-		 determine  its	 volume;  attacks refer to increases in volume
-		 and decays refer to decreases.	 Where more than one  pair  of
-		 attack/decay	parameters  are	 specified,  each  channel  is
-		 treated separately and the number of pairs  must  agree  with
+		 determine its volume; attacks refer to	 increases  in	volume
+		 and  decays  refer to decreases.  Where more than one pair of
+		 attack/decay  parameters  are	specified,  each  channel   is
+		 treated  separately  and  the number of pairs must agree with
 		 the number of input channels.	The second parameter is a list
-		 of points on the compander’s transfer function	 specified  in
-		 dB  relative  to  the maximum possible signal amplitude.  The
-		 input values must be in a strictly increasing order  but  the
-		 transfer  function  does not have to be monotonically rising.
+		 of  points  on the compander’s transfer function specified in
+		 dB relative to the maximum possible  signal  amplitude.   The
+		 input	values	must be in a strictly increasing order but the
+		 transfer function does not have to be	monotonically  rising.
 		 The special value -inf may be used to indicate that the input
 		 volume	 should	 be  associated	 output	 volume.   The	points
-		 -inf,-inf and 0,0 are assumed; the latter may be  overridden,
+		 -inf,-inf  and 0,0 are assumed; the latter may be overridden,
 		 but the former may not.
 
-		 The  third  (optional) parameter is a post-processing gain in
-		 dB which is applied after the compression  has	 taken	place;
-		 the  fourth  (optional)  parameter is an initial volume to be
-		 assumed for each channel when the effect starts.   This  per-
-		 mits  the  user to supply a nominal level initially, so that,
+		 The third (optional) parameter is a post-processing  gain  in
+		 dB  which  is	applied after the compression has taken place;
+		 the fourth (optional) parameter is an initial	volume	to  be
+		 assumed  for  each channel when the effect starts.  This per-
+		 mits the user to supply a nominal level initially,  so	 that,
 		 for example, a very large gain is not applied to initial sig-
 		 nal levels before the companding action has begun to operate:
-		 it is quite probable that in such an event, the output	 would
+		 it  is quite probable that in such an event, the output would
 		 be severely clipped while the compander gain properly adjusts
 		 itself.
 
-		 The fifth (optional) parameter is a delay  in	seconds.   The
-		 input	signal	is analyzed immediately to control the compan-
-		 der, but it  is  delayed  before  being  fed  to  the	volume
-		 adjuster.   Specifying	 a  delay  approximately  equal to the
-		 attack/decay times allows the compander to effectively	 oper-
+		 The  fifth  (optional)	 parameter is a delay in seconds.  The
+		 input signal is analyzed immediately to control  the  compan-
+		 der,  but  it	is  delayed  before  being  fed	 to the volume
+		 adjuster.  Specifying a  delay	 approximately	equal  to  the
+		 attack/decay  times allows the compander to effectively oper-
 		 ate in a "predictive" rather than a reactive mode.
 
-       copy	 Copy  the input file to the output file.  This is the default
+       copy	 Copy the input file to the output file.  This is the  default
 		 effect if both files have the same sampling rate.
 
        dcshift shift [ limitergain ]
 		 DC Shift the audio data, with basic linear amplitude formula.
-		 This  is  most useful if your audio data tends to not be cen-
-		 tered around a value of 0.  Shifting it back will  allow  you
-		 to  get  the  most  volume adjustments without clipping audio
+		 This is most useful if your audio data tends to not  be  cen-
+		 tered	around	a value of 0.  Shifting it back will allow you
+		 to get the most volume	 adjustments  without  clipping	 audio
 		 data.
-		 The first option is the dcshift  value.   It  is  a  floating
+		 The  first  option  is	 the  dcshift value.  It is a floating
 		 point number that indicates the amount to shift.
-		 An  option  limtergain	 value	can  be specified as well.  It
-		 should have a value much less then 1.0 and is	used  only  on
+		 An option limtergain value can	 be  specified	as  well.   It
+		 should	 have  a  value much less then 1.0 and is used only on
 		 peaks to prevent clipping.
 
-       deemph	 Apply	a  treble  attenuation	shelving  filter to samples in
-		 audio cd format.  The frequency  response  of	pre-emphasized
-		 recordings  is	 rectified.   The  filtering is defined in the
+       deemph	 Apply a treble attenuation  shelving  filter  to  samples  in
+		 audio	cd  format.   The frequency response of pre-emphasized
+		 recordings is rectified.  The filtering  is  defined  in  the
 		 standard document ISO 908.
 
-       earwax	 Makes sound easier to listen to on headphones.	  Adds	audio-
-		 cues  to  samples in audio cd format so that when listened to
+       earwax	 Makes	sound  easier to listen to on headphones.  Adds audio-
+		 cues to samples in audio cd format so that when  listened  to
 		 on headphones the stereo image is moved from inside your head
 		 (standard for headphones) to outside and in front of the lis-
 		 tener (standard for speakers). See
@@ -650,13 +664,13 @@
 		 www.geocities.com/beinges for a full explanation.
 
        echo gain-in gain-out delay decay [ delay decay ... ]
-		 Add echoing to a sound sample.	 Each delay/decay  part	 gives
+		 Add  echoing  to a sound sample.  Each delay/decay part gives
 		 the delay in milliseconds and the decay (relative to gain-in)
 		 of that echo.	Gain-out is the volume of the output.
 
        echos gain-in gain-out delay decay [ delay decay ... ]
-		 Add a sequence of echos to a sound sample.  Each  delay/decay
-		 part  gives the delay in milliseconds and the decay (relative
+		 Add  a sequence of echos to a sound sample.  Each delay/decay
+		 part gives the delay in milliseconds and the decay  (relative
 		 to gain-in) of that echo.  Gain-out is the volume of the out-
 		 put.
 
@@ -670,52 +684,52 @@
 		 volume of the audio from 0 to full volume over fade-in-length
 		 seconds.  Specify 0 seconds if no fade-in is wanted.
 
-		 For fade-outs, the audio data will be truncated at the	 stop-
+		 For  fade-outs, the audio data will be truncated at the stop-
 		 time and the volume will be ramped from full volume down to 0
 		 starting at fade-out-length seconds before the stop-time.  If
-		 fade-out-length  is  not  specified,  it defaults to the same
-		 value as fade-in-length.  No fade-out	is  performed  if  the
+		 fade-out-length is not specified, it  defaults	 to  the  same
+		 value	as  fade-in-length.   No  fade-out is performed if the
 		 stop-time is not specified.
-		 All  times can be specified in either periods of time or sam-
-		 ple  counts.	To  specify  time  periods  use	  the	format
-		 hh:mm:ss.frac	format.	 To specify using sample counts, spec-
-		 ify the number of samples and append the letter  ’s’  to  the
+		 All times can be specified in either periods of time or  sam-
+		 ple   counts.	  To  specify  time  periods  use  the	format
+		 hh:mm:ss.frac format.	To specify using sample counts,	 spec-
+		 ify  the  number  of samples and append the letter ’s’ to the
 		 sample count (for example 8000s).
 		 An optional type can be specified to change the type of enve-
-		 lope.	Choices are q for quarter of a sinewave, h for half  a
-		 sinewave,  t  for  linear slope, l for logarithmic, and p for
+		 lope.	 Choices are q for quarter of a sinewave, h for half a
+		 sinewave, t for linear slope, l for logarithmic,  and	p  for
 		 inverted parabola.  The default is a linear slope.
 
        filter [ low ]-[ high ] [ window-len [ beta ] ]
-		 Apply a Sinc-windowed lowpass, highpass, or  bandpass	filter
+		 Apply	a  Sinc-windowed lowpass, highpass, or bandpass filter
 		 of given window length to the signal.	low refers to the fre-
 		 quency of the lower 6dB corner of the filter.	high refers to
 		 the frequency of the upper 6dB corner of the filter.
 
-		 A  lowpass  filter is obtained by leaving low unspecified, or
-		 0.  A highpass filter is obtained by  leaving	high  unspeci-
-		 fied,	or  0,	or  greater  than or equal to the Nyquist fre-
+		 A lowpass filter is obtained by leaving low  unspecified,  or
+		 0.   A	 highpass  filter is obtained by leaving high unspeci-
+		 fied, or 0, or greater than or	 equal	to  the	 Nyquist  fre-
 		 quency.
 
 		 The window-len, if unspecified, defaults to 128.  Longer win-
-		 dows  give  a	sharper cutoff, smaller windows a more gradual
+		 dows give a sharper cutoff, smaller windows  a	 more  gradual
 		 cutoff.
 
-		 The beta, if unspecified, defaults to	16.   This  selects  a
+		 The  beta,  if	 unspecified,  defaults to 16.	This selects a
 		 Kaiser window.	 You can select a Nuttall window by specifying
-		 anything <= 2.0 here.	For  more  discussion  of  beta,  look
+		 anything  <=  2.0  here.   For	 more discussion of beta, look
 		 under the resample effect.
 
 
        flanger gain-in gain-out delay decay speed < -s | -t >
 		 Add   a   flanger   to	  a   sound   sample.	 Each	triple
-		 delay/decay/speed gives the delay  in	milliseconds  and  the
-		 decay	(relative  to  gain-in) with a modulation speed in Hz.
-		 The modulation is either sinodial (-s)	 or  triangular	 (-t).
+		 delay/decay/speed  gives  the	delay  in milliseconds and the
+		 decay (relative to gain-in) with a modulation	speed  in  Hz.
+		 The  modulation  is  either sinodial (-s) or triangular (-t).
 		 Gain-out is the volume of the output.
 
        highp frequency
-		 Apply	a  single  pole	 recursive high-pass filter.  The fre-
+		 Apply a single pole recursive	high-pass  filter.   The  fre-
 		 quency response drops logarithmically with I frequency in the
 		 middle of the drop.  The slope of the filter is quite gentle.
 		 See filter for a highpass effect with sharper cutoff.
@@ -725,8 +739,8 @@
 
        lowp frequency
 		 Apply a single pole recursive low-pass filter.	 The frequency
-		 response  drops  logarithmically with frequency in the middle
-		 of the drop.  The slope of the filter is quite	 gentle.   See
+		 response drops logarithmically with frequency in  the	middle
+		 of  the  drop.	 The slope of the filter is quite gentle.  See
 		 filter for a lowpass effect with sharper cutoff.
 
        lowpass frequency
@@ -734,8 +748,8 @@
 
        mask	 Add "masking noise" to signal.	 This effect deliberately adds
 		 white noise to a sound in order to mask quantization effects,
-		 created  by  the  process  of	playing a sound digitally.  It
-		 tends to mask buzzing voices, for example.  It adds  1/2  bit
+		 created by the process of  playing  a	sound  digitally.   It
+		 tends	to  mask buzzing voices, for example.  It adds 1/2 bit
 		 of noise to the sound file at the output bit depth.
 
        mcompand "attack1,decay1[,attack2,decay2...]
@@ -744,48 +758,48 @@
 
 		[gain [initial-volume [delay ] ] ]" xover_freq
 
-		 Multi-band  compander is similar to the single band compander
-		 but the audio file is first divided up into  bands  and  then
-		 the  compander	 is  ran on each band.	See the compand effect
+		 Multi-band compander is similar to the single band  compander
+		 but  the  audio  file is first divided up into bands and then
+		 the compander is ran on each band.  See  the  compand	effect
 		 for definition of its options.	 Compand options are specified
-		 between  double  quotes  and the crossover frequency for that
-		 band is specefied seperately with  xover_fre.	 This  can  be
+		 between double quotes and the crossover  frequency  for  that
+		 band  is  specefied  seperately  with xover_fre.  This can be
 		 repeated multiple times to create multiple bands.
 
        pan direction
-		 Pan  the  sound of an audio file from one channel to another.
-		 This is done by changing the volume of the input channels  so
+		 Pan the sound of an audio file from one channel  to  another.
+		 This  is done by changing the volume of the input channels so
 		 that it fades out on one channel and fades-in on another.  If
-		 the number of input channels is different then the number  of
-		 output	 channels then this effect tries to intelligently han-
-		 dle this.  For instance, if the input contains 1 channel  and
+		 the  number of input channels is different then the number of
+		 output channels then this effect tries to intelligently  han-
+		 dle  this.  For instance, if the input contains 1 channel and
 		 the output contains 2 channels, then it will create the miss-
-		 ing channel itself.  The direction is a value	from  -1.0  to
-		 1.0.	-1.0 represents far left and 1.0 represents far right.
-		 Numbers in between will start the pan effect without  totally
+		 ing  channel  itself.	 The direction is a value from -1.0 to
+		 1.0.  -1.0 represents far left and 1.0 represents far	right.
+		 Numbers  in between will start the pan effect without totally
 		 muting the opposite channel.
 
        phaser gain-in gain-out delay decay speed < -s | -t >
-		 Add	a   phaser   to	  a   sound   sample.	 Each	triple
-		 delay/decay/speed gives the delay  in	milliseconds  and  the
-		 decay	(relative  to  gain-in) with a modulation speed in Hz.
-		 The modulation is either sinodial (-s)	 or  triangular	 (-t).
-		 The  decay  should be less than 0.5 to avoid feedback.	 Gain-
+		 Add   a   phaser   to	 a   sound   sample.	Each	triple
+		 delay/decay/speed  gives  the	delay  in milliseconds and the
+		 decay (relative to gain-in) with a modulation	speed  in  Hz.
+		 The  modulation  is  either sinodial (-s) or triangular (-t).
+		 The decay should be less than 0.5 to avoid  feedback.	 Gain-
 		 out is the volume of the output.
 
        pick [ -1 | -2 | -3 | -4 | -l | -r | -f | -b ]
-		 Pick a subset of channels to be copied into the output	 file.
-		 This  effect is just an alias of the "avg" effect but is left
+		 Pick  a subset of channels to be copied into the output file.
+		 This effect is just an alias of the "avg" effect but is  left
 		 here for historical reasons.
 
        pitch shift [ width interpole fade ]
-		 Change the pitch of file without affecting  its  duration  by
+		 Change	 the  pitch  of file without affecting its duration by
 		 cross-fading shifted samples.	shift is given in cents. Use a
 		 positive value to shift to treble, negative value to shift to
 		 bass.	Default shift is 0.  width of window is in ms. Default
-		 width is 20ms. Try 30ms to lower pitch,  and  10ms  to	 raise
+		 width	is  20ms.  Try	30ms to lower pitch, and 10ms to raise
 		 pitch.	 interpole option, can be "cubic" or "linear". Default
-		 is "cubic".  The fade option, can be "cos", "hamming",	 "lin-
+		 is  "cubic".  The fade option, can be "cos", "hamming", "lin-
 		 ear" or "trapezoid".  Default is "cos".
 
        polyphase [ -w < nut / ham > ]
@@ -793,68 +807,68 @@
 		 [  -width <  long  / short  / # > ]
 
 		 [ -cutoff #  ]
-		 Translate  input  sampling  rate  to output sampling rate via
-		 polyphase interpolation, a DSP	 algorithm.   This  method  is
+		 Translate input sampling rate to  output  sampling  rate  via
+		 polyphase  interpolation,  a  DSP  algorithm.	This method is
 		 slow and uses lots of RAM, but gives much better results than
 		 rate.
 
-		 -w < nut / ham > : select either a Nuttal (~90	 dB  stopband)
+		 -w  <	nut / ham > : select either a Nuttal (~90 dB stopband)
 		 or Hamming (~43 dB stopband) window.  Default is nut.
 
-		 -width	 long / short / # : specify the (approximate) width of
-		 the filter.  long is 1024  samples;  short  is	 128  samples.
+		 -width long / short / # : specify the (approximate) width  of
+		 the  filter.	long  is  1024	samples; short is 128 samples.
 		 Alternatively, an exact number can be used.  Default is long.
-		 The short option is not  recommended,	as  it	produces  poor
+		 The  short  option  is	 not  recommended, as it produces poor
 		 quality results.
 
-		 -cutoff  #  : specify the filter cutoff frequency in terms of
-		 fraction of frequency bandwidth, also	know  as  the  Nyquist
+		 -cutoff # : specify the filter cutoff frequency in  terms  of
+		 fraction  of  frequency  bandwidth,  also know as the Nyquist
 		 frequency.  Please see the resample effect for further infor-
 		 mation on Nyquist frequency.  If upsampling, then this is the
-		 fraction  of  the original signal that should go through.  If
-		 downsampling, this is the fraction of the signal  left	 after
-		 downsampling.	 Default  is  0.95.   Remember	that this is a
+		 fraction of the original signal that should go	 through.   If
+		 downsampling,	this  is the fraction of the signal left after
+		 downsampling.	Default is 0.95.   Remember  that  this	 is  a
 		 float.
 
 
-       rate	 Translate input sampling rate to  output  sampling  rate  via
-		 linear	 interpolation to the Least Common Multiple of the two
-		 sampling rates.  This is the default effect if the two	 files
-		 have  different  sampling  rates  and the preview options was
+       rate	 Translate  input  sampling  rate  to output sampling rate via
+		 linear interpolation to the Least Common Multiple of the  two
+		 sampling  rates.  This is the default effect if the two files
+		 have different sampling rates and  the	 preview  options  was
 		 specified.  This is fast but noisy: the spectrum of the orig-
-		 inal  sound  will  be	shifted upwards and duplicated faintly
+		 inal sound will be shifted  upwards  and  duplicated  faintly
 		 when up-translating by a multiple.
 
-		 Lerp-ing is acceptable for cheap 8-bit	 sound	hardware,  but
-		 for  CD-quality  sound you should instead use either resample
-		 or polyphase.	If  you	 are  wondering	 which	rate  changing
-		 effects  to use, you will want to read a detailed analysis of
-		 all of them  at  http://eakaw2.et.tu-dresden.de/~wilde/resam-
+		 Lerp-ing  is  acceptable  for cheap 8-bit sound hardware, but
+		 for CD-quality sound you should instead use  either  resample
+		 or  polyphase.	  If  you  are	wondering  which rate changing
+		 effects to use, you will want to read a detailed analysis  of
+		 all  of  them at http://eakaw2.et.tu-dresden.de/~wilde/resam-
 		 ple/resample.html
 
        repeat count
-		 Repeats  the  audio data count times.	Requires disk space to
+		 Repeats the audio data count times.  Requires disk  space  to
 		 store the data to be repeated.
 
        resample [ -qs | -q | -ql ] [ rolloff [ beta ] ]
-		 Translate input sampling rate to  output  sampling  rate  via
-		 simulated  analog  filtration.	  This	method	is slower than
+		 Translate  input  sampling  rate  to output sampling rate via
+		 simulated analog filtration.	This  method  is  slower  than
 		 rate, but gives much better results.
 
 		 By default, linear interpolation is used, with a window width
 		 about 45 samples at the lower of the two rate.	 This gives an
-		 accuracy of about 16 bits, but insufficient  stopband	rejec-
-		 tion  in  the case that you want to have rolloff greater than
+		 accuracy  of  about 16 bits, but insufficient stopband rejec-
+		 tion in the case that you want to have rolloff	 greater  than
 		 about 0.80 of the Nyquist frequency.
 
-		 The -q* options will change the default  values  for  rolloff
-		 and  beta  as	well  as use quadratic interpolation of filter
+		 The  -q*  options  will change the default values for rolloff
+		 and beta as well as use  quadratic  interpolation  of	filter
 		 coefficients, resulting in about 24 bits precision.  The -qs,
-		 -q,  or -ql options specify increased accuracy at the cost of
+		 -q, or -ql options specify increased accuracy at the cost  of
 		 lower execution speed.	 It is optional to specify rolloff and
 		 beta parameters when using the -q* options.
 
-		 Following  is	a  table  of the reasonable defaults which are
+		 Following is a table of the  reasonable  defaults  which  are
 		 built-in to SoX:
 
 		    Option  Window rolloff beta interpolation
@@ -866,67 +880,67 @@
 		    ------  ------ ------- ---- -------------
 
 		 -qs, -q, or -ql use window lengths of 45, 75, or 149 samples,
-		 respectively,	at  the	 lower	sample-rate  of the two files.
+		 respectively, at the lower  sample-rate  of  the  two	files.
 		 This means progressively sharper stop-band rejection, at pro-
 		 portionally slower execution times.
 
-		 rolloff  refers to the cut-off frequency of the low pass fil-
-		 ter and is given in terms of the Nyquist  frequency  for  the
-		 lower	sample	rate.	rolloff	 therefore should be something
-		 between 0.0 and 1.0, in practice 0.8-0.95.  The defaults  are
+		 rolloff refers to the cut-off frequency of the low pass  fil-
+		 ter  and  is  given in terms of the Nyquist frequency for the
+		 lower sample rate.  rolloff  therefore	 should	 be  something
+		 between  0.0 and 1.0, in practice 0.8-0.95.  The defaults are
 		 indicated above.
 
-		 The  Nyquist  frequency is equal to (sample rate / 2).	 Logi-
-		 cally, this is because the A/D converter  needs  at  least  2
+		 The Nyquist frequency is equal to (sample rate /  2).	 Logi-
+		 cally,	 this  is  because  the A/D converter needs at least 2
 		 samples to detect 1 cycle at the Nyquist frequency.  Frequen-
-		 cies higher then the Nyquist will actually  appear  as	 lower
-		 frequencies  to  the  A/D  converter  and is called aliasing.
+		 cies  higher  then  the Nyquist will actually appear as lower
+		 frequencies to the A/D	 converter  and	 is  called  aliasing.
 		 Normally, A/D converts run the signal through a highpass fil-
 		 ter first to avoid these problems.
 
-		 Similar  problems  will  happen in software when reducing the
-		 sample rate of an  audio  file	 (frequencies  above  the  new
-		 Nyquist  frequency  can  be  aliased  to  lower frequencies).
-		 Therefore, a good resample effect will remove	all  frequency
+		 Similar problems will happen in software  when	 reducing  the
+		 sample	 rate  of  an  audio  file  (frequencies above the new
+		 Nyquist frequency  can	 be  aliased  to  lower	 frequencies).
+		 Therefore,  a	good resample effect will remove all frequency
 		 information above the new Nyquist frequency.
 
 		 The rolloff refers to how close to the Nyquist frequency this
-		 cutoff is, with closer being  better.	 When  increasing  the
+		 cutoff	 is,  with  closer  being better.  When increasing the
 		 sample rate of an audio file you would not expect to have any
-		 frequencies exist that are past  the  original	 Nyquist  fre-
-		 quency.   Because  of	resampling properties, it is common to
+		 frequencies  exist  that  are	past the original Nyquist fre-
+		 quency.  Because of resampling properties, it	is  common  to
 		 have aliasing data created that is above the old Nyquist fre-
-		 quency.   In that case the rolloff refers to how close to the
+		 quency.  In that case the rolloff refers to how close to  the
 		 original Nyquist frequency to use a highpass filter to remove
 		 this false data, with closer also being better.
 
 		 The beta parameter determines the type of filter window used.
-		 Any value greater than 2.0 is the beta for a  Kaiser  window.
-		 Beta  <=  2.0	selects a Nuttall window.  If unspecified, the
+		 Any  value  greater than 2.0 is the beta for a Kaiser window.
+		 Beta <= 2.0 selects a Nuttall window.	 If  unspecified,  the
 		 default is a Kaiser window with beta 16.
 
-		 In the case of Kaiser window (beta > 2.0), lower  betas  pro-
-		 duce  a somewhat faster transition from passband to stopband,
-		 at the cost of noticeable artifacts.  A beta  of  16  is  the
+		 In  the  case of Kaiser window (beta > 2.0), lower betas pro-
+		 duce a somewhat faster transition from passband to  stopband,
+		 at  the  cost	of  noticeable artifacts.  A beta of 16 is the
 		 default, beta less than 10 is not recommended.	 If you want a
-		 sharper cutoff, don’t use low beta’s,	use  a	longer	sample
-		 window.   A  Nuttall  window  is  selected  by specifying any
+		 sharper  cutoff,  don’t  use  low beta’s, use a longer sample
+		 window.  A Nuttall  window  is	 selected  by  specifying  any
 		 ’beta’ <= 2, and the Nuttall window has somewhat steeper cut-
-		 off  than  the	 default Kaiser window.	 You will probably not
-		 need to use the beta parameter at all, unless	you  are  just
-		 curious  about	 comparing  the	 effects of Nuttall vs. Kaiser
+		 off than the default Kaiser window.  You  will	 probably  not
+		 need  to  use	the beta parameter at all, unless you are just
+		 curious about comparing the effects  of  Nuttall  vs.	Kaiser
 		 windows.
 
-		 This is the default effect if the two	files  have  different
-		 sampling  rates.  Default parameters are, as indicated above,
-		 Kaiser window of length 45, rolloff  0.80,  beta  16,	linear
+		 This  is  the	default effect if the two files have different
+		 sampling rates.  Default parameters are, as indicated	above,
+		 Kaiser	 window	 of  length  45, rolloff 0.80, beta 16, linear
 		 interpolation.
 
-		 NOTE:	-qs  is	 only  slightly	 slower, but more accurate for
+		 NOTE: -qs is only slightly  slower,  but  more	 accurate  for
 		 16-bit or higher precision.
 
-		 NOTE: In many	cases  of  up-sampling,	 no  interpolation  is
-		 needed,  as  exact  filter  coefficients can be computed in a
+		 NOTE:	In  many  cases	 of  up-sampling,  no interpolation is
+		 needed, as exact filter coefficients can  be  computed	 in  a
 		 reasonable amount of space.  To be precise, this is done when
 
 			    input_rate < output_rate
@@ -934,13 +948,13 @@
 		   output_rate/gcd(input_rate,output_rate) <= 511
 
        reverb gain-out reverbe-time delay [ delay ... ]
-		 Add  reverberation to a sound sample.	Each delay is given in
+		 Add reverberation to a sound sample.  Each delay is given  in
 		 milliseconds and its feedback is depending on the reverb-time
-		 in  milliseconds.   Each delay should be in the range of half
-		 to quarter of reverb-time to get a  realistic	reverberation.
+		 in milliseconds.  Each delay should be in the range  of  half
+		 to  quarter  of reverb-time to get a realistic reverberation.
 		 Gain-out is the volume of the output.
 
-       reverse	 Reverse  the  sound  sample completely.  Included for finding
+       reverse	 Reverse the sound sample completely.	Included  for  finding
 		 Satanic subliminals.
 
        silence above_periods [ duration threshold[ d | % ]
@@ -948,99 +962,99 @@
 	       [ below_periods duration
 
 		 threshold[ d | % ]]
-		 Removes silence from the beginning or end of  a  sound	 file.
+		 Removes  silence  from	 the beginning or end of a sound file.
 		 Silence is anything below a specified threshold.
 		 When trimming silence from the beginning of a sound file, you
-		 specify a duration of audio that is  above  a	given  silence
+		 specify  a  duration  of  audio that is above a given silence
 		 threshold before audio data is processed.  You can also spec-
-		 ify the count of periods of none-silence you want  to	detect
-		 before	 processing  audio data.  Specify a period of 0 if you
+		 ify  the  count of periods of none-silence you want to detect
+		 before processing audio data.	Specify a period of 0  if  you
 		 do not want to trim data from the front of the sound file.
-		 When optionally trimming silence form	the  end  of  a	 sound
-		 file,	you specify the duration of audio that must be below a
-		 given threshold before stopping to  process  audio  data.   A
-		 count	of  periods that occur below the threshold may also be
-		 specified.  If this options are not specified	then  data  is
+		 When  optionally  trimming  silence  form  the end of a sound
+		 file, you specify the duration of audio that must be below  a
+		 given	threshold  before  stopping  to process audio data.  A
+		 count of periods that occur below the threshold may  also  be
+		 specified.   If  this	options are not specified then data is
 		 not trimmed from the end of the audio file.  If below_periods
-		 is negative, it is treated as a positive value	 and  is  also
-		 used  to  indicate  the  effect  should restart processing as
+		 is  negative,	it  is treated as a positive value and is also
+		 used to indicate the  effect  should  restart	processing  as
 		 specified by the above_periods, making it suitable for remov-
 		 ing periods of silence in the middle of a sound file.
-		 Duration  counts may be in the format of time, hh:mm:ss.frac,
+		 Duration counts may be in the format of time,	hh:mm:ss.frac,
 		 or in the exact count of samples.
 		 Threshold may be suffixed with d, or % to indicated the value
-		 is  in	 decibels  or  a percentage of max value of the sample
+		 is in decibels or a percentage of max	value  of  the	sample
 		 value.	 A value of ’0%’ will look for total silence.
 
        speed [ -c ] factor
-		 Speed up or down the sound, as a magnetic tape with  a	 speed
-		 control.   It	affects	 both  pitch and time. A factor of 1.0
+		 Speed	up  or down the sound, as a magnetic tape with a speed
+		 control.  It affects both pitch and time.  A  factor  of  1.0
 		 means no change, and is the default.  2.0 doubles speed, thus
-		 time  length is cut by a half and pitch is one octave higher.
-		 0.5 halves speed thus time length doubles and	pitch  is  one
-		 octave	 lower.	 If the optional -c parameter is used then the
+		 time length is cut by a half and pitch is one octave  higher.
+		 0.5  halves  speed  thus time length doubles and pitch is one
+		 octave lower.	If the optional -c parameter is used then  the
 		 factor is specified in "cents".
 
        stat [ -s n ] [-rms ] [ -v ] [ -d ]
-		 Do a statistical check on the input file, and	print  results
-		 on  the standard error file.  Audio data is passed unmodified
-		 from input to output file  unless  used  along	 with  the  -e
+		 Do  a	statistical check on the input file, and print results
+		 on the standard error file.  Audio data is passed  unmodified
+		 from  input  to  output  file	unless	used along with the -e
 		 option.
 
-		 The  "Volume  Adjustment:"  field in the statistics gives you
-		 the argument to the -v number which will make the  sample  as
+		 The "Volume Adjustment:" field in the	statistics  gives  you
+		 the  argument	to the -v number which will make the sample as
 		 loud as possible without clipping.
 
 		 The option -v will print out the "Volume Adjustment:" field’s
-		 value only and return.	 This could be of use  in  scripts  to
+		 value	only  and  return.  This could be of use in scripts to
 		 auto convert the volume.
 
-		 The  -s  n  option is used to scale the input data by a given
-		 factor.  The default value of n is the max value of a	signed
-		 long  variable	 (0x7fffffff).	 Internal  effects always work
-		 with signed long PCM data and so the value should  relate  to
+		 The -s n option is used to scale the input data  by  a	 given
+		 factor.   The default value of n is the max value of a signed
+		 long variable (0x7fffffff).   Internal	 effects  always  work
+		 with  signed  long PCM data and so the value should relate to
 		 this fact.
 
-		 The  -rms  option  will  convert all output average values to
+		 The -rms option will convert all  output  average  values  to
 		 root mean square format.
 
-		 There is also an optional parameter -d that will print out  a
-		 hex  dump  of the sound file from the internal buffer that is
-		 in 32-bit signed PCM data.  This is mainly  only  of  use  in
-		 tracking  down endian problems that creep in to SoX on cross-
+		 There	is also an optional parameter -d that will print out a
+		 hex dump of the sound file from the internal buffer  that  is
+		 in  32-bit  signed  PCM  data.	 This is mainly only of use in
+		 tracking down endian problems that creep in to SoX on	cross-
 		 platform versions.
 
 
        stretch factor [window fade shift fading]
-		 Time stretch file by a given factor. Change duration  without
-		 affecting  the	 pitch.	  factor of stretching: >1.0 lengthen,
-		 <1.0 shorten duration.	 window size  is  in  ms.  Default  is
-		 20ms.	The  fade  option, can be "lin".  shift ratio, in [0.0
-		 1.0]. Default depends on stretch factor. 1.0 to shorten,  0.8
+		 Time  stretch file by a given factor. Change duration without
+		 affecting the pitch.  factor of  stretching:  >1.0  lengthen,
+		 <1.0  shorten	duration.   window  size  is in ms. Default is
+		 20ms. The fade option, can be "lin".  shift  ratio,  in  [0.0
+		 1.0].	Default depends on stretch factor. 1.0 to shorten, 0.8
 		 to lengthen.  The fading ratio, in [0.0 0.5]. The amount of a
 		 fade’s default depends on factor and shift.
 
        swap [ 1 2 | 1 2 3 4 ]
-		 Swap channels in multi-channel sound files.  Optionally,  you
-		 may  specify  the channel order you would like the output in.
-		 This defaults to output channel 2 and then 1 for  stereo  and
+		 Swap  channels in multi-channel sound files.  Optionally, you
+		 may specify the channel order you would like the  output  in.
+		 This  defaults	 to output channel 2 and then 1 for stereo and
 		 2, 1, 4, 3 for quad-channels.	An interesting feature is that
-		 you may duplicate a given  channel  by	 overwriting  another.
-		 This  is  done	 by repeating an output channel on the command
-		 line.	For example, swap 2 2 will overwrite  channel  1  with
-		 channel  2’s  data; creating a stereo file with both channels
+		 you  may  duplicate  a	 given channel by overwriting another.
+		 This is done by repeating an output channel  on  the  command
+		 line.	 For  example,	swap 2 2 will overwrite channel 1 with
+		 channel 2’s data; creating a stereo file with	both  channels
 		 containing the same audio data.
 
        synth [ length ] type mix [ freq [ -freq2 ]
 
 	     [ off ] [ ph ] [ p1 ] [ p2 ] [ p3 ]
-		 The synth effect will generate various types of  audio	 data.
+		 The  synth  effect will generate various types of audio data.
 		 Although this effect is used to generate audio data, an input
-		 file must be specified.  The length of the input  audio  file
+		 file  must  be specified.  The length of the input audio file
 		 determines the length of the output audio file.
 		 <length>  length  in  sec  or	hh:mm:ss.frac,	0=inputlength,
 		 default=0
-		 <type> is sine, square,  triangle,  sawtooth,	trapetz,  exp,
+		 <type>	 is  sine,  square,  triangle, sawtooth, trapetz, exp,
 		 whitenoise, pinknoise, brownnoise, default=sine
 		 <mix> is create, mix, amod, default=create
 		 <freq> frequency at beginning in Hz, not used	for noise..
@@ -1048,66 +1062,66 @@
 		 <freq/2> can be given as %%n, where ’n’ is the number of half
 		 notes in respect to A (440Hz)
 		 <off> Bias (DC-offset)	 of signal in percent, default=0
-		 <ph>  phase  shift  0..100  shift phase 0..2*Pi, not used for
+		 <ph> phase shift 0..100 shift phase  0..2*Pi,	not  used  for
 		 noise..
-		 <p1> square: Ton/Toff, triangle+trapetz:  rising  slope  time
+		 <p1>  square:	Ton/Toff,  triangle+trapetz: rising slope time
 		 (0..100)
 		 <p2> trapetz: ON time (0..100)
 		 <p3> trapetz: falling slope position (0..100)
 
        trim start [ length ]
-		 Trim  can trim off unwanted audio data from the beginning and
-		 end of the audio file.	 Audio samples are  not	 sent  to  the
+		 Trim can trim off unwanted audio data from the beginning  and
+		 end  of  the  audio  file.  Audio samples are not sent to the
 		 output stream until the start location is reached.
-		 The  optional length parameter tells the number of samples to
-		 output after the start sample and is used  to	trim  off  the
-		 back  side  of	 the  audio  data.  Using a value of 0 for the
+		 The optional length parameter tells the number of samples  to
+		 output	 after	the  start  sample and is used to trim off the
+		 back side of the audio data.  Using a	value  of  0  for  the
 		 start parameter will allow trimming off the back side only.
-		 Both options can be specified using either an amount of  time
-		 and  an  exact	 count	of samples.  The format for specifying
-		 lengths in time is hh:mm:ss.frac.  A start  value  of	1:30.5
-		 will  not  start  until 1 minute, thirty and 1/2 seconds into
-		 the audio data.  The format for specifying sample  counts  is
-		 the  number of samples with the letter ’s’ appended to it.  A
-		 value of 8000s will wait until 8000 samples are  read	before
+		 Both  options can be specified using either an amount of time
+		 and an exact count of samples.	  The  format  for  specifying
+		 lengths  in  time  is hh:mm:ss.frac.  A start value of 1:30.5
+		 will not start until 1 minute, thirty and  1/2	 seconds  into
+		 the  audio  data.  The format for specifying sample counts is
+		 the number of samples with the letter ’s’ appended to it.   A
+		 value	of  8000s will wait until 8000 samples are read before
 		 starting to process audio data.
 
        vibro speed  [ depth ]
-		 Add  the  world-famous	 Fender	 Vibro-Champ sound effect to a
-		 sound sample by using a sine wave as the volume knob.	 Speed
-		 gives	the  Hertz  value of the wave.	This must be under 30.
-		 Depth gives the amount the volume is cut  into	 by  the  sine
+		 Add the world-famous Fender Vibro-Champ  sound	 effect	 to  a
+		 sound	sample by using a sine wave as the volume knob.	 Speed
+		 gives the Hertz value of the wave.  This must	be  under  30.
+		 Depth	gives  the  amount  the volume is cut into by the sine
 		 wave, ranging 0.0 to 1.0 and defaulting to 0.5.
 
        vol gain [ type [ limitergain ] ]
-		 The  vol  effect is much like the command line option -v.  It
-		 allows you to adjust the volume of an input file  and	allows
-		 you  to  specify  the	adjustment  in	relation to amplitude,
-		 power, or dB.	If type is not specified then it  defaults  to
+		 The vol effect is much like the command line option  -v.   It
+		 allows	 you  to adjust the volume of an input file and allows
+		 you to specify	 the  adjustment  in  relation	to  amplitude,
+		 power,	 or  dB.  If type is not specified then it defaults to
 		 amplitude.
-		 When  type is amplitude then a linear change of the amplitude
-		 is performed based on the gain.  Therefore, a	value  of  1.0
-		 will  keep  the  volume the same, 0.0 to < 1.0 will cause the
-		 volume to decrease and values of > 1.0 will cause the	volume
-		 to  increase.	Beware of clipping audio data when the gain is
+		 When type is amplitude then a linear change of the  amplitude
+		 is  performed	based  on the gain.  Therefore, a value of 1.0
+		 will keep the volume the same, 0.0 to < 1.0  will  cause  the
+		 volume	 to decrease and values of > 1.0 will cause the volume
+		 to increase.  Beware of clipping audio data when the gain  is
 		 greater then 1.0.  A negative value performs the same adjust-
 		 ment while also changing the phase.
-		 When  type  is power then a value of 1.0 also means no change
+		 When type is power then a value of 1.0 also means  no	change
 		 in volume.
-		 When type is dB the  amplitude	 is  changed  logarithmically.
+		 When  type  is	 dB  the amplitude is changed logarithmically.
 		 0.0 is constant while +6 doubles the amplitude.
-		 An  optional limitergain value can be specified and should be
+		 An optional limitergain value can be specified and should  be
 		 a value much less then 1.0 (ie 0.05 or 0.02) and is used only
-		 on  peaks to prevent clipping.	 Not specifying this parameter
-		 will cause no limiter to be  used.   In  verbose  mode,  this
-		 effect	 will display the percentage of audio data that needed
+		 on peaks to prevent clipping.	Not specifying this  parameter
+		 will  cause  no  limiter  to  be used.	 In verbose mode, this
+		 effect will display the percentage of audio data that	needed
 		 to be limited.
 
 BUGS
-       The syntax is horrific.	Thats the breaks when  trying  to  handle  all
+       The  syntax  is	horrific.   Thats the breaks when trying to handle all
        things from the command line.
 
-       Please  report  any  bugs found in this version of SoX to Chris Bagwell
+       Please report any bugs found in this version of SoX  to	Chris  Bagwell
        (cbagwell@users.sourceforge.net)
 
 FILES
@@ -1115,9 +1129,9 @@
        play(1), rec(1), soxexam(1)
 
 NOTICES
-       The version of SoX that accompanies this	 manual	 page  is  support  by
+       The  version  of	 SoX  that  accompanies this manual page is support by
        Chris Bagwell (cbagwell@users.sourceforge.net).	Please refer any ques-
-       tions regarding it to this address.  You may obtain the latest  version
+       tions  regarding it to this address.  You may obtain the latest version
        at the the web site http://sox.sourceforge.net/
 
 AUTHOR
--- a/src/raw.c
+++ b/src/raw.c
@@ -452,7 +452,7 @@
             ft->file.pos = 0;
 
             ft->file.count = st_read(ft, ft->file.buf+i, 1, ft->file.size-i);
-            if (ft->file.count != ft->file.size-i)
+            if (ft->file.count != ft->file.size-i || ft->file.count == 0)
             {
                 ft->file.eof = 1;
             }
--- a/src/wav.c
+++ b/src/wav.c
@@ -518,8 +518,17 @@
         break;
 
     case WAVE_FORMAT_IEEE_FLOAT:
-        st_fail_errno(ft,ST_EHDR,"Sorry, this WAV file is in IEEE Float format.");
-        return ST_EOF;
+        if (ft->info.encoding == -1 || ft->info.encoding == ST_ENCODING_FLOAT)
+            ft->info.encoding = ST_ENCODING_FLOAT;
+        else
+            st_report("User options overriding encoding read in .wav header");
+
+        /* Needed by rawread() functions */
+        rc = st_rawstartread(ft);
+        if (rc)
+            return rc;
+
+        break;
         
     case WAVE_FORMAT_ALAW:
         if (ft->info.encoding == -1 || ft->info.encoding == ST_ENCODING_ALAW)
@@ -829,8 +838,8 @@
     dwDataLength = len = findChunk(ft, "data");
     /* findChunk() only returns if chunk was found */
 
-        /* Data starts here */
-        wav->dataStart = st_tell(ft);
+    /* Data starts here */
+    wav->dataStart = st_tell(ft);
 
     switch (wav->formatTag)
     {
@@ -912,60 +921,85 @@
             ft->comment = (char*)malloc(256);
             /* Initialize comment to a NULL string */
             ft->comment[0] = 0;
-            while(!st_eof(ft)){
-                st_reads(ft,magic,4);
-                if(strncmp(magic,"INFO",4) == 0){
-                        /*Skip*/
-                } else if(strncmp(magic,"ICRD",4) == 0){
-                        st_readdw(ft,&len); 
-                        len = (len + 1) & ~1;
+            while(!st_eof(ft))
+            {
+                if (st_reads(ft,magic,4) == ST_EOF)
+                    break;
+                if (strncmp(magic,"INFO",4) == 0)
+                {
+                    /*Skip*/
+                    st_report("Chunk INFO");
+                }
+                else
+                {
+                    if (st_readdw(ft,&len) == ST_EOF)
+                        break;
+                    if (strncmp(magic,"ICRD",4) == 0)
+                    {
+                        int needs_return = 0;
+
+                        st_report("Chunk ICRD");
                         if (len > 254)
                         {
-                            fprintf(stderr, "Possible buffer overflow hack attack (ICRD)!\n");
+                            st_warn("Possible buffer overflow hack attack (ICRD)!\n");
                             break;
                         }
                         st_reads(ft,text,len);
                         if (strlen(ft->comment) + strlen(text) < 254)
                         {
+                            if (strlen(ft->comment) != 0)
+                                needs_return = 1;
+
                             strcat(ft->comment,text);
-                            strcat(ft->comment,"\n");
+
+                            if (needs_return)
+                                strcat(ft->comment,"\n");
                         }
-                } else if(strncmp(magic,"ISFT",4) == 0){
-                        st_readdw(ft,&len); 
-                        len = (len + 1) & ~1;
+                        if (strlen(text) < len)
+                           st_seek(ft, len - strlen(text), SEEK_CUR); 
+                    } 
+                    else if (strncmp(magic,"ISFT",4) == 0)
+                    {
+                        int needs_return = 0;
+
+                        st_report("Chunk ISFT");
                         if (len > 254)
                         {
-                            fprintf(stderr, "Possible buffer overflow hack attack (ISFT)!\n");
+                            st_warn("Possible buffer overflow hack attack (ISFT)!\n");
                             break;
                         }
                         st_reads(ft,text,len);
                         if (strlen(ft->comment) + strlen(text) < 254)
                         {
+                            if (strlen(ft->comment) != 0)
+                                needs_return = 1;
+
                             strcat(ft->comment,text);
-                            strcat(ft->comment,"\n");
+
+                            if (needs_return)
+                                strcat(ft->comment,"\n");
                         }
-                } else if(strncmp(magic,"cue ",4) == 0){
-                        st_readdw(ft,&len);
-                        len = (len + 1) & ~1;
+                        if (strlen(text) < len)
+                           st_seek(ft, len - strlen(text), SEEK_CUR); 
+                    } 
+                    else if (strncmp(magic,"cue ",4) == 0)
+                    {
+                        st_report("Chunk cue ");
                         st_seek(ft,len-4,SEEK_CUR);
                         st_readdw(ft,&dwLoopPos);
                         ft->loops[0].start = dwLoopPos;
-                } else if(strncmp(magic,"note",4) == 0){
-                        /*Skip*/
-                        st_readdw(ft,&len);
-                        len = (len + 1) & ~1;
-                        st_seek(ft,len-4,SEEK_CUR);
-                } else if(strncmp(magic,"adtl",4) == 0){
-                        /*Skip*/
-                } else if(strncmp(magic,"ltxt",4) == 0){
-                        st_seek(ft,4,SEEK_CUR);
+                    } 
+                    else if (strncmp(magic,"ltxt",4) == 0)
+                    {
+                        st_report("Chunk ltxt");
                         st_readdw(ft,&dwLoopPos);
                         ft->loops[0].length = dwLoopPos - ft->loops[0].start;
-                } else if(strncmp(magic,"labl",4) == 0){
-                        /*Skip*/
-                        st_readdw(ft,&len);
-                        len = (len + 1) & ~1;
-                        st_seek(ft,len-4,SEEK_CUR);
+                    } 
+                    else 
+                    {
+                        st_report("Attempting to seek beyond unsupported chunk '%c%c%c%c' of length %d bytes\n", magic[0], magic[1], magic[2], magic[3], len);
+                        st_seek(ft, len, SEEK_CUR);
+                    }
                 }
             }
         }
@@ -1058,9 +1092,11 @@
                 st_warn("Premature EOF on .wav input file");
         break;
 #endif
-        default: /* assume PCM encoding */
+        default: /* assume PCM or float encoding */
+#if 0
             if (len > wav->numSamples) 
                 len = wav->numSamples;
+#endif
 
             done = st_rawread(ft, buf, len);
             /* If software thinks there are more samples but I/O */
@@ -1306,7 +1342,8 @@
             break;
         case ST_SIZE_DWORD:
             wBitsPerSample = 32;
-            if (ft->info.encoding != ST_ENCODING_SIGN2)
+            if (ft->info.encoding != ST_ENCODING_SIGN2 &&
+                ft->info.encoding != ST_ENCODING_FLOAT)
             {
                 st_warn("Do not support %s with 32-bit data.  Forcing to Signed.",st_encodings_str[(unsigned char)ft->info.encoding]);
                 ft->info.encoding = ST_ENCODING_SIGN2;
@@ -1328,6 +1365,11 @@
         case ST_ENCODING_UNSIGNED:
         case ST_ENCODING_SIGN2:
             wFormatTag = WAVE_FORMAT_PCM;
+            bytespersample = (wBitsPerSample + 7)/8;
+            wBlockAlign = wChannels * bytespersample;
+            break;
+        case ST_ENCODING_FLOAT:
+            wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
             bytespersample = (wBitsPerSample + 7)/8;
             wBlockAlign = wChannels * bytespersample;
             break;