From b661af000b2ed88e4aa8cb123e470fde0cd277cf 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
---
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 8bab4c40..7df26369 100644
--- a/src/codecs/timidity/output.c
+++ b/src/codecs/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/codecs/timidity/output.h b/src/codecs/timidity/output.h
index 6451db3f..e272bfd6 100644
--- a/src/codecs/timidity/output.h
+++ b/src/codecs/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/codecs/timidity/timidity.c b/src/codecs/timidity/timidity.c
index 125cd1c9..a13f45f1 100644
--- a/src/codecs/timidity/timidity.c
+++ b/src/codecs/timidity/timidity.c
@@ -576,8 +576,11 @@ static void do_song_load(SDL_IOStream *io, SDL_AudioSpec *audio, MidiSong **out)
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");