about summary refs log tree commit diff stats
path: root/src/wrapped32/wrappedopenal.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-23 10:19:42 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-23 10:19:42 +0200
commit4c0a213840d4ea746f8ab1dfd12315a5df101207 (patch)
treed68cb16e104b374c30d5bd4e32f489eeeb63298c /src/wrapped32/wrappedopenal.c
parentaa65bad62b458acf790666d996cae72ab96881be (diff)
downloadbox64-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.c180
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();
+}