From 95b994f9d2609494915ecea41560ce68ad735807 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 25 Nov 2023 12:58:20 -0800 Subject: [PATCH] m_Do_dvd_thread 99% just a link issue --- include/SSystem/SComponent/c_list.h | 2 +- include/m_Do/m_Do_dvd_thread.h | 110 ++++++------ src/m_Do/m_Do_dvd_thread.cpp | 259 ++++++++++++++++++++++------ 3 files changed, 264 insertions(+), 107 deletions(-) diff --git a/include/SSystem/SComponent/c_list.h b/include/SSystem/SComponent/c_list.h index 4794b75c4..6d1fd2bec 100644 --- a/include/SSystem/SComponent/c_list.h +++ b/include/SSystem/SComponent/c_list.h @@ -16,6 +16,6 @@ int cLs_Insert(node_list_class* pList, int idx, node_class* pNode); node_class* cLs_GetFirst(node_list_class* pList); void cLs_Create(node_list_class* pList); -#define LIST_GET_HEAD(pList) (pList->mpHead) +#define LIST_GET_HEAD(pList) ((pList)->mpHead) #endif /* C_LIST_H */ diff --git a/include/m_Do/m_Do_dvd_thread.h b/include/m_Do/m_Do_dvd_thread.h index 917017e99..6480683e1 100644 --- a/include/m_Do/m_Do_dvd_thread.h +++ b/include/m_Do/m_Do_dvd_thread.h @@ -18,29 +18,11 @@ public: public: virtual ~mDoDvdThd_command_c(); mDoDvdThd_command_c(); - inline s32 sync() { return mIsDone; } + inline BOOL sync() { return mIsDone; } inline void destroy() { delete this; } - virtual s32 execute() = 0; + virtual BOOL execute() = 0; }; // Size = 0x14 -class mDoDvdThd_toMainRam_c : public mDoDvdThd_command_c { -public: - mDoDvdThd_toMainRam_c(u8); - static mDoDvdThd_toMainRam_c* create(char const*, u8, JKRHeap*); - virtual ~mDoDvdThd_toMainRam_c(); - virtual s32 execute(); - - void* getMemAddress() const { return mData; } - s32 getMemSize() const { return mDataSize; } - -private: - /* 0x14 */ u8 mMountDirection; - /* 0x18 */ s32 mEntryNum; - /* 0x1C */ void* mData; - /* 0x20 */ s32 mDataSize; - /* 0x24 */ JKRHeap* mHeap; -}; // Size = 0x28 - class mDoDvdThd_param_c { public: mDoDvdThd_param_c(); @@ -53,17 +35,47 @@ public: private: /* 0x00 */ OSMessageQueue mMessageQueue; - /* 0x20 */ void* mMessageQueueMessages; - /* 0x24 */ node_list_class mNodeList; - /* 0x30 */ OSMutex mMutext; + /* 0x20 */ OSMessage mMessageBuf[1]; + /* 0x24 */ node_list_class mCommandList; + /* 0x30 */ OSMutex mMutex; }; // Size = 0x48 +class mDoDvdThd_callback_c : public mDoDvdThd_command_c { +public: + virtual ~mDoDvdThd_callback_c(); + mDoDvdThd_callback_c(mDoDvdThd_callback_func, void*); + static mDoDvdThd_callback_c* create(mDoDvdThd_callback_func, void*); + virtual BOOL execute(); + +private: + /* 0x14 */ mDoDvdThd_callback_func mFunc; + /* 0x18 */ void* mUserData; + /* 0x1C */ void* mResult; +}; + +class mDoDvdThd_mountArchive_c : public mDoDvdThd_command_c { +public: + virtual ~mDoDvdThd_mountArchive_c(); + mDoDvdThd_mountArchive_c(u8); + static mDoDvdThd_mountArchive_c* create(char const*, u8, JKRHeap*); + virtual BOOL execute(); + + JKRMemArchive* getArchive() const { return mArchive; } + JKRHeap* getHeap() const { return mHeap; } + +private: + /* 0x14 */ u8 mMountDirection; + /* 0x18 */ s32 mEntryNum; + /* 0x1C */ JKRMemArchive* mArchive; + /* 0x20 */ JKRHeap* mHeap; +}; // Size = 0x24 + class mDoDvdThd_mountXArchive_c : public mDoDvdThd_command_c { public: virtual ~mDoDvdThd_mountXArchive_c(); mDoDvdThd_mountXArchive_c(u8 mountDirection, JKRArchive::EMountMode mountMode); static mDoDvdThd_mountXArchive_c* create(char const*, u8, JKRArchive::EMountMode); - virtual s32 execute(); + virtual BOOL execute(); JKRArchive* getArchive() const { return mArchive; } @@ -72,42 +84,29 @@ private: /* 0x18 */ s32 mEntryNum; /* 0x1C */ JKRArchive* mArchive; /* 0x20 */ JKRArchive::EMountMode mMountMode; +}; // Size = 0x24 + +class mDoDvdThd_toMainRam_c : public mDoDvdThd_command_c { +public: + mDoDvdThd_toMainRam_c(u8); + static mDoDvdThd_toMainRam_c* create(char const*, u8, JKRHeap*); + virtual ~mDoDvdThd_toMainRam_c(); + virtual BOOL execute(); + + void* getMemAddress() const { return mData; } + s32 getMemSize() const { return mDataSize; } + +private: + /* 0x14 */ u8 mAllocDirection; + /* 0x18 */ s32 mEntryNum; + /* 0x1C */ void* mData; + /* 0x20 */ s32 mDataSize; /* 0x24 */ JKRHeap* mHeap; }; // Size = 0x28 -class mDoDvdThd_mountArchive_c : public mDoDvdThd_command_c { -public: - virtual ~mDoDvdThd_mountArchive_c(); - mDoDvdThd_mountArchive_c(u8); - static mDoDvdThd_mountArchive_c* create(char const*, u8, JKRHeap*); - virtual s32 execute(); - - JKRMemArchive* getArchive() const { return mArchive; } - JKRHeap* getHeap() const { return mHeap; } - -private: - /* 0x14 */ u8 mMountDirection; - /* 0x18 */ s32 mEntryNumber; - /* 0x1C */ JKRMemArchive* mArchive; - /* 0x20 */ JKRHeap* mHeap; -}; // Size = 0x24 - -class mDoDvdThd_callback_c : public mDoDvdThd_command_c { -public: - virtual ~mDoDvdThd_callback_c(); - mDoDvdThd_callback_c(mDoDvdThd_callback_func, void*); - static mDoDvdThd_callback_c* create(mDoDvdThd_callback_func, void*); - virtual s32 execute(); - -private: - /* 0x14 */ mDoDvdThd_callback_func mFunction; - /* 0x18 */ void* mData; - /* 0x1C */ void* mResult; -}; - struct mDoDvdThdStack { u8 stack[4096]; -} __attribute__((aligned(16))); +} __attribute__((aligned(32))); struct mDoDvdThd { static s32 main(void*); @@ -118,6 +117,7 @@ struct mDoDvdThd { static mDoDvdThdStack l_threadStack; static mDoDvdThd_param_c l_param; static bool SyncWidthSound; + static u8 sDefaultDirection; }; #endif /* M_DO_M_DO_DVD_THREAD_H */ diff --git a/src/m_Do/m_Do_dvd_thread.cpp b/src/m_Do/m_Do_dvd_thread.cpp index 00bb96581..a4388ef98 100644 --- a/src/m_Do/m_Do_dvd_thread.cpp +++ b/src/m_Do/m_Do_dvd_thread.cpp @@ -4,154 +4,311 @@ // #include "m_Do/m_Do_dvd_thread.h" -#include "dolphin/types.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_printf.h" +#include "JSystem/JAudio/JASDvdThread.h" +#include "JSystem/JKernel/JKRDvdRipper.h" +#include "JSystem/JKernel/JKRMemArchive.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "SSystem/SComponent/c_list.h" +#include "dolphin/dvd/dvd.h" + +u8 dummy[0x0c]; +OSThread mDoDvdThd::l_thread; +mDoDvdThdStack mDoDvdThd::l_threadStack; +mDoDvdThd_param_c mDoDvdThd::l_param; +bool mDoDvdThd::SyncWidthSound; +u8 mDoDvdThd::sDefaultDirection; /* 80017EF8-80017F54 .text main__9mDoDvdThdFPv */ -void mDoDvdThd::main(void*) { - /* Nonmatching */ +s32 mDoDvdThd::main(void* userData) { + { JKRThread thread(OSGetCurrentThread(), 0); } + + JKRHeap* heap = NULL; + heap->becomeCurrentHeap(); + + mDoDvdThd_param_c* param = (mDoDvdThd_param_c*)userData; + param->mainLoop(); + return 0; } /* 80017F54-80017FB0 .text create__9mDoDvdThdFl */ -void mDoDvdThd::create(long) { - /* Nonmatching */ +void mDoDvdThd::create(s32 priority) { + OSCreateThread(&l_thread, main, &l_param, l_threadStack.stack + sizeof(l_threadStack), sizeof(l_threadStack), priority, 1); + OSResumeThread(&l_thread); } /* 80017FB0-80017FD8 .text suspend__9mDoDvdThdFv */ void mDoDvdThd::suspend() { - /* Nonmatching */ + OSSuspendThread(&l_thread); } /* 80017FD8-80018038 .text my_DVDConvertPathToEntrynum__FPCc */ -void my_DVDConvertPathToEntrynum(const char*) { - /* Nonmatching */ +s32 my_DVDConvertPathToEntrynum(const char* path) { + s32 entryNo = DVDConvertPathToEntrynum(path); + if (entryNo < 0) + JUT_WARN(0x240, "can't open:[%s]\n", path); + return entryNo; } /* 80018038-80018080 .text __dt__19mDoDvdThd_command_cFv */ mDoDvdThd_command_c::~mDoDvdThd_command_c() { - /* Nonmatching */ } /* 80018080-800180C8 .text __ct__17mDoDvdThd_param_cFv */ mDoDvdThd_param_c::mDoDvdThd_param_c() { - /* Nonmatching */ + OSInitMessageQueue(&mMessageQueue, mMessageBuf, ARRAY_SIZE(mMessageBuf)); + OSInitMutex(&mMutex); + cLs_Create(&mCommandList); } /* 800180C8-800180F0 .text kick__17mDoDvdThd_param_cFv */ void mDoDvdThd_param_c::kick() { - /* Nonmatching */ + OSSendMessage(&mMessageQueue, NULL, 0); } /* 800180F0-80018118 .text waitForKick__17mDoDvdThd_param_cFv */ -void mDoDvdThd_param_c::waitForKick() { - /* Nonmatching */ +s32 mDoDvdThd_param_c::waitForKick() { + OSReceiveMessage(&mMessageQueue, NULL, 1); } /* 80018118-80018120 .text getFirstCommand__17mDoDvdThd_param_cFv */ -void mDoDvdThd_param_c::getFirstCommand() { - /* Nonmatching */ +mDoDvdThd_command_c* mDoDvdThd_param_c::getFirstCommand() { + return (mDoDvdThd_command_c*) LIST_GET_HEAD(&mCommandList); } /* 80018120-80018178 .text addition__17mDoDvdThd_param_cFP19mDoDvdThd_command_c */ -void mDoDvdThd_param_c::addition(mDoDvdThd_command_c*) { - /* Nonmatching */ +void mDoDvdThd_param_c::addition(mDoDvdThd_command_c* cmd) { + OSLockMutex(&mMutex); + cLs_Addition(&mCommandList, cmd); + OSUnlockMutex(&mMutex); + kick(); } /* 80018178-800181CC .text cut__17mDoDvdThd_param_cFP19mDoDvdThd_command_c */ -void mDoDvdThd_param_c::cut(mDoDvdThd_command_c*) { - /* Nonmatching */ +void mDoDvdThd_param_c::cut(mDoDvdThd_command_c* cmd) { + OSLockMutex(&mMutex); + cLs_SingleCut(cmd); + OSUnlockMutex(&mMutex); + kick(); } /* 800181CC-8001821C .text cb__FPv */ -void cb(void*) { - /* Nonmatching */ +static s32 cb(void* userData) { + mDoDvdThd_command_c** cmd = (mDoDvdThd_command_c**)userData; + if ((*cmd)->execute() != 1) { + OSReport_Error("mDoDvdThd_param_c::mainLoop() コマンドの実行が失敗しました。\n"); + } + return false; } /* 8001821C-800182B4 .text mainLoop__17mDoDvdThd_param_cFv */ void mDoDvdThd_param_c::mainLoop() { - /* Nonmatching */ + while (waitForKick()) { + while (mDoDvdThd_command_c* cmd = this->getFirstCommand()) { + cut(cmd); + if (mDoDvdThd::SyncWidthSound) { + JASystem::Dvd::sendCmdMsg(cb, &cmd, 0x04); + } else { + cb(&cmd); + } + } + } } /* 800182B4-800182F8 .text __ct__19mDoDvdThd_command_cFv */ mDoDvdThd_command_c::mDoDvdThd_command_c() { - /* Nonmatching */ + mIsDone = false; + cNd_ForcedClear(this); } /* 800182F8-80018358 .text __dt__20mDoDvdThd_callback_cFv */ mDoDvdThd_callback_c::~mDoDvdThd_callback_c() { - /* Nonmatching */ } /* 80018358-800183B4 .text __ct__20mDoDvdThd_callback_cFPFPv_PvPv */ -mDoDvdThd_callback_c::mDoDvdThd_callback_c(void* (*)(void*), void*) { - /* Nonmatching */ +mDoDvdThd_callback_c::mDoDvdThd_callback_c(mDoDvdThd_callback_func func, void* userData) { + mFunc = func; + mUserData = userData; + mResult = NULL; } /* 800183B4-80018430 .text create__20mDoDvdThd_callback_cFPFPv_PvPv */ -void mDoDvdThd_callback_c::create(void* (*)(void*), void*) { - /* Nonmatching */ +mDoDvdThd_callback_c* mDoDvdThd_callback_c::create(mDoDvdThd_callback_func func, void* userData) { + mDoDvdThd_callback_c* cmd = new (mDoExt_getCommandHeap(), -4) mDoDvdThd_callback_c(func, userData); + if (cmd != NULL) + mDoDvdThd::l_param.addition(cmd); + return cmd; } /* 80018430-80018484 .text execute__20mDoDvdThd_callback_cFv */ -void mDoDvdThd_callback_c::execute() { - /* Nonmatching */ +BOOL mDoDvdThd_callback_c::execute() { + mResult = mFunc(mUserData); + mIsDone = true; + return mResult != NULL; } /* 80018484-800184E4 .text __dt__24mDoDvdThd_mountArchive_cFv */ mDoDvdThd_mountArchive_c::~mDoDvdThd_mountArchive_c() { - /* Nonmatching */ } /* 800184E4-80018554 .text __ct__24mDoDvdThd_mountArchive_cFUc */ -mDoDvdThd_mountArchive_c::mDoDvdThd_mountArchive_c(unsigned char) { - /* Nonmatching */ +mDoDvdThd_mountArchive_c::mDoDvdThd_mountArchive_c(u8 direction) { + mMountDirection = direction; + mEntryNum = -1; + mArchive = NULL; + mHeap = NULL; + if (direction == 0) + mMountDirection = mDoDvdThd::sDefaultDirection; } /* 80018554-8001861C .text create__24mDoDvdThd_mountArchive_cFPCcUcP7JKRHeap */ -void mDoDvdThd_mountArchive_c::create(const char*, unsigned char, JKRHeap*) { - /* Nonmatching */ +mDoDvdThd_mountArchive_c* mDoDvdThd_mountArchive_c::create(const char* path, u8 direction, JKRHeap* heap) { + mDoDvdThd_mountArchive_c* cmd = new (mDoExt_getCommandHeap(), -4) mDoDvdThd_mountArchive_c(direction); + if (cmd != NULL) { + s32 entryNumber = my_DVDConvertPathToEntrynum(path); + cmd->mEntryNum = entryNumber; + if (cmd->mEntryNum == -1) { + cmd->mIsDone = true; + delete cmd; + cmd = NULL; + } else { + cmd->mHeap = heap; + mDoDvdThd::l_param.addition(cmd); + } + } + return cmd; } /* 8001861C-80018770 .text execute__24mDoDvdThd_mountArchive_cFv */ -void mDoDvdThd_mountArchive_c::execute() { - /* Nonmatching */ +BOOL mDoDvdThd_mountArchive_c::execute() { + JKRHeap* heap = mHeap != NULL ? mHeap : mDoExt_getArchiveHeap(); + + while (true) { + JKRMemArchive* arc; + if (mMountDirection == 0) { + arc = new (heap, 0) JKRMemArchive(mEntryNum, JKRArchive::MOUNT_DIRECTION_HEAD); + } else { + arc = new (heap, -4) JKRMemArchive(mEntryNum, JKRArchive::MOUNT_DIRECTION_TAIL); + } + + if (arc != NULL && arc->isMounted()) { + mArchive = arc; + break; + } + + OSReport_Error("mDoDvdThd_mountArchive_c::execute マウント失敗\n"); + if (arc != NULL) + delete arc; + + if (heap != mDoExt_getZeldaHeap()) { + OSReport_Error("mDoDvdThd_mountArchive_c::execute システムヒープで再チャレンジ!\n"); + heap = mDoExt_getZeldaHeap(); + continue; + } + + OSReport_FatalError("mDoDvdThd_mountArchive_c::execute ヒープが致命的に足りません!\n"); + break; + } + + mIsDone = true; + return mArchive != NULL; } /* 80018770-800187D0 .text __dt__25mDoDvdThd_mountXArchive_cFv */ mDoDvdThd_mountXArchive_c::~mDoDvdThd_mountXArchive_c() { - /* Nonmatching */ } /* 800187D0-80018844 .text __ct__25mDoDvdThd_mountXArchive_cFUcQ210JKRArchive10EMountMode */ -mDoDvdThd_mountXArchive_c::mDoDvdThd_mountXArchive_c(unsigned char, JKRArchive::EMountMode) { - /* Nonmatching */ +mDoDvdThd_mountXArchive_c::mDoDvdThd_mountXArchive_c(u8 direction, JKRArchive::EMountMode mountMode) { + mMountDirection = direction; + mEntryNum = -1; + mArchive = NULL; + mMountMode = mountMode; + if (direction == 0) + mMountDirection = mDoDvdThd::sDefaultDirection; } /* 80018844-8001890C .text create__25mDoDvdThd_mountXArchive_cFPCcUcQ210JKRArchive10EMountMode */ -void mDoDvdThd_mountXArchive_c::create(const char*, unsigned char, JKRArchive::EMountMode) { - /* Nonmatching */ +mDoDvdThd_mountXArchive_c* mDoDvdThd_mountXArchive_c::create(const char* path, u8 direction, JKRArchive::EMountMode mountMode) { + mDoDvdThd_mountXArchive_c* cmd = new (mDoExt_getCommandHeap(), -4) mDoDvdThd_mountXArchive_c(direction, mountMode); + if (cmd != NULL) { + s32 entryNumber = my_DVDConvertPathToEntrynum(path); + cmd->mEntryNum = entryNumber; + if (cmd->mEntryNum == -1) { + cmd->mIsDone = true; + delete cmd; + cmd = NULL; + } else { + mDoDvdThd::l_param.addition(cmd); + } + } + return cmd; } /* 8001890C-80018984 .text execute__25mDoDvdThd_mountXArchive_cFv */ -void mDoDvdThd_mountXArchive_c::execute() { - /* Nonmatching */ +BOOL mDoDvdThd_mountXArchive_c::execute() { + JKRArchive::EMountDirection mountDir = mMountDirection == 0 ? JKRArchive::MOUNT_DIRECTION_HEAD : JKRArchive::MOUNT_DIRECTION_TAIL; + mArchive = JKRArchive::mount(mEntryNum, mMountMode, mDoExt_getArchiveHeap(), mountDir); + BOOL ret = getArchive() != NULL; + mIsDone = true; + return ret; } /* 80018984-800189E0 .text __ct__21mDoDvdThd_toMainRam_cFUc */ -mDoDvdThd_toMainRam_c::mDoDvdThd_toMainRam_c(unsigned char) { - /* Nonmatching */ +mDoDvdThd_toMainRam_c::mDoDvdThd_toMainRam_c(u8 direction) { + mAllocDirection = direction; + if (direction == 0) + mAllocDirection = mDoDvdThd::sDefaultDirection; } /* 800189E0-80018AA8 .text create__21mDoDvdThd_toMainRam_cFPCcUcP7JKRHeap */ -void mDoDvdThd_toMainRam_c::create(const char*, unsigned char, JKRHeap*) { - /* Nonmatching */ +mDoDvdThd_toMainRam_c* mDoDvdThd_toMainRam_c::create(const char* path, u8 direction, JKRHeap* heap) { + mDoDvdThd_toMainRam_c* cmd = new (mDoExt_getCommandHeap(), -4) mDoDvdThd_toMainRam_c(direction); + if (cmd != NULL) { + s32 entryNumber = my_DVDConvertPathToEntrynum(path); + cmd->mEntryNum = entryNumber; + if (cmd->mEntryNum == -1) { + cmd->mIsDone = true; + delete cmd; + cmd = NULL; + } else { + cmd->mHeap = heap; + mDoDvdThd::l_param.addition(cmd); + } + } + return cmd; } /* 80018AA8-80018B08 .text __dt__21mDoDvdThd_toMainRam_cFv */ mDoDvdThd_toMainRam_c::~mDoDvdThd_toMainRam_c() { - /* Nonmatching */ } /* 80018B08-80018BB8 .text execute__21mDoDvdThd_toMainRam_cFv */ -void mDoDvdThd_toMainRam_c::execute() { - /* Nonmatching */ +BOOL mDoDvdThd_toMainRam_c::execute() { + JKRHeap* heap; + if (mHeap != NULL) { + heap = mHeap; + } else { + heap = mDoExt_getArchiveHeap(); + } + + JKRDvdRipper::EAllocDirection allocDir = mAllocDirection == 0 ? JKRDvdRipper::ALLOC_DIRECTION_FORWARD : JKRDvdRipper::ALLOC_DIRECTION_BACKWARD; + mData = JKRDvdRipper::loadToMainRAM(mEntryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, heap, allocDir, 0, NULL); + if (mData != NULL) + mDataSize = heap->getSize(mData); + mIsDone = true; + return mData != NULL; +} + +static void dummy2() { + OSReport("mArchive != 0"); + OSReport("Halt"); + OSReport("archive"); + OSReport("mDoDvdThd_getResource_c::create() クラス生成に失敗\n"); + OSReport("mDoDvdThd_getResource_c::create() リソース取得に失敗\n"); + OSReport("entry"); + OSReport("mArchive"); + OSReport("mDoDvdThd_getResource_c::execute() リソース取得に失敗\n"); + OSReport("mEntryNum != -1"); }