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");