about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-25 12:16:18 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-25 12:16:18 +0100
commit7809f23d4b500e13e197fe87ae46d9def1fa3c0b (patch)
tree9b536f690235595a641b9b7c22ca651f22bdcffc /src
parent37a95492982bcbb3251989ee6bf2dd10e65e58c6 (diff)
downloadbox64-7809f23d4b500e13e197fe87ae46d9def1fa3c0b.tar.gz
box64-7809f23d4b500e13e197fe87ae46d9def1fa3c0b.zip
Added wrapped libvorbis and libvorbisfile
Diffstat (limited to 'src')
-rwxr-xr-xsrc/library_list.h4
-rw-r--r--src/wrapped/generated/functions_list.txt4
-rw-r--r--src/wrapped/generated/wrapper.c8
-rw-r--r--src/wrapped/generated/wrapper.h4
-rwxr-xr-xsrc/wrapped/wrappedlibvorbis.c51
-rwxr-xr-xsrc/wrapped/wrappedlibvorbis_private.h111
-rwxr-xr-xsrc/wrapped/wrappedvorbisfile.c176
-rwxr-xr-xsrc/wrapped/wrappedvorbisfile_private.h40
8 files changed, 396 insertions, 2 deletions
diff --git a/src/library_list.h b/src/library_list.h
index ad9f8d9d..10d7a401 100755
--- a/src/library_list.h
+++ b/src/library_list.h
@@ -25,8 +25,8 @@ GO("libSDL_image-1.2.so.0", sdl1image)
 GO("libSDL_ttf-2.0.so.0", sdl1ttf)
 GO("libsmpeg-0.4.so.0", smpeg)
 GO("libsmpeg2-2.0.so.0", smpeg2)
-//GO("libvorbisfile.so.3", vorbisfile)
-//GO("libvorbis.so.0", libvorbis)
+GO("libvorbisfile.so.3", vorbisfile)
+GO("libvorbis.so.0", libvorbis)
 GO("libogg.so.0", libogg)
 //GO("libpng12.so.0", png12)
 //GO("libpng16.so.16", png16)
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index cfbf716d..269d493f 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -105,6 +105,7 @@
 #() iFpO
 #() iFSi
 #() IFEp
+#() IFpi
 #() IFpu
 #() CFui
 #() CFpi
@@ -131,6 +132,7 @@
 #() dFdi
 #() dFdd
 #() dFdp
+#() dFpi
 #() dFpp
 #() lFpi
 #() LFpi
@@ -784,6 +786,7 @@
 #() iFpuuiuui
 #() iFpupuuui
 #() iFpuppppp
+#() iFppiiiip
 #() iFppiiuui
 #() iFppiipii
 #() iFppipipi
@@ -870,6 +873,7 @@
 #() vFppiiipiii
 #() vFpppppippp
 #() iFEpiiiiipi
+#() iFEpppipppp
 #() iFiiiiiiiip
 #() iFiiiipiiip
 #() iFdddpppppp
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index ed5fe423..19447ed2 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -138,6 +138,7 @@ typedef int32_t (*iFpp_t)(void*, void*);
 typedef int32_t (*iFpO_t)(void*, int32_t);
 typedef int32_t (*iFSi_t)(void*, int32_t);
 typedef int64_t (*IFEp_t)(x64emu_t*, void*);
+typedef int64_t (*IFpi_t)(void*, int32_t);
 typedef int64_t (*IFpu_t)(void*, uint32_t);
 typedef uint8_t (*CFui_t)(uint32_t, int32_t);
 typedef uint8_t (*CFpi_t)(void*, int32_t);
@@ -164,6 +165,7 @@ typedef double (*dFid_t)(int32_t, double);
 typedef double (*dFdi_t)(double, int32_t);
 typedef double (*dFdd_t)(double, double);
 typedef double (*dFdp_t)(double, void*);
+typedef double (*dFpi_t)(void*, int32_t);
 typedef double (*dFpp_t)(void*, void*);
 typedef intptr_t (*lFpi_t)(void*, int32_t);
 typedef uintptr_t (*LFpi_t)(void*, int32_t);
@@ -817,6 +819,7 @@ typedef int32_t (*iFpiupiii_t)(void*, int32_t, uint32_t, void*, int32_t, int32_t
 typedef int32_t (*iFpuuiuui_t)(void*, uint32_t, uint32_t, int32_t, uint32_t, uint32_t, int32_t);
 typedef int32_t (*iFpupuuui_t)(void*, uint32_t, void*, uint32_t, uint32_t, uint32_t, int32_t);
 typedef int32_t (*iFpuppppp_t)(void*, uint32_t, void*, void*, void*, void*, void*);
+typedef int32_t (*iFppiiiip_t)(void*, void*, int32_t, int32_t, int32_t, int32_t, void*);
 typedef int32_t (*iFppiiuui_t)(void*, void*, int32_t, int32_t, uint32_t, uint32_t, int32_t);
 typedef int32_t (*iFppiipii_t)(void*, void*, int32_t, int32_t, void*, int32_t, int32_t);
 typedef int32_t (*iFppipipi_t)(void*, void*, int32_t, void*, int32_t, void*, int32_t);
@@ -903,6 +906,7 @@ typedef void (*vFpipppiipi_t)(void*, int32_t, void*, void*, void*, int32_t, int3
 typedef void (*vFppiiipiii_t)(void*, void*, int32_t, int32_t, int32_t, void*, int32_t, int32_t, int32_t);
 typedef void (*vFpppppippp_t)(void*, void*, void*, void*, void*, int32_t, void*, void*, void*);
 typedef int32_t (*iFEpiiiiipi_t)(x64emu_t*, void*, int32_t, int32_t, int32_t, int32_t, int32_t, void*, int32_t);
+typedef int32_t (*iFEpppipppp_t)(x64emu_t*, void*, void*, void*, int32_t, void*, void*, void*, void*);
 typedef int32_t (*iFiiiiiiiip_t)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, void*);
 typedef int32_t (*iFiiiipiiip_t)(int32_t, int32_t, int32_t, int32_t, void*, int32_t, int32_t, int32_t, void*);
 typedef int32_t (*iFdddpppppp_t)(double, double, double, void*, void*, void*, void*, void*, void*);
@@ -1108,6 +1112,7 @@ void iFpp(x64emu_t *emu, uintptr_t fcn) { iFpp_t fn = (iFpp_t)fcn; R_RAX=fn((voi
 void iFpO(x64emu_t *emu, uintptr_t fcn) { iFpO_t fn = (iFpO_t)fcn; R_RAX=fn((void*)R_RDI, of_convert((int32_t)R_RSI)); }
 void iFSi(x64emu_t *emu, uintptr_t fcn) { iFSi_t fn = (iFSi_t)fcn; R_RAX=fn(io_convert((void*)R_RDI), (int32_t)R_RSI); }
 void IFEp(x64emu_t *emu, uintptr_t fcn) { IFEp_t fn = (IFEp_t)fcn; R_RAX=(uint64_t)fn(emu, (void*)R_RDI); }
+void IFpi(x64emu_t *emu, uintptr_t fcn) { IFpi_t fn = (IFpi_t)fcn; R_RAX=(uint64_t)fn((void*)R_RDI, (int32_t)R_RSI); }
 void IFpu(x64emu_t *emu, uintptr_t fcn) { IFpu_t fn = (IFpu_t)fcn; R_RAX=(uint64_t)fn((void*)R_RDI, (uint32_t)R_RSI); }
 void CFui(x64emu_t *emu, uintptr_t fcn) { CFui_t fn = (CFui_t)fcn; R_RAX=(unsigned char)fn((uint32_t)R_RDI, (int32_t)R_RSI); }
 void CFpi(x64emu_t *emu, uintptr_t fcn) { CFpi_t fn = (CFpi_t)fcn; R_RAX=(unsigned char)fn((void*)R_RDI, (int32_t)R_RSI); }
@@ -1134,6 +1139,7 @@ void dFid(x64emu_t *emu, uintptr_t fcn) { dFid_t fn = (dFid_t)fcn; emu->xmm[0].d
 void dFdi(x64emu_t *emu, uintptr_t fcn) { dFdi_t fn = (dFdi_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], (int32_t)R_RDI); }
 void dFdd(x64emu_t *emu, uintptr_t fcn) { dFdd_t fn = (dFdd_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], emu->xmm[1].d[0]); }
 void dFdp(x64emu_t *emu, uintptr_t fcn) { dFdp_t fn = (dFdp_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], (void*)R_RDI); }
+void dFpi(x64emu_t *emu, uintptr_t fcn) { dFpi_t fn = (dFpi_t)fcn; emu->xmm[0].d[0]=fn((void*)R_RDI, (int32_t)R_RSI); }
 void dFpp(x64emu_t *emu, uintptr_t fcn) { dFpp_t fn = (dFpp_t)fcn; emu->xmm[0].d[0]=fn((void*)R_RDI, (void*)R_RSI); }
 void lFpi(x64emu_t *emu, uintptr_t fcn) { lFpi_t fn = (lFpi_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (int32_t)R_RSI); }
 void LFpi(x64emu_t *emu, uintptr_t fcn) { LFpi_t fn = (LFpi_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (int32_t)R_RSI); }
@@ -1787,6 +1793,7 @@ void iFpiupiii(x64emu_t *emu, uintptr_t fcn) { iFpiupiii_t fn = (iFpiupiii_t)fcn
 void iFpuuiuui(x64emu_t *emu, uintptr_t fcn) { iFpuuiuui_t fn = (iFpuuiuui_t)fcn; R_RAX=fn((void*)R_RDI, (uint32_t)R_RSI, (uint32_t)R_RDX, (int32_t)R_RCX, (uint32_t)R_R8, (uint32_t)R_R9, *(int32_t*)(R_RSP + 8)); }
 void iFpupuuui(x64emu_t *emu, uintptr_t fcn) { iFpupuuui_t fn = (iFpupuuui_t)fcn; R_RAX=fn((void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (uint32_t)R_RCX, (uint32_t)R_R8, (uint32_t)R_R9, *(int32_t*)(R_RSP + 8)); }
 void iFpuppppp(x64emu_t *emu, uintptr_t fcn) { iFpuppppp_t fn = (iFpuppppp_t)fcn; R_RAX=fn((void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); }
+void iFppiiiip(x64emu_t *emu, uintptr_t fcn) { iFppiiiip_t fn = (iFppiiiip_t)fcn; R_RAX=fn((void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(void**)(R_RSP + 8)); }
 void iFppiiuui(x64emu_t *emu, uintptr_t fcn) { iFppiiuui_t fn = (iFppiiuui_t)fcn; R_RAX=fn((void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (uint32_t)R_R8, (uint32_t)R_R9, *(int32_t*)(R_RSP + 8)); }
 void iFppiipii(x64emu_t *emu, uintptr_t fcn) { iFppiipii_t fn = (iFppiipii_t)fcn; R_RAX=fn((void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (void*)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8)); }
 void iFppipipi(x64emu_t *emu, uintptr_t fcn) { iFppipipi_t fn = (iFppipipi_t)fcn; R_RAX=fn((void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (void*)R_RCX, (int32_t)R_R8, (void*)R_R9, *(int32_t*)(R_RSP + 8)); }
@@ -1873,6 +1880,7 @@ void vFpipppiipi(x64emu_t *emu, uintptr_t fcn) { vFpipppiipi_t fn = (vFpipppiipi
 void vFppiiipiii(x64emu_t *emu, uintptr_t fcn) { vFppiiipiii_t fn = (vFppiiipiii_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (void*)R_R9, *(int32_t*)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24)); }
 void vFpppppippp(x64emu_t *emu, uintptr_t fcn) { vFpppppippp_t fn = (vFpppppippp_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (int32_t)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24)); }
 void iFEpiiiiipi(x64emu_t *emu, uintptr_t fcn) { iFEpiiiiipi_t fn = (iFEpiiiiipi_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(void**)(R_RSP + 8), *(int32_t*)(R_RSP + 16)); }
+void iFEpppipppp(x64emu_t *emu, uintptr_t fcn) { iFEpppipppp_t fn = (iFEpppipppp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (int32_t)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16)); }
 void iFiiiiiiiip(x64emu_t *emu, uintptr_t fcn) { iFiiiiiiiip_t fn = (iFiiiiiiiip_t)fcn; R_RAX=fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(void**)(R_RSP + 24)); }
 void iFiiiipiiip(x64emu_t *emu, uintptr_t fcn) { iFiiiipiiip_t fn = (iFiiiipiiip_t)fcn; R_RAX=fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (void*)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(void**)(R_RSP + 24)); }
 void iFdddpppppp(x64emu_t *emu, uintptr_t fcn) { iFdddpppppp_t fn = (iFdddpppppp_t)fcn; R_RAX=fn(emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0], (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); }
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index 1fbcd582..8194011f 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -135,6 +135,7 @@ void iFpp(x64emu_t *emu, uintptr_t fnc);
 void iFpO(x64emu_t *emu, uintptr_t fnc);
 void iFSi(x64emu_t *emu, uintptr_t fnc);
 void IFEp(x64emu_t *emu, uintptr_t fnc);
+void IFpi(x64emu_t *emu, uintptr_t fnc);
 void IFpu(x64emu_t *emu, uintptr_t fnc);
 void CFui(x64emu_t *emu, uintptr_t fnc);
 void CFpi(x64emu_t *emu, uintptr_t fnc);
@@ -161,6 +162,7 @@ void dFid(x64emu_t *emu, uintptr_t fnc);
 void dFdi(x64emu_t *emu, uintptr_t fnc);
 void dFdd(x64emu_t *emu, uintptr_t fnc);
 void dFdp(x64emu_t *emu, uintptr_t fnc);
+void dFpi(x64emu_t *emu, uintptr_t fnc);
 void dFpp(x64emu_t *emu, uintptr_t fnc);
 void lFpi(x64emu_t *emu, uintptr_t fnc);
 void LFpi(x64emu_t *emu, uintptr_t fnc);
@@ -814,6 +816,7 @@ void iFpiupiii(x64emu_t *emu, uintptr_t fnc);
 void iFpuuiuui(x64emu_t *emu, uintptr_t fnc);
 void iFpupuuui(x64emu_t *emu, uintptr_t fnc);
 void iFpuppppp(x64emu_t *emu, uintptr_t fnc);
+void iFppiiiip(x64emu_t *emu, uintptr_t fnc);
 void iFppiiuui(x64emu_t *emu, uintptr_t fnc);
 void iFppiipii(x64emu_t *emu, uintptr_t fnc);
 void iFppipipi(x64emu_t *emu, uintptr_t fnc);
@@ -900,6 +903,7 @@ void vFpipppiipi(x64emu_t *emu, uintptr_t fnc);
 void vFppiiipiii(x64emu_t *emu, uintptr_t fnc);
 void vFpppppippp(x64emu_t *emu, uintptr_t fnc);
 void iFEpiiiiipi(x64emu_t *emu, uintptr_t fnc);
+void iFEpppipppp(x64emu_t *emu, uintptr_t fnc);
 void iFiiiiiiiip(x64emu_t *emu, uintptr_t fnc);
 void iFiiiipiiip(x64emu_t *emu, uintptr_t fnc);
 void iFdddpppppp(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped/wrappedlibvorbis.c b/src/wrapped/wrappedlibvorbis.c
new file mode 100755
index 00000000..ebe7ac68
--- /dev/null
+++ b/src/wrapped/wrappedlibvorbis.c
@@ -0,0 +1,51 @@
+#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 "wrapper.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "x64emu.h"
+#include "emu/x64emu_private.h"
+#include "callback.h"
+#include "box64context.h"
+#include "librarian.h"
+#include "myalign.h"
+
+
+const char* libvorbisName = "libvorbis.so.0";
+#define LIBNAME libvorbis
+
+
+typedef struct vorbis_my_s {
+} vorbis_my_t;
+
+void* getVorbisMy(library_t* lib)
+{
+    vorbis_my_t* my = (vorbis_my_t*)calloc(1, sizeof(vorbis_my_t));
+    #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A);
+    #undef GO
+    return my;
+}
+
+void freeVorbisMy(void* lib)
+{
+    //vorbis_my_t *my = (vorbis_my_t *)lib;
+}
+
+#define CUSTOM_INIT \
+    box64->vorbis = lib; \
+    lib->priv.w.p2 = getVorbisMy(lib);
+
+#define CUSTOM_FINI \
+    freeVorbisMy(lib->priv.w.p2); \
+    free(lib->priv.w.p2); \
+    lib->context->vorbis = NULL;
+
+#include "wrappedlib_init.h"
+
diff --git a/src/wrapped/wrappedlibvorbis_private.h b/src/wrapped/wrappedlibvorbis_private.h
new file mode 100755
index 00000000..427ef373
--- /dev/null
+++ b/src/wrapped/wrappedlibvorbis_private.h
@@ -0,0 +1,111 @@
+#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA))
+#error meh!
+#endif
+
+//GO(_book_maptype1_quantvals, 
+//GO(_book_unquantize, 
+//GO(drft_backward, 
+//GO(drft_clear, 
+//GO(drft_forward, 
+//GO(drft_init, 
+//GO(_float32_pack, 
+//GO(_float32_unpack, 
+//GO(floor1_encode, 
+//GO(floor1_fit, 
+//GO(floor1_interpolate_fit, 
+//GO(_make_words, 
+//GO(mdct_backward, 
+//GO(mdct_clear, 
+//GO(mdct_forward, 
+//GO(mdct_init, 
+//GO(ov_ilog, 
+//GO(res0_free_info, 
+//GO(res0_free_look, 
+//GO(res0_inverse, 
+//GO(res0_look, 
+//GO(res0_pack, 
+//GO(res0_unpack, 
+//GO(res1_class, 
+//GO(res1_forward, 
+//GO(res1_inverse, 
+//GO(res2_class, 
+//GO(res2_forward, 
+//GO(res2_inverse, 
+//GO(_ve_envelope_clear, 
+//GO(_ve_envelope_init, 
+//GO(_ve_envelope_mark, 
+//GO(_ve_envelope_search, 
+//GO(_ve_envelope_shift, 
+//GO(_vi_gpsy_free, 
+//GO(_vi_psy_free, 
+GO(vorbis_analysis, iFpp)
+GO(vorbis_analysis_blockout, iFpp)
+GO(vorbis_analysis_buffer, pFpi)
+GO(vorbis_analysis_headerout, iFppppp)
+GO(vorbis_analysis_init, iFpp)
+GO(vorbis_analysis_wrote, iFpi)
+//GO(_vorbis_apply_window, 
+GO(vorbis_bitrate_addblock, iFp)
+//GO(vorbis_bitrate_clear, 
+GO(vorbis_bitrate_flushpacket, iFpp)
+//GO(vorbis_bitrate_init, 
+//GO(vorbis_bitrate_managed, 
+//GO(_vorbis_block_alloc, 
+GO(vorbis_block_clear, iFp)
+GO(vorbis_block_init, iFpp)
+//GO(_vorbis_block_ripcord, 
+//GO(vorbis_book_clear, 
+//GO(vorbis_book_codelen, 
+//GO(vorbis_book_codeword, 
+//GO(vorbis_book_decode, 
+//GO(vorbis_book_decodev_add, 
+//GO(vorbis_book_decodevs_add, 
+//GO(vorbis_book_decodev_set, 
+//GO(vorbis_book_decodevv_add, 
+//GO(vorbis_book_encode, 
+//GO(vorbis_book_init_decode, 
+//GO(vorbis_book_init_encode, 
+GO(vorbis_comment_add, vFpp)
+GO(vorbis_comment_add_tag, vFppp)
+GO(vorbis_comment_clear, vFp)
+GO(vorbis_commentheader_out, iFpp)
+GO(vorbis_comment_init, vFp)
+GO(vorbis_comment_query, pFppi)
+GO(vorbis_comment_query_count, iFpp)
+GO(vorbis_dsp_clear, vFp)
+//GO(vorbis_granule_time, 
+GO(vorbis_info_blocksize, iFpi)
+GO(vorbis_info_clear, vFp)
+GO(vorbis_info_init, vFp)
+//GO(vorbis_lpc_from_data, 
+//GO(vorbis_lpc_predict, 
+//GO(vorbis_lpc_to_lsp, 
+//GO(vorbis_lsp_to_curve, 
+GO(vorbis_packet_blocksize, iFpp)
+//GO(vorbis_staticbook_destroy, 
+//GO(vorbis_staticbook_pack, 
+//GO(vorbis_staticbook_unpack, 
+GO(vorbis_synthesis, iFpp)
+GO(vorbis_synthesis_blockin, iFpp)
+GO(vorbis_synthesis_halfrate, iFpi)
+GO(vorbis_synthesis_halfrate_p, iFp)
+GO(vorbis_synthesis_headerin, iFppp)
+GO(vorbis_synthesis_idheader, iFp)
+GO(vorbis_synthesis_init, iFpp)
+GO(vorbis_synthesis_lapout, iFpp)
+GO(vorbis_synthesis_pcmout, iFpp)
+GO(vorbis_synthesis_read, iFpi)
+GO(vorbis_synthesis_restart, iFp)
+GO(vorbis_synthesis_trackonly, iFpp)
+GO(vorbis_version_string, pFv)
+GO(vorbis_window, pFpi)
+//GO(_vorbis_window_get, 
+//GO(_vp_ampmax_decay, 
+//GO(_vp_couple_quantize_normalize, 
+//GO(_vp_global_free, 
+//GO(_vp_global_look, 
+//GO(_vp_noisemask, 
+//GO(_vp_offset_and_mix, 
+//GO(_vp_psy_clear, 
+//GO(_vp_psy_init, 
+//GO(_vp_tonemask, 
diff --git a/src/wrapped/wrappedvorbisfile.c b/src/wrapped/wrappedvorbisfile.c
new file mode 100755
index 00000000..36dfb357
--- /dev/null
+++ b/src/wrapped/wrappedvorbisfile.c
@@ -0,0 +1,176 @@
+#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 "wrapper.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "x64emu.h"
+#include "emu/x64emu_private.h"
+#include "callback.h"
+#include "box64context.h"
+#include "librarian.h"
+#include "myalign.h"
+#include "bridge.h"
+
+const char* vorbisfileName = "libvorbisfile.so.3";
+#define LIBNAME vorbisfile
+
+typedef struct {
+  size_t (*read_func)  (void *ptr, size_t size, size_t nmemb, void *datasource);
+  int    (*seek_func)  (void *datasource, int64_t offset, int whence);
+  int    (*close_func) (void *datasource);
+  long   (*tell_func)  (void *datasource);
+} ov_callbacks;
+
+typedef int32_t (*iFpppiC_t)(void*, void*, void*, int32_t, ov_callbacks);
+
+typedef struct vorbisfile_my_s {
+    // functions
+    iFpppiC_t       ov_open_callbacks;
+} vorbisfile_my_t;
+
+void* getVorbisfileMy(library_t* lib)
+{
+    vorbisfile_my_t* my = (vorbisfile_my_t*)calloc(1, sizeof(vorbisfile_my_t));
+    #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A);
+    GO(ov_open_callbacks, iFpppiC_t)
+    #undef GO
+    return my;
+}
+
+void freeVorbisfileMy(void* lib)
+{
+    //vorbisfile_my_t *my = (vorbisfile_my_t *)lib;
+}
+
+int32_t my_ov_open_callbacks(x64emu_t* emu, void* datasource, void* vf, void* initial, int32_t ibytes, void* read, void* seek, void* close, void* tell);
+
+#define CUSTOM_INIT \
+    box64->vorbisfile = lib;\
+    lib->priv.w.p2 = getVorbisfileMy(lib);
+
+#define CUSTOM_FINI \
+    freeVorbisfileMy(lib->priv.w.p2);   \
+    free(lib->priv.w.p2);               \
+    lib->context->vorbisfile = NULL;
+
+#include "wrappedlib_init.h"
+
+#define SUPER() \
+GO(0)           \
+GO(1)           \
+GO(2)           \
+GO(3)           \
+GO(4)           \
+GO(5)           \
+GO(6)           \
+GO(7)
+
+// read
+#define GO(A)   \
+static uintptr_t my_read_fct_##A = 0;   \
+static unsigned long my_read_##A(void* ptr, unsigned long size, unsigned long nmemb, void* datasource)     \
+{                                       \
+    return RunFunction(my_context, my_read_fct_##A, 4, ptr, size, nmemb, datasource);\
+}
+SUPER()
+#undef GO
+static void* findreadFct(void* fct)
+{
+    if(!fct) return NULL;
+    if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_read_fct_##A == (uintptr_t)fct) return my_read_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_read_fct_##A == 0) {my_read_fct_##A = (uintptr_t)fct; return my_read_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for vorbisfile read callback\n");
+    return NULL;
+}
+// seek
+#define GO(A)   \
+static uintptr_t my_seek_fct_##A = 0;   \
+static int my_seek_##A(void* ptr, int64_t offset, int whence)     \
+{                                       \
+    return (int)RunFunction(my_context, my_seek_fct_##A, 3, ptr, offset, whence);\
+}
+SUPER()
+#undef GO
+static void* findseekFct(void* fct)
+{
+    if(!fct) return NULL;
+    if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_seek_fct_##A == (uintptr_t)fct) return my_seek_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_seek_fct_##A == 0) {my_seek_fct_##A = (uintptr_t)fct; return my_seek_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for vorbisfile seek callback\n");
+    return NULL;
+}
+// close
+#define GO(A)   \
+static uintptr_t my_close_fct_##A = 0;   \
+static int my_close_##A(void* ptr)     \
+{                   \
+    return (int)RunFunction(my_context, my_close_fct_##A, 1, ptr);\
+}
+SUPER()
+#undef GO
+static void* findcloseFct(void* fct)
+{
+    if(!fct) return NULL;
+    if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_close_fct_##A == (uintptr_t)fct) return my_close_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_close_fct_##A == 0) {my_close_fct_##A = (uintptr_t)fct; return my_close_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for vorbisfile close callback\n");
+    return NULL;
+}
+// tell
+#define GO(A)   \
+static uintptr_t my_tell_fct_##A = 0;   \
+static long my_tell_##A(void* ptr)     \
+{                                       \
+    return (long)RunFunction(my_context, my_tell_fct_##A, 1, ptr);\
+}
+SUPER()
+#undef GO
+static void* findtellFct(void* fct)
+{
+    if(!fct) return NULL;
+    if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_tell_fct_##A == (uintptr_t)fct) return my_tell_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_tell_fct_##A == 0) {my_tell_fct_##A = (uintptr_t)fct; return my_tell_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for vorbisfile tell callback\n");
+    return NULL;
+}
+
+#undef SUPER
+
+EXPORT int32_t my_ov_open_callbacks(x64emu_t* emu, void* datasource, void* vf, void* initial, int32_t ibytes, void* read_fnc, void* seek_fnc, void* close_fnc, void* tell_fnc)
+{
+    vorbisfile_my_t* my = (vorbisfile_my_t*)emu->context->vorbisfile->priv.w.p2;
+    ov_callbacks cbs = {0};
+    cbs.read_func = findreadFct(read_fnc);
+    cbs.seek_func = findseekFct(seek_fnc);
+    cbs.close_func = findcloseFct(close_fnc);
+    cbs.tell_func = findtellFct(tell_fnc);
+    int32_t ret =  my->ov_open_callbacks(datasource, vf, initial, ibytes, cbs);
+    return ret;
+}
diff --git a/src/wrapped/wrappedvorbisfile_private.h b/src/wrapped/wrappedvorbisfile_private.h
new file mode 100755
index 00000000..5cf5602c
--- /dev/null
+++ b/src/wrapped/wrappedvorbisfile_private.h
@@ -0,0 +1,40 @@
+#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA))
+#error meh!
+#endif
+
+GO(ov_bitrate,iFpi)
+GO(ov_bitrate_instant,iFp)
+GO(ov_clear,iFp)
+GO(ov_comment,pFpi)
+GO(ov_crosslap,iFpp)
+GO(ov_fopen,iFpp)
+GO(ov_halfrate,iFpi)
+GO(ov_halfrate_p,iFp)
+GO(ov_info,pFpi)
+GO(ov_open,iFpppi)
+GOM(ov_open_callbacks,iFEpppipppp)  // ov_callbaks are not "by ref", so all 4 values are just on the stack
+GO(ov_pcm_seek,iFpI)
+GO(ov_pcm_seek_lap,iFpi)
+GO(ov_pcm_seek_page,iFpI)
+GO(ov_pcm_seek_page_lap,iFpI)
+GO(ov_pcm_tell,IFp)
+GO(ov_pcm_total,IFpi)
+GO(ov_raw_seek,iFpi)
+GO(ov_raw_seek_lap,iFpi)
+GO(ov_raw_tell,IFp)
+GO(ov_raw_total,IFpi)
+GO(ov_read,iFppiiiip)
+//GO(ov_read_filter,iFppiiiipBp)
+GO(ov_read_float,iFppip)
+GO(ov_seekable,iFp)
+GO(ov_serialnumber,iFpi)
+GO(ov_streams,iFp)
+GO(ov_test,iFpppi)
+//GO(ov_test_callbacks,iFpppiS)
+GO(ov_test_open,iFp)
+GO(ov_time_seek,iFpd)
+GO(ov_time_seek_lap,iFpd)
+GO(ov_time_seek_page,iFpd)
+GO(ov_time_seek_page_lap,iFpd)
+GO(ov_time_tell,dFp)
+GO(ov_time_total,dFpi)