# HG changeset patch # User Rik # Date 1278106119 25200 # Node ID a4b8364e04c77f6b75c467135e691d5493c398a5 # Parent 5faf6832855a535b69f6bcd9311b204dea798740 wavread.m: Correctly handle non-word aligned chunks (bug #30309). diff -r 5faf6832855a -r a4b8364e04c7 scripts/ChangeLog --- a/scripts/ChangeLog Thu Jul 01 11:15:23 2010 -0700 +++ b/scripts/ChangeLog Fri Jul 02 14:28:39 2010 -0700 @@ -1,3 +1,8 @@ +2010-07-02 Rik + + * audio/wavread.m: Correctly handle non-word aligned data chunks. + (bug #30309). + 2010-06-16 Rik * plot/stairs.m: Add additional calling forms to documentation. diff -r 5faf6832855a -r a4b8364e04c7 scripts/audio/wavread.m --- a/scripts/audio/wavread.m Thu Jul 01 11:15:23 2010 -0700 +++ b/scripts/audio/wavread.m Fri Jul 02 14:28:39 2010 -0700 @@ -29,7 +29,7 @@ ## @deftypefnx {Function File} {[@dots{}] =} wavread (@var{filename}, @var{n}) ## Read only the first @var{n} samples from each channel. ## -## @deftypefnx {Function File} {[@dots{}] =} wavread (@var{filename},[@var{n1} @var{n2}]) +## @deftypefnx {Function File} {[@dots{}] =} wavread (@var{filename}, [@var{n1} @var{n2}]) ## Read only samples @var{n1} through @var{n2} from each channel. ## ## @deftypefnx {Function File} {[@var{samples}, @var{channels}] =} wavread (@var{filename}, "size") @@ -52,7 +52,7 @@ endif if (! ischar (filename)) - error ("wavread: expecting filename to be a character string"); + error ("wavread: FILENAME must be a character string"); endif # Open file for binary reading. @@ -157,20 +157,21 @@ if (nargin == 1) length = 8 * data_size / bits_per_sample; else - if (size (param, 2) == 1) + nparams = size (param, 2); + if (nparams == 1) ## Number of samples is given. length = param * channels; - elseif (size (param, 2) == 2) + elseif (nparams == 2) ## Sample range is given. if (fseek (fid, (param(1)-1) * channels * (bits_per_sample/8), "cof") < 0) warning ("wavread: seeking failed"); endif length = (param(2)-param(1)+1) * channels; - elseif (size (param, 2) == 4 && char (param) == "size") + elseif (nparams == 4 && char (param) == "size") ## Size of the file is requested. fclose (fid); y = [data_size/channels/(bits_per_sample/8), channels]; - return + return; else fclose (fid); error ("wavread: invalid argument 2"); @@ -204,7 +205,7 @@ case 16 yi /= 32767; case 24 - yi /= 8388607; + yi /= 8388607; case 32 yi /= 2147483647; endswitch @@ -230,6 +231,8 @@ fseek (fid, chunk_size, "cof"); id = char (fread (fid, 4))'; chunk_size = fread (fid, 1, "uint32", 0, "ieee-le"); + ## Chunk sizes must be word-aligned (2 byte) + chunk_size += rem (chunk_size, 2); offset = offset + 8 + chunk_size; endwhile if (! strcmp (id, chunk_id))