diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-23 10:19:42 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-23 10:19:42 +0200 |
| commit | 4c0a213840d4ea746f8ab1dfd12315a5df101207 (patch) | |
| tree | d68cb16e104b374c30d5bd4e32f489eeeb63298c /src/wrapped32/wrappedopenal.c | |
| parent | aa65bad62b458acf790666d996cae72ab96881be (diff) | |
| download | box64-4c0a213840d4ea746f8ab1dfd12315a5df101207.tar.gz box64-4c0a213840d4ea746f8ab1dfd12315a5df101207.zip | |
[BOX32][WRAPPER] Added 32bits wrapped openal
Diffstat (limited to 'src/wrapped32/wrappedopenal.c')
| -rw-r--r-- | src/wrapped32/wrappedopenal.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/src/wrapped32/wrappedopenal.c b/src/wrapped32/wrappedopenal.c new file mode 100644 index 00000000..1d53b894 --- /dev/null +++ b/src/wrapped32/wrappedopenal.c @@ -0,0 +1,180 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include <dlfcn.h> + +#include "wrappedlibs.h" + +#include "debug.h" +#include "wrapper32.h" +#include "bridge.h" +#include "librarian/library_private.h" +#include "x64emu.h" +#include "emu/x64emu_private.h" +#include "callback.h" +#include "box32context.h" +#include "librarian.h" +#include "myalign32.h" + +static const char* openalName = "libopenal.so.1"; +#define LIBNAME openal + +#include "generated/wrappedopenaltypes32.h" + +#include "wrappercallback32.h" + +#define SUPER() \ +GO(0) \ +GO(1) \ +GO(2) \ +GO(3) \ +GO(4) + +// Request ... +#define GO(A) \ +static uintptr_t my32_Request_fct_##A = 0; \ +static void my32_Request_##A(int32_t a, int32_t b) \ +{ \ + RunFunctionFmt(my32_Request_fct_##A, "ii", a, b); \ +} +SUPER() +#undef GO +static void* find_Request_Fct(void* fct) +{ + if(!fct) return fct; + if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct); + #define GO(A) if(my32_Request_fct_##A == (uintptr_t)fct) return my32_Request_##A; + SUPER() + #undef GO + #define GO(A) if(my32_Request_fct_##A == 0) {my32_Request_fct_##A = (uintptr_t)fct; return my32_Request_##A; } + SUPER() + #undef GO + printf_log(LOG_NONE, "Warning, no more slot for openal Request callback\n"); + return NULL; +} + +#undef SUPER + +void* my32_alGetProcAddress(x64emu_t* emu, void* name); +void* my32_alcGetProcAddress(x64emu_t* emu, void* device, void* name); +void my32_alRequestFoldbackStart(x64emu_t *emu, int32_t mode, int32_t count, int32_t length, void* mem, void* cb); +void my32_alRequestFoldbackStop(x64emu_t* emu); + +#include "wrappedlib_init32.h" + + +void fillALProcWrapper32() +{ + int cnt, ret; + khint_t k; + kh_symbolmap_t * symbolmap = kh_init(symbolmap); + // populates maps... + cnt = sizeof(openalsymbolmap)/sizeof(map_onesymbol_t); + for (int i=0; i<cnt; ++i) { + k = kh_put(symbolmap, symbolmap, openalsymbolmap[i].name, &ret); + kh_value(symbolmap, k).w = openalsymbolmap[i].w; + kh_value(symbolmap, k).resolved = 0; + } + // and the my32_ symbols map + cnt = sizeof(MAPNAME(mysymbolmap))/sizeof(map_onesymbol_t); + for (int i=0; i<cnt; ++i) { + k = kh_put(symbolmap, symbolmap, openalmysymbolmap[i].name, &ret); + kh_value(symbolmap, k).w = openalmysymbolmap[i].w; + kh_value(symbolmap, k).resolved = 0; + } + my_context->alwrappers = symbolmap; + // fill my32_* map + symbolmap = kh_init(symbolmap); + cnt = sizeof(MAPNAME(mysymbolmap))/sizeof(map_onesymbol_t); + for (int i=0; i<cnt; ++i) { + k = kh_put(symbolmap, symbolmap, openalmysymbolmap[i].name, &ret); + kh_value(symbolmap, k).w = openalmysymbolmap[i].w; + kh_value(symbolmap, k).resolved = 0; + } + my_context->almymap = symbolmap; +} + +EXPORT void* my32_alGetProcAddress(x64emu_t* emu, void* name) +{ + khint_t k; + const char* rname = (const char*)name; + printf_log(LOG_DEBUG, "Calling 32bits alGetProcAddress(%s)\n", rname); + if(!emu->context->alwrappers) // could be moved in "my" structure... + fillALProcWrapper32(emu->context); + // get proc adress using actual alGetProcAddress + k = kh_get(symbolmap, emu->context->almymap, rname); + int is_my = (k==kh_end(emu->context->almymap))?0:1; + void* symbol; + if(is_my) { + // try again, by using custom "my32_" now... + char tmp[200]; + strcpy(tmp, "my32_"); + strcat(tmp, rname); + symbol = dlsym(emu->context->box64lib, tmp); + } else + symbol = my->alGetProcAddress(name); + if(!symbol) + return NULL; // easy + // get wrapper + k = kh_get(symbolmap, emu->context->alwrappers, rname); + if(k==kh_end(emu->context->alwrappers)) { + printf_log(LOG_INFO, "Warning, no wrapper for %s\n", rname); + return NULL; + } + symbol1_t *s = &kh_value(emu->context->alwrappers, k); + if(!s->resolved) { + const char* constname = kh_key(emu->context->alwrappers, k); + s->addr = AddCheckBridge(emu->context->system, s->w, symbol, 0, constname); + s->resolved = 1; + } + return (void*)s->addr; +} + +EXPORT void* my32_alcGetProcAddress(x64emu_t* emu, void* device, void* name) +{ + khint_t k; + const char* rname = (const char*)name; + printf_log(LOG_DEBUG, "Calling 32bits alcGetProcAddress(%p, %s)\n", device, rname); + if(!emu->context->alwrappers) // could be moved in "my" structure... + fillALProcWrapper32(); + // get proc adress using actual alGetProcAddress + k = kh_get(symbolmap, emu->context->almymap, rname); + int is_my = (k==kh_end(emu->context->almymap))?0:1; + void* symbol; + if(is_my) { + // try again, by using custom "my32_" now... + char tmp[200]; + strcpy(tmp, "my32_"); + strcat(tmp, rname); + symbol = dlsym(emu->context->box64lib, tmp); + } else + symbol = my->alcGetProcAddress(device, name); + if(!symbol) + return NULL; // easy + // get wrapper + k = kh_get(symbolmap, emu->context->alwrappers, rname); + if(k==kh_end(emu->context->alwrappers)) { + printf_log(LOG_INFO, "Warning, no wrapper for %s\n", rname); + return NULL; + } + symbol1_t *s = &kh_value(emu->context->alwrappers, k); + if(!s->resolved) { + const char* constname = kh_key(emu->context->alwrappers, k); + s->addr = AddCheckBridge(emu->context->system, s->w, symbol, 0, constname); + s->resolved = 1; + } + return (void*)s->addr; +} + +EXPORT void my32_alRequestFoldbackStart(x64emu_t *emu, int32_t mode, int32_t count, int32_t length, void* mem, void* cb) +{ + (void)emu; + my->alRequestFoldbackStart(mode, count, length, mem, find_Request_Fct(cb)); +} + +EXPORT void my32_alRequestFoldbackStop(x64emu_t* emu) +{ + (void)emu; + my->alRequestFoldbackStop(); +} |