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)