SDL_mixer: timidity: Support byteswapped float output

From fe6455f35b9636cd42273b0175f0c4445ab30dfb Mon Sep 17 00:00:00 2001
From: Cameron Cawley <[EMAIL REDACTED]>
Date: Tue, 29 Mar 2022 22:24:44 +0100
Subject: [PATCH] timidity: Support byteswapped float output

Ported from https://github.com/icculus/SDL_sound/pull/47

(cherry picked from commit 5a4422f112122b2b071bc11e14b5c22b5de9fd94)
---
 src/timidity/output.c   | 9 +++++++++
 src/timidity/output.h   | 5 +++++
 src/timidity/timidity.c | 7 +++++--
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/timidity/output.c b/src/timidity/output.c
index 8bab4c40..7df26369 100644
--- a/src/timidity/output.c
+++ b/src/timidity/output.c
@@ -79,6 +79,15 @@ void timi_s32tof32(void *dp, Sint32 *lp, Sint32 c)
     }
 }
 
+void timi_s32tof32x(void* dp, Sint32* lp, Sint32 c)
+{
+    float* sp = (float*)(dp);
+    while (c--)
+    {
+        *sp++ = SDL_SwapFloat((float)(*lp++) / 2147483647.0f);
+    }
+}
+
 void timi_s32tos32(void *dp, Sint32 *lp, Sint32 c)
 {
   Sint32 *sp=(Sint32 *)(dp);
diff --git a/src/timidity/output.h b/src/timidity/output.h
index 6451db3f..e272bfd6 100644
--- a/src/timidity/output.h
+++ b/src/timidity/output.h
@@ -36,6 +36,7 @@ extern void timi_s32tof32(void *dp, Sint32 *lp, Sint32 c);
 extern void timi_s32tos32(void *dp, Sint32 *lp, Sint32 c);
 
 /* byte-exchanged 32-bit */
+extern void timi_s32tof32x(void* dp, Sint32* lp, Sint32 c);
 extern void timi_s32tos32x(void *dp, Sint32 *lp, Sint32 c);
 
 /* little-endian and big-endian specific */
@@ -44,11 +45,15 @@ extern void timi_s32tos32x(void *dp, Sint32 *lp, Sint32 c);
 #define timi_s32tos16b timi_s32tos16x
 #define timi_s32tos32l timi_s32tos32
 #define timi_s32tos32b timi_s32tos32x
+#define timi_s32tof32l timi_s32tof32
+#define timi_s32tof32b timi_s32tof32x
 #else
 #define timi_s32tos16l timi_s32tos16x
 #define timi_s32tos16b timi_s32tos16
 #define timi_s32tos32l timi_s32tos32x
 #define timi_s32tos32b timi_s32tos32
+#define timi_s32tof32l timi_s32tof32x
+#define timi_s32tof32b timi_s32tof32
 #endif
 
 #endif /* TIMIDITY_OUTPUT_H */
diff --git a/src/timidity/timidity.c b/src/timidity/timidity.c
index 563bba90..427a20cc 100644
--- a/src/timidity/timidity.c
+++ b/src/timidity/timidity.c
@@ -576,8 +576,11 @@ static void do_song_load(SDL_IOStream *io, const SDL_AudioSpec *audio, MidiSong
   case SDL_AUDIO_S32BE:
     song->write = timi_s32tos32b;
     break;
-  case SDL_AUDIO_F32:
-    song->write = timi_s32tof32;
+  case SDL_AUDIO_F32LE:
+    song->write = timi_s32tof32l;
+    break;
+  case SDL_AUDIO_F32BE:
+    song->write = timi_s32tof32b;
     break;
   default:
     SDL_SetError("Unsupported audio format");