hi,
a few bugs from my gnats db, which all have quick fixes (patched against pd-0.37-1test6)
Krzysztof
BUG #25 soundfiler reads a trailer of a stereo .wav file as part of a sample
Quite often, there is a trailer chunk after data chunk in a .wav file. Soundfiler (correctly) does not read trailers of mono files, but (incorrectly) loads a trailer into an array (or arrays), if the file has additional channels.
Fix: In d_soundfile.c, change lines 1020-1021 to
- if (framesinfile > bytelimit / bytespersamp) - framesinfile = bytelimit / bytespersamp; + if (framesinfile > bytelimit / (channels * bytespersamp)) + framesinfile = bytelimit / (channels * bytespersamp);
and change lines 1040-1041 to
- if (finalsize > bytelimit / bytespersamp) - finalsize = bytelimit / bytespersamp; + if (finalsize > bytelimit / (channels * bytespersamp)) + finalsize = bytelimit / (channels * bytespersamp);
BUG #26 a pop made by reading .wav file trailer as part of a sample
It is quite common for a .wav file to contain a trailer chunk following sample data. Readsf~ correctly excludes it from playback in some cases, but in other cases does not.
Fix: This is one of the two fixes needed: after line 1489 in d_soundfile.c add
else wantbytes = READSIZE; + if (wantbytes > x->x_bytelimit) + wantbytes = x->x_bytelimit;
The other one, subtracting a skip offset from the `bytelimit' variable in open_soundfile(), is reported separately, because it affects both readsf~, and soundfiler.
BUG #27 readsf~ and soundfiler run over .wav file trailer if skip option used
Yet another case of .wav file trailer chunk causing pops in playback from arrays and from readsf~. The pops occur, if the option 'skip' is used as part of the 'read' message to soundfiler, or as an argument of the 'open' message to readsf~.
Fix: In d_soundfile.c, before line 375, add
+ bytelimit -= nchannels * bytespersamp * skipframes; + if (bytelimit < 0) + bytelimit = 0; /* copy sample format back to caller */
BUG #28 readsf~ truncates files, if number of samples != multiple of dsp block
If the last dsp block in a stream of sample data to be output by readsf~ is going to be only partially filled from a sound file, readsf~ fills it all with zeros. In effect, the file is truncated on playback.
Fix: In d_soundfile.c, function readsf_perform(), declare a local variable xfersize of type int, and before line 1669 add
+ xfersize = (x->x_fifohead - x->x_fifotail + 1) / + (sfchannels * bytespersample); + if (xfersize) + { + soundfile_xferin(sfchannels, noutlets, x->x_outvec, 0, + (unsigned char *)(x->x_buf + x->x_fifotail), xfersize, + bytespersample, bigendian); + vecsize -= xfersize; + for (i = 0; i < noutlets; i++) + for (j = vecsize, fp = x->x_outvec[i] + xfersize; j--; ) + *fp++ = 0; + return (w+2); + } goto idle;
BUG #30 endianness bug remains in soundfiler
Endianness bug in soundfiler_writeargparse() remains. Actually, there were two bugs, a typo and an omission -- typo has been corrected, omission has not.
Fix: In d_soudfile.c add the missing clause before line 581:
+ else bigendian = endianness; swap = (bigendian != garray_ambigendian());
BUG #31 debugging overhead left in readsf~ and writesf~
In release version, i.e. with debugging printout from readsf~ and writesf~ disabled, the "sprintf(boo..." debugging calls are still performed.
Fix: In d_soundfile.c, comment out the lines 1430-2, 1460-2, 1523-5, 1963-5. For example, change line 1303 to
-#if 0 +//#define DEBUG_SOUNDFILE +#ifdef DEBUG_SOUNDFILE
and add #ifdef DEBUG_SOUNDFILE ... #endif clause around the above lines.
BUG #32 sending 'normalize' to an array of zeros produces an array of nans
Sending 'normalize' to an array of zeros produces an array of nans.
Fix: In g_array.c, line 951, change the condition maxv >= 0 to maxv > 0