Skip to content

Commit b250ba9

Browse files
gigachadmma69Joeclaude
authored
wrapped: implement ov_read_filter with filter callback wrapping (#3604)
- Add GOM(ov_read_filter, iFEppiiiippp) to wrappedvorbisfile_private.h - Add iFppiiiippp_t typedef and findfilterFct() callback pool in wrappedvorbisfile.c - Implement my_ov_read_filter() export that wraps the filter callback - Add iFEppiiiippp type to wrapper.h/wrapper.c generated files - Add iFEppiiiippp case to x64printer.c for trace output - Add iFppiiiippp_t typedef and SUPER() entry to wrappedvorbisfiletypes.h Co-authored-by: Joe <joe@Joes-MacBook-Pro.local> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 3435090 commit b250ba9

6 files changed

Lines changed: 38 additions & 2 deletions

File tree

src/emu/x64printer.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6839,6 +6839,8 @@ void x64Print(x64emu_t* emu, char* buff, size_t buffsz, const char* func, int ti
68396839
snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIu32 ", %" PRIp ", %" PRIp ", %" PRIu32 ", %" PRIp ", %" PRIp ", %" PRIp ", %" PRIp ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (uint32_t)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24));
68406840
} else if (w == iFEpupppLppL) {
68416841
snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIu32 ", %" PRIp ", %" PRIp ", %" PRIp ", %" PRIu64 ", %" PRIp ", %" PRIp ", %" PRIu64 ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (uintptr_t)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(uintptr_t*)(R_RSP + 24));
6842+
} else if (w == iFEppiiiippp) {
6843+
snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIp ", %" PRIi32 ", %" PRIi32 ", %" PRIi32 ", %" PRIi32 ", %" PRIp ", %" PRIp ", %" PRIp ")", tid, *(void**)(R_RSP), func, (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**)(R_RSP + 16), *(void**)(R_RSP + 24));
68426844
} else if (w == iFEppLuppupp) {
68436845
snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIp ", %" PRIu64 ", %" PRIu32 ", %" PRIp ", %" PRIp ", %" PRIu32 ", %" PRIp ", %" PRIp ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (uint32_t)R_RCX, (void*)R_R8, (void*)R_R9, *(uint32_t*)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24));
68446846
} else if (w == iFEppppppipp) {

src/wrapped/generated/wrappedvorbisfiletypes.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
#endif
1313

1414
typedef int32_t (*iFppplPPPP_t)(void*, void*, void*, intptr_t, void*, void*, void*, void*);
15+
typedef int32_t (*iFppiiiippp_t)(void*, void*, int32_t, int32_t, int32_t, int32_t, void*, void*, void*);
1516

1617
#define SUPER() ADDED_FUNCTIONS() \
1718
GO(ov_open_callbacks, iFppplPPPP_t) \
18-
GO(ov_test_callbacks, iFppplPPPP_t)
19+
GO(ov_test_callbacks, iFppplPPPP_t) \
20+
GO(ov_read_filter, iFppiiiippp_t)
1921

2022
#endif // __wrappedvorbisfileTYPES_H_

src/wrapped/generated/wrapper.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3727,6 +3727,7 @@ typedef int32_t (*iFEipiipippi_t)(x64emu_t*, int32_t, void*, int32_t, int32_t, v
37273727
typedef int32_t (*iFEpiiiiippp_t)(x64emu_t*, void*, int32_t, int32_t, int32_t, int32_t, int32_t, void*, void*, void*);
37283728
typedef int32_t (*iFEpuppupppp_t)(x64emu_t*, void*, uint32_t, void*, void*, uint32_t, void*, void*, void*, void*);
37293729
typedef int32_t (*iFEpupppLppL_t)(x64emu_t*, void*, uint32_t, void*, void*, void*, uintptr_t, void*, void*, uintptr_t);
3730+
typedef int32_t (*iFEppiiiippp_t)(x64emu_t*, void*, void*, int32_t, int32_t, int32_t, int32_t, void*, void*, void*);
37303731
typedef int32_t (*iFEppLuppupp_t)(x64emu_t*, void*, void*, uintptr_t, uint32_t, void*, void*, uint32_t, void*, void*);
37313732
typedef int32_t (*iFEppppppipp_t)(x64emu_t*, void*, void*, void*, void*, void*, void*, int32_t, void*, void*);
37323733
typedef int32_t (*iFEpppppppip_t)(x64emu_t*, void*, void*, void*, void*, void*, void*, void*, int32_t, void*);
@@ -7820,6 +7821,7 @@ void iFEipiipippi(x64emu_t *emu, uintptr_t fcn) { iFEipiipippi_t fn = (iFEipiipi
78207821
void iFEpiiiiippp(x64emu_t *emu, uintptr_t fcn) { iFEpiiiiippp_t fn = (iFEpiiiiippp_t)fcn; R_RAX=(int)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), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24)); }
78217822
void iFEpuppupppp(x64emu_t *emu, uintptr_t fcn) { iFEpuppupppp_t fn = (iFEpuppupppp_t)fcn; R_RAX=(int)fn(emu, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (uint32_t)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24)); }
78227823
void iFEpupppLppL(x64emu_t *emu, uintptr_t fcn) { iFEpupppLppL_t fn = (iFEpupppLppL_t)fcn; R_RAX=(int)fn(emu, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (uintptr_t)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(uintptr_t*)(R_RSP + 24)); }
7824+
void iFEppiiiippp(x64emu_t *emu, uintptr_t fcn) { iFEppiiiippp_t fn = (iFEppiiiippp_t)fcn; R_RAX=(int)fn(emu, (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**)(R_RSP + 16), *(void**)(R_RSP + 24)); }
78237825
void iFEppLuppupp(x64emu_t *emu, uintptr_t fcn) { iFEppLuppupp_t fn = (iFEppLuppupp_t)fcn; R_RAX=(int)fn(emu, (void*)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (uint32_t)R_RCX, (void*)R_R8, (void*)R_R9, *(uint32_t*)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24)); }
78247826
void iFEppppppipp(x64emu_t *emu, uintptr_t fcn) { iFEppppppipp_t fn = (iFEppppppipp_t)fcn; R_RAX=(int)fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(int32_t*)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24)); }
78257827
void iFEpppppppip(x64emu_t *emu, uintptr_t fcn) { iFEpppppppip_t fn = (iFEpppppppip_t)fcn; R_RAX=(int)fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(void**)(R_RSP + 24)); }

src/wrapped/generated/wrapper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3738,6 +3738,7 @@ void iFEipiipippi(x64emu_t *emu, uintptr_t fnc);
37383738
void iFEpiiiiippp(x64emu_t *emu, uintptr_t fnc);
37393739
void iFEpuppupppp(x64emu_t *emu, uintptr_t fnc);
37403740
void iFEpupppLppL(x64emu_t *emu, uintptr_t fnc);
3741+
void iFEppiiiippp(x64emu_t *emu, uintptr_t fnc);
37413742
void iFEppLuppupp(x64emu_t *emu, uintptr_t fnc);
37423743
void iFEppppppipp(x64emu_t *emu, uintptr_t fnc);
37433744
void iFEpppppppip(x64emu_t *emu, uintptr_t fnc);

src/wrapped/wrappedvorbisfile.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@ typedef struct {
3131
} ov_callbacks;
3232

3333
typedef int32_t (*iFppplC_t)(void*, void*, void*, long, ov_callbacks);
34+
typedef int32_t (*iFppiiiippp_t)(void*, void*, int, int, int, int, void*, void(*)(float**, long, long, void*), void*);
3435

3536
#define SUPER() \
3637
GO(ov_open_callbacks, iFppplC_t) \
3738
GO(ov_test_callbacks, iFppplC_t) \
39+
GO(ov_read_filter, iFppiiiippp_t) \
3840

3941
#include "wrappercallback.h"
4042

@@ -136,6 +138,28 @@ static void* findtellFct(void* fct)
136138
printf_log(LOG_NONE, "Warning, no more slot for vorbisfile tell callback\n");
137139
return NULL;
138140
}
141+
// filter (for ov_read_filter: void (*filter)(float **pcm, long channels, long samples, void *filter_param))
142+
#define GO(A) \
143+
static uintptr_t my_filter_fct_##A = 0; \
144+
static void my_filter_##A(float** pcm, long channels, long samples, void* filter_param) \
145+
{ \
146+
RunFunctionFmt(my_filter_fct_##A, "pllp", pcm, channels, samples, filter_param);\
147+
}
148+
SUPER()
149+
#undef GO
150+
static void* findfilterFct(void* fct)
151+
{
152+
if(!fct) return NULL;
153+
if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct);
154+
#define GO(A) if(my_filter_fct_##A == (uintptr_t)fct) return my_filter_##A;
155+
SUPER()
156+
#undef GO
157+
#define GO(A) if(my_filter_fct_##A == 0) {my_filter_fct_##A = (uintptr_t)fct; return my_filter_##A; }
158+
SUPER()
159+
#undef GO
160+
printf_log(LOG_NONE, "Warning, no more slot for vorbisfile filter callback\n");
161+
return NULL;
162+
}
139163

140164
#undef SUPER
141165

@@ -161,4 +185,9 @@ EXPORT int32_t my_ov_test_callbacks(x64emu_t* emu, void* datasource, void* vf, v
161185
return ret;
162186
}
163187

188+
EXPORT int32_t my_ov_read_filter(x64emu_t* emu, void* vf, void* buffer, int length, int bigendianp, int word, int sgned, void* bitstream, void* filter, void* filter_param)
189+
{
190+
return my->ov_read_filter(vf, buffer, length, bigendianp, word, sgned, bitstream, findfilterFct(filter), filter_param);
191+
}
192+
164193
#include "wrappedlib_init.h"

src/wrapped/wrappedvorbisfile_private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ GO(ov_raw_seek_lap,iFpi)
2424
GO(ov_raw_tell,IFp)
2525
GO(ov_raw_total,IFpi)
2626
GO(ov_read,iFppiiiip)
27-
//GO(ov_read_filter,iFppiiiipBp)
27+
GOM(ov_read_filter,iFEppiiiippp)
2828
GO(ov_read_float,iFppip)
2929
GO(ov_seekable,iFp)
3030
GO(ov_serialnumber,iFpi)

0 commit comments

Comments
 (0)