From a31fec1973e974e5d1bd8d2b42807af28ef79b55 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 31 Jul 2024 18:27:41 +1000 Subject: [PATCH] Make it easier to switch Audio backends --- misc/xbox360/Makefile | 4 ++-- src/AudioBackend.c | 6 +++--- src/Core.h | 41 +++++++++++++++++++++++++---------------- src/Logger.c | 4 ++-- src/Window_Win.c | 19 ++++++++++++------- 5 files changed, 44 insertions(+), 30 deletions(-) diff --git a/misc/xbox360/Makefile b/misc/xbox360/Makefile index 9ce922254..f8d3ae418 100644 --- a/misc/xbox360/Makefile +++ b/misc/xbox360/Makefile @@ -29,7 +29,7 @@ export AR := xenon-ar #--------------------------------------------------------------------------------- TARGET := ClassiCube-xbox360 BUILD := build-360 -SOURCES := src +SOURCES := src third_party/bearssl/src #--------------------------------------------------------------------------------- # options for code generation @@ -68,7 +68,7 @@ export OFILES := $(CFILES:.c=.o) $(sFILES:.s=.o) $(SFILES:.S=.o) #--------------------------------------------------------------------------------- # build a list of include paths #--------------------------------------------------------------------------------- -export INCLUDE := -I$(LIBXENON_INC) +export INCLUDE := -I$(LIBXENON_INC) -Ithird_party/bearssl/inc #--------------------------------------------------------------------------------- # build a list of library paths diff --git a/src/AudioBackend.c b/src/AudioBackend.c index 1f45a13c0..c285bc9a6 100644 --- a/src/AudioBackend.c +++ b/src/AudioBackend.c @@ -22,7 +22,7 @@ static void AudioBase_FreeChunks(struct AudioChunk* chunks, int numChunks); /* achieve higher speed by playing samples at higher sample rate */ #define Audio_AdjustSampleRate(sampleRate, playbackRate) ((sampleRate * playbackRate) / 100) -#if defined CC_BUILD_OPENAL +#if CC_AUD_BACKEND == CC_AUD_BACKEND_OPENAL /*########################################################################################################################* *------------------------------------------------------OpenAL backend-----------------------------------------------------* *#########################################################################################################################*/ @@ -298,7 +298,7 @@ cc_result Audio_AllocChunks(cc_uint32 size, struct AudioChunk* chunks, int numCh void Audio_FreeChunks(struct AudioChunk* chunks, int numChunks) { AudioBase_FreeChunks(chunks, numChunks); } -#elif defined CC_BUILD_WINMM +#elif CC_AUD_BACKEND == CC_AUD_BACKEND_WINMM /*########################################################################################################################* *------------------------------------------------------WinMM backend------------------------------------------------------* *#########################################################################################################################*/ @@ -503,7 +503,7 @@ cc_result Audio_AllocChunks(cc_uint32 size, struct AudioChunk* chunks, int numCh void Audio_FreeChunks(struct AudioChunk* chunks, int numChunks) { AudioBase_FreeChunks(chunks, numChunks); } -#elif defined CC_BUILD_OPENSLES +#elif CC_AUD_BACKEND == CC_AUD_BACKEND_OPENSLES /*########################################################################################################################* *----------------------------------------------------OpenSL ES backend----------------------------------------------------* *#########################################################################################################################*/ diff --git a/src/Core.h b/src/Core.h index 665c362a6..e7dc0415d 100644 --- a/src/Core.h +++ b/src/Core.h @@ -145,6 +145,10 @@ typedef cc_uint8 cc_bool; #define CC_SSL_BACKEND_BEARSSL 2 #define CC_SSL_BACKEND_SCHANNEL 3 +#define CC_AUD_BACKEND_OPENAL 1 +#define CC_AUD_BACKEND_WINMM 2 +#define CC_AUD_BACKEND_OPENSLES 3 + #define CC_GFX_BACKEND_IS_GL() (CC_GFX_BACKEND == CC_GFX_BACKEND_GL1 || CC_GFX_BACKEND == CC_GFX_BACKEND_GL2) #define CC_BUILD_NETWORKING @@ -180,9 +184,9 @@ typedef cc_uint8 cc_bool; #elif defined _WIN32 #define CC_BUILD_WIN #define CC_BUILD_HTTPCLIENT - #define CC_BUILD_WINMM + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_WINMM #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_SCHANNEL - #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_D3D9 + #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_WIN32 #elif defined __ANDROID__ #define CC_BUILD_ANDROID @@ -192,13 +196,14 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_EGL #define CC_BUILD_TOUCH #define CC_BUILD_OPENSLES + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENSLES #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL2 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_ANDROID #elif defined __serenity__ #define CC_BUILD_SERENITY #define CC_BUILD_POSIX #define CC_BUILD_CURL - #define CC_BUILD_OPENAL + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_SDL2 #elif defined __linux__ @@ -206,7 +211,7 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_POSIX #define CC_BUILD_XINPUT2 #define CC_BUILD_CURL - #define CC_BUILD_OPENAL + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #if defined CC_BUILD_RPI #define CC_BUILD_GLES @@ -231,7 +236,7 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_MACOS #define CC_BUILD_CURL #endif - #define CC_BUILD_OPENAL + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #elif defined Macintosh #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_SOFTGPU #define CC_BUILD_MACCLASSIC @@ -247,7 +252,7 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_POSIX #define CC_BUILD_XINPUT2 #define CC_BUILD_CURL - #define CC_BUILD_OPENAL + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #elif defined __FreeBSD__ || defined __DragonFly__ @@ -256,6 +261,7 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_BSD #define CC_BUILD_XINPUT2 #define CC_BUILD_CURL + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #elif defined __OpenBSD__ @@ -264,7 +270,7 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_BSD #define CC_BUILD_XINPUT2 #define CC_BUILD_CURL - #define CC_BUILD_OPENAL + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #elif defined __NetBSD__ @@ -273,15 +279,15 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_BSD #define CC_BUILD_XINPUT2 #define CC_BUILD_CURL - #define CC_BUILD_OPENAL + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #elif defined __HAIKU__ #define CC_BUILD_HAIKU #define CC_BUILD_POSIX #define CC_BUILD_CURL - #define CC_BUILD_OPENAL #define CC_BACKTRACE_BUILTIN + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_BEOS #elif defined __BEOS__ @@ -289,16 +295,16 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_POSIX #define CC_BUILD_GL11 #define CC_BUILD_HTTPCLIENT - #define CC_BUILD_OPENAL #define CC_BACKTRACE_BUILTIN + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_BEOS #elif defined __sgi #define CC_BUILD_IRIX #define CC_BUILD_POSIX #define CC_BUILD_CURL - #define CC_BUILD_OPENAL #define CC_BIG_ENDIAN + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #elif defined __EMSCRIPTEN__ @@ -318,8 +324,8 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_CONSOLE #define CC_BUILD_LOWMEM #define CC_BUILD_COOPTHREADED - #define CC_BUILD_OPENAL #define CC_BUILD_HTTPCLIENT + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL #elif defined __3DS__ #define CC_BUILD_3DS @@ -342,9 +348,9 @@ typedef cc_uint8 cc_bool; #elif defined __vita__ #define CC_BUILD_PSVITA #define CC_BUILD_CONSOLE - #define CC_BUILD_OPENAL #define CC_BUILD_HTTPCLIENT #define CC_BUILD_TOUCH + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL #elif defined _arch_dreamcast #define CC_BUILD_DREAMCAST @@ -358,9 +364,9 @@ typedef cc_uint8 cc_bool; #elif defined PLAT_PS3 #define CC_BUILD_PS3 #define CC_BUILD_CONSOLE - #define CC_BUILD_OPENAL #define CC_BUILD_HTTPCLIENT #define CC_BUILD_SPLITSCREEN + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL #elif defined N64 #define CC_BIG_ENDIAN @@ -379,9 +385,9 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_CONSOLE #define CC_BUILD_LOWMEM #define CC_BUILD_COOPTHREADED - #define CC_BUILD_OPENAL #define CC_BUILD_HTTPCLIENT #define CC_BUILD_SPLITSCREEN + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL #elif defined PLAT_NDS #define CC_BUILD_NDS @@ -399,10 +405,10 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_WIIU #define CC_BUILD_CONSOLE #define CC_BUILD_COOPTHREADED - #define CC_BUILD_OPENAL #define CC_BUILD_HTTPCLIENT #define CC_BUILD_SPLITSCREEN #define CC_BUILD_TOUCH + #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL #elif defined __SWITCH__ #define CC_BUILD_SWITCH @@ -463,6 +469,9 @@ typedef cc_uint8 cc_bool; #if defined DEFAULT_SSL_BACKEND && !defined CC_SSL_BACKEND #define CC_SSL_BACKEND DEFAULT_SSL_BACKEND #endif +#if defined DEFAULT_AUD_BACKEND && !defined CC_AUD_BACKEND + #define CC_AUD_BACKEND DEFAULT_AUD_BACKEND +#endif #ifdef CC_BUILD_CONSOLE #undef CC_BUILD_FREETYPE diff --git a/src/Logger.c b/src/Logger.c index f84d5fd4b..0ddb8e4c2 100644 --- a/src/Logger.c +++ b/src/Logger.c @@ -290,12 +290,12 @@ static DWORD_PTR (WINAPI *_SymGetModuleBase)(HANDLE process, DWORD_PTR addr); static PVOID (WINAPI *_SymFunctionTableAccess)(HANDLE process, DWORD_PTR addr); static BOOL (WINAPI *_SymInitialize)(HANDLE process, PCSTR userSearchPath, BOOL fInvadeProcess); -static PVOID FunctionTableAccessCallback(HANDLE process, DWORD_PTR addr) { +static PVOID WINAPI FunctionTableAccessCallback(HANDLE process, DWORD_PTR addr) { if (!_SymFunctionTableAccess) return NULL; return _SymFunctionTableAccess(process, addr); } -static DWORD_PTR GetModuleBaseCallback(HANDLE process, DWORD_PTR addr) { +static DWORD_PTR WINAPI GetModuleBaseCallback(HANDLE process, DWORD_PTR addr) { if (!_SymGetModuleBase) return 0; return _SymGetModuleBase(process, addr); } diff --git a/src/Window_Win.c b/src/Window_Win.c index 47f78bb64..0ed8ff638 100644 --- a/src/Window_Win.c +++ b/src/Window_Win.c @@ -812,6 +812,7 @@ static HGLRC ctx_handle; static HDC ctx_DC; typedef BOOL (WINAPI *FP_SWAPINTERVAL)(int interval); static FP_SWAPINTERVAL wglSwapIntervalEXT; +static void* gl_lib; static void GLContext_SelectGraphicsMode(struct GraphicsMode* mode) { PIXELFORMATDESCRIPTOR pfd = { 0 }; @@ -846,6 +847,9 @@ void GLContext_Create(void) { InitGraphicsMode(&mode); GLContext_SelectGraphicsMode(&mode); + static const cc_string glPath = String_FromConst("OPENGL32.dll"); + gl_lib = DynamicLib_Load2(&glPath); + ctx_handle = wglCreateContext(win_DC); if (!ctx_handle) { Logger_Abort2(GetLastError(), "Failed to create OpenGL context"); @@ -867,19 +871,20 @@ void GLContext_Free(void) { ctx_handle = NULL; } +static PROC (WINAPI *_wglGetProcAddress)(LPCSTR); /* https://www.khronos.org/opengl/wiki/Load_OpenGL_Functions#Windows */ #define GLContext_IsInvalidAddress(ptr) (ptr == (void*)0 || ptr == (void*)1 || ptr == (void*)-1 || ptr == (void*)2) void* GLContext_GetAddress(const char* function) { - static const cc_string glPath = String_FromConst("OPENGL32.dll"); - static void* lib; - - void* addr = (void*)wglGetProcAddress(function); - if (!GLContext_IsInvalidAddress(addr)) return addr; + /* Not present on NT 3.5 */ + if (!_wglGetProcAddress) _wglGetProcAddress = DynamicLib_Get2(gl_lib, "wglGetProcAddress"); + if (_wglGetProcAddress) { + void* addr = (void*)_wglGetProcAddress(function); + if (!GLContext_IsInvalidAddress(addr)) return addr; + } /* Some drivers return NULL from wglGetProcAddress for core OpenGL functions */ - if (!lib) lib = DynamicLib_Load2(&glPath); - return DynamicLib_Get2(lib, function); + return DynamicLib_Get2(gl_lib, function); } cc_bool GLContext_SwapBuffers(void) {