diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-25 12:16:18 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-25 12:16:18 +0100 |
| commit | 7809f23d4b500e13e197fe87ae46d9def1fa3c0b (patch) | |
| tree | 9b536f690235595a641b9b7c22ca651f22bdcffc /src | |
| parent | 37a95492982bcbb3251989ee6bf2dd10e65e58c6 (diff) | |
| download | box64-7809f23d4b500e13e197fe87ae46d9def1fa3c0b.tar.gz box64-7809f23d4b500e13e197fe87ae46d9def1fa3c0b.zip | |
Added wrapped libvorbis and libvorbisfile
Diffstat (limited to 'src')
| -rwxr-xr-x | src/library_list.h | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 8 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 4 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibvorbis.c | 51 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibvorbis_private.h | 111 | ||||
| -rwxr-xr-x | src/wrapped/wrappedvorbisfile.c | 176 | ||||
| -rwxr-xr-x | src/wrapped/wrappedvorbisfile_private.h | 40 |
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) |