Commit 9f5e3ed7e7f312bf7596894715549b3c4e5dd15c

Sam Lantinga 2014-06-22T10:05:59

Fixed bug 1673 - BEXT wave files only have extra metadata that you can easily skip through bill In SDL_wave.c, BEXT wave files with "bext" instead of "fmt " are choked on if (chunk.magic != FMT) { SDL_SetError("Complex WAVE files not supported"); was_error = 1; goto done; } BEXT files http://en.wikipedia.org/wiki/Broadcast_Wave_Format actually playback the same as regular waves. All they have is (A LOT OF) extra header info. To open them, just SKIP the "bext" chunk, and the "fmt " chunk will be a couple of hundred bytes later. The "fmt " chunk is also bloated, but if you skip past the extra information to the "data" chunk, there is nothing different about a BEXT wave file than a "normal" one. You can then load the data and proceed as normal.

diff --git a/src/audio/SDL_wave.c b/src/audio/SDL_wave.c
index afa1df1..8316c6f 100644
--- a/src/audio/SDL_wave.c
+++ b/src/audio/SDL_wave.c
@@ -460,7 +460,7 @@ SDL_LoadWAV_RW(SDL_RWops * src, int freesrc,
         }
         /* 2 Uint32's for chunk header+len, plus the lenread */
         headerDiff += lenread + 2 * sizeof(Uint32);
-    } while ((chunk.magic == FACT) || (chunk.magic == LIST));
+    } while ((chunk.magic == FACT) || (chunk.magic == LIST) || (chunk.magic == BEXT));
 
     /* Decode the audio data format */
     format = (WaveFMT *) chunk.data;
diff --git a/src/audio/SDL_wave.h b/src/audio/SDL_wave.h
index c53ad59..d136995 100644
--- a/src/audio/SDL_wave.h
+++ b/src/audio/SDL_wave.h
@@ -29,6 +29,7 @@
 #define WAVE            0x45564157      /* "WAVE" */
 #define FACT            0x74636166      /* "fact" */
 #define LIST            0x5453494c      /* "LIST" */
+#define BEXT            0x74786562      /* "bext" */
 #define FMT             0x20746D66      /* "fmt " */
 #define DATA            0x61746164      /* "data" */
 #define PCM_CODE        0x0001