diff --git a/include/JSystem/JAudio/JASDvdThread.h b/include/JSystem/JAudio/JASDvdThread.h index c48738d33..52accbde9 100644 --- a/include/JSystem/JAudio/JASDvdThread.h +++ b/include/JSystem/JAudio/JASDvdThread.h @@ -19,7 +19,7 @@ public: OSInitThreadQueue(&field_0x68); } ~JASTaskThread(); - bool sendCmdMsg(s32 (*)(void*), void*, u32); + BOOL sendCmdMsg(s32 (*)(void*), void*, u32); void* run(); void pause(bool); @@ -31,7 +31,7 @@ namespace JASystem { namespace Dvd { bool createThread(int, int, u32); void resumeThread(); - void sendCmdMsg(s32 (*)(void*), void*, u32); + BOOL sendCmdMsg(s32 (*)(void*), void*, u32); int checkPassDvdT(u32, u32*, void (*)(u32)); u32 checkFile(char*); void unpauseDvdT(); diff --git a/include/JSystem/JAudio/JASHeapCtrl.h b/include/JSystem/JAudio/JASHeapCtrl.h index 27f9fc805..f800f16be 100644 --- a/include/JSystem/JAudio/JASHeapCtrl.h +++ b/include/JSystem/JAudio/JASHeapCtrl.h @@ -19,6 +19,7 @@ namespace JASystem { }; THeap(TDisposer*); + ~THeap() {} void initRootHeap(void*, u32, Type); bool alloc(THeap*, u32); bool free(); @@ -42,9 +43,9 @@ namespace JASystem { public: TSolidHeap(); ~TSolidHeap() {} - int alloc(long param_1); + void* alloc(s32 param_1); void freeAll(); - void init(u8* param_1, long param_2); + void init(u8* param_1, s32 param_2); int getRemain(); /* 0x00 */ u32 field_0x0; diff --git a/include/JSystem/JAudio/JASSystemHeap.h b/include/JSystem/JAudio/JASSystemHeap.h index e42bfc34a..477312828 100644 --- a/include/JSystem/JAudio/JASSystemHeap.h +++ b/include/JSystem/JAudio/JASSystemHeap.h @@ -14,7 +14,7 @@ namespace JASystem { void sysDramSetup(JKRSolidHeap*); void* allocFromSysDram(u32); void sysAramSetup(u32); - void allocFromSysAramFull(u32*); + void* allocFromSysAramFull(u32*); extern TSolidHeap audioAramHeap; extern u32 audioDramSize; diff --git a/include/JSystem/JAudio/JASWaveArcLoader.h b/include/JSystem/JAudio/JASWaveArcLoader.h new file mode 100644 index 000000000..d8ae96492 --- /dev/null +++ b/include/JSystem/JAudio/JASWaveArcLoader.h @@ -0,0 +1,43 @@ +#ifndef JASWAVEARCLOADER_H +#define JASWAVEARCLOADER_H + +#include "JSystem/JAudio/JASHeapCtrl.h" +#include "dolphin/os/OSMutex.h" + +namespace JASystem { + namespace WaveArcLoader { + bool init(); + Kernel::THeap* getRootHeap(); + void setCurrentDir(const char*); + char* getCurrentDir(); + + extern Kernel::THeap sAramHeap; + extern char sCurrentDir[]; + }; + + class TWaveArc : public Kernel::TDisposer { + public: + TWaveArc(); + virtual void onLoadDone() {} + virtual void onEraseDone() {} + bool loadSetup(u32); + bool eraseSetup(); + static s32 loadToAramCallback(void*); + bool sendLoadCmd(); + void load(Kernel::THeap*); + bool erase(); + void onDispose(); + void setEntryNum(s32); + void setFileName(const char*); + + /* 0x04 */ Kernel::THeap field_0x4; + /* 0x4C */ int field_0x4c; + /* 0x50 */ OSMutex mMutex; + /* 0x68 */ int field_0x68; + /* 0x6C */ int field_0x6c; + /* 0x70 */ int field_0x70; + /* 0x74 */ int field_0x74; + }; +} + +#endif /* JASWAVEARCLOADER_H */ diff --git a/include/JSystem/JKernel/JKRThread.h b/include/JSystem/JKernel/JKRThread.h index ca4e85678..d293a4d96 100644 --- a/include/JSystem/JKernel/JKRThread.h +++ b/include/JSystem/JKernel/JKRThread.h @@ -31,11 +31,11 @@ public: protected: void resume() { OSResumeThread(mThreadRecord); } - void sendMessage(OSMessage message) { - OSSendMessage(&mMessageQueue, message, OS_MESSAGE_NOBLOCK); + BOOL sendMessage(OSMessage message) { + return OSSendMessage(&mMessageQueue, message, OS_MESSAGE_NOBLOCK); } - void sendMessageBlock(OSMessage message) { - OSSendMessage(&mMessageQueue, message, OS_MESSAGE_BLOCK); + BOOL sendMessageBlock(OSMessage message) { + return OSSendMessage(&mMessageQueue, message, OS_MESSAGE_BLOCK); } OSMessage waitMessage() { OSMessage message; diff --git a/src/JSystem/JAudio/JASDvdThread.cpp b/src/JSystem/JAudio/JASDvdThread.cpp index ceffbc437..134059ca6 100644 --- a/src/JSystem/JAudio/JASDvdThread.cpp +++ b/src/JSystem/JAudio/JASDvdThread.cpp @@ -22,14 +22,14 @@ JASTaskThread::TCallStack::~TCallStack() { } /* 8027B5D8-8027B66C .text sendCmdMsg__13JASTaskThreadFPFPv_lPvUl */ -bool JASTaskThread::sendCmdMsg(s32 (*param_1)(void*), void* param_2, u32 param_3) { +BOOL JASTaskThread::sendCmdMsg(s32 (*param_1)(void*), void* param_2, u32 param_3) { TCallStack* stack = new(JKRGetSystemHeap(), -4) TCallStack(param_3); if (!stack) { return false; } JASystem::Calc::bcopy(param_2, stack->argspace, param_3); stack->field_0x0 = param_1; - sendMessageBlock(stack); + return sendMessageBlock(stack); } /* 8027B66C-8027B6D4 .text run__13JASTaskThreadFv */ @@ -79,9 +79,9 @@ void JASystem::Dvd::resumeThread() { } /* 8027B84C-8027B8D4 .text sendCmdMsg__Q28JASystem3DvdFPFPv_lPvUl */ -void JASystem::Dvd::sendCmdMsg(s32 (*param_1)(void*), void* param_2, u32 param_3) { +BOOL JASystem::Dvd::sendCmdMsg(s32 (*param_1)(void*), void* param_2, u32 param_3) { JUT_ASSERT(152, sThread); - sThread->sendCmdMsg(param_1, param_2, param_3); + return sThread->sendCmdMsg(param_1, param_2, param_3); } /* 8027B8D4-8027B914 .text checkPassDvdT__Q28JASystem3DvdFUlPUlPFUl_v */ diff --git a/src/JSystem/JAudio/JASHeapCtrl.cpp b/src/JSystem/JAudio/JASHeapCtrl.cpp index 0682a2ad9..9d69be89c 100644 --- a/src/JSystem/JAudio/JASHeapCtrl.cpp +++ b/src/JSystem/JAudio/JASHeapCtrl.cpp @@ -197,7 +197,7 @@ JASystem::Kernel::TSolidHeap::TSolidHeap() { } /* 8027D370-8027D40C .text alloc__Q38JASystem6Kernel10TSolidHeapFl */ -int JASystem::Kernel::TSolidHeap::alloc(s32 size) { +void* JASystem::Kernel::TSolidHeap::alloc(s32 size) { /* Nonmatching */ u32 tmp1 = OSRoundUp32B(size); if (field_0x0 == 0) { @@ -213,7 +213,7 @@ int JASystem::Kernel::TSolidHeap::alloc(s32 size) { } field_0xc++; field_0x10 = tmp2; - return tmp2; + return (void*)tmp2; } /* 8027D40C-8027D424 .text freeAll__Q38JASystem6Kernel10TSolidHeapFv */ diff --git a/src/JSystem/JAudio/JASSystemHeap.cpp b/src/JSystem/JAudio/JASSystemHeap.cpp index 6f6daf828..27f535573 100644 --- a/src/JSystem/JAudio/JASSystemHeap.cpp +++ b/src/JSystem/JAudio/JASSystemHeap.cpp @@ -52,8 +52,9 @@ void JASystem::Kernel::sysAramSetup(u32 param_1) { } /* 8027DC84-8027DCDC .text allocFromSysAramFull__Q28JASystem6KernelFPUl */ -void JASystem::Kernel::allocFromSysAramFull(u32* param_1) { +void* JASystem::Kernel::allocFromSysAramFull(u32* param_1) { u32 size = audioAramHeap.getRemain(); - audioAramHeap.alloc(size - 0x20); + void* var1 = audioAramHeap.alloc(size - 0x20); *param_1 = size - 0x20; + return var1; } diff --git a/src/JSystem/JAudio/JASWaveArcLoader.cpp b/src/JSystem/JAudio/JASWaveArcLoader.cpp index 262e4b564..c451154f2 100644 --- a/src/JSystem/JAudio/JASWaveArcLoader.cpp +++ b/src/JSystem/JAudio/JASWaveArcLoader.cpp @@ -3,81 +3,174 @@ // Translation Unit: JASWaveArcLoader.cpp // -#include "JASWaveArcLoader.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASWaveArcLoader.h" +#include "JSystem/JAudio/JASDvdThread.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JKernel/JKRDvdAramRipper.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "MSL_C/string.h" + +const u32 DIR_MAX = 64; + +JASystem::Kernel::THeap JASystem::WaveArcLoader::sAramHeap(NULL); /* 80287BD8-80287C24 .text init__Q28JASystem13WaveArcLoaderFv */ -void JASystem::WaveArcLoader::init() { - /* Nonmatching */ +bool JASystem::WaveArcLoader::init() { + u32 local_8; + void* var1 = Kernel::allocFromSysAramFull(&local_8); + if (!var1) { + return false; + } + sAramHeap.initRootHeap(var1, local_8, Kernel::THeap::Type0); + return true; } /* 80287C24-80287C30 .text getRootHeap__Q28JASystem13WaveArcLoaderFv */ -void JASystem::WaveArcLoader::getRootHeap() { - /* Nonmatching */ +JASystem::Kernel::THeap* JASystem::WaveArcLoader::getRootHeap() { + return &sAramHeap; } +char JASystem::WaveArcLoader::sCurrentDir[DIR_MAX] = "/Banks/"; + /* 80287C30-80287D24 .text setCurrentDir__Q28JASystem13WaveArcLoaderFPCc */ -void JASystem::WaveArcLoader::setCurrentDir(const char*) { +void JASystem::WaveArcLoader::setCurrentDir(const char* dir) { /* Nonmatching */ + //JUT_ASSERT(60, std::strlen(dir) < DIR_MAX); + strcpy(sCurrentDir, dir); + int len = strlen(sCurrentDir); + if (sCurrentDir[len - 1] == '/') { + return; + } + JUT_ASSERT(65, len+1 < DIR_MAX); + sCurrentDir[len] = '/'; + sCurrentDir[len+1] = 0; } /* 80287D24-80287D30 .text getCurrentDir__Q28JASystem13WaveArcLoaderFv */ -void JASystem::WaveArcLoader::getCurrentDir() { - /* Nonmatching */ +char* JASystem::WaveArcLoader::getCurrentDir() { + return sCurrentDir; } /* 80287D30-80287DA4 .text __ct__Q28JASystem8TWaveArcFv */ -JASystem::TWaveArc::TWaveArc() { - /* Nonmatching */ +JASystem::TWaveArc::TWaveArc() : field_0x4(this) { + field_0x4c = 0; + field_0x68 = 0; + field_0x6c = -1; + field_0x70 = 0; + field_0x74 = 0; + OSInitMutex(&mMutex); } /* 80287DA4-80287E34 .text loadSetup__Q28JASystem8TWaveArcFUl */ -void JASystem::TWaveArc::loadSetup(unsigned long) { - /* Nonmatching */ +bool JASystem::TWaveArc::loadSetup(u32 param_1) { + OSLockMutex(&mMutex); + if (field_0x74 != param_1) { + OSUnlockMutex(&mMutex); + return false; + } + if (field_0x68 != 1) { + OSUnlockMutex(&mMutex); + return false; + } + field_0x4c = 1; + field_0x68 = 2; + OSUnlockMutex(&mMutex); + return true; } /* 80287E34-80287EB8 .text eraseSetup__Q28JASystem8TWaveArcFv */ -void JASystem::TWaveArc::eraseSetup() { - /* Nonmatching */ +bool JASystem::TWaveArc::eraseSetup() { + OSLockMutex(&mMutex); + if (field_0x68 == 0) { + OSUnlockMutex(&mMutex); + return false; + } + if (field_0x68 == 1) { + field_0x68 = 0; + OSUnlockMutex(&mMutex); + return false; + } + field_0x4c = 0; + field_0x68 = 0; + OSUnlockMutex(&mMutex); + return true; } +struct unk_message { + JASystem::TWaveArc* field_0x0; + int field_0x4; + void* field_0x8; + u32 field_0xc; +}; + /* 80287EB8-80287F48 .text loadToAramCallback__Q28JASystem8TWaveArcFPv */ -void JASystem::TWaveArc::loadToAramCallback(void*) { +s32 JASystem::TWaveArc::loadToAramCallback(void* param_1) { /* Nonmatching */ + unk_message* msg = (unk_message*)param_1; + if (JKRDvdAramRipper::loadToAram(msg->field_0x4, u32(msg->field_0x8), EXPAND_SWITCH_UNKNOWN0, 0, 0) == 0) { + return -1; + } + TWaveArc* waveArc = msg->field_0x0; + if (!waveArc->loadSetup(msg->field_0xc)) { + return 0; + } + waveArc->onLoadDone(); + return 0; } /* 80287F48-80287FE4 .text sendLoadCmd__Q28JASystem8TWaveArcFv */ -void JASystem::TWaveArc::sendLoadCmd() { +bool JASystem::TWaveArc::sendLoadCmd() { /* Nonmatching */ + OSLockMutex(&mMutex); + field_0x4c = 0; + field_0x68 = 1; + unk_message msg; + msg.field_0x0 = this; + msg.field_0x4 = field_0x6c; + msg.field_0x8 = field_0x4.mBase; + msg.field_0xc = ++field_0x74; + OSUnlockMutex(&mMutex); + if (!Dvd::sendCmdMsg(loadToAramCallback, &msg, sizeof(msg))) { + field_0x4.free(); + return false; + } + return true; } /* 80287FE4-802880A0 .text load__Q28JASystem8TWaveArcFPQ38JASystem6Kernel5THeap */ -void JASystem::TWaveArc::load(JASystem::Kernel::THeap*) { +void JASystem::TWaveArc::load(Kernel::THeap*) { /* Nonmatching */ } /* 802880A0-802880C4 .text erase__Q28JASystem8TWaveArcFv */ -void JASystem::TWaveArc::erase() { - /* Nonmatching */ +bool JASystem::TWaveArc::erase() { + return field_0x4.free(); } /* 802880C4-8028810C .text onDispose__Q28JASystem8TWaveArcFv */ void JASystem::TWaveArc::onDispose() { - /* Nonmatching */ + if (eraseSetup()) { + onEraseDone(); + } } /* 8028810C-8028816C .text setEntryNum__Q28JASystem8TWaveArcFl */ -void JASystem::TWaveArc::setEntryNum(long) { +void JASystem::TWaveArc::setEntryNum(s32) { /* Nonmatching */ } /* 8028816C-80288214 .text setFileName__Q28JASystem8TWaveArcFPCc */ -void JASystem::TWaveArc::setFileName(const char*) { - /* Nonmatching */ +void JASystem::TWaveArc::setFileName(const char* param_1) { + char* currentDir = WaveArcLoader::getCurrentDir(); + size_t size = strlen(currentDir); + size += strlen(param_1); + char* str = new (JKRGetSystemHeap(), -4) char[size + 1]; + strcpy(str, currentDir); + strcat(str, param_1); + str[size] = 0; + s32 entry = DVDConvertPathToEntrynum(str); + delete[] str; + if (entry >= 0) { + setEntryNum(entry); + } } - -/* 80288214-8028828C .text __dt__Q38JASystem6Kernel5THeapFv */ -JASystem::Kernel::THeap::~THeap() { - /* Nonmatching */ -} -