diff --git a/src/audio/SDL_wave.c b/src/audio/SDL_wave.c index 36a7b1248..d82b4061c 100644 --- a/src/audio/SDL_wave.c +++ b/src/audio/SDL_wave.c @@ -418,8 +418,9 @@ SDL_AudioSpec * SDL_LoadWAV_RW (SDL_RWops *src, int freesrc, /* WAV magic header */ Uint32 RIFFchunk; - Uint32 wavelen; + Uint32 wavelen = 0; Uint32 WAVEmagic; + Uint32 headerDiff = 0; /* FMT chunk */ WaveFMT *format = NULL; @@ -446,6 +447,7 @@ SDL_AudioSpec * SDL_LoadWAV_RW (SDL_RWops *src, int freesrc, was_error = 1; goto done; } + headerDiff += sizeof(Uint32); // for WAVE /* Read the audio data format chunk */ chunk.data = NULL; @@ -458,6 +460,8 @@ SDL_AudioSpec * SDL_LoadWAV_RW (SDL_RWops *src, int freesrc, was_error = 1; goto done; } + // 2 Uint32's for chunk header+len, plus the lenread + headerDiff += lenread + 2 * sizeof(Uint32); } while ( (chunk.magic == FACT) || (chunk.magic == LIST) ); /* Decode the audio data format */ @@ -535,7 +539,9 @@ SDL_AudioSpec * SDL_LoadWAV_RW (SDL_RWops *src, int freesrc, } *audio_len = lenread; *audio_buf = chunk.data; + if(chunk.magic != DATA) headerDiff += lenread + 2 * sizeof(Uint32); } while ( chunk.magic != DATA ); + headerDiff += 2 * sizeof(Uint32); // for the data chunk and len if ( MS_ADPCM_encoded ) { if ( MS_ADPCM_decode(audio_buf, audio_len) < 0 ) { @@ -561,6 +567,10 @@ done: if ( freesrc && src ) { SDL_RWclose(src); } + else { + // seek to the end of the file (given by the RIFF chunk) + SDL_RWseek(src, wavelen - chunk.length - headerDiff, SEEK_CUR); + } if ( was_error ) { spec = NULL; }