SDL_mixer: timidity: Support byteswapped float output (cb767)

From cb7672a4659fe2830a2e282dfc39069c051be89f 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

Taken from https://github.com/icculus/SDL_sound/pull/47
---
 src/codecs/timidity/output.c   | 9 +++++++++
 src/codecs/timidity/output.h   | 5 +++++
 src/codecs/timidity/timidity.c | 7 +++++--
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/codecs/timidity/output.c b/src/codecs/timidity/output.c
index 47ea1d18..85715184 100644
--- a/src/codecs/timidity/output.c
+++ b/src/codecs/timidity/output.c
@@ -105,6 +105,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/codecs/timidity/output.h b/src/codecs/timidity/output.h
index 3a08f5bb..a93de61e 100644
--- a/src/codecs/timidity/output.h
+++ b/src/codecs/timidity/output.h
@@ -38,6 +38,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 */
@@ -48,6 +49,8 @@ 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_s32tou16l timi_s32tou16x
 #define timi_s32tou16b timi_s32tou16
@@ -55,6 +58,8 @@ extern void timi_s32tos32x(void *dp, Sint32 *lp, Sint32 c);
 #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/codecs/timidity/timidity.c b/src/codecs/timidity/timidity.c
index c32e2801..d5d4e1eb 100644
--- a/src/codecs/timidity/timidity.c
+++ b/src/codecs/timidity/timidity.c
@@ -576,8 +576,11 @@ static void do_song_load(SDL_RWops *rw, SDL_AudioSpec *audio, MidiSong **out)
   case AUDIO_S32MSB:
     song->write = timi_s32tos32b;
     break;
-  case AUDIO_F32SYS:
-    song->write = timi_s32tof32;
+  case AUDIO_F32LSB:
+    song->write = timi_s32tof32l;
+    break;
+  case AUDIO_F32MSB:
+    song->write = timi_s32tof32b;
     break;
   default:
     SDL_SetError("Unsupported audio format");