src/audio/SDL_wave.c
changeset 1260 80f8c94b5199
parent 769 b8d311d90021
child 1312 c9b51268668f
--- a/src/audio/SDL_wave.c	Tue Jan 24 06:36:43 2006 +0000
+++ b/src/audio/SDL_wave.c	Tue Jan 24 07:20:18 2006 +0000
@@ -418,8 +418,9 @@
 
 	/* WAV magic header */
 	Uint32 RIFFchunk;
-	Uint32 wavelen;
+	Uint32 wavelen = 0;
 	Uint32 WAVEmagic;
+	Uint32 headerDiff = 0;
 
 	/* FMT chunk */
 	WaveFMT *format = NULL;
@@ -446,6 +447,7 @@
 		was_error = 1;
 		goto done;
 	}
+	headerDiff += sizeof(Uint32); // for WAVE
 
 	/* Read the audio data format chunk */
 	chunk.data = NULL;
@@ -458,6 +460,8 @@
 			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 @@
 		}
 		*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 @@
 	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;
 	}