From d8efd150811d60e51b6081576a189281948e0f4f Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Fri, 17 Nov 2023 03:03:51 -0800 Subject: [PATCH] JASResArcLoader --- configure.py | 2 +- include/JSystem/JAudio/JASResArcLoader.h | 17 +++++ src/JSystem/JAudio/JASResArcLoader.cpp | 79 ++++++++++++++++++++---- 3 files changed, 86 insertions(+), 12 deletions(-) create mode 100644 include/JSystem/JAudio/JASResArcLoader.h diff --git a/configure.py b/configure.py index 2dd7bcc66..2eaa7aed0 100644 --- a/configure.py +++ b/configure.py @@ -657,7 +657,7 @@ config.libs = [ Object(Matching, "JSystem/JAudio/JASRate.cpp"), Object(NonMatching, "JSystem/JAudio/JASHardStream.cpp"), Object(NonMatching, "JSystem/JAudio/JASHeapCtrl.cpp"), - Object(NonMatching, "JSystem/JAudio/JASResArcLoader.cpp"), + Object(Matching, "JSystem/JAudio/JASResArcLoader.cpp"), Object(Matching, "JSystem/JAudio/JASProbe.cpp"), Object(Matching, "JSystem/JAudio/JASKernelDebug.cpp"), Object(Matching, "JSystem/JAudio/JASCmdStack.cpp"), diff --git a/include/JSystem/JAudio/JASResArcLoader.h b/include/JSystem/JAudio/JASResArcLoader.h new file mode 100644 index 000000000..af478b18c --- /dev/null +++ b/include/JSystem/JAudio/JASResArcLoader.h @@ -0,0 +1,17 @@ +#ifndef JASRESARCLOADER_H +#define JASRESARCLOADER_H + +#include "dolphin/types.h" + +class JKRArchive; + +namespace JASystem { + namespace ResArcLoader { + u32 getResSize(JKRArchive*, u16); + s32 loadResourceCallback(void*); + u32 loadResource(JKRArchive*, u16, u8*, u32); + void loadResourceAsync(JKRArchive*, u16, u8*, u32, void (*)(u32, u32), u32); + } +} + +#endif /* JASRESARCLOADER_H */ diff --git a/src/JSystem/JAudio/JASResArcLoader.cpp b/src/JSystem/JAudio/JASResArcLoader.cpp index fe8c30c2e..e925d0d14 100644 --- a/src/JSystem/JAudio/JASResArcLoader.cpp +++ b/src/JSystem/JAudio/JASResArcLoader.cpp @@ -3,26 +3,83 @@ // Translation Unit: JASResArcLoader.cpp // -#include "JASResArcLoader.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASResArcLoader.h" +#include "JSystem/JAudio/JASDvdThread.h" +#include "JSystem/JKernel/JKRArchive.h" +#include "dolphin/os/OSMessage.h" + +struct LoadResourceMsg { + /* 0x00 */ JKRArchive* mArchive; + /* 0x04 */ u16 mId; + /* 0x08 */ u8* mBuffer; + /* 0x0C */ u32 mSize; + /* 0x10 */ void (*mCallback)(u32, u32); + /* 0x14 */ u32 mCallbackParam; + /* 0x18 */ OSMessageQueue* mMessageQueue; +}; /* 8027D4C8-8027D4FC .text getResSize__Q28JASystem12ResArcLoaderFP10JKRArchiveUs */ -void JASystem::ResArcLoader::getResSize(JKRArchive*, unsigned short) { - /* Nonmatching */ +u32 JASystem::ResArcLoader::getResSize(JKRArchive* archive, u16 param_2) { + JKRArchive::SDIFileEntry* entry = archive->findIdResource(param_2); + if (entry == NULL) { + return 0; + } + return entry->data_size; } /* 8027D4FC-8027D5A0 .text loadResourceCallback__Q28JASystem12ResArcLoaderFPv */ -void JASystem::ResArcLoader::loadResourceCallback(void*) { - /* Nonmatching */ +s32 JASystem::ResArcLoader::loadResourceCallback(void* param_1) { + LoadResourceMsg* msg = (LoadResourceMsg*)param_1; + u32 var1 = msg->mArchive->readResource(msg->mBuffer, msg->mSize, msg->mId); + if (msg->mCallback) { + msg->mCallback(var1, msg->mCallbackParam); + } + if (var1 == 0) { + if (msg->mMessageQueue) { + OSSendMessage(msg->mMessageQueue, OSMessage(-1), OS_MESSAGE_BLOCK); + } + return -1; + } else { + if (msg->mMessageQueue) { + OSSendMessage(msg->mMessageQueue, OSMessage(0), OS_MESSAGE_BLOCK); + } + return 0; + } } /* 8027D5A0-8027D658 .text loadResource__Q28JASystem12ResArcLoaderFP10JKRArchiveUsPUcUl */ -void JASystem::ResArcLoader::loadResource(JKRArchive*, unsigned short, unsigned char*, unsigned long) { - /* Nonmatching */ +u32 JASystem::ResArcLoader::loadResource(JKRArchive* archive, u16 id, u8* buffer, u32 size) { + OSMessageQueue queue; + LoadResourceMsg msg; + OSMessage queueMsg; + OSMessage receiveMsg; + OSInitMessageQueue(&queue, &queueMsg, 1); + msg.mArchive = archive; + msg.mId = id; + msg.mBuffer = buffer; + msg.mSize = size; + msg.mCallback = NULL; + msg.mCallbackParam = 0; + msg.mMessageQueue = NULL; + msg.mMessageQueue = &queue; + if (!Dvd::sendCmdMsg(loadResourceCallback, &msg, sizeof(LoadResourceMsg))) { + return 0; + } + OSReceiveMessage(&queue, &receiveMsg, OS_MESSAGE_BLOCK); + return size & ~-(u32(receiveMsg) != 0); } /* 8027D658-8027D6B0 .text loadResourceAsync__Q28JASystem12ResArcLoaderFP10JKRArchiveUsPUcUlPFUlUl_vUl */ -void JASystem::ResArcLoader::loadResourceAsync(JKRArchive*, unsigned short, unsigned char*, unsigned long, void (*)(unsigned long, unsigned long), unsigned long) { - /* Nonmatching */ +void JASystem::ResArcLoader::loadResourceAsync(JKRArchive* archive, u16 id, u8* buffer, u32 size, void (*cb)(u32, u32), u32 cbParam) { + LoadResourceMsg msg; + msg.mArchive = archive; + msg.mId = id; + msg.mBuffer = buffer; + msg.mSize = size; + msg.mCallback = NULL; + msg.mCallbackParam = 0; + msg.mMessageQueue = NULL; + msg.mCallback = cb; + msg.mCallbackParam = cbParam; + Dvd::sendCmdMsg(loadResourceCallback, &msg, sizeof(LoadResourceMsg)); } -