sdl2-compat: Add legacy audio function

From 922d6fbfe7a99040abcb82baa2f242011ee7e842 Mon Sep 17 00:00:00 2001
From: Sylvain <[EMAIL REDACTED]>
Date: Thu, 5 Jan 2023 12:26:58 +0100
Subject: [PATCH] Add legacy audio function

---
 src/sdl2_compat.c          | 156 +++++++++++++++++++++++++++++++++++++
 src/sdl3_include_wrapper.h |  36 ---------
 src/sdl3_syms.h            |  25 +++---
 3 files changed, 165 insertions(+), 52 deletions(-)

diff --git a/src/sdl2_compat.c b/src/sdl2_compat.c
index 64863a5..bef49d4 100644
--- a/src/sdl2_compat.c
+++ b/src/sdl2_compat.c
@@ -2972,6 +2972,161 @@ DECLSPEC int SDLCALL SDL_GL_GetSwapInterval(void)
     return val;
 }
 
+static SDL_AudioDeviceID g_audio_id = 0;
+static SDL_AudioSpec g_audio_spec;
+
+DECLSPEC int SDLCALL
+SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
+{
+    SDL_AudioDeviceID id = 0;
+
+    /* Start up the audio driver, if necessary. This is legacy behaviour! */
+    if (!SDL_WasInit(SDL_INIT_AUDIO)) {
+        if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) {
+            return -1;
+        }
+    }
+
+    if (g_audio_id > 0) {
+        SDL_SetError("Audio device is already opened");
+        return -1;
+    }
+
+    if (obtained) {
+        id = SDL_OpenAudioDevice(NULL, 0, desired, obtained, SDL_AUDIO_ALLOW_ANY_CHANGE);
+
+        g_audio_spec = *obtained;
+    } else {
+        SDL_AudioSpec _obtained;
+        SDL_zero(_obtained);
+        id = SDL_OpenAudioDevice(NULL, 0, desired, &_obtained, 0);
+        /* On successful open, copy calculated values into 'desired'. */
+        if (id > 0) {
+            desired->size = _obtained.size;
+            desired->silence = _obtained.silence;
+        }
+
+        g_audio_spec = _obtained;
+    }
+
+    if (id > 0) {
+        g_audio_id = id;
+        return 0;
+    } else {
+        return -1;
+    }
+}
+
+/*
+ * Moved here from SDL_mixer.c, since it relies on internals of an opened
+ *  audio device (and is deprecated, by the way!).
+ */
+DECLSPEC void SDLCALL
+SDL_MixAudio(Uint8 *dst, const Uint8 *src, Uint32 len, int volume)
+{
+    /* Mix the user-level audio format */
+    if (g_audio_id > 0) {
+        SDL_MixAudioFormat(dst, src, g_audio_spec.format, len, volume); // FIXME: is this correct ??
+    }
+}
+
+DECLSPEC Uint32 SDLCALL
+SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev)
+{
+    SDL_AudioDeviceID id = dev == 1 ? g_audio_id : dev;
+    return SDL3_GetQueuedAudioSize(id);
+}
+ 
+DECLSPEC int SDLCALL 
+SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len)
+{
+    SDL_AudioDeviceID id = dev == 1 ? g_audio_id : dev;
+    return SDL3_QueueAudio(id, data, len);
+}
+
+DECLSPEC Uint32 SDLCALL
+SDL_DequeueAudio(SDL_AudioDeviceID dev, void *data, Uint32 len)
+{
+    SDL_AudioDeviceID id = dev == 1 ? g_audio_id : dev;
+    return SDL3_DequeueAudio(id, data, len);
+}
+
+DECLSPEC void SDLCALL
+SDL_ClearQueuedAudio(SDL_AudioDeviceID dev)
+{
+    SDL_AudioDeviceID id = dev == 1 ? g_audio_id : dev;
+    return SDL3_ClearQueuedAudio(id);
+}
+
+DECLSPEC void SDLCALL
+SDL_PauseAudioDevice(SDL_AudioDeviceID dev, int pause_on)
+{
+    SDL_AudioDeviceID id = dev == 1 ? g_audio_id : dev;
+    SDL3_PauseAudioDevice(id, pause_on);
+}
+
+DECLSPEC SDL_AudioStatus SDLCALL
+SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev)
+{
+    SDL_AudioDeviceID id = dev == 1 ? g_audio_id : dev;
+    return SDL3_GetAudioDeviceStatus(id);
+}
+
+DECLSPEC void SDLCALL
+SDL_LockAudioDevice(SDL_AudioDeviceID dev)
+{
+    SDL_AudioDeviceID id = dev == 1 ? g_audio_id : dev;
+    SDL3_LockAudioDevice(id);
+}
+
+DECLSPEC void SDLCALL 
+SDL_UnlockAudioDevice(SDL_AudioDeviceID dev)
+{
+    SDL_AudioDeviceID id = dev == 1 ? g_audio_id : dev;
+    SDL3_UnlockAudioDevice(id);
+}
+
+DECLSPEC void SDLCALL 
+SDL_CloseAudioDevice(SDL_AudioDeviceID dev)
+{
+    SDL_AudioDeviceID id = dev == 1 ? g_audio_id : dev;
+    SDL3_CloseAudioDevice(id);
+}
+
+
+DECLSPEC void SDLCALL
+SDL_LockAudio(void)
+{
+    SDL_LockAudioDevice(1);
+}
+
+DECLSPEC void SDLCALL
+SDL_UnlockAudio(void)
+{
+    SDL_UnlockAudioDevice(1);
+}
+
+DECLSPEC void SDLCALL
+SDL_CloseAudio(void)
+{
+    SDL_CloseAudioDevice(1);
+    g_audio_id = 0;
+}
+
+DECLSPEC void SDLCALL
+SDL_PauseAudio(int pause_on)
+{
+    SDL_PauseAudioDevice(1, pause_on);
+}
+
+DECLSPEC SDL_AudioStatus SDLCALL
+SDL_GetAudioStatus(void)
+{
+    return SDL_GetAudioDeviceStatus(1);
+}
+
+
+
 DECLSPEC void SDLCALL
 SDL_LockJoysticks(void)
 {
@@ -2996,6 +3151,7 @@ SDL_UnlockSensors(void)
     SDL3_UnlockMutex(sensor_lock);
 }
 
+
 typedef struct
 {
     Uint32 format;              /**< pixel format */
diff --git a/src/sdl3_include_wrapper.h b/src/sdl3_include_wrapper.h
index 26eb938..a3c0868 100644
--- a/src/sdl3_include_wrapper.h
+++ b/src/sdl3_include_wrapper.h
@@ -36,37 +36,29 @@
 #define SDL_GetNumAudioDrivers IGNORE_THIS_VERSION_OF_SDL_GetNumAudioDrivers
 #define SDL_GetAudioDriver IGNORE_THIS_VERSION_OF_SDL_GetAudioDriver
 #define SDL_GetCurrentAudioDriver IGNORE_THIS_VERSION_OF_SDL_GetCurrentAudioDriver
-#define SDL_OpenAudio IGNORE_THIS_VERSION_OF_SDL_OpenAudio
 #define SDL_GetNumAudioDevices IGNORE_THIS_VERSION_OF_SDL_GetNumAudioDevices
 #define SDL_GetAudioDeviceName IGNORE_THIS_VERSION_OF_SDL_GetAudioDeviceName
 #define SDL_GetAudioDeviceSpec IGNORE_THIS_VERSION_OF_SDL_GetAudioDeviceSpec
 #define SDL_GetDefaultAudioInfo IGNORE_THIS_VERSION_OF_SDL_GetDefaultAudioInfo
 #define SDL_OpenAudioDevice IGNORE_THIS_VERSION_OF_SDL_OpenAudioDevice
-#define SDL_GetAudioStatus IGNORE_THIS_VERSION_OF_SDL_GetAudioStatus
 #define SDL_GetAudioDeviceStatus IGNORE_THIS_VERSION_OF_SDL_GetAudioDeviceStatus
-#define SDL_PauseAudio IGNORE_THIS_VERSION_OF_SDL_PauseAudio
 #define SDL_PauseAudioDevice IGNORE_THIS_VERSION_OF_SDL_PauseAudioDevice
 #define SDL_LoadWAV_RW IGNORE_THIS_VERSION_OF_SDL_LoadWAV_RW
 #define SDL_BuildAudioCVT IGNORE_THIS_VERSION_OF_SDL_BuildAudioCVT
 #define SDL_ConvertAudio IGNORE_THIS_VERSION_OF_SDL_ConvertAudio
 #define SDL_CreateAudioStream IGNORE_THIS_VERSION_OF_SDL_CreateAudioStream
 #define SDL_PutAudioStreamData IGNORE_THIS_VERSION_OF_SDL_PutAudioStreamData
-#define SDL_GetAudioStreamData IGNORE_THIS_VERSION_OF_SDL_GetAudioStreamData
 #define SDL_GetAudioStreamAvailable IGNORE_THIS_VERSION_OF_SDL_GetAudioStreamAvailable
 #define SDL_FlushAudioStream IGNORE_THIS_VERSION_OF_SDL_FlushAudioStream
 #define SDL_ClearAudioStream IGNORE_THIS_VERSION_OF_SDL_ClearAudioStream
 #define SDL_DestroyAudioStream IGNORE_THIS_VERSION_OF_SDL_DestroyAudioStream
-#define SDL_MixAudio IGNORE_THIS_VERSION_OF_SDL_MixAudio
 #define SDL_MixAudioFormat IGNORE_THIS_VERSION_OF_SDL_MixAudioFormat
 #define SDL_QueueAudio IGNORE_THIS_VERSION_OF_SDL_QueueAudio
 #define SDL_DequeueAudio IGNORE_THIS_VERSION_OF_SDL_DequeueAudio
 #define SDL_GetQueuedAudioSize IGNORE_THIS_VERSION_OF_SDL_GetQueuedAudioSize
 #define SDL_ClearQueuedAudio IGNORE_THIS_VERSION_OF_SDL_ClearQueuedAudio
-#define SDL_LockAudio IGNORE_THIS_VERSION_OF_SDL_LockAudio
 #define SDL_LockAudioDevice IGNORE_THIS_VERSION_OF_SDL_LockAudioDevice
-#define SDL_UnlockAudio IGNORE_THIS_VERSION_OF_SDL_UnlockAudio
 #define SDL_UnlockAudioDevice IGNORE_THIS_VERSION_OF_SDL_UnlockAudioDevice
-#define SDL_CloseAudio IGNORE_THIS_VERSION_OF_SDL_CloseAudio
 #define SDL_CloseAudioDevice IGNORE_THIS_VERSION_OF_SDL_CloseAudioDevice
 #define SDL_hid_init IGNORE_THIS_VERSION_OF_SDL_hid_init
 #define SDL_hid_exit IGNORE_THIS_VERSION_OF_SDL_hid_exit
@@ -967,10 +959,6 @@ typedef void (__cdecl *pfnSDL_CurrentEndThread) (unsigned);
 #undef SDL_GetCurrentAudioDriver
 #endif
 
-#ifdef SDL_OpenAudio
-#undef SDL_OpenAudio
-#endif
-
 #ifdef SDL_GetNumAudioDevices
 #undef SDL_GetNumAudioDevices
 #endif
@@ -991,18 +979,10 @@ typedef void (__cdecl *pfnSDL_CurrentEndThread) (unsigned);
 #undef SDL_OpenAudioDevice
 #endif
 
-#ifdef SDL_GetAudioStatus
-#undef SDL_GetAudioStatus
-#endif
-
 #ifdef SDL_GetAudioDeviceStatus
 #undef SDL_GetAudioDeviceStatus
 #endif
 
-#ifdef SDL_PauseAudio
-#undef SDL_PauseAudio
-#endif
-
 #ifdef SDL_PauseAudioDevice
 #undef SDL_PauseAudioDevice
 #endif
@@ -1047,10 +1027,6 @@ typedef void (__cdecl *pfnSDL_CurrentEndThread) (unsigned);
 #undef SDL_DestroyAudioStream
 #endif
 
-#ifdef SDL_MixAudio
-#undef SDL_MixAudio
-#endif
-
 #ifdef SDL_MixAudioFormat
 #undef SDL_MixAudioFormat
 #endif
@@ -1071,26 +1047,14 @@ typedef void (__cdecl *pfnSDL_CurrentEndThread) (unsigned);
 #undef SDL_ClearQueuedAudio
 #endif
 
-#ifdef SDL_LockAudio
-#undef SDL_LockAudio
-#endif
-
 #ifdef SDL_LockAudioDevice
 #undef SDL_LockAudioDevice
 #endif
 
-#ifdef SDL_UnlockAudio
-#undef SDL_UnlockAudio
-#endif
-
 #ifdef SDL_UnlockAudioDevice
 #undef SDL_UnlockAudioDevice
 #endif
 
-#ifdef SDL_CloseAudio
-#undef SDL_CloseAudio
-#endif
-
 #ifdef SDL_CloseAudioDevice
 #undef SDL_CloseAudioDevice
 #endif
diff --git a/src/sdl3_syms.h b/src/sdl3_syms.h
index 10d5356..fe3b7cb 100644
--- a/src/sdl3_syms.h
+++ b/src/sdl3_syms.h
@@ -100,25 +100,18 @@ SDL3_SYM_PASSTHROUGH(void*,AtomicGetPtr,(void **a),(a),return)
 SDL3_SYM_PASSTHROUGH(int,GetNumAudioDrivers,(void),(),return)
 SDL3_SYM_PASSTHROUGH(const char*,GetAudioDriver,(int a),(a),return)
 SDL3_SYM_PASSTHROUGH(const char*,GetCurrentAudioDriver,(void),(),return)
-SDL3_SYM_PASSTHROUGH(int,OpenAudio,(SDL_AudioSpec *a, SDL_AudioSpec *b),(a,b),return)
 SDL3_SYM_PASSTHROUGH(int,GetNumAudioDevices,(int a),(a),return)
 SDL3_SYM_PASSTHROUGH(const char*,GetAudioDeviceName,(int a, int b),(a,b),return)
 SDL3_SYM_PASSTHROUGH(SDL_AudioDeviceID,OpenAudioDevice,(const char *a, int b, const SDL_AudioSpec *c, SDL_AudioSpec *d, int e),(a,b,c,d,e),return)
-SDL3_SYM_PASSTHROUGH(SDL_AudioStatus,GetAudioStatus,(void),(),return)
-SDL3_SYM_PASSTHROUGH(SDL_AudioStatus,GetAudioDeviceStatus,(SDL_AudioDeviceID a),(a),return)
-SDL3_SYM_PASSTHROUGH(void,PauseAudio,(int a),(a),)
-SDL3_SYM_PASSTHROUGH(void,PauseAudioDevice,(SDL_AudioDeviceID a, int b),(a,b),)
+SDL3_SYM(SDL_AudioStatus,GetAudioDeviceStatus,(SDL_AudioDeviceID a),(a),return)
+SDL3_SYM(void,PauseAudioDevice,(SDL_AudioDeviceID a, int b),(a,b),)
 SDL3_SYM(SDL_AudioSpec*,LoadWAV_RW,(SDL_RWops *a, int b, SDL_AudioSpec *c, Uint8 **d, Uint32 *e),(a,b,c,d,e),return)
 SDL3_SYM_PASSTHROUGH(int,BuildAudioCVT,(SDL_AudioCVT *a, SDL_AudioFormat b, Uint8 c, int d, SDL_AudioFormat e, Uint8 f, int g),(a,b,c,d,e,f,g),return)
 SDL3_SYM_PASSTHROUGH(int,ConvertAudio,(SDL_AudioCVT *a),(a),return)
-SDL3_SYM_PASSTHROUGH(void,MixAudio,(Uint8 *a, const Uint8 *b, Uint32 c, int d),(a,b,c,d),)
 SDL3_SYM_PASSTHROUGH(void,MixAudioFormat,(Uint8 *a, const Uint8 *b, SDL_AudioFormat c, Uint32 d, int e),(a,b,c,d,e),)
-SDL3_SYM_PASSTHROUGH(void,LockAudio,(void),(),)
-SDL3_SYM_PASSTHROUGH(void,LockAudioDevice,(SDL_AudioDeviceID a),(a),)
-SDL3_SYM_PASSTHROUGH(void,UnlockAudio,(void),(),)
-SDL3_SYM_PASSTHROUGH(void,UnlockAudioDevice,(SDL_AudioDeviceID a),(a),)
-SDL3_SYM_PASSTHROUGH(void,CloseAudio,(void),(),)
-SDL3_SYM_PASSTHROUGH(void,CloseAudioDevice,(SDL_AudioDeviceID a),(a),)
+SDL3_SYM(void,LockAudioDevice,(SDL_AudioDeviceID a),(a),)
+SDL3_SYM(void,UnlockAudioDevice,(SDL_AudioDeviceID a),(a),)
+SDL3_SYM(void,CloseAudioDevice,(SDL_AudioDeviceID a),(a),)
 SDL3_SYM_PASSTHROUGH(int,SetClipboardText,(const char *a),(a),return)
 SDL3_SYM_PASSTHROUGH(char*,GetClipboardText,(void),(),return)
 SDL3_SYM_PASSTHROUGH(SDL_bool,HasClipboardText,(void),(),return)
@@ -573,9 +566,9 @@ SDL3_SYM_PASSTHROUGH(int,CaptureMouse,(SDL_bool a),(a),return)
 SDL3_SYM_PASSTHROUGH(int,SetWindowHitTest,(SDL_Window *a, SDL_HitTest b, void *c),(a,b,c),return)
 SDL3_SYM(Uint32,GetGlobalMouseState,(float *a, float *b),(a,b),return)
 SDL3_SYM_PASSTHROUGH(SDL_bool,HasAVX2,(void),(),return)
-SDL3_SYM_PASSTHROUGH(int,QueueAudio,(SDL_AudioDeviceID a, const void *b, Uint32 c),(a,b,c),return)
-SDL3_SYM_PASSTHROUGH(Uint32,GetQueuedAudioSize,(SDL_AudioDeviceID a),(a),return)
-SDL3_SYM_PASSTHROUGH(void,ClearQueuedAudio,(SDL_AudioDeviceID a),(a),)
+SDL3_SYM(int,QueueAudio,(SDL_AudioDeviceID a, const void *b, Uint32 c),(a,b,c),return)
+SDL3_SYM(Uint32,GetQueuedAudioSize,(SDL_AudioDeviceID a),(a),return)
+SDL3_SYM(void,ClearQueuedAudio,(SDL_AudioDeviceID a),(a),)
 SDL3_SYM_PASSTHROUGH(SDL_Window*,GetGrabbedWindow,(void),(),return)
 #if defined(__WIN32__) || defined(__GDK__)
 SDL3_SYM_PASSTHROUGH(void,SetWindowsMessageHook,(SDL_WindowsMessageHook a, void *b),(a,b),)
@@ -592,7 +585,7 @@ SDL3_SYM_PASSTHROUGH(int,SetWindowInputFocus,(SDL_Window *a),(a),return)
 SDL3_SYM_PASSTHROUGH(int,SetWindowModalFor,(SDL_Window *a, SDL_Window *b),(a,b),return)
 SDL3_SYM_RENAMED(int,RenderSetIntegerScale,SetRenderIntegerScale,(SDL_Renderer *a, SDL_bool b),(a,b),return)
 SDL3_SYM_RENAMED(SDL_bool,RenderGetIntegerScale,GetRenderIntegerScale,(SDL_Renderer *a),(a),return)
-SDL3_SYM_PASSTHROUGH(Uint32,DequeueAudio,(SDL_AudioDeviceID a, void *b, Uint32 c),(a,b,c),return)
+SDL3_SYM(Uint32,DequeueAudio,(SDL_AudioDeviceID a, void *b, Uint32 c),(a,b,c),return)
 SDL3_SYM_PASSTHROUGH(void,SetWindowResizable,(SDL_Window *a, SDL_bool b),(a,b),)
 SDL3_SYM(SDL_bool,GetHintBoolean,(const char *a, SDL_bool b),(a,b),return)
 SDL3_SYM_RENAMED(Uint16,JoystickGetVendor,GetJoystickVendor,(SDL_Joystick *a),(a),return)