diff --git a/src/audio/SDL_wave.c b/src/audio/SDL_wave.c index 9eff53bfd968b5294ed069f2f65a970473e2eae6..3bc9fdf3f2c6f4c253e38f7f2b480859cf2b2667 100644 --- a/src/audio/SDL_wave.c +++ b/src/audio/SDL_wave.c @@ -413,7 +413,7 @@ SDL_LoadWAV_RW(SDL_RWops * src, int freesrc, int was_error; Chunk chunk; int lenread; - int MS_ADPCM_encoded, IMA_ADPCM_encoded; + int IEEE_float_encoded, MS_ADPCM_encoded, IMA_ADPCM_encoded; int samplesize; /* WAV magic header */ @@ -472,11 +472,15 @@ SDL_LoadWAV_RW(SDL_RWops * src, int freesrc, was_error = 1; goto done; } - MS_ADPCM_encoded = IMA_ADPCM_encoded = 0; + IEEE_float_encoded = MS_ADPCM_encoded = IMA_ADPCM_encoded = 0; switch (SDL_SwapLE16(format->encoding)) { case PCM_CODE: /* We can understand this */ break; + case IEEE_FLOAT_CODE: + IEEE_float_encoded = 1; + /* We can understand this */ + break; case MS_ADPCM_CODE: /* Try to understand this */ if (InitMS_ADPCM(format) < 0) { @@ -506,24 +510,37 @@ SDL_LoadWAV_RW(SDL_RWops * src, int freesrc, } SDL_memset(spec, 0, (sizeof *spec)); spec->freq = SDL_SwapLE32(format->frequency); - switch (SDL_SwapLE16(format->bitspersample)) { - case 4: - if (MS_ADPCM_encoded || IMA_ADPCM_encoded) { - spec->format = AUDIO_S16; + + if (IEEE_float_encoded) { + if ((SDL_SwapLE16(format->bitspersample)) != 32) { + was_error = 1; } else { + spec->format = AUDIO_F32; + } + } else { + switch (SDL_SwapLE16(format->bitspersample)) { + case 4: + if (MS_ADPCM_encoded || IMA_ADPCM_encoded) { + spec->format = AUDIO_S16; + } else { + was_error = 1; + } + break; + case 8: + spec->format = AUDIO_U8; + break; + case 16: + spec->format = AUDIO_S16; + break; + case 32: + spec->format = AUDIO_S32; + break; + default: was_error = 1; + break; } - break; - case 8: - spec->format = AUDIO_U8; - break; - case 16: - spec->format = AUDIO_S16; - break; - default: - was_error = 1; - break; } + if (was_error) { SDL_SetError("Unknown %d-bit PCM data format", SDL_SwapLE16(format->bitspersample)); diff --git a/src/audio/SDL_wave.h b/src/audio/SDL_wave.h index 036a0c839bf285e4e4273cbcf9d3dd3c770030db..7f98ed4595d927e8eb061a46653852b6b72a14bb 100644 --- a/src/audio/SDL_wave.h +++ b/src/audio/SDL_wave.h @@ -34,6 +34,7 @@ #define DATA 0x61746164 /* "data" */ #define PCM_CODE 0x0001 #define MS_ADPCM_CODE 0x0002 +#define IEEE_FLOAT_CODE 0x0003 #define IMA_ADPCM_CODE 0x0011 #define MP3_CODE 0x0055 #define WAVE_MONO 1