From fd613a1f43fcc0a2d2048217e146c89632f0da1c 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(). --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402041 --- src/audio/SDL_wave.c | 51 +++++++++++++++++++++++++++++--------------- src/audio/SDL_wave.h | 1 + 2 files changed, 35 insertions(+), 17 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; - } else { + + 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