Browse Source

Fix for wav loader chunk alignment not included in chunk size.

Mark Sibly 8 years ago
parent
commit
331564e8fc
1 changed files with 10 additions and 5 deletions
  1. 10 5
      modules/std/audio/load_wav.monkey2

+ 10 - 5
modules/std/audio/load_wav.monkey2

@@ -44,16 +44,20 @@ Function ReadWAV:AudioData( stream:std.stream.Stream )
 		Local tag:=stream.ReadInt()
 		Local size:=stream.ReadInt()
 		
+		Local aligned_size:=size+(size&1)	'chunk size *including* 2 byte alignment of next chunk.
+		
 		Select tag
 		Case $20746d66		'FMT
 			
 			Local fmt:=New FMT_Chunk
 			Local fmt_sz:=sizeof( fmt )
 			
-			If stream.Read( Varptr fmt,fmt_sz )<>fmt_sz Return Null
+			'read FMT chunk data
+			If fmt_sz>size Or stream.Read( Varptr fmt,fmt_sz )<>fmt_sz Return Null
 			
-			Local n:=size-fmt_sz
-			If n>0 And stream.Skip( n )<>n Return Null
+			'skip to next chunk
+			Local n:=aligned_size-fmt_sz
+			If n And stream.Skip( n )<>n Return Null
 			
 			If fmt.compType<>1 Return Null
 			
@@ -85,11 +89,12 @@ Function ReadWAV:AudioData( stream:std.stream.Stream )
 		
 		End
 		
-		stream.Skip( size )
+		'skip to next chunk
+		If stream.Skip( aligned_size )<>aligned_size Return Null
 		
 	Wend
 	
-	Return null
+	Return Null
 
 End