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