Files
tww/src/m_Do/m_Do_dvd_thread.cpp
T
2024-10-29 00:22:32 -04:00

325 lines
11 KiB
C++

//
// Generated by dtk
// Translation Unit: m_Do_dvd_thread.cpp
//
#include "m_Do/m_Do_dvd_thread.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"
static u8 dummy[0x0c];
OSThread mDoDvdThd::l_thread;
mDoDvdThdStack mDoDvdThd::l_threadStack;
mDoDvdThd_param_c mDoDvdThd::l_param;
bool mDoDvdThd::SyncWidthSound = false;
u8 mDoDvdThd::sDefaultDirection = JKRArchive::DEFAULT_MOUNT_DIRECTION;
/* 80017EF8-80017F54 .text main__9mDoDvdThdFPv */
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(s32 priority) {
OSCreateThread(&l_thread, (void*)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() {
OSSuspendThread(&l_thread);
}
/* 80017FD8-80018038 .text my_DVDConvertPathToEntrynum__FPCc */
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() {
}
/* 80018080-800180C8 .text __ct__17mDoDvdThd_param_cFv */
mDoDvdThd_param_c::mDoDvdThd_param_c() {
OSInitMessageQueue(&mMessageQueue, mMessageBuf, ARRAY_SIZE(mMessageBuf));
OSInitMutex(&mMutex);
cLs_Create(&mCommandList);
}
/* 800180C8-800180F0 .text kick__17mDoDvdThd_param_cFv */
void mDoDvdThd_param_c::kick() {
OSSendMessage(&mMessageQueue, NULL, 0);
}
/* 800180F0-80018118 .text waitForKick__17mDoDvdThd_param_cFv */
BOOL mDoDvdThd_param_c::waitForKick() {
return OSReceiveMessage(&mMessageQueue, NULL, 1);
}
/* 80018118-80018120 .text getFirstCommand__17mDoDvdThd_param_cFv */
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* 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* cmd) {
OSLockMutex(&mMutex);
cLs_SingleCut(cmd);
OSUnlockMutex(&mMutex);
kick();
}
/* 800181CC-8001821C .text cb__FPv */
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() {
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() {
mIsDone = false;
cNd_ForcedClear(this);
}
/* 800182F8-80018358 .text __dt__20mDoDvdThd_callback_cFv */
mDoDvdThd_callback_c::~mDoDvdThd_callback_c() {
}
/* 80018358-800183B4 .text __ct__20mDoDvdThd_callback_cFPFPv_PvPv */
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 */
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 */
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() {
}
/* 800184E4-80018554 .text __ct__24mDoDvdThd_mountArchive_cFUc */
mDoDvdThd_mountArchive_c::mDoDvdThd_mountArchive_c(u8 direction) {
mMountDirection = direction;
mEntryNum = -1;
mArchive = NULL;
mHeap = NULL;
if (direction == JKRArchive::DEFAULT_MOUNT_DIRECTION)
mMountDirection = mDoDvdThd::sDefaultDirection;
}
/* 80018554-8001861C .text create__24mDoDvdThd_mountArchive_cFPCcUcP7JKRHeap */
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 */
BOOL mDoDvdThd_mountArchive_c::execute() {
JKRHeap* heap = mHeap != NULL ? mHeap : mDoExt_getArchiveHeap();
while (true) {
JKRMemArchive* arc;
if (mMountDirection == JKRArchive::DEFAULT_MOUNT_DIRECTION) {
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() {
}
/* 800187D0-80018844 .text __ct__25mDoDvdThd_mountXArchive_cFUcQ210JKRArchive10EMountMode */
mDoDvdThd_mountXArchive_c::mDoDvdThd_mountXArchive_c(u8 direction, JKRArchive::EMountMode mountMode) {
mMountDirection = direction;
mEntryNum = -1;
mArchive = NULL;
mMountMode = mountMode;
if (direction == JKRArchive::DEFAULT_MOUNT_DIRECTION)
mMountDirection = mDoDvdThd::sDefaultDirection;
}
/* 80018844-8001890C .text create__25mDoDvdThd_mountXArchive_cFPCcUcQ210JKRArchive10EMountMode */
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 */
BOOL mDoDvdThd_mountXArchive_c::execute() {
JKRArchive::EMountDirection mountDir;
if (mMountDirection == JKRArchive::DEFAULT_MOUNT_DIRECTION) {
mountDir = JKRArchive::MOUNT_DIRECTION_HEAD;
} else {
mountDir = 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(u8 direction) {
mAllocDirection = direction;
if (direction == JKRArchive::DEFAULT_MOUNT_DIRECTION)
mAllocDirection = mDoDvdThd::sDefaultDirection;
}
/* 800189E0-80018AA8 .text create__21mDoDvdThd_toMainRam_cFPCcUcP7JKRHeap */
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() {
}
/* 80018B08-80018BB8 .text execute__21mDoDvdThd_toMainRam_cFv */
BOOL mDoDvdThd_toMainRam_c::execute() {
JKRHeap* heap;
if (mHeap != NULL) {
heap = mHeap;
} else {
heap = mDoExt_getArchiveHeap();
}
JKRDvdRipper::EAllocDirection allocDir;
if (mAllocDirection == JKRDvdRipper::DEFAULT_EALLOC_DIRECTION) {
allocDir = JKRDvdRipper::ALLOC_DIRECTION_FORWARD;
} else {
allocDir = 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");
}