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/JASHardStream.h b/include/JSystem/JAudio/JASHardStream.h new file mode 100644 index 000000000..fa5b6a428 --- /dev/null +++ b/include/JSystem/JAudio/JASHardStream.h @@ -0,0 +1,66 @@ +#ifndef JASHARDSTREAM_H +#define JASHARDSTREAM_H + +#include "dolphin/types.h" + +typedef struct DVDCommandBlock DVDCommandBlock; +typedef struct DVDFileInfo DVDFileInfo; + +namespace JASystem { + namespace HardStream { + int unregistBgmAll(); + void main(); + void firstBgmCallback(s32, DVDFileInfo*); + void secondBgmCallback(s32, DVDFileInfo*); + void getAddrCallback(s32, DVDCommandBlock*); + + class TControl { + public: + TControl(); + ~TControl() {} + u16 getIntroNum(); + u16 getLoopNum(); + BOOL fileOpen(u16, DVDFileInfo*); + void clearListOne(); + void setLastAddr(DVDFileInfo*); + u32 getLastAddr(); + BOOL startFirst(u16, DVDFileInfo*, u32*); + BOOL startSecond(u16, DVDFileInfo*, u32*); + void resetFader(); + u8 getCurVol(); + void calcCurVolume(); + u8 volFloatToU8(f32); + + /* 0x00 */ int field_0x0; + /* 0x04 */ void* field_0x4; + /* 0x08 */ u16 field_0x8; + /* 0x0A */ u8 field_0xa; + /* 0x0B */ u8 field_0xb; + /* 0x0C */ f32 field_0xc; + /* 0x10 */ f32 field_0x10; + /* 0x14 */ int field_0x14; + /* 0x18 */ int field_0x18; + /* 0x1C */ int field_0x1c; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ f32 field_0x28; + /* 0x2C */ f32 field_0x2c; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ f32 field_0x34; + /* 0x38 */ int field_0x38; + /* 0x3C */ int field_0x3c; + /* 0x40 */ int field_0x40; + /* 0x44 */ u32 field_0x44[2]; + /* 0x4C */ u8 field_0x4c; + }; + + extern TControl strCtrl; + extern bool useHardStreaming; + extern char* streamFiles; + extern u32* playList; + extern int playListMax; + extern char rootDir[]; + } +} + +#endif /* JASHARDSTREAM_H */ 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/include/dolphin/ai/ai.h b/include/dolphin/ai/ai.h index 0de6e2d9c..e5fef1766 100644 --- a/include/dolphin/ai/ai.h +++ b/include/dolphin/ai/ai.h @@ -14,10 +14,12 @@ AIDCallback AIRegisterDMACallback(AIDCallback callback); void AIInitDMA(u32 addr, u32 length); void AIStartDMA(void); void AIStopDMA(void); +void AIResetStreamSampleCount(void); void AISetStreamPlayState(u32 state); inline u32 AIGetStreamPlayState(void); void AISetDSPSampleRate(u32 rate); u32 AIGetDSPSampleRate(void); +void AISetStreamSampleRate(u32 rate); void __AI_set_stream_sample_rate(u32 rate); u32 AIGetStreamSampleRate(void); void AISetStreamVolLeft(u8 vol); diff --git a/include/dolphin/dvd/dvd.h b/include/dolphin/dvd/dvd.h index c2998bf5e..a7d68f5ad 100644 --- a/include/dolphin/dvd/dvd.h +++ b/include/dolphin/dvd/dvd.h @@ -127,12 +127,15 @@ BOOL DVDChangeDir(const char* dirname); BOOL DVDCloseDir(DVDDirectory* dir); BOOL DVDOpenDir(const char*, DVDDirectory* dir); BOOL DVDReadDir(DVDDirectory* dir, DVDDirectoryEntry* entry); +BOOL DVDPrepareStreamAsync(DVDFileInfo* fileinfo, u32 length, u32 offset, DVDCallback callback); BOOL DVDReadAbsAsyncPrio(DVDCommandBlock* block, void* addr, s32 length, s32 offset, DVDCBCallback callback, s32 prio); BOOL DVDReadAbsAsyncForBS(DVDCommandBlock* block, void* addr, s32 length, s32 offset, DVDCBCallback callback); BOOL DVDReadDiskID(DVDCommandBlock* block, DVDDiskID* diskID, DVDCBCallback callback); BOOL DVDCancelStreamAsync(DVDCommandBlock* block, DVDCBCallback callback); +BOOL DVDStopStreamAtEndAsync(DVDCommandBlock* block, DVDCBCallback callback); +BOOL DVDGetStreamPlayAddrAsync(DVDCommandBlock* block, DVDCBCallback callback); BOOL DVDInquiryAsync(DVDCommandBlock* block, DVDDriveInfo* info, DVDCBCallback callback); void DVDReset(void); BOOL DVDSetAutoInvalidation(BOOL autoInval); diff --git a/src/JSystem/JAudio/JASHardStream.cpp b/src/JSystem/JAudio/JASHardStream.cpp index d13fa0056..2e0d807f6 100644 --- a/src/JSystem/JAudio/JASHardStream.cpp +++ b/src/JSystem/JAudio/JASHardStream.cpp @@ -3,52 +3,315 @@ // Translation Unit: JASHardStream.cpp // -#include "JASHardStream.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASHardStream.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "MSL_C/string.h" +#include "dolphin/ai/ai.h" +#include "dolphin/dvd/dvd.h" +#include "dolphin/os/OS.h" + +JASystem::HardStream::TControl JASystem::HardStream::strCtrl; +bool JASystem::HardStream::useHardStreaming; +char* JASystem::HardStream::streamFiles; +u32* JASystem::HardStream::playList; +int JASystem::HardStream::playListMax = 32; /* 8027BE44-8027BEA4 .text unregistBgmAll__Q28JASystem10HardStreamFv */ -void JASystem::HardStream::unregistBgmAll() { +int JASystem::HardStream::unregistBgmAll() { /* Nonmatching */ + if (strCtrl.field_0x4 == NULL) { + return 0; + } + strCtrl.field_0x4 = NULL; + for (int i = 0; i < playListMax; i++) { + u32* list = playList + i * 3; + list[2] = list[1] = list[0] = 0; + } + return 1; } +char JASystem::HardStream::rootDir[32] = ""; + /* 8027BEA4-8027C318 .text main__Q28JASystem10HardStreamFv */ void JASystem::HardStream::main() { /* Nonmatching */ + static DVDFileInfo finfo[3]; + static u32 cur_finfo = 0; + static u8 cur_addr_cmd = 0; + static DVDCommandBlock get_addr_cmd[16]; + static DVDCommandBlock stop_cmd; + static DVDCommandBlock finish_cmd; + if (!useHardStreaming) { + return; + } + while (true) { + u16 introNum; + switch (strCtrl.field_0xb) { + case 1: + if (!strCtrl.field_0x4) { + return; + } + introNum = strCtrl.getIntroNum(); + if (introNum != 0xffff) { + if (!strCtrl.startFirst(introNum, finfo, &cur_finfo)) { + strCtrl.field_0xb = 0; + return; + } + strCtrl.field_0x8 = 0; + } else { + if (!strCtrl.startFirst(strCtrl.getLoopNum(), finfo, &cur_finfo)) { + strCtrl.field_0xb = 0; + return; + } + strCtrl.clearListOne(); + strCtrl.field_0x8 = 1; + } + strCtrl.field_0xb = 3; + return; + case 2: + if (strCtrl.field_0x8 == 0) { + u16 loopNum = strCtrl.getLoopNum(); + if (loopNum != 0xffff) { + if (!strCtrl.startSecond(loopNum, finfo, &cur_finfo)) { + strCtrl.field_0xb = 0; + return; + } + strCtrl.clearListOne(); + strCtrl.field_0x8 = 1; + strCtrl.field_0xb = 4; + return; + } + } + strCtrl.clearListOne(); + if (strCtrl.field_0x4 == 0) { + if (strCtrl.field_0x8 == 0) { + DVDStopStreamAtEndAsync(&stop_cmd, 0); + strCtrl.field_0xb = 4; + strCtrl.field_0x8 = 2; + return; + } + strCtrl.field_0x8 = 3; + strCtrl.field_0xb = 4; + return; + } + introNum = strCtrl.getIntroNum(); + if (introNum != 0xffff) { + if (!strCtrl.startSecond(introNum, finfo, &cur_finfo)) { + strCtrl.field_0xb = 0; + return; + } + strCtrl.field_0x8 = 0; + } else { + if (!strCtrl.startSecond(strCtrl.getLoopNum(), finfo, &cur_finfo)) { + strCtrl.field_0xb = 0; + return; + } + strCtrl.clearListOne(); + strCtrl.field_0x8 = 1; + } + strCtrl.field_0xb = 4; + return; + case 4: + u8 currentVol = strCtrl.getCurVol(); + AISetStreamVolLeft(currentVol); + AISetStreamVolRight(currentVol); + DVDGetStreamPlayAddrAsync(&get_addr_cmd[cur_addr_cmd], getAddrCallback); + cur_addr_cmd++; + cur_addr_cmd %= 16; + return; + case 5: + if (!strCtrl.field_0x4) { + if (strCtrl.field_0x8 != 2) { + strCtrl.field_0x8 = 3; + } + strCtrl.field_0xb = 4; + return; + } + if (strCtrl.field_0x8 == 0) { + if (((u16**)strCtrl.field_0x4)[0][3] == 0xffff) { + if (((u32*)strCtrl.field_0x4)[1] == 0) { + DVDStopStreamAtEndAsync(&stop_cmd, 0); + strCtrl.clearListOne(); + strCtrl.field_0x8 = 2; + } else { + strCtrl.clearListOne(); + strCtrl.field_0x8 = 1; + break; + } + } else { + if (!strCtrl.startSecond(strCtrl.getLoopNum(), finfo, &cur_finfo)) { + strCtrl.field_0xb = 0; + return; + } + strCtrl.clearListOne(); + strCtrl.field_0x8 = 1; + } + } else if (!strCtrl.field_0x4) { + strCtrl.field_0x8 = 3; + strCtrl.field_0xb = 4; + } else { + introNum = strCtrl.getIntroNum(); + if (introNum == 0xffff) { + strCtrl.field_0x8 = 0; + break; + } + if (!strCtrl.startSecond(introNum, finfo, &cur_finfo)) { + strCtrl.field_0xb = 0; + return; + } + strCtrl.field_0x8 = 0; + } + strCtrl.field_0xb = 4; + return; + case 6: + AISetStreamVolLeft(0); + AISetStreamVolRight(0); + AISetStreamPlayState(0); + DVDCancelStreamAsync(&finish_cmd, NULL); + strCtrl.field_0xb = 0; + strCtrl.field_0x8 = 0; + strCtrl.resetFader(); + strCtrl.field_0xa = 0; + return; + case 0: + case 3: + default: + return; + } + } } /* 8027C318-8027C39C .text firstBgmCallback__Q28JASystem10HardStreamFlP11DVDFileInfo */ -void JASystem::HardStream::firstBgmCallback(long, DVDFileInfo*) { - /* Nonmatching */ +void JASystem::HardStream::firstBgmCallback(s32, DVDFileInfo*) { + if (strCtrl.field_0xa == 0) { + u8 vol = strCtrl.getCurVol(); + AISetStreamVolLeft(vol); + AISetStreamVolRight(vol); + AISetStreamSampleRate(1); + AIResetStreamSampleCount(); + AISetStreamPlayState(1); + strCtrl.field_0xb = 2; + } else { + strCtrl.field_0xb = 4; + strCtrl.field_0xa = 0; + } } /* 8027C39C-8027C3B0 .text secondBgmCallback__Q28JASystem10HardStreamFlP11DVDFileInfo */ -void JASystem::HardStream::secondBgmCallback(long, DVDFileInfo*) { - /* Nonmatching */ +void JASystem::HardStream::secondBgmCallback(s32, DVDFileInfo*) { + strCtrl.field_0xb = 4; } /* 8027C3B0-8027C4E4 .text getAddrCallback__Q28JASystem10HardStreamFlP15DVDCommandBlock */ -void JASystem::HardStream::getAddrCallback(long, DVDCommandBlock*) { - /* Nonmatching */ +void JASystem::HardStream::getAddrCallback(s32 param_1, DVDCommandBlock* param_2) { + static BOOL last_frame = 0; + if (strCtrl.field_0x8 == 3) { + if (param_1 == strCtrl.field_0x44[strCtrl.field_0x4c ^ 1]) { + last_frame = true; + } else if (last_frame) { + last_frame = false; + strCtrl.field_0xb = 5; + } + } else if (strCtrl.field_0x8 == 2) { + if (param_1 == strCtrl.field_0x44[strCtrl.field_0x4c ^ 1] - 0x8000) { + last_frame = true; + } else if (last_frame) { + strCtrl.field_0xb = 6; + unregistBgmAll(); + last_frame = false; + } + } else { + if (param_1 == strCtrl.getLastAddr()) { + last_frame = true; + } else if (last_frame) { + last_frame = false; + strCtrl.field_0xb = 5; + } + } +} + +float dummy1() { + return 0.0f; } /* 8027C4E4-8027C544 .text __ct__Q38JASystem10HardStream8TControlFv */ JASystem::HardStream::TControl::TControl() { - /* Nonmatching */ + field_0x0 = 0; + field_0x4 = NULL; + field_0xa = 0; + field_0x8 = 0; + field_0xb = 0; + field_0xc = 1.0f; + field_0x10 = 0.0f; + field_0x14 = 0; + field_0x18 = 0; + field_0x1c = 0; + field_0x20 = 0.0f; + field_0x24 = 0.0f; + field_0x2c = 1.0f; + field_0x30 = 1.0f; + field_0x28 = 1.0f; + field_0x34 = 0.0f; + field_0x38 = 0; + field_0x3c = 0; + field_0x40 = 0; + field_0x4c = 0; } /* 8027C544-8027C57C .text getIntroNum__Q38JASystem10HardStream8TControlFv */ -void JASystem::HardStream::TControl::getIntroNum() { - /* Nonmatching */ +u16 JASystem::HardStream::TControl::getIntroNum() { + if (!field_0x4) { + return 0xffff; + } + u16* ptr = *(u16**)field_0x4; + if (ptr == NULL) { + return 0xffff; + } + return ptr[2]; } /* 8027C57C-8027C5B4 .text getLoopNum__Q38JASystem10HardStream8TControlFv */ -void JASystem::HardStream::TControl::getLoopNum() { - /* Nonmatching */ +u16 JASystem::HardStream::TControl::getLoopNum() { + if (!field_0x4) { + return 0xffff; + } + u16* ptr = *(u16**)field_0x4; + if (ptr == NULL) { + return 0xffff; + } + return ptr[3]; +} + +void dummy2() { + OSReport(__FILE__); + OSReport("playPairs != 0"); + OSReport("Halt"); + OSReport("playList != 0"); + OSReport("name != 0"); + OSReport("[JASHardStream::setRootDir] ディレクトリ(%s)名が長すぎます。\n"); + OSReport("filename != 0"); + OSReport("streamFiles != 0"); + OSReport("[JASHardStream::setFile] このID(%d)には既にファイルが登録されています。\n"); + OSReport("pair_id < playPairsMax"); + OSReport("[JASHardStream::setBgmPair] このBGMペアID(%d)は既に使用されています。\n"); + OSReport("[JASHardStream::setBgmPair] イントロ部のBGM番号指定が大きすぎます。(%d)\n"); + OSReport("[JASHardStream::setBgmPair] ループ部のBGM番号指定が大きすぎます。(%d)\n"); + OSReport("[JASHardStream::registBgmPair] このペア(%d)にはイントロ/ループともにありませんので登録できません。\n"); + OSReport("new_list != 0"); + OSReport("[JASHardStream::playBgm] まだ前の曲が再生中ですので、新たに開始できません。\n"); } /* 8027C5B4-8027C648 .text fileOpen__Q38JASystem10HardStream8TControlFUsP11DVDFileInfo */ -void JASystem::HardStream::TControl::fileOpen(unsigned short, DVDFileInfo*) { - /* Nonmatching */ +BOOL JASystem::HardStream::TControl::fileOpen(u16 param_1, DVDFileInfo* fileinfo) { + char buffer[64]; + char* ptr = streamFiles + param_1 * 0x24; + strcpy(buffer, rootDir); + strcat(buffer, ptr); + if (!DVDOpen(buffer, fileinfo)) { + OSReport("[JASHardStream::main] ファイルが開けません。(%s)\n", buffer); + return false; + } + return true; } /* 8027C648-8027C67C .text clearListOne__Q38JASystem10HardStream8TControlFv */ @@ -57,33 +320,60 @@ void JASystem::HardStream::TControl::clearListOne() { } /* 8027C67C-8027C710 .text setLastAddr__Q38JASystem10HardStream8TControlFP11DVDFileInfo */ -void JASystem::HardStream::TControl::setLastAddr(DVDFileInfo*) { - /* Nonmatching */ +void JASystem::HardStream::TControl::setLastAddr(DVDFileInfo* finfo) { + JUT_ASSERT(906, finfo != 0); + field_0x44[field_0x4c] = finfo->start_address + finfo->length - 0x8000; + field_0x4c ^= 1; } /* 8027C710-8027C724 .text getLastAddr__Q38JASystem10HardStream8TControlFv */ -void JASystem::HardStream::TControl::getLastAddr() { - /* Nonmatching */ +u32 JASystem::HardStream::TControl::getLastAddr() { + return field_0x44[field_0x4c]; } /* 8027C724-8027C7D8 .text startFirst__Q38JASystem10HardStream8TControlFUsP11DVDFileInfoPUl */ -void JASystem::HardStream::TControl::startFirst(unsigned short, DVDFileInfo*, unsigned long*) { - /* Nonmatching */ +BOOL JASystem::HardStream::TControl::startFirst(u16 param_1, DVDFileInfo* param_2, u32* param_3) { + if (!fileOpen(param_1, param_2 + *param_3)) { + return false; + } + setLastAddr(param_2 + *param_3); + DVDPrepareStreamAsync(param_2 + *param_3, 0, 0, firstBgmCallback); + param_3[0]++; + param_3[0] %= 3; + return true; } /* 8027C7D8-8027C88C .text startSecond__Q38JASystem10HardStream8TControlFUsP11DVDFileInfoPUl */ -void JASystem::HardStream::TControl::startSecond(unsigned short, DVDFileInfo*, unsigned long*) { - /* Nonmatching */ +BOOL JASystem::HardStream::TControl::startSecond(u16 param_1, DVDFileInfo* param_2, u32* param_3) { + if (!fileOpen(param_1, param_2 + *param_3)) { + return false; + } + setLastAddr(param_2 + *param_3); + DVDPrepareStreamAsync(param_2 + *param_3, 0, 0, secondBgmCallback); + param_3[0]++; + param_3[0] %= 3; + return true; } /* 8027C88C-8027C8C8 .text resetFader__Q38JASystem10HardStream8TControlFv */ void JASystem::HardStream::TControl::resetFader() { - /* Nonmatching */ + field_0x14 = 0; + field_0x20 = 0.0f; + field_0x38 = 0; + field_0x18 = 0; + field_0x24 = 0.0f; + field_0x3c = 0; + field_0x30 = 1.0f; + field_0x2c = 1.0f; + field_0x28 = 1.0f; + field_0x1c = 0; + field_0x40 = 0; } /* 8027C8C8-8027C900 .text getCurVol__Q38JASystem10HardStream8TControlFv */ -void JASystem::HardStream::TControl::getCurVol() { - /* Nonmatching */ +u8 JASystem::HardStream::TControl::getCurVol() { + calcCurVolume(); + return volFloatToU8(field_0x10); } /* 8027C900-8027CB5C .text calcCurVolume__Q38JASystem10HardStream8TControlFv */ @@ -92,12 +382,13 @@ void JASystem::HardStream::TControl::calcCurVolume() { } /* 8027CB5C-8027CB9C .text volFloatToU8__Q38JASystem10HardStream8TControlFf */ -void JASystem::HardStream::TControl::volFloatToU8(float) { +u8 JASystem::HardStream::TControl::volFloatToU8(f32 param_1) { /* Nonmatching */ + if (param_1 > 1.0f) { + param_1 = 1.0f; + } + if (param_1 < 0.0f) { + param_1 = 0.0f; + } + return param_1 * 255.0f; } - -/* 8027CBD8-8027CC14 .text __dt__Q38JASystem10HardStream8TControlFv */ -JASystem::HardStream::TControl::~TControl() { - /* Nonmatching */ -} - 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)); } -