[PD-dev] some fixes to d_soundfile.c

Miller Puckette mpuckett at man104-1.ucsd.edu
Sat Feb 7 23:40:48 CET 2004


OK, think I fixed them all, thanks.  (to appear in test7...)

On Sat, Feb 07, 2004 at 04:30:47PM +0100, Krzysztof Czaja wrote:
> 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
> 
> 
> _______________________________________________
> PD-dev mailing list
> PD-dev at iem.at
> http://iem.at/cgi-bin/mailman/listinfo/pd-dev




More information about the Pd-dev mailing list