diff --git a/src/bink/include/binkngc.h b/src/bink/include/binkngc.h index e6870606b..6660b550b 100644 --- a/src/bink/include/binkngc.h +++ b/src/bink/include/binkngc.h @@ -4,5 +4,7 @@ #include "bink.h" void radfree(void* ptr); +typedef void *(*RADMEMALLOC)(u32 size); +typedef void (*RADMEMFREE)(void* mem); #endif diff --git a/src/bink/include/binkread.h b/src/bink/include/binkread.h index 98a8c47c0..6735fc490 100644 --- a/src/bink/include/binkread.h +++ b/src/bink/include/binkread.h @@ -2,5 +2,5 @@ #define BINKREAD_H #include "bink.h" - +void BinkCloseTrack(HBINKTRACK bnkt); #endif diff --git a/src/bink/src/sdk/decode/binkread.c b/src/bink/src/sdk/decode/binkread.c index 8233cfaad..5d79f1ce1 100644 --- a/src/bink/src/sdk/decode/binkread.c +++ b/src/bink/src/sdk/decode/binkread.c @@ -695,6 +695,7 @@ s32 BinkSetSoundSystem(BINKSNDSYSOPEN open, u32 param) // (undefined *param_1,undefined2 *param_2,uint param_3) void conv16to8() { + } void checksound(u32 tmp) @@ -986,9 +987,9 @@ HBINKTRACK BinkOpenTrack(HBINK bnk, u32 trackindex) void BinkCloseTrack(HBINKTRACK bnkt) { - if (bnkt != 0) + if (bnkt) { - if (bnkt->sndcomp != 0) + if (bnkt->sndcomp) { BinkAudioDecompressClose(bnkt->sndcomp); bnkt->sndcomp = 0; diff --git a/src/bink/src/sdk/decode/ngc/binkngc.c b/src/bink/src/sdk/decode/ngc/binkngc.c index 996e26ff4..318fd7532 100644 --- a/src/bink/src/sdk/decode/ngc/binkngc.c +++ b/src/bink/src/sdk/decode/ngc/binkngc.c @@ -1,8 +1,68 @@ #include "binkngc.h" +#include "bink.h" #include "dolphin/os/OSAlloc.h" -u32 usermalloc = NULL; -void* userfree = NULL; + +RADMEMALLOC usermalloc = NULL; +RADMEMFREE userfree = NULL; +RADMEMALLOC userarammalloc = NULL; +RADMEMFREE useraramfree = NULL; + + + +void radmemset16(void* dest, u16 value, u32 size) { + int half_size = size >> 1; + int sprayed_value = (value << 16) | value; + u16* d16 = dest; + u32* d32 = dest; + + while (half_size--) { + *d32++ = sprayed_value; + } + + d16 = (U16*)d32; + if ((size & 1)) + *d16 = value; +} + +void RADSetMemory(RADMEMALLOC malloc_fn, RADMEMFREE free_fn) { + usermalloc = malloc_fn; + userfree = free_fn; +} + +void* radmalloc(u32 size) +{ + u32 request; + void *rawBlock; + u8 fromUser; + u32 addr; + u32 offset; + u8 *aligned; + if (size == 0 || size == 0xFFFFFFFF) + return 0; + request = size + 0x40; + if (usermalloc != 0 && (rawBlock = usermalloc(request))) { + if (rawBlock != 0 && rawBlock != (void *)-1) { + fromUser = 3; + } else { + return 0; + } + } else { + rawBlock = OSAllocFromHeap(__OSCurrHeap, request); + if (rawBlock == 0) { + return 0; + } + fromUser= 0; + } + addr = (u32)rawBlock; + offset = (u32)(0x40 - (addr & 0x1F)) & 0xFF; + aligned = (u8 *)rawBlock + offset; + aligned[-1] = (u8)offset; + aligned[-2] = fromUser; + if (fromUser == 3) + *(void **)(aligned - 8) = (void *)userfree; + return aligned; +} void radfree(void* ptr) { @@ -23,3 +83,21 @@ void radfree(void* ptr) } } } + +void RADSetAudioMemory(RADMEMALLOC malloc_fn, RADMEMFREE free_fn) { + userarammalloc = malloc_fn; + useraramfree = free_fn; +} + +void* radaudiomalloc(u32 size) { + if (userarammalloc) { + return userarammalloc(size); + } + return NULL; +} + +void radaudiofree(void* ptr) { + if (useraramfree) { + useraramfree(ptr); + } +}