diff --git a/Makefile b/Makefile index 7ddf95c491..12d2e01371 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,10 @@ else endif endif +ifeq ($(WINE_LD),) +WINE_LD := $(WINE) +endif + # Hack for OSX ifeq ($(UNAME_S),Darwin) CPP := cpp-10 -P @@ -67,7 +71,7 @@ AS := $(DEVKITPPC)/bin/powerpc-eabi-as OBJCOPY := $(DEVKITPPC)/bin/powerpc-eabi-objcopy STRIP := $(DEVKITPPC)/bin/powerpc-eabi-strip CC := $(WINE) tools/mwcc_compiler/$(MWCC_VERSION)/mwcceppc_patched.exe -LD := $(WINE) tools/mwcc_compiler/$(MWCC_VERSION)/mwldeppc.exe +LD := $(WINE_LD) tools/mwcc_compiler/$(MWCC_VERSION)/mwldeppc.exe ELF2DOL := $(BUILD_PATH)/elf2dol PYTHON := python3 ICONV := iconv diff --git a/include/JSystem/JAudio2/JAISound.h b/include/JSystem/JAudio2/JAISound.h index f027ab22cd..e586164f0d 100644 --- a/include/JSystem/JAudio2/JAISound.h +++ b/include/JSystem/JAudio2/JAISound.h @@ -10,17 +10,23 @@ class JAISoundID { public: - operator u32() const { return this->mId; } - void operator=(JAISoundID const& other) {mId = other.mId;}; + operator u32() const { return this->mId.mFullId; } + void operator=(JAISoundID const& other) { mId.mFullId = other.mId.mFullId; }; - JAISoundID(u32 pId) { mId = pId; }; + JAISoundID(u32 pId) { mId.mFullId = pId; }; - JAISoundID(JAISoundID const& other) {mId = other.mId;}; + JAISoundID(JAISoundID const& other) { mId = other.mId; }; JAISoundID() {} -private: - u32 mId; + union { + u32 mFullId; + struct { + u16 mSoundType; + u16 mShortId; + } mAdvancedId; // Debug doesn't have an inline for referencing the short ID so I assume + // it's similar to this + } mId; }; struct JASTrack { @@ -30,11 +36,9 @@ struct JASTrack { /* 80292918 */ void writePort(u32, u16); /* 8029297C */ void readPort(u32); - inline int getChannelMgrCount() { - return channelMgrCount; - } + inline int getChannelMgrCount() { return channelMgrCount; } - /* 0x0 */u8 field_0x0[0x1d0]; + /* 0x0 */ u8 field_0x0[0x1d0]; /* 0x1d0 */ int channelMgrCount; }; @@ -49,54 +53,50 @@ struct JAISoundStatus_ { user_data = 0; } - bool isAlive(); //used in assert + bool isAlive(); // used in assert - inline bool isPlaying() { - return state.unk==5; - } + inline bool isPlaying() { return state.unk == 5; } - inline bool isPaused() { - return field_0x0.flags.paused; - } + inline bool isPaused() { return field_0x0.flags.paused; } /* 0x0 */ union { u8 value; - struct{ - u8 flag1:1; - u8 paused:1; - u8 flag3:1; - u8 flag4:1; - u8 flag5:1; - u8 flag6:1; - u8 flag7:1; - u8 flag8:1; - }flags; - }field_0x0; + struct { + u8 flag1 : 1; + u8 paused : 1; + u8 flag3 : 1; + u8 flag4 : 1; + u8 flag5 : 1; + u8 flag6 : 1; + u8 flag7 : 1; + u8 flag8 : 1; + } flags; + } field_0x0; /* 0x1 */ union { u8 value; - struct{ - u8 flag1:1; - u8 flag2:1; - u8 flag3:1; - u8 flag4:1; - u8 flag5:1; - u8 flag6:1; - u8 flag7:1; - u8 flag8:1; - }flags; - }field_0x1; + struct { + u8 flag1 : 1; + u8 flag2 : 1; + u8 flag3 : 1; + u8 flag4 : 1; + u8 flag5 : 1; + u8 flag6 : 1; + u8 flag7 : 1; + u8 flag8 : 1; + } flags; + } field_0x1; /* 0x2 */ struct { u8 unk; struct { - u8 flag1:1; - u8 flag2:1; - u8 flag3:1; - u8 flag4:1; - u8 flag5:1; - u8 flag6:1; - u8 flag7:1; - u8 flag8:1; - }flags; + u8 flag1 : 1; + u8 flag2 : 1; + u8 flag3 : 1; + u8 flag4 : 1; + u8 flag5 : 1; + u8 flag6 : 1; + u8 flag7 : 1; + u8 flag8 : 1; + } flags; } state; /* 0x4 */ u32 user_data; }; // Size: 0x6 @@ -111,21 +111,19 @@ struct JAISoundFader { mTransition.zero(); } void fadeOut(u32 fadeCount) { - if (fadeCount!=0) { - mTransition.set(0.0f,mIntensity,fadeCount); - }else{ + if (fadeCount != 0) { + mTransition.set(0.0f, mIntensity, fadeCount); + } else { forceOut(); } } bool isOut() { - if(mTransition.mCount != 0 || mIntensity < 0.01f) { + if (mTransition.mCount != 0 || mIntensity < 0.01f) { return true; } return false; } - inline void calc() { - mIntensity = mTransition.apply(mIntensity); - } + inline void calc() { mIntensity = mTransition.apply(mIntensity); } /* 0x00 */ f32 mIntensity; /* 0x04 */ JAISoundParamsTransition::TTransition mTransition; @@ -181,16 +179,14 @@ public: u32 getUserData() const { return status_.user_data; } bool isHandleAttached() const { return handle_ != NULL; } - void removeLifeTime_() { - status_.field_0x1.flags.flag1 = false; - } + void removeLifeTime_() { status_.field_0x1.flags.flag1 = false; } void stop_JAISound_() { status_.state.flags.flag5 = 0; status_.state.flags.flag1 = 1; } bool isStopping() { bool isStopping = false; - if(status_.state.flags.flag1) { + if (status_.state.flags.flag1) { isStopping = status_.state.flags.flag5 ? fader.isOut() : true; } return isStopping; diff --git a/include/JSystem/JAudio2/JASTaskThread.h b/include/JSystem/JAudio2/JASTaskThread.h index d98f9bb450..e24d03bb6d 100644 --- a/include/JSystem/JAudio2/JASTaskThread.h +++ b/include/JSystem/JAudio2/JASTaskThread.h @@ -10,7 +10,7 @@ public: /* 8028F9EC */ void allocCallStack(void (*)(void*), void*); /* 8028F850 */ void allocCallStack(void (*)(void*), void const*, u32); /* 8028FC54 */ void sendCmdMsg(void (*)(void*), void*); - /* 8028FB5C */ void sendCmdMsg(void (*)(void*), void const*, u32); + /* 8028FB5C */ int sendCmdMsg(void (*)(void*), void const*, u32); /* 8028FE88 */ void pause(bool); /* 8028F724 */ virtual ~JASTaskThread(); diff --git a/include/JSystem/JAudio2/JASWaveArcLoader.h b/include/JSystem/JAudio2/JASWaveArcLoader.h index 355e5ad801..2d7e55e0aa 100644 --- a/include/JSystem/JAudio2/JASWaveArcLoader.h +++ b/include/JSystem/JAudio2/JASWaveArcLoader.h @@ -1,6 +1,110 @@ #ifndef JASWAVEARCLOADER_H #define JASWAVEARCLOADER_H +#include "dol2asm.h" #include "dolphin/types.h" +#include "global.h" + +#include "MSL_C/MSL_Common/Src/string.h" +#include "dolphin/os/OSMutex.h" + +#include "JSystem/JAudio2/JASDvdThread.h" +#include "JSystem/JAudio2/JASHeapCtrl.h" +#include "JSystem/JKernel/JKRDvdAramRipper.h" +#include "JSystem/JKernel/JKRSolidHeap.h" + +struct JASDisposer { + JASDisposer() {} + /* 8029A7B8 */ virtual ~JASDisposer() {} + /* 80290BCC */ virtual void onDispose(); +}; + +struct JASHeap : JSUTree { + /* 80290140 */ JASHeap(JASDisposer*); + /* 802901AC */ void initRootHeap(void*, u32); + /* 8029021C */ bool alloc(JASHeap*, u32); + /* 802903F4 */ bool allocTail(JASHeap*, u32); + /* 802904E4 */ void free(); + /* 80290608 */ void insertChild(JASHeap*, JASHeap*, void*, u32, bool); + /* 802906F0 */ void getTailHeap(); + /* 8029077C */ void getTailOffset(); + /* 802907E0 */ void getCurOffset(); + /* 80290B54 */ ~JASHeap() {} + void* getBase() { return mBase; } + + /* 0x1C */ OSMutex mMutex; + /* 0x38 */ JASDisposer* mDisposer; + /* 0x3C */ void* mBase; + /* 0x40 */ u32 _3c; + /* 0x44 */ u32 _40; +}; + +struct JASKernel { + /* 802909B8 */ void setupRootHeap(JKRSolidHeap*, u32); + /* 80290AC0 */ static JKRHeap* getSystemHeap(); + /* 80290AC8 */ u32 getCommandHeap(); + /* 80290AD0 */ void setupAramHeap(u32, u32); + /* 80290B08 */ static JASHeap* getAramHeap(); + + static u8 audioAramHeap[68]; + static u8 sAramBase[4]; + static JKRHeap* sSystemHeap; + static u8 sCommandHeap[4]; +}; + +#define DIR_MAX 64 +struct JASWaveArcLoader { + /* 8029A0A0 */ static JASHeap* getRootHeap(); + /* 8029A0D0 */ static void setCurrentDir(char const*); + /* 8029A130 */ static char* getCurrentDir(); + + static char sCurrentDir[DIR_MAX]; + static JASHeap* sAramHeap; +}; + +struct JASWaveArc : JASDisposer { + /* 8029A13C */ JASWaveArc(); + /* 8029A258 */ bool loadSetup(u32); + /* 8029A2EC */ bool eraseSetup(); + /* 8029A378 */ static void loadToAramCallback(void*); + /* 8029A404 */ bool sendLoadCmd(); + /* 8029A4C0 */ bool load(JASHeap*); + /* 8029A580 */ bool loadTail(JASHeap*); + /* 8029A640 */ void erase(); + /* 8029A6AC */ void setEntryNum(s32); + /* 8029A70C */ void setFileName(char const*); + + /* 8029A1B4 */ virtual ~JASWaveArc(); + /* 8029A664 */ virtual void onDispose(); + /* 80298FA0 */ virtual void onLoadDone(); + /* 80298FA4 */ virtual void onEraseDone(); + + struct loadToAramCallbackParams { + // not official struct name + /* 0x0 */ JASWaveArc* mWavArc; + /* 0x4 */ long mEntryNum; + /* 0x8 */ u32 mBase; + /* 0xC */ u32 _c; + }; + + /* 0x04 */ JASHeap mHeap; + /* 0x48 */ u32 _48; + /* 0x4C */ volatile s32 _4c; + /* 0x50 */ int mEntryNum; + /* 0x54 */ u32 mFileLength; + /* 0x58 */ u16 _58; + /* 0x5A */ u16 _5a; + /* 0x5C */ OSMutex mMutex; +}; + +struct JASMutexLock { + JASMutexLock(OSMutex* mutex) { + mMutex = mutex; + OSLockMutex(mMutex); + } + ~JASMutexLock() { OSUnlockMutex(mMutex); } + + /* 0x0 */ OSMutex* mMutex; +}; #endif /* JASWAVEARCLOADER_H */ diff --git a/include/JSystem/JAudio2/JAUBankTable.h b/include/JSystem/JAudio2/JAUBankTable.h index 96f0360a8c..c441f8ff30 100644 --- a/include/JSystem/JAudio2/JAUBankTable.h +++ b/include/JSystem/JAudio2/JAUBankTable.h @@ -1,6 +1,30 @@ #ifndef JAUBANKTABLE_H #define JAUBANKTABLE_H +#include "JSystem/JSupport/JSUList.h" #include "dolphin/types.h" +template +struct JASPtrTable { + T* get(u32 value) const { + if (value >= mLength) { + return NULL; + } + return mTable[value]; + } + T** mTable; + u32 mLength; +}; + +struct JASBank; +struct JAUBankTable { + /* 802A4AA0 */ /*virtual*/ JASBank* getBank(u32) const; + /* 0x0 */ void* vtable; + /* 0x4 */ JASPtrTable mBankPtrTable; +}; + +struct JAUBankTableDictionary : JSUList { + /* 802A4A80 */ void appendBankTable(JSULink*); +}; + #endif /* JAUBANKTABLE_H */ diff --git a/include/JSystem/JAudio2/JAUStreamFileTable.h b/include/JSystem/JAudio2/JAUStreamFileTable.h index b6f8d6b567..46bdf5ad54 100644 --- a/include/JSystem/JAudio2/JAUStreamFileTable.h +++ b/include/JSystem/JAudio2/JAUStreamFileTable.h @@ -1,6 +1,33 @@ #ifndef JAUSTREAMFILETABLE_H #define JAUSTREAMFILETABLE_H +#include "JSystem/JAudio2/JAISound.h" #include "dolphin/types.h" +struct BinaryStreamFileTable { + /* 0x0 */ char mIdentifier[4]; + /* 0x4 */ int mNumFiles; + /* 0x8 */ int mFilePathOffsets[]; +}; + +struct JAUStreamFileTable { + /* 802A7420 */ JAUStreamFileTable(); + /* 802A742C */ void init(void const*); + /* 802A7478 */ int getNumFiles() const; + /* 802A7484 */ const char* getFilePath(int) const; + + /* 0x0 */ const BinaryStreamFileTable* mData; +}; + +struct JAIStreamDataMgr { + /* 802A3AD8 */ ~JAIStreamDataMgr(); +}; + +struct JAUStreamDataMgr_StreamFileTable : JAIStreamDataMgr { + /* 802A74AC */ virtual int getStreamFileEntry(JAISoundID); + /* 802A74E8 */ virtual ~JAUStreamDataMgr_StreamFileTable() {} + + /* 0x4 */ JAUStreamFileTable mStreamFileTable; +}; + #endif /* JAUSTREAMFILETABLE_H */ diff --git a/include/dolphin/dvd/dvd.h b/include/dolphin/dvd/dvd.h index bdf0da3b33..2613077ef4 100644 --- a/include/dolphin/dvd/dvd.h +++ b/include/dolphin/dvd/dvd.h @@ -91,7 +91,7 @@ DVDDiskID* DVDGetCurrentDiskID(void); BOOL DVDFastOpen(long, DVDFileInfo* fileinfo); BOOL DVDGetCommandBlockStatus(DVDCommandBlock*); BOOL DVDReadAsyncPrio(DVDFileInfo* fileinfo, void*, long, long, DVDCallback, long); -BOOL DVDConvertPathToEntrynum(const char*); +int DVDConvertPathToEntrynum(const char*); DVDState DVDGetDriveStatus(void); BOOL DVDCheckDisk(void); diff --git a/libs/JSystem/JAudio2/JASTaskThread.cpp b/libs/JSystem/JAudio2/JASTaskThread.cpp index 7c8438e661..87fc196a3b 100644 --- a/libs/JSystem/JAudio2/JASTaskThread.cpp +++ b/libs/JSystem/JAudio2/JASTaskThread.cpp @@ -107,7 +107,7 @@ asm void JASTaskThread::allocCallStack(void (*param_0)(void*), void* param_1) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void JASTaskThread::sendCmdMsg(void (*param_0)(void*), void const* param_1, u32 param_2) { +asm int JASTaskThread::sendCmdMsg(void (*param_0)(void*), void const* param_1, u32 param_2) { nofralloc #include "asm/JSystem/JAudio2/JASTaskThread/sendCmdMsg__13JASTaskThreadFPFPv_vPCvUl.s" } diff --git a/libs/JSystem/JAudio2/JASWaveArcLoader.cpp b/libs/JSystem/JAudio2/JASWaveArcLoader.cpp index 135315119e..af19d207c4 100644 --- a/libs/JSystem/JAudio2/JASWaveArcLoader.cpp +++ b/libs/JSystem/JAudio2/JASWaveArcLoader.cpp @@ -4,74 +4,6 @@ // #include "JSystem/JAudio2/JASWaveArcLoader.h" -#include "dol2asm.h" -#include "dolphin/types.h" - -// -// Types: -// - -struct JSUPtrList { - /* 802DBEAC */ ~JSUPtrList(); -}; - -struct JSUPtrLink { - /* 802DBE14 */ ~JSUPtrLink(); -}; - -struct JKRHeap {}; - -struct JKRExpandSwitch {}; - -struct JKRDvdAramRipper { - /* 802DA874 */ void loadToAram(s32, u32, JKRExpandSwitch, u32, u32, u32*); -}; - -struct JASWaveArcLoader { - /* 8029A0A0 */ void getRootHeap(); - /* 8029A0D0 */ void setCurrentDir(char const*); - /* 8029A130 */ void getCurrentDir(); - - static u8 sCurrentDir[64]; - static u8 sAramHeap[4 + 4 /* padding */]; -}; - -struct JASDisposer { - /* 80290BCC */ void onDispose(); - /* 8029A7B8 */ ~JASDisposer(); -}; - -struct JASHeap { - /* 80290140 */ JASHeap(JASDisposer*); - /* 8029021C */ void alloc(JASHeap*, u32); - /* 802903F4 */ void allocTail(JASHeap*, u32); - /* 802904E4 */ void free(); -}; - -struct JASWaveArc { - /* 80298FA0 */ void onLoadDone(); - /* 80298FA4 */ void onEraseDone(); - /* 8029A13C */ JASWaveArc(); - /* 8029A1B4 */ ~JASWaveArc(); - /* 8029A258 */ void loadSetup(u32); - /* 8029A2EC */ void eraseSetup(); - /* 8029A378 */ void loadToAramCallback(void*); - /* 8029A404 */ void sendLoadCmd(); - /* 8029A4C0 */ void load(JASHeap*); - /* 8029A580 */ void loadTail(JASHeap*); - /* 8029A640 */ void erase(); - /* 8029A664 */ void onDispose(); - /* 8029A6AC */ void setEntryNum(s32); - /* 8029A70C */ void setFileName(char const*); -}; - -struct JASTaskThread { - /* 8028FB5C */ void sendCmdMsg(void (*)(void*), void const*, u32); -}; - -struct JASKernel { - /* 80290B08 */ void getAramHeap(); -}; // // Forward References: @@ -117,17 +49,8 @@ extern "C" void __dla__FPv(); extern "C" void loadToAram__16JKRDvdAramRipperFlUl15JKRExpandSwitchUlUlPUl(); extern "C" void __dt__10JSUPtrLinkFv(); extern "C" void __dt__10JSUPtrListFv(); -extern "C" void OSInitMutex(); -extern "C" void OSLockMutex(); -extern "C" void OSUnlockMutex(); -extern "C" void DVDConvertPathToEntrynum(); -extern "C" void DVDFastOpen(); -extern "C" void DVDClose(); extern "C" void _savegpr_27(); extern "C" void _restgpr_27(); -extern "C" void strcat(); -extern "C" void strcpy(); -extern "C" void strlen(); // // Declarations: @@ -135,48 +58,39 @@ extern "C" void strlen(); /* ############################################################################################## */ /* 80451290-80451298 000790 0004+04 1/1 0/0 0/0 .sbss sAramHeap__16JASWaveArcLoader */ -u8 JASWaveArcLoader::sAramHeap[4 + 4 /* padding */]; +JASHeap* JASWaveArcLoader::sAramHeap; /* 8029A0A0-8029A0D0 2949E0 0030+00 2/2 0/0 0/0 .text getRootHeap__16JASWaveArcLoaderFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArcLoader::getRootHeap() { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/getRootHeap__16JASWaveArcLoaderFv.s" +JASHeap* JASWaveArcLoader::getRootHeap() { + if (JASWaveArcLoader::sAramHeap) { + return JASWaveArcLoader::sAramHeap; + } + return JASKernel::getAramHeap(); } -#pragma pop /* ############################################################################################## */ /* 803C77E0-803C7820 024900 0040+00 2/2 0/0 0/0 .data sCurrentDir__16JASWaveArcLoader */ -SECTION_DATA u8 JASWaveArcLoader::sCurrentDir[64] = { - 0x2F, 0x41, 0x75, 0x64, 0x69, 0x6F, 0x52, 0x65, 0x73, 0x2F, 0x57, 0x61, 0x76, 0x65, 0x73, 0x2F, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; +char JASWaveArcLoader::sCurrentDir[DIR_MAX] = "/AudioRes/Waves/"; /* 8029A0D0-8029A130 294A10 0060+00 0/0 1/1 0/0 .text setCurrentDir__16JASWaveArcLoaderFPCc */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArcLoader::setCurrentDir(char const* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/setCurrentDir__16JASWaveArcLoaderFPCc.s" +void JASWaveArcLoader::setCurrentDir(char const* dir) { + ASSERT(std::strlen(dir) < DIR_MAX - 1); + strcpy(sCurrentDir, dir); + u32 len = strlen(sCurrentDir); + if (sCurrentDir[len - 1] != '/') { + ASSERT(len + 1 < DIR_MAX); + sCurrentDir[len] = '/'; + sCurrentDir[len + 1] = '\0'; + } } -#pragma pop /* 8029A130-8029A13C 294A70 000C+00 1/1 0/0 0/0 .text getCurrentDir__16JASWaveArcLoaderFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArcLoader::getCurrentDir() { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/getCurrentDir__16JASWaveArcLoaderFv.s" + +char* JASWaveArcLoader::getCurrentDir() { + return sCurrentDir; } -#pragma pop /* ############################################################################################## */ /* 803C7820-803C7838 024940 0018+00 2/2 0/0 0/0 .data __vt__10JASWaveArc */ @@ -198,131 +112,185 @@ SECTION_DATA extern void* __vt__11JASDisposer[4] = { }; /* 8029A13C-8029A1B4 294A7C 0078+00 0/0 2/2 0/0 .text __ct__10JASWaveArcFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JASWaveArc::JASWaveArc() { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/__ct__10JASWaveArcFv.s" + +JASWaveArc::JASWaveArc() : mHeap(this) { + _48 = 0; + _4c = 0; + mEntryNum = -1; + mFileLength = 0; + _58 = 0; + _5a = 0; + OSInitMutex(&mMutex); } -#pragma pop /* 8029A1B4-8029A258 294AF4 00A4+00 1/0 2/2 0/0 .text __dt__10JASWaveArcFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JASWaveArc::~JASWaveArc() { +#ifdef NONMATCHING +JASWaveArc::~JASWaveArc() {} +#else +asm void __dt__10JASWaveArcFv() { nofralloc #include "asm/JSystem/JAudio2/JASWaveArcLoader/__dt__10JASWaveArcFv.s" } -#pragma pop +#endif /* 8029A258-8029A2EC 294B98 0094+00 1/1 0/0 0/0 .text loadSetup__10JASWaveArcFUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArc::loadSetup(u32 param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/loadSetup__10JASWaveArcFUl.s" +bool JASWaveArc::loadSetup(u32 param_0) { + JASMutexLock mutexLock(&mMutex); + if (_58 != param_0) { + return false; + } + if (_4c != 1) { + return false; + } + _48 = 1; + _4c = 2; + return true; } -#pragma pop /* 8029A2EC-8029A378 294C2C 008C+00 1/1 0/0 0/0 .text eraseSetup__10JASWaveArcFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArc::eraseSetup() { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/eraseSetup__10JASWaveArcFv.s" +bool JASWaveArc::eraseSetup() { + JASMutexLock mutexLock(&mMutex); + if (_4c == 0) { + return false; + } + if (_4c == 1) { + _4c = 0; + return false; + } + _48 = 0; + _4c = 0; + return true; } -#pragma pop /* 8029A378-8029A404 294CB8 008C+00 1/1 0/0 0/0 .text loadToAramCallback__10JASWaveArcFPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArc::loadToAramCallback(void* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/loadToAramCallback__10JASWaveArcFPv.s" +void JASWaveArc::loadToAramCallback(void* this_) { + loadToAramCallbackParams* tmp = (loadToAramCallbackParams*)this_; + JASWaveArc* wavArc = tmp->mWavArc; + JKRAramBlock* block = JKRDvdAramRipper::loadToAram(tmp->mEntryNum, tmp->mBase, + EXPAND_SWITCH_UNKNOWN0, 0, 0, NULL); + if (block == NULL) { + // "loadToAram Failed" + return; + } + wavArc->_5a--; + if (wavArc->loadSetup(tmp->_c)) { + wavArc->onLoadDone(); + } } -#pragma pop /* 8029A404-8029A4C0 294D44 00BC+00 2/2 0/0 0/0 .text sendLoadCmd__10JASWaveArcFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArc::sendLoadCmd() { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/sendLoadCmd__10JASWaveArcFv.s" +bool JASWaveArc::sendLoadCmd() { + JASMutexLock mutexLock(&mMutex); + _48 = 0; + _4c = 1; + void* base = mHeap.getBase(); + loadToAramCallbackParams commandInfo; + commandInfo.mWavArc = this; + commandInfo.mEntryNum = mEntryNum; + commandInfo.mBase = (u32)mHeap.mBase; + commandInfo._c = ++_58; + + _5a++; + + JASTaskThread* thread = JASDvd::getThreadPointer(); + int status = thread->sendCmdMsg(loadToAramCallback, &commandInfo, 0x10); + if (status == 0) { + // "sendCmdMsg loadToAramCallback Failed" + mHeap.free(); + return false; + } + return true; } -#pragma pop /* 8029A4C0-8029A580 294E00 00C0+00 0/0 2/2 0/0 .text load__10JASWaveArcFP7JASHeap */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArc::load(JASHeap* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/load__10JASWaveArcFP7JASHeap.s" +bool JASWaveArc::load(JASHeap* heap) { + if (mEntryNum < 0) { + return false; + } + JASMutexLock mutexLock(&mMutex); + if (_4c != 0) { + return false; + } + if (heap == NULL) { + heap = JASWaveArcLoader::getRootHeap(); + } + bool result = mHeap.alloc(heap, mFileLength); + if (result == false) { + return false; + } + return sendLoadCmd(); } -#pragma pop /* 8029A580-8029A640 294EC0 00C0+00 0/0 1/1 0/0 .text loadTail__10JASWaveArcFP7JASHeap */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArc::loadTail(JASHeap* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/loadTail__10JASWaveArcFP7JASHeap.s" +bool JASWaveArc::loadTail(JASHeap* heap) { + if (mEntryNum < 0) { + return false; + } + JASMutexLock mutexLock(&mMutex); + if (_4c != 0) { + return false; + } + if (heap == NULL) { + heap = JASWaveArcLoader::getRootHeap(); + } + bool result = mHeap.allocTail(heap, mFileLength); + if (result == false) { + return false; + } + return sendLoadCmd(); } -#pragma pop /* 8029A640-8029A664 294F80 0024+00 0/0 2/2 0/0 .text erase__10JASWaveArcFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArc::erase() { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/erase__10JASWaveArcFv.s" +void JASWaveArc::erase() { + mHeap.free(); } -#pragma pop /* 8029A664-8029A6AC 294FA4 0048+00 1/0 2/0 0/0 .text onDispose__10JASWaveArcFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArc::onDispose() { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/onDispose__10JASWaveArcFv.s" +void JASWaveArc::onDispose() { + if (eraseSetup()) { + onEraseDone(); + } } -#pragma pop /* 8029A6AC-8029A70C 294FEC 0060+00 1/1 0/0 0/0 .text setEntryNum__10JASWaveArcFl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArc::setEntryNum(s32 param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/setEntryNum__10JASWaveArcFl.s" +void JASWaveArc::setEntryNum(s32 entryNum) { + DVDFileInfo fileInfo; + if (entryNum < 0) { + return; + } + BOOL openStatus = DVDFastOpen(entryNum, &fileInfo); + if (openStatus == FALSE) { + return; + } + mFileLength = fileInfo.length; + DVDClose(&fileInfo); + mEntryNum = entryNum; } -#pragma pop /* 8029A70C-8029A7B8 29504C 00AC+00 0/0 2/2 0/0 .text setFileName__10JASWaveArcFPCc */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASWaveArc::setFileName(char const* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASWaveArcLoader/setFileName__10JASWaveArcFPCc.s" +void JASWaveArc::setFileName(char const* fileName) { + char* currentDir = JASWaveArcLoader::getCurrentDir(); + size_t length = strlen(currentDir); + length = length + strlen(fileName); + JKRHeap* systemHeap = JASKernel::getSystemHeap(); + char* fileString = new (systemHeap, -4) char[length + 1]; + strcpy(fileString, currentDir); + strcat(fileString, fileName); + fileString[length] = '\0'; + int entryNum = DVDConvertPathToEntrynum(fileString); + delete[] fileString; + if (entryNum < 0) { + return; + } + setEntryNum(entryNum); } -#pragma pop /* 8029A7B8-8029A800 2950F8 0048+00 1/0 0/0 0/0 .text __dt__11JASDisposerFv */ #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm JASDisposer::~JASDisposer() { +asm void __dt__11JASDisposerFv() { nofralloc #include "asm/JSystem/JAudio2/JASWaveArcLoader/__dt__11JASDisposerFv.s" } diff --git a/libs/JSystem/JAudio2/JAUBankTable.cpp b/libs/JSystem/JAudio2/JAUBankTable.cpp index ae28058b26..23215ad725 100644 --- a/libs/JSystem/JAudio2/JAUBankTable.cpp +++ b/libs/JSystem/JAudio2/JAUBankTable.cpp @@ -7,63 +7,13 @@ #include "dol2asm.h" #include "dolphin/types.h" -// -// Types: -// - -struct JSUPtrLink {}; - -struct JSUPtrList { - /* 802DBF4C */ void append(JSUPtrLink*); -}; - -template -struct JSULink {}; -/* JSULink */ -struct JSULink__template0 {}; - -struct JAUBankTable { - /* 802A4AA0 */ void getBank(u32) const; -}; - -struct JAUBankTableDictionary { - /* 802A4A80 */ void appendBankTable(JSULink*); -}; - -// -// Forward References: -// - -extern "C" void func_802A4A80(); -extern "C" void getBank__12JAUBankTableCFUl(); - -// -// External References: -// - -extern "C" void append__10JSUPtrListFP10JSUPtrLink(); - -// -// Declarations: -// - /* 802A4A80-802A4AA0 29F3C0 0020+00 0/0 1/1 0/0 .text * appendBankTable__22JAUBankTableDictionaryFP23JSULink<12JAUBankTable> */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JAUBankTableDictionary::appendBankTable(JSULink* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JAUBankTable/func_802A4A80.s" +void JAUBankTableDictionary::appendBankTable(JSULink* bankTableList) { + append(bankTableList); } -#pragma pop /* 802A4AA0-802A4AC4 29F3E0 0024+00 0/0 2/0 0/0 .text getBank__12JAUBankTableCFUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JAUBankTable::getBank(u32 param_0) const { - nofralloc -#include "asm/JSystem/JAudio2/JAUBankTable/getBank__12JAUBankTableCFUl.s" +JASBank* JAUBankTable::getBank(u32 bank) const { + return mBankPtrTable.get(bank); } -#pragma pop diff --git a/libs/JSystem/JAudio2/JAUStreamFileTable.cpp b/libs/JSystem/JAudio2/JAUStreamFileTable.cpp index 7aaca2f249..6cd6f12167 100644 --- a/libs/JSystem/JAudio2/JAUStreamFileTable.cpp +++ b/libs/JSystem/JAudio2/JAUStreamFileTable.cpp @@ -1,124 +1,49 @@ -// -// Generated By: dol2asm -// Translation Unit: JAUStreamFileTable -// - #include "JSystem/JAudio2/JAUStreamFileTable.h" #include "dol2asm.h" +#include "dolphin/dvd/dvd.h" #include "dolphin/types.h" - -// -// Types: -// - -struct JAUStreamFileTable { - /* 802A7420 */ JAUStreamFileTable(); - /* 802A742C */ void init(void const*); - /* 802A7478 */ void getNumFiles() const; - /* 802A7484 */ void getFilePath(int) const; -}; - -struct JAISoundID {}; - -struct JAUStreamDataMgr_StreamFileTable { - /* 802A74AC */ void getStreamFileEntry(JAISoundID); - /* 802A74E8 */ ~JAUStreamDataMgr_StreamFileTable(); -}; - -struct JAIStreamDataMgr { - /* 802A3AD8 */ ~JAIStreamDataMgr(); -}; - -// -// Forward References: -// - -extern "C" void __ct__18JAUStreamFileTableFv(); -extern "C" void init__18JAUStreamFileTableFPCv(); -extern "C" void getNumFiles__18JAUStreamFileTableCFv(); -extern "C" void getFilePath__18JAUStreamFileTableCFi(); -extern "C" void getStreamFileEntry__32JAUStreamDataMgr_StreamFileTableF10JAISoundID(); -extern "C" void __dt__32JAUStreamDataMgr_StreamFileTableFv(); - -// -// External References: -// - -extern "C" void __dt__16JAIStreamDataMgrFv(); -extern "C" void __dl__FPv(); -extern "C" void DVDConvertPathToEntrynum(); - -// -// Declarations: -// +#include "global.h" /* 802A7420-802A742C 2A1D60 000C+00 0/0 1/1 0/0 .text __ct__18JAUStreamFileTableFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JAUStreamFileTable::JAUStreamFileTable() { - nofralloc -#include "asm/JSystem/JAudio2/JAUStreamFileTable/__ct__18JAUStreamFileTableFv.s" +JAUStreamFileTable::JAUStreamFileTable() { + mData = NULL; } -#pragma pop /* 802A742C-802A7478 2A1D6C 004C+00 0/0 1/1 0/0 .text init__18JAUStreamFileTableFPCv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JAUStreamFileTable::init(void const* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JAUStreamFileTable/init__18JAUStreamFileTableFPCv.s" +void JAUStreamFileTable::init(void const* data) { + if (data == NULL) { + mData = NULL; + return; + } + const BinaryStreamFileTable* binaryTable = (const BinaryStreamFileTable*)data; + const char* ident = binaryTable->mIdentifier; + if (ident[0] == 'b' && ident[1] == 's' && ident[2] == 'f' && ident[3] == 't') { + mData = binaryTable; + } } -#pragma pop /* 802A7478-802A7484 2A1DB8 000C+00 0/0 1/1 0/0 .text getNumFiles__18JAUStreamFileTableCFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JAUStreamFileTable::getNumFiles() const { - nofralloc -#include "asm/JSystem/JAudio2/JAUStreamFileTable/getNumFiles__18JAUStreamFileTableCFv.s" +int JAUStreamFileTable::getNumFiles() const { + return mData->mNumFiles; } -#pragma pop /* 802A7484-802A74AC 2A1DC4 0028+00 1/1 1/1 0/0 .text getFilePath__18JAUStreamFileTableCFi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JAUStreamFileTable::getFilePath(int param_0) const { - nofralloc -#include "asm/JSystem/JAudio2/JAUStreamFileTable/getFilePath__18JAUStreamFileTableCFi.s" +const char* JAUStreamFileTable::getFilePath(int index) const { + if (mData == NULL) { + return 0; + } + ASSERT(index >= 0); + ASSERT(index < getNumFiles()); + char* data = (char*)mData; + return (char*)(data + *(int*)(data + 8 + (index * sizeof(s32)))); } -#pragma pop /* 802A74AC-802A74E8 2A1DEC 003C+00 1/0 0/0 0/0 .text * getStreamFileEntry__32JAUStreamDataMgr_StreamFileTableF10JAISoundID */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JAUStreamDataMgr_StreamFileTable::getStreamFileEntry(JAISoundID param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JAUStreamFileTable/getStreamFileEntry__32JAUStreamDataMgr_StreamFileTableF10JAISoundID.s" +int JAUStreamDataMgr_StreamFileTable::getStreamFileEntry(JAISoundID soundId) { + const char* filePath = mStreamFileTable.getFilePath(soundId.mId.mAdvancedId.mShortId); + if (filePath == NULL) { + return -1; + } + return DVDConvertPathToEntrynum(filePath); } -#pragma pop - -/* ############################################################################################## */ -/* 803C9B50-803C9B60 026C70 0010+00 1/1 1/1 0/0 .data __vt__32JAUStreamDataMgr_StreamFileTable */ -SECTION_DATA extern void* __vt__32JAUStreamDataMgr_StreamFileTable[4] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)getStreamFileEntry__32JAUStreamDataMgr_StreamFileTableF10JAISoundID, - (void*)__dt__32JAUStreamDataMgr_StreamFileTableFv, -}; - -/* 802A74E8-802A7548 2A1E28 0060+00 1/0 0/0 0/0 .text __dt__32JAUStreamDataMgr_StreamFileTableFv - */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JAUStreamDataMgr_StreamFileTable::~JAUStreamDataMgr_StreamFileTable() { - nofralloc -#include "asm/JSystem/JAudio2/JAUStreamFileTable/__dt__32JAUStreamDataMgr_StreamFileTableFv.s" -} -#pragma pop diff --git a/src/f_op/f_op_scene.cpp b/src/f_op/f_op_scene.cpp index 8815ca8ff9..6651b5a826 100644 --- a/src/f_op/f_op_scene.cpp +++ b/src/f_op/f_op_scene.cpp @@ -4,10 +4,10 @@ // #include "f_op/f_op_scene.h" -#include "f_op/f_op_scene_tag.h" -#include "f_pc/f_pc_manager.h" #include "dol2asm.h" #include "dolphin/types.h" +#include "f_op/f_op_scene_tag.h" +#include "f_pc/f_pc_manager.h" /* 8001EB34-8001EB5C 019474 0028+00 1/0 0/0 0/0 .text fopScn_Draw__FP11scene_class */ static void fopScn_Draw(scene_class* pScene) { @@ -20,43 +20,43 @@ static void fopScn_Execute(scene_class* pScene) { } /* 8001EB84-8001EBAC 0194C4 0028+00 1/0 0/0 0/0 .text fopScn_IsDelete__FPv */ -static s32 fopScn_IsDelete(scene_class* pScene) { - return fpcMtd_IsDelete(pScene->mpMtd, pScene); +static s32 fopScn_IsDelete(void* pScene) { + return fpcMtd_IsDelete(static_cast(pScene)->mpMtd, pScene); } /* 8001EBAC-8001EC00 0194EC 0054+00 1/0 0/0 0/0 .text fopScn_Delete__FPv */ -static s32 fopScn_Delete(void* param_1) { - scene_class* pScene = (scene_class*)param_1; - s32 ret = fpcMtd_Delete(pScene->mpMtd, pScene); +static s32 fopScn_Delete(void* pScene) { + scene_class* scene = static_cast(pScene); + s32 ret = fpcMtd_Delete(scene->mpMtd, scene); if (ret == 1) { - fopScnTg_QueueTo(&pScene->mScnTg); + fopScnTg_QueueTo(&scene->mScnTg); } return ret; } /* 8001EC00-8001EC74 019540 0074+00 1/0 0/0 0/0 .text fopScn_Create__FPv */ -static s32 fopScn_Create(scene_class * pScene) { +static s32 fopScn_Create(void* pScene) { + scene_class* scene = static_cast(pScene); if (fpcM_IsFirstCreating(pScene)) { - scene_process_profile_definition* profile = (scene_process_profile_definition*) fpcM_GetProfile(pScene); - pScene->mpMtd = profile->mpMtd; - fopScnTg_Init(&pScene->mScnTg, pScene); - fopScnTg_ToQueue(&pScene->mScnTg); + scene_process_profile_definition* profile = + (scene_process_profile_definition*)fpcM_GetProfile(pScene); + scene->mpMtd = profile->mpMtd; + fopScnTg_Init(&scene->mScnTg, pScene); + fopScnTg_ToQueue(&scene->mScnTg); - u32 * append = (u32*)fpcM_GetAppend(pScene); + u32* append = (u32*)fpcM_GetAppend(pScene); if (append != NULL) { - pScene->mBase.mBase.mParameters = *append; + scene->mBase.mBase.mParameters = *append; } } - return fpcMtd_Create(pScene->mpMtd, pScene); + return fpcMtd_Create(scene->mpMtd, pScene); } /* ############################################################################################## */ /* 803A38B0-803A38C8 -00001 0014+04 0/0 9/0 0/0 .data g_fopScn_Method */ nodedraw_method_class g_fopScn_Method = { - (process_method_func)fopScn_Create, - (process_method_func)fopScn_Delete, - (process_method_func)fopScn_Execute, - (process_method_func)fopScn_IsDelete, + (process_method_func)fopScn_Create, (process_method_func)fopScn_Delete, + (process_method_func)fopScn_Execute, (process_method_func)fopScn_IsDelete, (process_method_func)fopScn_Draw, };