Make it easier to switch Audio backends

This commit is contained in:
UnknownShadow200 2024-07-31 18:27:41 +10:00
parent 6da3ab1354
commit a31fec1973
5 changed files with 44 additions and 30 deletions

View File

@ -29,7 +29,7 @@ export AR := xenon-ar
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
TARGET := ClassiCube-xbox360 TARGET := ClassiCube-xbox360
BUILD := build-360 BUILD := build-360
SOURCES := src SOURCES := src third_party/bearssl/src
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# options for code generation # 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 # 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 # build a list of library paths

View File

@ -22,7 +22,7 @@ static void AudioBase_FreeChunks(struct AudioChunk* chunks, int numChunks);
/* achieve higher speed by playing samples at higher sample rate */ /* achieve higher speed by playing samples at higher sample rate */
#define Audio_AdjustSampleRate(sampleRate, playbackRate) ((sampleRate * playbackRate) / 100) #define Audio_AdjustSampleRate(sampleRate, playbackRate) ((sampleRate * playbackRate) / 100)
#if defined CC_BUILD_OPENAL #if CC_AUD_BACKEND == CC_AUD_BACKEND_OPENAL
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------OpenAL backend-----------------------------------------------------* *------------------------------------------------------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) { void Audio_FreeChunks(struct AudioChunk* chunks, int numChunks) {
AudioBase_FreeChunks(chunks, numChunks); AudioBase_FreeChunks(chunks, numChunks);
} }
#elif defined CC_BUILD_WINMM #elif CC_AUD_BACKEND == CC_AUD_BACKEND_WINMM
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------WinMM backend------------------------------------------------------* *------------------------------------------------------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) { void Audio_FreeChunks(struct AudioChunk* chunks, int numChunks) {
AudioBase_FreeChunks(chunks, numChunks); AudioBase_FreeChunks(chunks, numChunks);
} }
#elif defined CC_BUILD_OPENSLES #elif CC_AUD_BACKEND == CC_AUD_BACKEND_OPENSLES
/*########################################################################################################################* /*########################################################################################################################*
*----------------------------------------------------OpenSL ES backend----------------------------------------------------* *----------------------------------------------------OpenSL ES backend----------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/

View File

@ -145,6 +145,10 @@ typedef cc_uint8 cc_bool;
#define CC_SSL_BACKEND_BEARSSL 2 #define CC_SSL_BACKEND_BEARSSL 2
#define CC_SSL_BACKEND_SCHANNEL 3 #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_GFX_BACKEND_IS_GL() (CC_GFX_BACKEND == CC_GFX_BACKEND_GL1 || CC_GFX_BACKEND == CC_GFX_BACKEND_GL2)
#define CC_BUILD_NETWORKING #define CC_BUILD_NETWORKING
@ -180,9 +184,9 @@ typedef cc_uint8 cc_bool;
#elif defined _WIN32 #elif defined _WIN32
#define CC_BUILD_WIN #define CC_BUILD_WIN
#define CC_BUILD_HTTPCLIENT #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_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 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_WIN32
#elif defined __ANDROID__ #elif defined __ANDROID__
#define CC_BUILD_ANDROID #define CC_BUILD_ANDROID
@ -192,13 +196,14 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_EGL #define CC_BUILD_EGL
#define CC_BUILD_TOUCH #define CC_BUILD_TOUCH
#define CC_BUILD_OPENSLES #define CC_BUILD_OPENSLES
#define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENSLES
#define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL2 #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL2
#define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_ANDROID #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_ANDROID
#elif defined __serenity__ #elif defined __serenity__
#define CC_BUILD_SERENITY #define CC_BUILD_SERENITY
#define CC_BUILD_POSIX #define CC_BUILD_POSIX
#define CC_BUILD_CURL #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_GFX_BACKEND CC_GFX_BACKEND_GL1
#define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_SDL2 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_SDL2
#elif defined __linux__ #elif defined __linux__
@ -206,7 +211,7 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_POSIX #define CC_BUILD_POSIX
#define CC_BUILD_XINPUT2 #define CC_BUILD_XINPUT2
#define CC_BUILD_CURL #define CC_BUILD_CURL
#define CC_BUILD_OPENAL #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11
#if defined CC_BUILD_RPI #if defined CC_BUILD_RPI
#define CC_BUILD_GLES #define CC_BUILD_GLES
@ -231,7 +236,7 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_MACOS #define CC_BUILD_MACOS
#define CC_BUILD_CURL #define CC_BUILD_CURL
#endif #endif
#define CC_BUILD_OPENAL #define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#elif defined Macintosh #elif defined Macintosh
#define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_SOFTGPU #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_SOFTGPU
#define CC_BUILD_MACCLASSIC #define CC_BUILD_MACCLASSIC
@ -247,7 +252,7 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_POSIX #define CC_BUILD_POSIX
#define CC_BUILD_XINPUT2 #define CC_BUILD_XINPUT2
#define CC_BUILD_CURL #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_GFX_BACKEND CC_GFX_BACKEND_GL1
#define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11
#elif defined __FreeBSD__ || defined __DragonFly__ #elif defined __FreeBSD__ || defined __DragonFly__
@ -256,6 +261,7 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_BSD #define CC_BUILD_BSD
#define CC_BUILD_XINPUT2 #define CC_BUILD_XINPUT2
#define CC_BUILD_CURL #define CC_BUILD_CURL
#define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1
#define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11
#elif defined __OpenBSD__ #elif defined __OpenBSD__
@ -264,7 +270,7 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_BSD #define CC_BUILD_BSD
#define CC_BUILD_XINPUT2 #define CC_BUILD_XINPUT2
#define CC_BUILD_CURL #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_GFX_BACKEND CC_GFX_BACKEND_GL1
#define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11
#elif defined __NetBSD__ #elif defined __NetBSD__
@ -273,15 +279,15 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_BSD #define CC_BUILD_BSD
#define CC_BUILD_XINPUT2 #define CC_BUILD_XINPUT2
#define CC_BUILD_CURL #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_GFX_BACKEND CC_GFX_BACKEND_GL1
#define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11
#elif defined __HAIKU__ #elif defined __HAIKU__
#define CC_BUILD_HAIKU #define CC_BUILD_HAIKU
#define CC_BUILD_POSIX #define CC_BUILD_POSIX
#define CC_BUILD_CURL #define CC_BUILD_CURL
#define CC_BUILD_OPENAL
#define CC_BACKTRACE_BUILTIN #define CC_BACKTRACE_BUILTIN
#define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1
#define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_BEOS #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_BEOS
#elif defined __BEOS__ #elif defined __BEOS__
@ -289,16 +295,16 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_POSIX #define CC_BUILD_POSIX
#define CC_BUILD_GL11 #define CC_BUILD_GL11
#define CC_BUILD_HTTPCLIENT #define CC_BUILD_HTTPCLIENT
#define CC_BUILD_OPENAL
#define CC_BACKTRACE_BUILTIN #define CC_BACKTRACE_BUILTIN
#define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1
#define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_BEOS #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_BEOS
#elif defined __sgi #elif defined __sgi
#define CC_BUILD_IRIX #define CC_BUILD_IRIX
#define CC_BUILD_POSIX #define CC_BUILD_POSIX
#define CC_BUILD_CURL #define CC_BUILD_CURL
#define CC_BUILD_OPENAL
#define CC_BIG_ENDIAN #define CC_BIG_ENDIAN
#define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1 #define DEFAULT_GFX_BACKEND CC_GFX_BACKEND_GL1
#define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11 #define DEFAULT_WIN_BACKEND CC_WIN_BACKEND_X11
#elif defined __EMSCRIPTEN__ #elif defined __EMSCRIPTEN__
@ -318,8 +324,8 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_CONSOLE #define CC_BUILD_CONSOLE
#define CC_BUILD_LOWMEM #define CC_BUILD_LOWMEM
#define CC_BUILD_COOPTHREADED #define CC_BUILD_COOPTHREADED
#define CC_BUILD_OPENAL
#define CC_BUILD_HTTPCLIENT #define CC_BUILD_HTTPCLIENT
#define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL
#elif defined __3DS__ #elif defined __3DS__
#define CC_BUILD_3DS #define CC_BUILD_3DS
@ -342,9 +348,9 @@ typedef cc_uint8 cc_bool;
#elif defined __vita__ #elif defined __vita__
#define CC_BUILD_PSVITA #define CC_BUILD_PSVITA
#define CC_BUILD_CONSOLE #define CC_BUILD_CONSOLE
#define CC_BUILD_OPENAL
#define CC_BUILD_HTTPCLIENT #define CC_BUILD_HTTPCLIENT
#define CC_BUILD_TOUCH #define CC_BUILD_TOUCH
#define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL
#elif defined _arch_dreamcast #elif defined _arch_dreamcast
#define CC_BUILD_DREAMCAST #define CC_BUILD_DREAMCAST
@ -358,9 +364,9 @@ typedef cc_uint8 cc_bool;
#elif defined PLAT_PS3 #elif defined PLAT_PS3
#define CC_BUILD_PS3 #define CC_BUILD_PS3
#define CC_BUILD_CONSOLE #define CC_BUILD_CONSOLE
#define CC_BUILD_OPENAL
#define CC_BUILD_HTTPCLIENT #define CC_BUILD_HTTPCLIENT
#define CC_BUILD_SPLITSCREEN #define CC_BUILD_SPLITSCREEN
#define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL
#elif defined N64 #elif defined N64
#define CC_BIG_ENDIAN #define CC_BIG_ENDIAN
@ -379,9 +385,9 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_CONSOLE #define CC_BUILD_CONSOLE
#define CC_BUILD_LOWMEM #define CC_BUILD_LOWMEM
#define CC_BUILD_COOPTHREADED #define CC_BUILD_COOPTHREADED
#define CC_BUILD_OPENAL
#define CC_BUILD_HTTPCLIENT #define CC_BUILD_HTTPCLIENT
#define CC_BUILD_SPLITSCREEN #define CC_BUILD_SPLITSCREEN
#define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL
#elif defined PLAT_NDS #elif defined PLAT_NDS
#define CC_BUILD_NDS #define CC_BUILD_NDS
@ -399,10 +405,10 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_WIIU #define CC_BUILD_WIIU
#define CC_BUILD_CONSOLE #define CC_BUILD_CONSOLE
#define CC_BUILD_COOPTHREADED #define CC_BUILD_COOPTHREADED
#define CC_BUILD_OPENAL
#define CC_BUILD_HTTPCLIENT #define CC_BUILD_HTTPCLIENT
#define CC_BUILD_SPLITSCREEN #define CC_BUILD_SPLITSCREEN
#define CC_BUILD_TOUCH #define CC_BUILD_TOUCH
#define DEFAULT_AUD_BACKEND CC_AUD_BACKEND_OPENAL
#define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL #define DEFAULT_SSL_BACKEND CC_SSL_BACKEND_BEARSSL
#elif defined __SWITCH__ #elif defined __SWITCH__
#define CC_BUILD_SWITCH #define CC_BUILD_SWITCH
@ -463,6 +469,9 @@ typedef cc_uint8 cc_bool;
#if defined DEFAULT_SSL_BACKEND && !defined CC_SSL_BACKEND #if defined DEFAULT_SSL_BACKEND && !defined CC_SSL_BACKEND
#define CC_SSL_BACKEND DEFAULT_SSL_BACKEND #define CC_SSL_BACKEND DEFAULT_SSL_BACKEND
#endif #endif
#if defined DEFAULT_AUD_BACKEND && !defined CC_AUD_BACKEND
#define CC_AUD_BACKEND DEFAULT_AUD_BACKEND
#endif
#ifdef CC_BUILD_CONSOLE #ifdef CC_BUILD_CONSOLE
#undef CC_BUILD_FREETYPE #undef CC_BUILD_FREETYPE

View File

@ -290,12 +290,12 @@ static DWORD_PTR (WINAPI *_SymGetModuleBase)(HANDLE process, DWORD_PTR addr);
static PVOID (WINAPI *_SymFunctionTableAccess)(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 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; if (!_SymFunctionTableAccess) return NULL;
return _SymFunctionTableAccess(process, addr); 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; if (!_SymGetModuleBase) return 0;
return _SymGetModuleBase(process, addr); return _SymGetModuleBase(process, addr);
} }

View File

@ -812,6 +812,7 @@ static HGLRC ctx_handle;
static HDC ctx_DC; static HDC ctx_DC;
typedef BOOL (WINAPI *FP_SWAPINTERVAL)(int interval); typedef BOOL (WINAPI *FP_SWAPINTERVAL)(int interval);
static FP_SWAPINTERVAL wglSwapIntervalEXT; static FP_SWAPINTERVAL wglSwapIntervalEXT;
static void* gl_lib;
static void GLContext_SelectGraphicsMode(struct GraphicsMode* mode) { static void GLContext_SelectGraphicsMode(struct GraphicsMode* mode) {
PIXELFORMATDESCRIPTOR pfd = { 0 }; PIXELFORMATDESCRIPTOR pfd = { 0 };
@ -846,6 +847,9 @@ void GLContext_Create(void) {
InitGraphicsMode(&mode); InitGraphicsMode(&mode);
GLContext_SelectGraphicsMode(&mode); GLContext_SelectGraphicsMode(&mode);
static const cc_string glPath = String_FromConst("OPENGL32.dll");
gl_lib = DynamicLib_Load2(&glPath);
ctx_handle = wglCreateContext(win_DC); ctx_handle = wglCreateContext(win_DC);
if (!ctx_handle) { if (!ctx_handle) {
Logger_Abort2(GetLastError(), "Failed to create OpenGL context"); Logger_Abort2(GetLastError(), "Failed to create OpenGL context");
@ -867,19 +871,20 @@ void GLContext_Free(void) {
ctx_handle = NULL; ctx_handle = NULL;
} }
static PROC (WINAPI *_wglGetProcAddress)(LPCSTR);
/* https://www.khronos.org/opengl/wiki/Load_OpenGL_Functions#Windows */ /* 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) #define GLContext_IsInvalidAddress(ptr) (ptr == (void*)0 || ptr == (void*)1 || ptr == (void*)-1 || ptr == (void*)2)
void* GLContext_GetAddress(const char* function) { void* GLContext_GetAddress(const char* function) {
static const cc_string glPath = String_FromConst("OPENGL32.dll"); /* Not present on NT 3.5 */
static void* lib; if (!_wglGetProcAddress) _wglGetProcAddress = DynamicLib_Get2(gl_lib, "wglGetProcAddress");
if (_wglGetProcAddress) {
void* addr = (void*)wglGetProcAddress(function); void* addr = (void*)_wglGetProcAddress(function);
if (!GLContext_IsInvalidAddress(addr)) return addr; if (!GLContext_IsInvalidAddress(addr)) return addr;
}
/* Some drivers return NULL from wglGetProcAddress for core OpenGL functions */ /* Some drivers return NULL from wglGetProcAddress for core OpenGL functions */
if (!lib) lib = DynamicLib_Load2(&glPath); return DynamicLib_Get2(gl_lib, function);
return DynamicLib_Get2(lib, function);
} }
cc_bool GLContext_SwapBuffers(void) { cc_bool GLContext_SwapBuffers(void) {