From 722893931996736e46cea6f0ee6883209f44c562 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 31 Aug 2006 21:00:10 +0000 Subject: [PATCH] Added int32 adn float32 support to SDL_LoadWAV_RW(). --- src/audio/SDL_wave.c | 49 +++++++++++++++++++++++++++++--------------- src/audio/SDL_wave.h | 1 + 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/audio/SDL_wave.c b/src/audio/SDL_wave.c index 9eff53bfd..3bc9fdf3f 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 036a0c839..7f98ed459 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