m_Do_dvd_thread 99%

just a link issue
This commit is contained in:
Jasper St. Pierre
2023-11-25 12:58:20 -08:00
parent 66f32083af
commit 95b994f9d2
3 changed files with 264 additions and 107 deletions
+1 -1
View File
@@ -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 */
+55 -55
View File
@@ -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 */
+208 -51
View File
@@ -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");
}