sdl2-compat: audio: Fix available audio stream byte count

From 59b07d62ec6fbadad7bfe419b35225cbf9c2dd53 Mon Sep 17 00:00:00 2001
From: Cameron Gutman <[EMAIL REDACTED]>
Date: Tue, 25 Feb 2025 18:01:38 -0600
Subject: [PATCH] audio: Fix available audio stream byte count

SDL2 returns the number of post-conversion bytes while SDL3 returns the number of pre-conversion bytes.
---
 src/sdl2_compat.c | 24 ++++++++++++++++++++++--
 src/sdl3_syms.h   |  1 +
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/sdl2_compat.c b/src/sdl2_compat.c
index f128024..a56ee86 100644
--- a/src/sdl2_compat.c
+++ b/src/sdl2_compat.c
@@ -7089,7 +7089,27 @@ SDL_AudioStreamClear(SDL2_AudioStream *stream2)
 SDL_DECLSPEC int SDLCALL
 SDL_AudioStreamAvailable(SDL2_AudioStream *stream2)
 {
-    return SDL3_GetAudioStreamAvailable(stream2 ? stream2->stream3 : NULL);
+    SDL_AudioSpec src_spec, dst_spec;
+    int src_size, dst_size;
+    Sint64 available;
+
+    if (!stream2) {
+        return 0;
+    }
+
+    if (!SDL3_GetAudioStreamFormat(stream2->stream3, &src_spec, &dst_spec)) {
+        return 0;
+    }
+
+    available = SDL3_GetAudioStreamAvailable(stream2->stream3);
+    if (available < 0) {
+        return 0;
+    }
+
+    src_size = src_spec.channels * src_spec.freq * SDL_AUDIO_BYTESIZE(src_spec.format);
+    dst_size = dst_spec.channels * dst_spec.freq * SDL_AUDIO_BYTESIZE(dst_spec.format);
+
+    return (int)(available * src_size / dst_size);
 }
 
 SDL_DECLSPEC void SDLCALL
@@ -7157,7 +7177,7 @@ SDL_DECLSPEC Uint32 SDLCALL
 SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev)
 {
     SDL2_AudioStream *stream2 = GetOpenAudioDevice(dev);
-    return (stream2 && (stream2->callback2 == NULL)) ? SDL3_GetAudioStreamAvailable(stream2->stream3) : 0;
+    return (stream2 && (stream2->callback2 == NULL)) ? SDL_AudioStreamAvailable(stream2) : 0;
 }
 
 SDL_DECLSPEC int SDLCALL
diff --git a/src/sdl3_syms.h b/src/sdl3_syms.h
index d2af0e8..8ef0ca1 100644
--- a/src/sdl3_syms.h
+++ b/src/sdl3_syms.h
@@ -253,6 +253,7 @@ SDL3_SYM(SDL_AudioDeviceID*,GetAudioRecordingDevices,(int *a),(a),return)
 SDL3_SYM(int,GetAudioStreamAvailable,(SDL_AudioStream *a),(a),return)
 SDL3_SYM(int,GetAudioStreamData,(SDL_AudioStream *a, void *b, int c),(a,b,c),return)
 SDL3_SYM(SDL_AudioDeviceID,GetAudioStreamDevice,(SDL_AudioStream *a),(a),return)
+SDL3_SYM(bool,GetAudioStreamFormat,(SDL_AudioStream *a, SDL_AudioSpec *b, SDL_AudioSpec *c),(a,b,c),return)
 SDL3_SYM(SDL_PropertiesID,GetAudioStreamProperties,(SDL_AudioStream *a),(a),return)
 SDL3_SYM(const char*,GetBasePath,(void),(),return)
 SDL3_SYM(bool,GetBooleanProperty,(SDL_PropertiesID a, const char *b, bool c),(a,b,c),return)