Re: [AD] Bug with WAV loader on latest WIP

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


> The latest WIP has this code in load_wav:
>
> for (i=0; i<len*channels; i++) {
>     if ((s = pack_igetw(f)) == EOF) {
>        destroy_sample(spl);
>        spl = NULL;
>        break;
>     }
>     ((signed short *)spl->data)[i] = s^0x8000;
> }
>
> However, EOF is -1, which is 0xFFFF and is a valid sample for a 16-bit
> wave file to have in it. Since the return value of pack_igetw is being
> cast to short to be placed into s, there is no distinction between the
> sample 0xFFFF and the error code -1.
> This is causing load_wav to fail on some perfectly valid wave files.

Oops! My bad. I didn't see that 's' was a 'signed short', which is a
non-sense since pack_igetw() returns an 'int'.

> I propose the following fix:
>
> int in;
> for (i=0; i<len*channels; i++) {
>     if ((in = pack_igetw(f)) == EOF) {
>        destroy_sample(spl);
>        spl = NULL;
>        break;
>     }
>     s = in;
>     ((signed short *)spl->data)[i] = s^0x8000;
> }
>
> which reads from the file initially into a 32-bit integer, so that the
> 0xFFFF sample value will be accurately stored as 65535, completely
> distinct from -1, the fail value.

Fine with me. I'm going to apply the slighly modified patch that is
attached. Could you confirm that it fixes your problem too ?

--
Eric Botcazou

Attachment: sound.diff
Description: Binary data



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/