diff options
| author | Caroline Madsen <69010899+randomsalience@users.noreply.github.com> | 2024-02-11 00:29:35 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-11 07:29:35 +0200 |
| commit | d183f6593a45538312844559c0801f7331185bdd (patch) | |
| tree | a3711bafc5345a3081139d9fec8630eaea1a79f6 /libs | |
| parent | df653e1d34b91659b22344dcaae44d846ab4e7bd (diff) | |
JAS work (#2069)
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/JSystem/JAudio2/JASAramStream.cpp | 803 | ||||
| -rw-r--r-- | libs/JSystem/JAudio2/JASBasicWaveBank.cpp | 6 | ||||
| -rw-r--r-- | libs/JSystem/JAudio2/JASChannel.cpp | 768 | ||||
| -rw-r--r-- | libs/JSystem/JAudio2/JASDSPChannel.cpp | 383 | ||||
| -rw-r--r-- | libs/JSystem/JAudio2/JASDSPInterface.cpp | 7 | ||||
| -rw-r--r-- | libs/JSystem/JAudio2/JASDrumSet.cpp | 2 | ||||
| -rw-r--r-- | libs/JSystem/JAudio2/JASHeapCtrl.cpp | 4 | ||||
| -rw-r--r-- | libs/JSystem/JAudio2/JASTaskThread.cpp | 58 |
8 files changed, 1301 insertions, 730 deletions
diff --git a/libs/JSystem/JAudio2/JASAramStream.cpp b/libs/JSystem/JAudio2/JASAramStream.cpp index 4831c5f8ef..1084f2675c 100644 --- a/libs/JSystem/JAudio2/JASAramStream.cpp +++ b/libs/JSystem/JAudio2/JASAramStream.cpp @@ -4,56 +4,25 @@ // #include "JSystem/JAudio2/JASAramStream.h" +#include "JSystem/JAudio2/JASAiCtrl.h" +#include "JSystem/JAudio2/JASChannel.h" +#include "JSystem/JAudio2/JASCriticalSection.h" +#include "JSystem/JAudio2/JASDSPInterface.h" +#include "JSystem/JAudio2/JASDriverIF.h" +#include "JSystem/JAudio2/JASDvdThread.h" +#include "JSystem/JKernel/JKRAram.h" +#include "JSystem/JKernel/JKRSolidHeap.h" #include "dol2asm.h" // // Types: // -struct JKRHeap {}; - -struct JKRExpandSwitch {}; - -struct JKRAram { - /* 802D233C */ void mainRamToAram(u8*, u32, u32, JKRExpandSwitch, u32, JKRHeap*, int, u32*); -}; - -struct JASTaskThread { - /* 8028FB5C */ void sendCmdMsg(void (*)(void*), void const*, u32); - /* 8028FC54 */ void sendCmdMsg(void (*)(void*), void*); -}; - -struct JASOscillator { - struct Data {}; -}; - -template <typename A0> -struct JASMemPool_MultiThreaded {}; /* JASMemPool_MultiThreaded<JASChannel> */ struct JASMemPool_MultiThreaded__template2 { /* 802978DC */ void func_802978DC(void* _this); }; -struct JASGenericMemPool { - /* 80290848 */ JASGenericMemPool(); - /* 80290860 */ ~JASGenericMemPool(); - /* 80290948 */ void alloc(u32); -}; - -struct JASDriver { - /* 8029C9E8 */ void getDacRate(); - /* 8029E1C4 */ void rejectCallback(s32 (*)(void*), void*); - /* 8029E274 */ void registerSubFrameCallback(s32 (*)(void*), void*); -}; - -struct JASChannel { - /* 8029A800 */ JASChannel(void (*)(u32, JASChannel*, JASDsp::TChannel*, void*), void*); - /* 8029AA60 */ void playForce(); - /* 8029AAD0 */ void release(u16); - /* 8029AB64 */ void setOscInit(u32, JASOscillator::Data const*); - /* 8029AB98 */ void setMixConfig(u32, u16); -}; - // // Forward References: // @@ -119,7 +88,6 @@ extern "C" void _restgpr_25(); extern "C" void _restgpr_26(); extern "C" void _restgpr_28(); extern "C" void _restgpr_29(); -extern "C" extern u8 JASDram[4]; // // Declarations: @@ -127,33 +95,41 @@ extern "C" extern u8 JASDram[4]; /* ############################################################################################## */ /* 80451250-80451254 000750 0004+00 6/6 0/0 0/0 .sbss sLoadThread__13JASAramStream */ -u8 JASAramStream::sLoadThread[4]; +JASTaskThread* JASAramStream::sLoadThread; /* 80451254-80451258 000754 0004+00 3/3 0/0 0/0 .sbss sReadBuffer__13JASAramStream */ -u8 JASAramStream::sReadBuffer[4]; +u8* JASAramStream::sReadBuffer; /* 80451258-8045125C 000758 0004+00 6/6 1/1 0/0 .sbss sBlockSize__13JASAramStream */ u32 JASAramStream::sBlockSize; /* 8045125C-80451260 00075C 0004+00 1/1 0/0 0/0 .sbss sChannelMax__13JASAramStream */ -u8 JASAramStream::sChannelMax[4]; +u32 JASAramStream::sChannelMax; /* 80451260-80451268 -00001 0008+00 8/8 4/4 0/0 .sbss None */ /* 80451260 0001+00 data_80451260 None */ /* 80451261 0001+00 data_80451261 None */ /* 80451262 0006+00 data_80451262 None */ -extern u8 struct_80451260[8]; -u8 struct_80451260[8]; +extern bool struct_80451260; +extern bool struct_80451261; +extern u32 struct_80451264; +bool struct_80451260; +bool struct_80451261; +u32 struct_80451264; /* 8029631C-802963A8 290C5C 008C+00 0/0 1/1 0/0 .text initSystem__13JASAramStreamFUlUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::initSystem(u32 param_0, u32 param_1) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/initSystem__13JASAramStreamFUlUl.s" +void JASAramStream::initSystem(u32 i_blockSize, u32 i_channelMax) { + if (JASDriver::registerSubFrameCallback(dvdErrorCheck, NULL)) { + if (sLoadThread == NULL) { + sLoadThread = JASDvd::getThreadPointer(); + } + sReadBuffer = new (JASDram, 0x20) u8[(i_blockSize + 0x20) * i_channelMax]; + sBlockSize = i_blockSize; + sChannelMax = i_channelMax; + struct_80451260 = false; + struct_80451261 = false; + } } -#pragma pop /* ############################################################################################## */ /* 80455610-80455614 003C10 0004+00 3/3 0/0 0/0 .sdata2 @390 */ @@ -171,6 +147,53 @@ SECTION_SDATA2 static f32 lit_391 = 1.0f; SECTION_SDATA2 static f32 lit_392 = 0.5f; /* 802963A8-8029649C 290CE8 00F4+00 0/0 1/1 0/0 .text __ct__13JASAramStreamFv */ +#ifdef NONMATCHING +JASAramStream::JASAramStream() { + field_0x0a8 = NULL; + field_0x0ac = false; + field_0x0ad = false; + field_0x0ae = 0; + field_0x0b0 = 0; + field_0x0b4 = 0; + field_0x0b8 = 0; + field_0x0bc = 0; + field_0x0c0 = false; + field_0x0c4 = 0; + field_0x0c8 = 0.0f; + field_0x108 = 0; + field_0x10c = 0; + mBlock = 0; + field_0x114 = 0; + field_0x118 = 0; + field_0x12c = 0; + field_0x148 = 0; + field_0x14c = 0; + mCallback = NULL; + mCallbackData = NULL; + field_0x158 = 0; + mChannelNum = 0; + mBufCount = 0; + field_0x160 = 0; + field_0x164 = 0; + mLoop = false; + mLoopStart = 0; + mLoopEnd = 0; + mVolume = 1.0f; + mPitch = 1.0f; + for (int i = 0; i < 6; i++) { + mChannels[i] = NULL; + field_0x130[i] = 0; + field_0x13c[i] = 0; + mChannelVolume[i] = 1.0f; + mChannelPan[i] = 0.5f; + mChannelFxMix[i] = 0.0f; + mChannelDolby[i] = 0.0f; + } + for (int i = 0; i < 6; i++) { + field_0x1dc[i] = 0; + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -179,132 +202,160 @@ asm JASAramStream::JASAramStream() { #include "asm/JSystem/JAudio2/JASAramStream/__ct__13JASAramStreamFv.s" } #pragma pop +#endif /* 8029649C-8029655C 290DDC 00C0+00 0/0 1/1 0/0 .text * init__13JASAramStreamFUlUlPFUlP13JASAramStreamPv_vPv */ +#ifdef NONMATCHING +void JASAramStream::init(u32 param_0, u32 param_1, StreamCallback i_callback, void* i_callbackData) { + field_0x148 = param_0; + field_0x14c = param_1; + field_0x0c8 = 0.0f; + field_0x0ae = 0; + field_0x0ac = false; + field_0x0ad = false; + field_0x114 = 0; + mChannelNum = 0; + for (int i = 0; i < 6; i++) { + mChannelVolume[i] = 1.0f; + mChannelPan[i] = 0.5f; + mChannelFxMix[i] = 0.0f; + mChannelDolby[i] = 0.0f; + } + mVolume = 1.0f; + mPitch = 1.0f; + field_0x1dc[0] = 0xffff; + mCallback = i_callback; + mCallbackData = i_callbackData; + OSInitMessageQueue(&field_0x000, field_0x040, 0x10); + OSInitMessageQueue(&field_0x020, field_0x080, 4); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void JASAramStream::init(u32 param_0, u32 param_1, void (*param_2)(u32, JASAramStream*, void*), - void* param_3) { +asm void JASAramStream::init(u32 param_0, u32 param_1, StreamCallback i_callback, void* param_3) { nofralloc #include "asm/JSystem/JAudio2/JASAramStream/init__13JASAramStreamFUlUlPFUlP13JASAramStreamPv_vPv.s" } #pragma pop +#endif /* 8029655C-80296618 290E9C 00BC+00 0/0 1/1 0/0 .text prepare__13JASAramStreamFli */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm bool JASAramStream::prepare(s32 param_0, int param_1) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/prepare__13JASAramStreamFli.s" +bool JASAramStream::prepare(s32 param_0, int param_1) { + if (!DVDFastOpen(param_0, &mDvdFileInfo)) { + return false; + } + if (!JASDriver::registerSubFrameCallback(channelProcCallback, this)) { + return false; + } + TaskData data; + data.stream = this; + data.field_0x4 = field_0x14c; + data.field_0x8 = param_1; + if (!sLoadThread->sendCmdMsg(headerLoadTask, &data, 0xc)) { + JASDriver::rejectCallback(channelProcCallback, this); + return false; + } + return true; } -#pragma pop /* 80296618-8029664C 290F58 0034+00 0/0 1/1 0/0 .text start__13JASAramStreamFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm bool JASAramStream::start() { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/start__13JASAramStreamFv.s" +bool JASAramStream::start() { + return OSSendMessage(&field_0x000, (OSMessage)0, OS_MESSAGE_NOBLOCK); } -#pragma pop /* 8029664C-80296684 290F8C 0038+00 0/0 1/1 0/0 .text stop__13JASAramStreamFUs */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::stop(u16 param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/stop__13JASAramStreamFUs.s" +bool JASAramStream::stop(u16 param_0) { + return OSSendMessage(&field_0x000, (OSMessage)(param_0 << 0x10 | 1), OS_MESSAGE_NOBLOCK); } -#pragma pop /* 80296684-802966CC 290FC4 0048+00 0/0 1/1 0/0 .text pause__13JASAramStreamFb */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::pause(bool param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/pause__13JASAramStreamFb.s" +bool JASAramStream::pause(bool param_0) { + OSMessage msg; + if (param_0) { + msg = (OSMessage)2; + } else { + msg = (OSMessage)3; + } + if (!OSSendMessage(&field_0x000, msg, OS_MESSAGE_NOBLOCK)) { + return false; + } + return true; } -#pragma pop /* 802966CC-80296710 29100C 0044+00 0/0 1/1 0/0 .text cancel__13JASAramStreamFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::cancel() { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/cancel__13JASAramStreamFv.s" +bool JASAramStream::cancel() { + field_0x114 = 1; + return sLoadThread->sendCmdMsg(finishTask, this); } -#pragma pop /* 80296710-8029673C 291050 002C+00 4/4 0/0 0/0 .text getBlockSamples__13JASAramStreamCFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::getBlockSamples() const { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/getBlockSamples__13JASAramStreamCFv.s" +u32 JASAramStream::getBlockSamples() const { + if (field_0x158 == 0) { + return (sBlockSize << 4) / 9; + } + return sBlockSize >> 1; } -#pragma pop /* 8029673C-8029676C 29107C 0030+00 1/1 0/0 0/0 .text headerLoadTask__13JASAramStreamFPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::headerLoadTask(void* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/headerLoadTask__13JASAramStreamFPv.s" +void JASAramStream::headerLoadTask(void* i_data) { + TaskData* data = (TaskData*)i_data; + data->stream->headerLoad(data->field_0x4, data->field_0x8); } -#pragma pop /* 8029676C-80296848 2910AC 00DC+00 1/1 0/0 0/0 .text firstLoadTask__13JASAramStreamFPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::firstLoadTask(void* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/firstLoadTask__13JASAramStreamFPv.s" +void JASAramStream::firstLoadTask(void* i_data) { + TaskData* data = (TaskData*)i_data; + JASAramStream* _this = data->stream; + if (!_this->load()) { + return; + } + if (data->field_0x8 > 0) { + data->field_0x8--; + if (data->field_0x8 == 0) { + if (!sLoadThread->sendCmdMsg(prepareFinishTask, _this)) { + struct_80451261 = true; + } + } + } + if (data->field_0x4 != 0) { + data->field_0x4--; + if (!sLoadThread->sendCmdMsg(firstLoadTask, data, 0xc)) { + struct_80451261 = true; + } + JASCriticalSection cs; + _this->field_0x118++; + } } -#pragma pop /* 80296848-80296868 291188 0020+00 1/1 0/0 0/0 .text loadToAramTask__13JASAramStreamFPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::loadToAramTask(void* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/loadToAramTask__13JASAramStreamFPv.s" +void JASAramStream::loadToAramTask(void* i_this) { + ((JASAramStream*)i_this)->load(); } -#pragma pop /* 80296868-802968C8 2911A8 0060+00 2/2 0/0 0/0 .text finishTask__13JASAramStreamFPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::finishTask(void* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/finishTask__13JASAramStreamFPv.s" +void JASAramStream::finishTask(void* i_this) { + JASAramStream* _this = (JASAramStream*)i_this; + JASDriver::rejectCallback(channelProcCallback, _this); + if (_this->mCallback != NULL) { + _this->mCallback(CB_START, _this, _this->mCallbackData); + _this->mCallback = NULL; + } } -#pragma pop /* 802968C8-80296920 291208 0058+00 1/1 0/0 0/0 .text prepareFinishTask__13JASAramStreamFPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::prepareFinishTask(void* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/prepareFinishTask__13JASAramStreamFPv.s" +void JASAramStream::prepareFinishTask(void* i_this) { + JASAramStream* _this = (JASAramStream*)i_this; + OSSendMessage(&_this->field_0x020, (OSMessage)4, OS_MESSAGE_BLOCK); + if (_this->mCallback != NULL) { + _this->mCallback(CB_STOP, _this, _this->mCallbackData); + } } -#pragma pop /* ############################################################################################## */ /* 8045561C-80455620 003C1C 0004+00 1/1 0/0 0/0 .sdata2 @531 */ @@ -314,34 +365,141 @@ SECTION_SDATA2 static f32 lit_531 = 127.0f; SECTION_SDATA2 static f64 lit_533 = 4503599627370496.0 /* cast u32 to float */; /* 80296920-80296AE8 291260 01C8+00 1/1 0/0 0/0 .text headerLoad__13JASAramStreamFUli */ +#ifdef NONMATCHING +// matches with literals +bool JASAramStream::headerLoad(u32 param_0, int param_1) { + if (struct_80451261) { + return false; + } + if (field_0x114 != 0) { + return false; + } + if (DVDReadPrio(&mDvdFileInfo, sReadBuffer, sizeof(Header), 0, 1) < 0) { + struct_80451261 = true; + return false; + } + Header* header = (Header*)sReadBuffer; + field_0x158 = header->format; + mChannelNum = header->channels; + field_0x164 = header->field_0x10; + mLoop = header->loop != 0; + mLoopStart = header->loop_start; + mLoopEnd = header->loop_end; + mVolume = header->field_0x28 / 127.0f; + field_0x118 = 0; + mBlock = 0; + field_0x10c = 0; + field_0x160 = (param_0 / sBlockSize) / header->channels; + mBufCount = field_0x160; + mBufCount--; + field_0x108 = mBufCount; + getBlockSamples(); + if (param_1 < 0 || param_1 > field_0x108) { + param_1 = field_0x108; + } + if (field_0x114 != 0) { + return false; + } + TaskData data; + data.stream = this; + data.field_0x4 = field_0x108 - 1; + data.field_0x8 = param_1; + if (!sLoadThread->sendCmdMsg(firstLoadTask, &data, 0xc)) { + struct_80451261 = true; + return false; + } + JASCriticalSection cs; + field_0x118++; + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void JASAramStream::headerLoad(u32 param_0, int param_1) { +asm bool JASAramStream::headerLoad(u32 param_0, int param_1) { nofralloc #include "asm/JSystem/JAudio2/JASAramStream/headerLoad__13JASAramStreamFUli.s" } #pragma pop +#endif /* 80296AE8-80296D74 291428 028C+00 2/2 0/0 0/0 .text load__13JASAramStreamFv */ +#ifdef NONMATCHING +bool JASAramStream::load() { + { + JASCriticalSection cs; + field_0x118--; + } + if (struct_80451261) { + return false; + } + if (field_0x114 != 0) { + return false; + } + u32 loop_end_block = (mLoopEnd - 1) / getBlockSamples(); + u32 loop_start_block = mLoopStart / getBlockSamples(); + u32 block = mBlock; + if (block > loop_end_block) { + return false; + } + u32 size = sBlockSize * mChannelNum + sizeof(BlockHeader); + u32 offset = block * size + sizeof(Header); + if (DVDReadPrio(&mDvdFileInfo, sReadBuffer, size, offset, 1) < 0) { + struct_80451261 = true; + return false; + } + BlockHeader* bhead = (BlockHeader*)sReadBuffer; + if (field_0x114 != 0) { + return false; + } + u32 uvar2 = field_0x148 + field_0x10c * sBlockSize; + for (int i = 0; i < mChannelNum; i++) { + if (!JKRAram::mainRamToAram(sReadBuffer + bhead->field_0x4 * i + 0x20, + uvar2 + i * field_0x160 * sBlockSize, + bhead->field_0x4, EXPAND_SWITCH_UNKNOWN0, 0, NULL, -1, NULL)) { + struct_80451261 = 1; + return false; + } + } + field_0x10c++; + if (field_0x10c >= field_0x108) { + u32 uvar8 = mBlock - 1 + field_0x108; + if (mLoop) { + for (; uvar8 > loop_end_block; uvar8 = uvar8 - loop_end_block + loop_start_block) {} + } + if (uvar8 == loop_end_block || uvar8 + 2 == loop_end_block) { + field_0x108 = field_0x160; + OSSendMessage(&field_0x020, (OSMessage)5, OS_MESSAGE_BLOCK); + } else { + field_0x108 = field_0x160 - 1; + } + for (int i = 0; i < mChannelNum; i++) { + field_0x130[i] = bhead->field_0x8[i].field_0x0; + field_0x13c[i] = bhead->field_0x8[i].field_0x2; + } + field_0x10c = 0; + } + mBlock++; + if (mBlock > loop_end_block && mLoop) { + mBlock = loop_start_block; + } + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void JASAramStream::load() { +asm bool JASAramStream::load() { nofralloc #include "asm/JSystem/JAudio2/JASAramStream/load__13JASAramStreamFv.s" } #pragma pop +#endif /* 80296D74-80296D94 2916B4 0020+00 2/2 0/0 0/0 .text channelProcCallback__13JASAramStreamFPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::channelProcCallback(void* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/channelProcCallback__13JASAramStreamFPv.s" +s32 JASAramStream::channelProcCallback(void* i_this) { + return ((JASAramStream*)i_this)->channelProc(); } -#pragma pop /* ############################################################################################## */ /* 803C7670-803C76A8 -00001 0034+04 1/1 0/0 0/0 .data @613 */ @@ -365,29 +523,229 @@ SECTION_DATA static void* lit_613[13 + 1 /* padding */] = { /* 80296D94-80296DF0 2916D4 005C+00 2/1 0/0 0/0 .text dvdErrorCheck__13JASAramStreamFPv */ +#ifdef NONMATCHING +s32 JASAramStream::dvdErrorCheck(void* param_0) { + switch (DVDGetDriveStatus()) { + case DVD_STATE_END: + struct_80451260 = false; + break; + case DVD_STATE_WAITING: + case DVD_STATE_COVER_CLOSED: + case DVD_STATE_NO_DISK: + case DVD_STATE_COVER_OPEN: + case DVD_STATE_WRONG_DISK: + case DVD_STATE_MOTOR_STOPPED: + case DVD_STATE_IGNORED: + case 9: + case DVD_STATE_CANCELED: + case DVD_STATE_RETRY: + case DVD_STATE_FATAL_ERROR: + struct_80451260 = true; + break; + } + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void JASAramStream::dvdErrorCheck(void* param_0) { +asm s32 JASAramStream::dvdErrorCheck(void* param_0) { nofralloc #include "asm/JSystem/JAudio2/JASAramStream/dvdErrorCheck__13JASAramStreamFPv.s" } #pragma pop +#endif /* 80296DF0-80296E2C 291730 003C+00 1/1 0/0 0/0 .text * channelCallback__13JASAramStreamFUlP10JASChannelPQ26JASDsp8TChannelPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::channelCallback(u32 param_0, JASChannel* param_1, JASDsp::TChannel* param_2, - void* param_3) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/channelCallback__13JASAramStreamFUlP10JASChannelPQ26JASDsp8TChannelPv.s" +void JASAramStream::channelCallback(u32 i_callbackType, JASChannel* i_channel, + JASDsp::TChannel* i_dspChannel, void* i_this) { + ((JASAramStream*)i_this)->updateChannel(i_callbackType, i_channel, i_dspChannel); } -#pragma pop /* 80296E2C-802974AC 29176C 0680+00 1/1 0/0 0/0 .text * updateChannel__13JASAramStreamFUlP10JASChannelPQ26JASDsp8TChannel */ +#ifdef NONMATCHING +// missing extra loads of field_0x0c4 +void JASAramStream::updateChannel(u32 i_callbackType, JASChannel* i_channel, + JASDsp::TChannel* i_dspChannel) { + u32 block_samples = getBlockSamples(); + switch (i_callbackType) { + case JASChannel::CB_START: + if (field_0x0a8 == NULL) { + field_0x0a8 = i_channel; + field_0x0b4 = block_samples * mBufCount; + field_0x0b8 = 0; + field_0x0b0 = 0; + field_0x0bc = (mLoopEnd - 1) / block_samples; + field_0x0c0 = 0; + field_0x0c4 = 0; + field_0x12c = 0; + } + break; + case JASChannel::CB_PLAY: + if (i_dspChannel->field_0x008 == 0) { + if (i_channel == field_0x0a8) { + field_0x12c = 0; + u32 uvar8 = i_dspChannel->field_0x074 + i_dspChannel->field_0x064; + u32 uvar5 = field_0x0b4; + if (uvar8 <= uvar5) { + field_0x0b8 += uvar5 - uvar8; + } else { + if (!field_0x0c0) { + field_0x0b8 += uvar5; + field_0x0b8 += block_samples * mBufCount - uvar8; + } else { + field_0x0b8 += uvar5; + field_0x0b8 += block_samples * mBufCount - uvar8 + - i_dspChannel->field_0x110; + field_0x0b8 -= mLoopEnd; + field_0x0b8 += mLoopStart; + i_dspChannel->field_0x110 = 0; + field_0x120 = 0; + field_0x12c |= 2; + if (field_0x0c4 < -1) { + field_0x0c4++; + } + field_0x0c0 = false; + } + } + if (field_0x0b8 > mLoopEnd) { + struct_80451261 = true; + } + f32 fvar1 = field_0x0c4; + fvar1 *= mLoopEnd - mLoopStart; + if (field_0x0c4 < -1) { + fvar1 += field_0x0b8; + } + fvar1 /= field_0x164; + field_0x0c8 = fvar1; + if (field_0x0b8 + 400 >= mLoopEnd && !field_0x0c0) { + if (mLoop) { + u32 uvar5 = field_0x0bc + 1; + if (uvar5 >= mBufCount) { + uvar5 = 0; + } + i_dspChannel->field_0x110 = mLoopStart % block_samples + + uvar5 * block_samples; + field_0x120 = i_dspChannel->field_0x110; + field_0x12c |= 2; + } else { + i_dspChannel->field_0x102 = 0; + field_0x128 = 0; + field_0x12c |= 8; + } + i_dspChannel->field_0x074 -= block_samples * mBufCount + - (field_0x0bc * block_samples + mLoopEnd % block_samples); + field_0x11c = i_dspChannel->field_0x074; + field_0x12c |= 1; + field_0x0bc += (mLoopEnd - 1) / block_samples - mLoopStart / block_samples + 1; + field_0x0c0 = true; + } + u32 uvar4 = i_dspChannel->field_0x070 - i_channel->field_0x104; + if (uvar4 != 0) { + uvar4--; + } + uvar5 = uvar4 / sBlockSize; + getBlockSamples(); + if (uvar5 != field_0x0b0) { + bool cmp = uvar5 < field_0x0b0; + while (uvar5 != field_0x0b0) { + if (!sLoadThread->sendCmdMsg(loadToAramTask, this)) { + struct_80451261 = true; + break; + } + { + JASCriticalSection cs; + field_0x118++; + } + field_0x0b0++; + if (field_0x0b0 >= mBufCount) { + field_0x0b0 = 0; + } + } + if (cmp) { + field_0x0bc -= mBufCount; + if (field_0x0ad) { + if (!field_0x0c0) { + i_dspChannel->field_0x074 += block_samples; + field_0x11c = i_dspChannel->field_0x074; + field_0x12c |= 1; + } + i_dspChannel->field_0x114 += block_samples; + field_0x124 = i_dspChannel->field_0x114; + field_0x12c |= 4; + mBufCount = field_0x160; + field_0x0ad = false; + } else { + if (mBufCount != field_0x160 - 1) { + mBufCount = field_0x160 - 1; + i_dspChannel->field_0x114 -= block_samples; + field_0x124 = i_dspChannel->field_0x114; + field_0x12c |= 4; + if (!field_0x0c0) { + i_dspChannel->field_0x074 -= block_samples; + field_0x11c = i_dspChannel->field_0x074; + field_0x12c |= 1; + } + } + } + } + } else { + if (field_0x118 == 0 && !struct_80451260) { + field_0x0ae &= ~2; + field_0x0ae &= ~4; + } + } + field_0x0b4 = i_dspChannel->field_0x074 + i_dspChannel->field_0x064; + if (field_0x118 >= field_0x160 - 2) { + field_0x0ae |= 4; + } + } else { + if (field_0x12c & 1) { + i_dspChannel->field_0x074 = field_0x11c; + } + if (field_0x12c & 2) { + i_dspChannel->field_0x110 = field_0x120; + } + if (field_0x12c & 4) { + i_dspChannel->field_0x114 = field_0x124; + } + if (field_0x12c & 8) { + i_dspChannel->field_0x102 = field_0x128; + } + } + int i = 0; + for (; i < 6; i++) { + if (i_channel == mChannels[i]) { + break; + } + } + i_dspChannel->field_0x104 = field_0x130[i]; + i_dspChannel->field_0x106 = field_0x13c[i]; + } + break; + case JASChannel::CB_STOP: + bool open_channel = false; + for (int i = 0; i < 6; i++) { + if (i_channel == mChannels[i]) { + mChannels[i] = NULL; + } else if (mChannels[i] != NULL) { + open_channel = true; + } + } + if (!open_channel) { + field_0x114 = 1; + if (!sLoadThread->sendCmdMsg(finishTask, this)) { + struct_80451261 = true; + return; + } + } + break; + } + i_channel->mPauseFlag = field_0x0ae != 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -396,36 +754,88 @@ asm void JASAramStream::updateChannel(u32 param_0, JASChannel* param_1, JASDsp:: #include "asm/JSystem/JAudio2/JASAramStream/updateChannel__13JASAramStreamFUlP10JASChannelPQ26JASDsp8TChannel.s" } #pragma pop +#endif /* 802974AC-80297658 291DEC 01AC+00 1/1 0/0 0/0 .text channelProc__13JASAramStreamFv */ +#ifdef NONMATCHING +// regalloc and instruction ordering +s32 JASAramStream::channelProc() { + OSMessage msg; + while (OSReceiveMessage(&field_0x020, &msg, OS_MESSAGE_NOBLOCK)) { + switch ((u32)msg) { + case 4: + field_0x0ac = true; + break; + case 5: + field_0x0ad = true; + break; + } + } + + if (!field_0x0ac) { + return 0; + } + + while (OSReceiveMessage(&field_0x000, &msg, OS_MESSAGE_NOBLOCK)) { + switch ((u32)msg & 0xff) { + case 0: + channelStart(); + break; + case 1: + channelStop((u32)msg >> 0x10); + break; + case 2: + field_0x0ae |= 1; + break; + case 3: + field_0x0ae &= ~1; + break; + } + } + + if (struct_80451261) { + field_0x0ae |= 8; + } + if (struct_80451260) { + field_0x0ae |= 2; + } + + for (int i = 0; i < mChannelNum; i++) { + JASChannel* channel = mChannels[i]; + if (channel != NULL) { + JASChannelParams params; + params.mVolume = mVolume * mChannelVolume[i]; + params.mPitch = mPitch; + params.field_0x8 = 0.0f; + params.mPan = mChannelPan[i]; + params.mFxMix = mChannelFxMix[i]; + params.mDolby = mChannelDolby[i]; + channel->setParams(params); + } + } + + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void JASAramStream::channelProc() { +asm s32 JASAramStream::channelProc() { nofralloc #include "asm/JSystem/JAudio2/JASAramStream/channelProc__13JASAramStreamFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 8039B168-8039B174 0277C8 000C+00 1/0 0/0 0/0 .rodata OSC_RELEASE_TABLE */ -SECTION_RODATA static u8 const OSC_RELEASE_TABLE[12] = { - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, +static JASOscillator::Point const OSC_RELEASE_TABLE[2] = { + {0x0000, 0x0002, 0x0000}, + {0x000F, 0x0000, 0x0000}, }; -COMPILER_STRIP_GATE(0x8039B168, &OSC_RELEASE_TABLE); /* 8039B174-8039B190 -00001 0018+04 1/1 0/0 0/0 .rodata OSC_ENV */ -SECTION_RODATA static void* const OSC_ENV[6 + 1 /* padding */] = { - (void*)NULL, - (void*)0x3F800000, - (void*)NULL, - (void*)&OSC_RELEASE_TABLE, - (void*)0x3F800000, - (void*)NULL, - /* padding */ - NULL, -}; -COMPILER_STRIP_GATE(0x8039B174, &OSC_ENV); +static JASOscillator::Data const OSC_ENV = {0, 1.0f, NULL, OSC_RELEASE_TABLE, 1.0f, 0.0f}; /* 80431B28-80431B34 05E848 000C+00 1/1 0/0 0/0 .bss @792 */ static u8 lit_792[12]; @@ -436,19 +846,48 @@ extern u8 data_80431B34[16 + 4 /* padding */]; u8 data_80431B34[16 + 4 /* padding */]; /* 80455628-80455630 003C28 0004+04 1/1 0/0 0/0 .sdata2 one$776 */ -SECTION_SDATA2 static u8 one[4 + 4 /* padding */] = { - 0x00, - 0x00, - 0x00, - 0x01, - /* padding */ - 0x00, - 0x00, - 0x00, - 0x00, -}; +SECTION_SDATA2 static u32 one = 1; /* 80297658-80297870 291F98 0218+00 1/1 0/0 0/0 .text channelStart__13JASAramStreamFv */ +#ifdef NONMATCHING +// matches with literals and weak fn ordering +void JASAramStream::channelStart() { + u8 r31; + switch (field_0x158) { + case 0: + r31 = 0; + break; + case 1: + r31 = 3; + break; + } + for (int i = 0; i < mChannelNum; i++) { + JASWaveInfo wave_info; + wave_info.field_0x00 = r31; + wave_info.field_0x02 = 0xff; + wave_info.field_0x10 = 0; + wave_info.field_0x14 = mBufCount * getBlockSamples(); + wave_info.field_0x18 = wave_info.field_0x14; + wave_info.field_0x1c = 0; + wave_info.field_0x1e = 0; + // probably a fake match, this should be set in the JASWaveInfo constructor + wave_info.field_0x20 = &one; + JASChannel* channel = new JASChannel(channelCallback, this); + channel->setPriority(0x7f7f); + for (u32 j = 0; j < 6; j++) { + channel->setMixConfig(j, field_0x1dc[j]); + } + channel->setInitPitch(field_0x164 / JASDriver::getDacRate()); + channel->setOscInit(0, &OSC_ENV); + channel->field_0xdc.field_0x4 = wave_info; + channel->field_0x104 = field_0x148 + sBlockSize * field_0x160 * i; + channel->field_0xdc.field_0x0 = 0; + channel->playForce(); + mChannels[i] = channel; + } + field_0x0a8 = NULL; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -457,16 +896,16 @@ asm void JASAramStream::channelStart() { #include "asm/JSystem/JAudio2/JASAramStream/channelStart__13JASAramStreamFv.s" } #pragma pop +#endif /* 80297870-802978DC 2921B0 006C+00 1/1 0/0 0/0 .text channelStop__13JASAramStreamFUs */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAramStream::channelStop(u16 param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAramStream/channelStop__13JASAramStreamFUs.s" +void JASAramStream::channelStop(u16 i_directRelease) { + for (int i = 0; i < mChannelNum; i++) { + if (mChannels[i] != NULL) { + mChannels[i]->release(i_directRelease); + } + } } -#pragma pop /* 802978DC-80297930 29221C 0054+00 1/1 5/5 0/0 .text * __dt__38JASMemPool_MultiThreaded<10JASChannel>Fv */ diff --git a/libs/JSystem/JAudio2/JASBasicWaveBank.cpp b/libs/JSystem/JAudio2/JASBasicWaveBank.cpp index 3491770225..19b4d1f4ce 100644 --- a/libs/JSystem/JAudio2/JASBasicWaveBank.cpp +++ b/libs/JSystem/JAudio2/JASBasicWaveBank.cpp @@ -225,7 +225,7 @@ asm void JASBasicWaveBank::incWaveTable(JASBasicWaveBank::TWaveGroup const* para /* ############################################################################################## */ /* 80451278-80451280 000778 0004+04 2/2 0/0 0/0 .sbss mNoLoad__16JASBasicWaveBank */ -u8 JASBasicWaveBank::mNoLoad[4 + 4 /* padding */]; +u32 JASBasicWaveBank::mNoLoad; /* 8029883C-802988DC 29317C 00A0+00 1/1 0/0 0/0 .text * decWaveTable__16JASBasicWaveBankFPCQ216JASBasicWaveBank10TWaveGroup */ @@ -235,7 +235,7 @@ void JASBasicWaveBank::decWaveTable(JASBasicWaveBank::TWaveGroup const* param_0) TWaveHandle* handle = mWaveTable + param_0->getWaveID(i); if (handle->mHeap == ¶m_0->base.mHeap) { handle->mHeap = NULL; - handle->field_0x4.field_0x20 = mNoLoad; + handle->field_0x4.field_0x20 = &mNoLoad; handle->field_0x4.field_0x08 = -1; } } @@ -260,7 +260,7 @@ void JASBasicWaveBank::setWaveInfo(JASBasicWaveBank::TWaveGroup* wgrp, int index JUT_ASSERT(205, index < wgrp->mWaveCount); JUT_ASSERT(206, index >= 0); mWaveTable[param_2].field_0x4 = param_3; - mWaveTable[param_2].field_0x4.field_0x20 = mNoLoad; + mWaveTable[param_2].field_0x4.field_0x20 = &mNoLoad; mWaveTable[param_2].field_0x4.field_0x08 = -1; wgrp->mCtrlWaveArray[index].field_0x0 = param_2; wgrp->mCtrlWaveArray[index].field_0x4 = param_3.field_0x08; diff --git a/libs/JSystem/JAudio2/JASChannel.cpp b/libs/JSystem/JAudio2/JASChannel.cpp index 1abab78270..8d74d1539a 100644 --- a/libs/JSystem/JAudio2/JASChannel.cpp +++ b/libs/JSystem/JAudio2/JASChannel.cpp @@ -4,48 +4,16 @@ // #include "JSystem/JAudio2/JASChannel.h" +#include "JSystem/JAudio2/JASAiCtrl.h" +#include "JSystem/JAudio2/JASCalc.h" +#include "JSystem/JAudio2/JASDriverIF.h" +#include "JSystem/JAudio2/JASDSPChannel.h" +#include "JSystem/JSupport/JSupport.h" +#include "JSystem/JMath/JMATrigonometric.h" +#include "JSystem/JGeometry.h" #include "dol2asm.h" // -// Types: -// - -struct JMath { - static u8 sincosTable_[65536]; -}; - -namespace JASDsp { - struct TChannel { - /* 8029DD8C */ void setWaveInfo(JASWaveInfo const&, u32, u32); - /* 8029DEAC */ void setOscInfo(u32); - /* 8029DEC4 */ void initAutoMixer(); - /* 8029DEF0 */ void setAutoMixer(u16, u8, u8, u8, u8); - /* 8029DF1C */ void setPitch(u16); - /* 8029DF34 */ void setMixerInitVolume(u8, s16); - /* 8029DF54 */ void setMixerVolume(u8, s16); - /* 8029DF80 */ void setPauseFlag(u8); - /* 8029E09C */ void setBusConnect(u8, u8); - }; -}; - -struct JASDriver { - /* 8029C9E8 */ void getDacRate(); -}; - -struct JASDSPChannel { - /* 8029D320 */ void free(); - /* 8029D330 */ void start(); - /* 8029D340 */ void drop(); - /* 8029D44C */ void alloc(u8, s32 (*)(u32, JASDsp::TChannel*, void*), void*); - /* 8029D4BC */ void allocForce(u8, s32 (*)(u32, JASDsp::TChannel*, void*), void*); - /* 8029D534 */ void setPriority(u8); -}; - -struct JASCalc { - /* 8028F578 */ void pow2(f32); -}; - -// // Forward References: // @@ -129,38 +97,6 @@ extern "C" extern u8 struct_80451260[8]; // Declarations: // -/* ############################################################################################## */ -/* 80455680-80455684 003C80 0004+00 6/6 0/0 0/0 .sdata2 @544 */ -SECTION_SDATA2 static f32 lit_544 = 1.0f; - -/* 80455684-80455688 003C84 0004+00 7/7 0/0 0/0 .sdata2 @545 */ -SECTION_SDATA2 static u8 lit_545[4] = { - 0x00, - 0x00, - 0x00, - 0x00, -}; - -/* 80455688-80455690 003C88 0004+04 6/6 0/0 0/0 .sdata2 @546 */ -SECTION_SDATA2 static f32 lit_546[1 + 1 /* padding */] = { - 0.5f, - /* padding */ - 0.0f, -}; - -/* 8029A800-8029A918 295140 0118+00 0/0 3/3 0/0 .text - * __ct__10JASChannelFPFUlP10JASChannelPQ26JASDsp8TChannelPv_vPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JASChannel::JASChannel(void (*param_0)(u32, JASChannel*, JASDsp::TChannel*, void*), - void* param_1) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/__ct__10JASChannelFPFUlP10JASChannelPQ26JASDsp8TChannelPv_vPv.s" -} -#pragma pop - -/* ############################################################################################## */ /* 80431B90-80431BB0 05E8B0 0020+00 2/2 0/0 0/0 .bss sBankDisposeMsgQ__10JASChannel */ OSMessageQueue JASChannel::sBankDisposeMsgQ; @@ -168,12 +104,55 @@ OSMessageQueue JASChannel::sBankDisposeMsgQ; OSMessage JASChannel::sBankDisposeMsg[16]; /* 80431BF0-80431C30 05E910 0040+00 2/2 0/3 0/0 .bss sBankDisposeList__10JASChannel */ -u32 JASChannel::sBankDisposeList[16]; +OSMessage JASChannel::sBankDisposeList[16]; + +/* 80451298-804512A0 000798 0004+04 3/3 0/0 0/0 .sbss sBankDisposeListSize__10JASChannel + */ +int JASChannel::sBankDisposeListSize; + +/* 8029A800-8029A918 295140 0118+00 0/0 3/3 0/0 .text + * __ct__10JASChannelFPFUlP10JASChannelPQ26JASDsp8TChannelPv_vPv */ +JASChannel::JASChannel(Callback i_callback, void* i_callbackData) : + mStatus(STATUS_INACTIVE), + mDspCh(NULL), + mCallback(i_callback), + mCallbackData(i_callbackData), + mUpdateTimer(0), + mBankDisposeID(NULL), + mKey(0), + mVelocity(0x7f), + mKeySweep(0.0f), + mKeySweepTarget(0.0f), + mKeySweepCount(0), + mSkipSamples(0) +{ + field_0xdc.field_0x0 = 0; + field_0x104 = 0; + mMixConfig[0].whole = 0x150; + mMixConfig[1].whole = 0x210; + mMixConfig[2].whole = 0x352; + mMixConfig[3].whole = 0x412; + mMixConfig[4].whole = 0; + mMixConfig[5].whole = 0; + mPriority = 0x13f; + mPauseFlag = false; +} /* 80431C30-80431C40 05E950 000C+04 1/1 0/2 0/0 .bss @556 */ static u8 lit_556[12 + 4 /* padding */]; /* 8029A918-8029A9F0 295258 00D8+00 5/5 0/0 0/0 .text __dt__10JASChannelFv */ +#ifdef NONMATCHING +// matches with static data +JASChannel::~JASChannel() { + if (mDspCh != NULL) { + mDspCh->drop(); + } + if (mCallback != NULL) { + mCallback(CB_STOP, this, NULL, mCallbackData); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -182,309 +161,480 @@ asm JASChannel::~JASChannel() { #include "asm/JSystem/JAudio2/JASChannel/__dt__10JASChannelFv.s" } #pragma pop +#endif /* 8029A9F0-8029AA60 295330 0070+00 0/0 2/2 0/0 .text play__10JASChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int JASChannel::play() { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/play__10JASChannelFv.s" +int JASChannel::play() { + JASDSPChannel* channel = JASDSPChannel::alloc(JSULoByte(mPriority), dspUpdateCallback, this); + if (channel == NULL) { + delete this; + return 0; + } + mDspCh = channel; + channel->start(); + mStatus = STATUS_ACTIVE; + return 1; } -#pragma pop /* 8029AA60-8029AAD0 2953A0 0070+00 0/0 1/1 0/0 .text playForce__10JASChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::playForce() { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/playForce__10JASChannelFv.s" +int JASChannel::playForce() { + JASDSPChannel* channel = JASDSPChannel::allocForce(JSULoByte(mPriority), + dspUpdateCallback, this); + if (channel == NULL) { + delete this; + return 0; + } + mDspCh = channel; + channel->start(); + mStatus = STATUS_ACTIVE; + return 1; } -#pragma pop /* 8029AAD0-8029AB64 295410 0094+00 0/0 4/4 0/0 .text release__10JASChannelFUs */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::release(u16 param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/release__10JASChannelFUs.s" +void JASChannel::release(u16 i_directRelease) { + if (mStatus == STATUS_ACTIVE) { + if (i_directRelease != 0) { + setDirectRelease(i_directRelease); + } + for (u32 i = 0; i < 2; i++) { + if (mOscillators[i].isValid()) { + mOscillators[i].release(); + } + } + mDspCh->setPriority(JSUHiByte(mPriority)); + mStatus = STATUS_RELEASE; + } } -#pragma pop /* 8029AB64-8029AB98 2954A4 0034+00 0/0 4/4 0/0 .text * setOscInit__10JASChannelFUlPCQ213JASOscillator4Data */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::setOscInit(u32 param_0, JASOscillator::Data const* param_1) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/setOscInit__10JASChannelFUlPCQ213JASOscillator4Data.s" +void JASChannel::setOscInit(u32 i_index, JASOscillator::Data const* i_data) { + mOscillators[i_index].initStart(i_data); } -#pragma pop /* 8029AB98-8029ABA8 2954D8 0010+00 0/0 2/2 0/0 .text setMixConfig__10JASChannelFUlUs */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::setMixConfig(u32 param_0, u16 param_1) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/setMixConfig__10JASChannelFUlUs.s" +void JASChannel::setMixConfig(u32 i_index, u16 i_config) { + mMixConfig[i_index].whole = i_config; } -#pragma pop /* 8029ABA8-8029ABC0 2954E8 0018+00 1/1 0/0 0/0 .text * calcEffect__10JASChannelFPCQ210JASChannel9PanVector */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::calcEffect(JASChannel::PanVector const* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/calcEffect__10JASChannelFPCQ210JASChannel9PanVector.s" +f32 JASChannel::calcEffect(JASChannel::PanVector const* i_vector) { + return i_vector->mSound + i_vector->mEffect + i_vector->mChannel; } -#pragma pop /* 8029ABC0-8029ABEC 295500 002C+00 1/1 0/0 0/0 .text * calcPan__10JASChannelFPCQ210JASChannel9PanVector */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::calcPan(JASChannel::PanVector const* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/calcPan__10JASChannelFPCQ210JASChannel9PanVector.s" +f32 JASChannel::calcPan(JASChannel::PanVector const* i_vector) { + return 0.5f + (i_vector->mSound - 0.5f) + (i_vector->mEffect - 0.5f) + + (i_vector->mChannel - 0.5f); } -#pragma pop - -/* ############################################################################################## */ -/* 803C7848-803C7864 -00001 001C+00 1/1 0/0 0/0 .data @662 */ -SECTION_DATA static void* lit_662[7] = { - (void*)(((char*)effectOsc__10JASChannelFUlPQ213JASOscillator12EffectParams) + 0x68), - (void*)(((char*)effectOsc__10JASChannelFUlPQ213JASOscillator12EffectParams) + 0x58), - (void*)(((char*)effectOsc__10JASChannelFUlPQ213JASOscillator12EffectParams) + 0x78), - (void*)(((char*)effectOsc__10JASChannelFUlPQ213JASOscillator12EffectParams) + 0x94), - (void*)(((char*)effectOsc__10JASChannelFUlPQ213JASOscillator12EffectParams) + 0xA4), - (void*)(((char*)effectOsc__10JASChannelFUlPQ213JASOscillator12EffectParams) + 0xB4), - (void*)(((char*)effectOsc__10JASChannelFUlPQ213JASOscillator12EffectParams) + 0xC4), -}; - -/* 80455690-80455698 003C90 0008+00 1/1 0/0 0/0 .sdata2 @661 */ -SECTION_SDATA2 static f64 lit_661 = 0.5; /* 8029ABEC-8029ACD4 29552C 00E8+00 3/2 0/0 0/0 .text * effectOsc__10JASChannelFUlPQ213JASOscillator12EffectParams */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::effectOsc(u32 param_0, JASOscillator::EffectParams* param_1) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/effectOsc__10JASChannelFUlPQ213JASOscillator12EffectParams.s" +void JASChannel::effectOsc(u32 i_index, JASOscillator::EffectParams* i_params) { + f32 value = mOscillators[i_index].getValue(); + switch (mOscillators[i_index].getTarget()) { + case JASOscillator::TARGET_PITCH: + i_params->mPitch *= value; + break; + case JASOscillator::TARGET_VOLUME: + i_params->mVolume *= value; + break; + case JASOscillator::TARGET_PAN: + value -= 0.5; + i_params->mPan += value; + break; + case JASOscillator::TARGET_FXMIX: + i_params->mFxMix += value; + break; + case JASOscillator::TARGET_DOLBY: + i_params->mDolby += value; + break; + case JASOscillator::TARGET_5: + i_params->_14 *= value; + break; + case JASOscillator::TARGET_6: + i_params->_18 *= value; + break; + } } -#pragma pop - -/* ############################################################################################## */ -/* 80455698-804556A0 003C98 0008+00 3/3 0/0 0/0 .sdata2 @685 */ -SECTION_SDATA2 static f64 lit_685 = 4503601774854144.0 /* cast s32 to float */; /* 8029ACD4-8029AD38 295614 0064+00 0/0 1/1 0/0 .text setKeySweepTarget__10JASChannelFlUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::setKeySweepTarget(s32 param_0, u32 param_1) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/setKeySweepTarget__10JASChannelFlUl.s" +void JASChannel::setKeySweepTarget(s32 i_target, u32 i_count) { + if (i_count == 0) { + mKeySweep = i_target; + } else { + mKeySweep = 0.0f; + mKeySweepTarget = i_target; + } + mKeySweepCount = i_count; } -#pragma pop - -/* ############################################################################################## */ -/* 804556A0-804556A8 003CA0 0004+04 1/1 0/0 0/0 .sdata2 @711 */ -SECTION_SDATA2 static f32 lit_711[1 + 1 /* padding */] = { - 127.0f, - /* padding */ - 0.0f, -}; - -/* 804556A8-804556B0 003CA8 0008+00 4/4 0/0 0/0 .sdata2 @714 */ -SECTION_SDATA2 static f64 lit_714 = 4503599627370496.0 /* cast u32 to float */; /* 8029AD38-8029AF78 295678 0240+00 2/2 0/0 0/0 .text * updateEffectorParam__10JASChannelFPQ26JASDsp8TChannelPUsRCQ213JASOscillator12EffectParams */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::updateEffectorParam(JASDsp::TChannel* param_0, u16* param_1, - JASOscillator::EffectParams const& param_2) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/func_8029AD38.s" +void JASChannel::updateEffectorParam(JASDsp::TChannel* i_channel, u16* i_mixerVolume, + JASOscillator::EffectParams const& i_params) { + PanVector pan_vector, fxmix_vector, dolby_vector; + pan_vector.mSound = mSoundParams.mPan; + pan_vector.mChannel = mParams.mPan; + pan_vector.mEffect = i_params.mPan; + fxmix_vector.mSound = mSoundParams.mFxMix; + fxmix_vector.mChannel = mParams.mFxMix; + fxmix_vector.mEffect = i_params.mFxMix; + dolby_vector.mSound = mSoundParams.mDolby; + dolby_vector.mChannel = mParams.mDolby; + dolby_vector.mEffect = i_params.mDolby; + + f32 pan = 0.5f; + f32 dolby = 0.0f; + switch (JASDriver::getOutputMode()) { + case 0: + break; + case 1: + pan = calcPan(&pan_vector); + break; + case 2: + pan = calcPan(&pan_vector); + dolby = calcEffect(&dolby_vector); + break; + } + f32 fxmix = calcEffect(&fxmix_vector); + f32 volume = mVelocity / 127.0f; + volume = volume * volume; + volume = mSoundParams.mVolume * i_params.mVolume * mParams.mVolume + * (i_params._18 * mTremolo.getValue() + 1.0f) * volume; + + if (volume < 0.0f) { + volume = 0.0f; + } + pan = JASCalc::clamp01(pan); + fxmix = JASCalc::clamp01(fxmix); + dolby = JASCalc::clamp01(dolby); + + if (isDolbyMode()) { + updateAutoMixer(i_channel, volume, pan, fxmix, dolby); + } else { + updateMixer(volume, pan, fxmix, dolby, i_mixerVolume); + } } -#pragma pop /* 8029AF78-8029B004 2958B8 008C+00 2/2 0/0 0/0 .text * dspUpdateCallback__10JASChannelFUlPQ26JASDsp8TChannelPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::dspUpdateCallback(u32 param_0, JASDsp::TChannel* param_1, void* param_2) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/dspUpdateCallback__10JASChannelFUlPQ26JASDsp8TChannelPv.s" +s32 JASChannel::dspUpdateCallback(u32 i_type, JASDsp::TChannel* i_channel, void* i_this) { + JASChannel* _this = static_cast<JASChannel*>(i_this); + switch (i_type) { + case JASDSPChannel::CB_PLAY: + return _this->updateDSPChannel(i_channel); + case JASDSPChannel::CB_START: + return _this->initialUpdateDSPChannel(i_channel); + case JASDSPChannel::CB_STOP: + case JASDSPChannel::CB_DROP: + _this->mDspCh->free(); + _this->mDspCh = NULL; + delete _this; + return -1; + } + return 0; } -#pragma pop - -/* ############################################################################################## */ -/* 804556B0-804556B4 003CB0 0004+00 2/2 0/0 0/0 .sdata2 @775 */ -SECTION_SDATA2 static f32 lit_775 = 12.0f; - -/* 804556B4-804556B8 003CB4 0004+00 2/2 0/0 0/0 .sdata2 @776 */ -SECTION_SDATA2 static f32 lit_776 = 4096.0f; /* 8029B004-8029B324 295944 0320+00 1/1 0/0 0/0 .text * initialUpdateDSPChannel__10JASChannelFPQ26JASDsp8TChannel */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::initialUpdateDSPChannel(JASDsp::TChannel* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/initialUpdateDSPChannel__10JASChannelFPQ26JASDsp8TChannel.s" +s32 JASChannel::initialUpdateDSPChannel(JASDsp::TChannel* i_channel) { + if (isDolbyMode()) { + i_channel->initAutoMixer(); + } + + if (mCallback != NULL) { + mCallback(CB_START, this, i_channel, mCallbackData); + } + + if (field_0xdc.field_0x4.field_0x20[0] == 0) { + mDspCh->free(); + mDspCh = NULL; + delete this; + return -1; + } + + if (checkBankDispose()) { + mDspCh->free(); + mDspCh = NULL; + delete this; + return -1; + } + + switch (field_0xdc.field_0x0) { + case 0: + i_channel->setWaveInfo(field_0xdc.field_0x4, field_0x104, mSkipSamples); + break; + case 2: + i_channel->setOscInfo(field_0x104); + break; + } + + for (u8 i = 0; i < 6; i++) { + MixConfig mix_config = mMixConfig[i]; + u32 output_mode = JASDriver::getOutputMode(); + if (output_mode == 0) { + switch (mix_config.parts.upper) { + case 8: + mix_config.parts.upper = 11; + break; + case 9: + mix_config.parts.upper = 2; + break; + } + } else if (output_mode == 1 && mix_config.parts.upper == 8) { + mix_config.parts.upper = 11; + } + i_channel->setBusConnect(i, mix_config.parts.upper); + } + + JASOscillator::EffectParams effect_params; + for (u32 i = 0; i < 2; i++) { + if (mOscillators[i].isValid()) { + mOscillators[i].update(); + effectOsc(i, &effect_params); + } + } + mVibrate.resetCounter(); + mTremolo.resetCounter(); + u16 mixer_volume[6]; + updateEffectorParam(i_channel, mixer_volume, effect_params); + for (u8 i = 0; i < 6; i++) { + i_channel->setMixerInitVolume(i, mixer_volume[i]); + } + + f32 pitch = JASCalc::pow2(mParams.field_0x8 + (mKey + mKeySweep) / 12.0f + + effect_params._14 * mVibrate.getValue()); + pitch = mSoundParams.mPitch * effect_params.mPitch * pitch * mParams.mPitch * 4096.0f; + if (pitch < 0.0f) { + pitch = 0.0f; + } + i_channel->setPitch(pitch); + + i_channel->setPauseFlag(mPauseFlag); + i_channel->field_0x066 = 0; + return 0; } -#pragma pop - -/* ############################################################################################## */ -/* 804556B8-804556BC 003CB8 0004+00 1/1 0/0 0/0 .sdata2 @832 */ -SECTION_SDATA2 static f32 lit_832 = 32028.5f; - -/* 804556BC-804556C0 003CBC 0004+00 1/1 0/0 0/0 .sdata2 @833 */ -SECTION_SDATA2 static f32 lit_833 = 48000.0f; /* 8029B324-8029B6A0 295C64 037C+00 1/1 0/0 0/0 .text * updateDSPChannel__10JASChannelFPQ26JASDsp8TChannel */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::updateDSPChannel(JASDsp::TChannel* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/updateDSPChannel__10JASChannelFPQ26JASDsp8TChannel.s" +s32 JASChannel::updateDSPChannel(JASDsp::TChannel* i_channel) { + if (mCallback != NULL) { + mCallback(CB_PLAY, this, i_channel, mCallbackData); + } + + if (field_0xdc.field_0x4.field_0x20[0] == 0) { + mDspCh->free(); + mDspCh = NULL; + delete this; + return -1; + } + + if (checkBankDispose()) { + mDspCh->free(); + mDspCh = NULL; + delete this; + return -1; + } + + i_channel->setPauseFlag(mPauseFlag); + JASOscillator::EffectParams effect_params; + if (mPauseFlag) { + if (mOscillators[0].isRelease()) { + mDspCh->free(); + mDspCh = NULL; + delete this; + return -1; + } + } else { + f32 inc = 32028.5f / JASDriver::getDacRate(); + mVibrate.incCounter(inc); + mTremolo.incCounter(inc); + if (mUpdateTimer != 0) { + mUpdateTimer--; + if (mUpdateTimer == 0 && mCallback != NULL) { + mCallback(CB_TIMER, this, i_channel, mCallbackData); + } + } + inc = 48000.0f / JASDriver::getDacRate(); + for (u32 i = 0; i < 2; i++) { + if (mOscillators[i].isValid()) { + mOscillators[i].incCounter(inc); + effectOsc(i, &effect_params); + if (i == 0 && mOscillators[i].isStop()) { + mDspCh->free(); + mDspCh = NULL; + delete this; + return -1; + } + } + } + } + + u16 mixer_volume[6]; + updateEffectorParam(i_channel, mixer_volume, effect_params); + for (u8 i = 0; i < 6; i++) { + i_channel->setMixerVolume(i, mixer_volume[i]); + } + + f32 pitch = JASCalc::pow2(mParams.field_0x8 + (mKey + mKeySweep) / 12.0f + + effect_params._14 * mVibrate.getValue()); + pitch = mSoundParams.mPitch * effect_params.mPitch * pitch * mParams.mPitch * 4096.0f; + if (pitch < 0.0f) { + pitch = 0.0f; + } + i_channel->setPitch(pitch); + + if (!mPauseFlag && mKeySweepCount != 0) { + mKeySweep += (mKeySweepTarget - mKeySweep) / mKeySweepCount; + mKeySweepCount--; + } + return 0; } -#pragma pop - -/* ############################################################################################## */ -/* 804556C0-804556C4 003CC0 0004+00 1/1 0/0 0/0 .sdata2 @846 */ -SECTION_SDATA2 static f32 lit_846 = 0.7070000171661377f; - -/* 804556C4-804556C8 003CC4 0004+00 1/1 0/0 0/0 .sdata2 @847 */ -SECTION_SDATA2 static f32 lit_847 = 127.5f; /* 8029B6A0-8029B7D8 295FE0 0138+00 1/1 0/0 0/0 .text * updateAutoMixer__10JASChannelFPQ26JASDsp8TChannelffff */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::updateAutoMixer(JASDsp::TChannel* param_0, f32 param_1, f32 param_2, - f32 param_3, f32 param_4) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/updateAutoMixer__10JASChannelFPQ26JASDsp8TChannelffff.s" +void JASChannel::updateAutoMixer(JASDsp::TChannel* i_channel, f32 param_1, f32 param_2, + f32 param_3, f32 param_4) { + if (JASDriver::getOutputMode() == 0) { + param_1 *= 0.707f; + } + f32 fvar1 = JASCalc::clamp01(param_1); + i_channel->setAutoMixer(fvar1 * JASDriver::getChannelLevel_dsp(), param_2 * 127.5f, + param_4 * 127.5f, param_3 * 127.5f, 0); } -#pragma pop - -/* ############################################################################################## */ -/* 803C7864-803C7884 -00001 0020+00 1/1 0/0 0/0 .data @977 */ -SECTION_DATA static void* lit_977[8] = { - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x210), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x1E4), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x1EC), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x1F4), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x210), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x1FC), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x204), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x20C), -}; - -/* 803C7884-803C78A8 -00001 0020+04 1/1 0/0 0/0 .data @974 */ -SECTION_DATA static void* lit_974[8 + 1 /* padding */] = { - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x114), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0xE8), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0xF0), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0xF8), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x114), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x100), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x108), - (void*)(((char*)updateMixer__10JASChannelFffffPUs) + 0x110), - /* padding */ - NULL, -}; - -/* 804556C8-804556CC 003CC8 0004+00 1/1 0/0 0/0 .sdata2 @969 */ -SECTION_SDATA2 static f32 lit_969 = -1303.7972412109375f; - -/* 804556CC-804556D0 003CCC 0004+00 1/1 0/0 0/0 .sdata2 @970 */ -SECTION_SDATA2 static f32 lit_970 = 1303.7972412109375f; - -/* 804556D0-804556D4 003CD0 0004+00 1/1 0/0 0/0 .sdata2 @971 */ -SECTION_SDATA2 static f32 lit_971 = 3.1415927410125732f; - -/* 804556D4-804556D8 003CD4 0004+00 1/1 0/0 0/0 .sdata2 @972 */ -SECTION_SDATA2 static f32 lit_972 = 0.326119989156723f; - -/* 804556D8-804556E0 003CD8 0004+04 1/1 0/0 0/0 .sdata2 @973 */ -SECTION_SDATA2 static f32 lit_973[1 + 1 /* padding */] = { - 0.34775999188423157f, - /* padding */ - 0.0f, -}; /* 8029B7D8-8029BBFC 296118 0424+00 3/1 0/0 0/0 .text updateMixer__10JASChannelFffffPUs */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::updateMixer(f32 param_0, f32 param_1, f32 param_2, f32 param_3, u16* param_4) { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/updateMixer__10JASChannelFffffPUs.s" +void JASChannel::updateMixer(f32 i_volume, f32 i_pan, f32 i_fxmix, f32 i_dolby, u16* i_volumeOut) { + for (u32 i = 0; i < 6; i++) { + f32 volume = i_volume; + MixConfig config = mMixConfig[i]; + if (config.parts.upper == 0) { + i_volumeOut[i] = 0; + } else { + f32 scale; + + if (config.parts.lower0 != 0) { + switch (config.parts.lower0) { + case 1: + scale = i_pan; + break; + case 2: + scale = i_fxmix; + break; + case 3: + scale = i_dolby; + break; + case 5: + scale = 1.0f - i_pan; + break; + case 6: + scale = 1.0f - i_fxmix; + break; + case 7: + scale = 1.0f - i_dolby; + break; + } + + switch (config.parts.lower0) { + case 2: + case 6: + volume *= scale; + break; + default: + if (JASDriver::getOutputMode() == 0) { + volume *= scale; + } else { + volume *= JMASinRadian(scale * JGeometry::TUtil<f32>::PI() * 0.5f); + } + break; + } + } + + if (config.parts.lower1 != 0) { + switch (config.parts.lower1) { + case 1: + scale = i_pan; + break; + case 2: + scale = i_fxmix; + break; + case 3: + scale = i_dolby; + break; + case 5: + scale = 1.0f - i_pan; + break; + case 6: + scale = 1.0f - i_fxmix; + break; + case 7: + scale = 1.0f - i_dolby; + break; + } + + switch (config.parts.lower1) { + case 3: + case 7: + volume *= JMASinRadian((scale * 0.34776f + 0.32612f) + * JGeometry::TUtil<f32>::PI() * 0.5f); + break; + case 2: + case 6: + volume *= scale; + break; + default: + if (JASDriver::getOutputMode() == 0) { + volume *= scale; + } else { + volume *= JMASinRadian(scale * JGeometry::TUtil<f32>::PI() * 0.5f); + } + break; + } + } + + i_volumeOut[i] = JASCalc::clamp01(volume) * JASDriver::getChannelLevel_dsp(); + } + } } -#pragma pop /* 8029BBFC-8029BC0C 29653C 0010+00 0/0 3/3 0/0 .text free__10JASChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::free() { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/free__10JASChannelFv.s" +void JASChannel::free() { + mCallback = NULL; + mCallbackData = NULL; } -#pragma pop - -/* ############################################################################################## */ -/* 80451298-804512A0 000798 0004+04 3/3 0/0 0/0 .sbss sBankDisposeListSize__10JASChannel - */ -u32 JASChannel::sBankDisposeListSize; /* 8029BC0C-8029BC48 29654C 003C+00 0/0 1/1 0/0 .text initBankDisposeMsgQueue__10JASChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::initBankDisposeMsgQueue() { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/initBankDisposeMsgQueue__10JASChannelFv.s" +void JASChannel::initBankDisposeMsgQueue() { + OSInitMessageQueue(&sBankDisposeMsgQ, sBankDisposeMsg, 0x10); + sBankDisposeListSize = 0; } -#pragma pop /* 8029BC48-8029BCC0 296588 0078+00 0/0 1/1 0/0 .text receiveBankDisposeMsg__10JASChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::receiveBankDisposeMsg() { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/receiveBankDisposeMsg__10JASChannelFv.s" +void JASChannel::receiveBankDisposeMsg() { + OSMessage msg; + for (sBankDisposeListSize = 0; + OSReceiveMessage(&sBankDisposeMsgQ, &msg, OS_MESSAGE_NOBLOCK); + sBankDisposeListSize++) + { + sBankDisposeList[sBankDisposeListSize] = msg; + } } -#pragma pop /* 8029BCC0-8029BD14 296600 0054+00 2/2 0/0 0/0 .text checkBankDispose__10JASChannelCFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASChannel::checkBankDispose() const { - nofralloc -#include "asm/JSystem/JAudio2/JASChannel/checkBankDispose__10JASChannelCFv.s" +bool JASChannel::checkBankDispose() const { + if (mBankDisposeID == NULL) { + return false; + } + for (int i = 0; i < sBankDisposeListSize; i++) { + if (mBankDisposeID == sBankDisposeList[i]) { + return true; + } + } + return false; } -#pragma pop diff --git a/libs/JSystem/JAudio2/JASDSPChannel.cpp b/libs/JSystem/JAudio2/JASDSPChannel.cpp index 6de16aef67..a559b51ee9 100644 --- a/libs/JSystem/JAudio2/JASDSPChannel.cpp +++ b/libs/JSystem/JAudio2/JASDSPChannel.cpp @@ -4,236 +4,245 @@ // #include "JSystem/JAudio2/JASDSPChannel.h" -#include "dolphin/types.h" +#include "JSystem/JAudio2/JASHeapCtrl.h" +#include "JSystem/JKernel/JKRSolidHeap.h" -// -// Types: -// - -struct JKRHeap {}; - -struct JASDsp { - struct TChannel { - /* 8029DCA4 */ void init(); - /* 8029DCE0 */ void playStart(); - /* 8029DD44 */ void playStop(); - /* 8029DD50 */ void replyFinishRequest(); - /* 8029DD60 */ void forceStop(); - /* 8029DD7C */ void isFinish() const; - /* 8029DF8C */ void flush(); - }; - - /* 8029D9A4 */ void releaseHalt(u32); - /* 8029DA38 */ void getDSPHandle(int); -}; - -struct JASDSPChannel { - /* 8029D2F4 */ JASDSPChannel(); - /* 8029D320 */ void free(); - /* 8029D330 */ void start(); - /* 8029D340 */ void drop(); - /* 8029D3C8 */ void initAll(); - /* 8029D44C */ void alloc(u8, s32 (*)(u32, JASDsp::TChannel*, void*), void*); - /* 8029D4BC */ void allocForce(u8, s32 (*)(u32, JASDsp::TChannel*, void*), void*); - /* 8029D534 */ void setPriority(u8); - /* 8029D540 */ void getLowestChannel(int); - /* 8029D5D0 */ void getLowestActiveChannel(); - /* 8029D65C */ void updateProc(); - /* 8029D89C */ void updateAll(); - /* 8029D910 */ void killActiveChannel(); - /* 8029D948 */ void getHandle(u32); - - static u8 sDspChannels[4 + 4 /* padding */]; -}; - -// -// Forward References: -// - -extern "C" void __ct__13JASDSPChannelFv(); -extern "C" void free__13JASDSPChannelFv(); -extern "C" void start__13JASDSPChannelFv(); -extern "C" void drop__13JASDSPChannelFv(); -extern "C" void initAll__13JASDSPChannelFv(); -extern "C" void alloc__13JASDSPChannelFUcPFUlPQ26JASDsp8TChannelPv_lPv(); -extern "C" void allocForce__13JASDSPChannelFUcPFUlPQ26JASDsp8TChannelPv_lPv(); -extern "C" void setPriority__13JASDSPChannelFUc(); -extern "C" void getLowestChannel__13JASDSPChannelFi(); -extern "C" void getLowestActiveChannel__13JASDSPChannelFv(); -extern "C" void updateProc__13JASDSPChannelFv(); -extern "C" void updateAll__13JASDSPChannelFv(); -extern "C" void killActiveChannel__13JASDSPChannelFv(); -extern "C" void getHandle__13JASDSPChannelFUl(); -extern "C" u8 sDspChannels__13JASDSPChannel[4 + 4 /* padding */]; - -// -// External References: -// - -extern "C" void releaseHalt__6JASDspFUl(); -extern "C" void getDSPHandle__6JASDspFi(); -extern "C" void init__Q26JASDsp8TChannelFv(); -extern "C" void playStart__Q26JASDsp8TChannelFv(); -extern "C" void playStop__Q26JASDsp8TChannelFv(); -extern "C" void replyFinishRequest__Q26JASDsp8TChannelFv(); -extern "C" void forceStop__Q26JASDsp8TChannelFv(); -extern "C" void isFinish__Q26JASDsp8TChannelCFv(); -extern "C" void flush__Q26JASDsp8TChannelFv(); -extern "C" void* __nwa__FUlP7JKRHeapi(); -extern "C" void __construct_new_array(); -extern "C" void _savegpr_28(); -extern "C" void _restgpr_28(); -extern "C" extern u8 JASDram[4]; - -// -// Declarations: -// +/* 804512E0-804512E8 0007E0 0004+04 5/5 0/0 0/0 .sbss sDspChannels__13JASDSPChannel */ +JASDSPChannel* JASDSPChannel::sDspChannels; /* 8029D2F4-8029D320 297C34 002C+00 1/1 0/0 0/0 .text __ct__13JASDSPChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JASDSPChannel::JASDSPChannel() { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/__ct__13JASDSPChannelFv.s" +JASDSPChannel::JASDSPChannel() : + mStatus(STATUS_INACTIVE), + mPriority(-1), + mFlags(0), + field_0xc(0), + mCallback(NULL), + mCallbackData(NULL), + mChannel(NULL) +{ + /* empty function */ } -#pragma pop /* 8029D320-8029D330 297C60 0010+00 0/0 3/3 0/0 .text free__13JASDSPChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::free() { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/free__13JASDSPChannelFv.s" +void JASDSPChannel::free() { + mCallback = NULL; + mCallbackData = NULL; } -#pragma pop /* 8029D330-8029D340 297C70 0010+00 0/0 2/2 0/0 .text start__13JASDSPChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::start() { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/start__13JASDSPChannelFv.s" +void JASDSPChannel::start() { + mFlags |= 1; } -#pragma pop /* 8029D340-8029D3C8 297C80 0088+00 3/3 2/2 0/0 .text drop__13JASDSPChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::drop() { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/drop__13JASDSPChannelFv.s" +void JASDSPChannel::drop() { + if (mCallback != NULL) { + mCallback(CB_DROP, NULL, mCallbackData); + } + mCallback = NULL; + mCallbackData = NULL; + mPriority = -1; + mFlags &= ~1; + if (mStatus == STATUS_ACTIVE) { + mFlags |= 2; + mStatus = STATUS_DROP; + } } -#pragma pop - -/* ############################################################################################## */ -/* 804512E0-804512E8 0007E0 0004+04 5/5 0/0 0/0 .sbss sDspChannels__13JASDSPChannel */ -u8 JASDSPChannel::sDspChannels[4 + 4 /* padding */]; /* 8029D3C8-8029D44C 297D08 0084+00 0/0 1/1 0/0 .text initAll__13JASDSPChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::initAll() { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/initAll__13JASDSPChannelFv.s" +void JASDSPChannel::initAll() { + sDspChannels = new (JASDram, 0x20) JASDSPChannel[0x40]; + for (int i = 0; i < 0x40; i++) { + sDspChannels[i].mChannel = JASDsp::getDSPHandle(i); + } } -#pragma pop /* 8029D44C-8029D4BC 297D8C 0070+00 0/0 1/1 0/0 .text * alloc__13JASDSPChannelFUcPFUlPQ26JASDsp8TChannelPv_lPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::alloc(u8 param_0, s32 (*param_1)(u32, JASDsp::TChannel*, void*), - void* param_2) { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/alloc__13JASDSPChannelFUcPFUlPQ26JASDsp8TChannelPv_lPv.s" +JASDSPChannel* JASDSPChannel::alloc(u8 i_priority, Callback i_callback, void* i_callbackData) { + JASDSPChannel* channel = getLowestChannel(i_priority); + if (channel == NULL) { + return NULL; + } + channel->drop(); + channel->mPriority = i_priority; + channel->field_0xc = 0; + channel->mCallback = i_callback; + channel->mCallbackData = i_callbackData; + return channel; } -#pragma pop /* 8029D4BC-8029D534 297DFC 0078+00 0/0 1/1 0/0 .text * allocForce__13JASDSPChannelFUcPFUlPQ26JASDsp8TChannelPv_lPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::allocForce(u8 param_0, s32 (*param_1)(u32, JASDsp::TChannel*, void*), - void* param_2) { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/allocForce__13JASDSPChannelFUcPFUlPQ26JASDsp8TChannelPv_lPv.s" +JASDSPChannel* JASDSPChannel::allocForce(u8 i_priority, Callback i_callback, void* i_callbackData) { + JASDSPChannel* channel = getLowestChannel(i_priority); + if (channel == NULL) { + return NULL; + } + channel->mStatus = STATUS_INACTIVE; + channel->drop(); + channel->mPriority = i_priority; + channel->field_0xc = 0; + channel->mCallback = i_callback; + channel->mCallbackData = i_callbackData; + return channel; } -#pragma pop /* 8029D534-8029D540 297E74 000C+00 0/0 1/1 0/0 .text setPriority__13JASDSPChannelFUc */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::setPriority(u8 param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/setPriority__13JASDSPChannelFUc.s" +void JASDSPChannel::setPriority(u8 i_priority) { + mPriority = i_priority; } -#pragma pop /* 8029D540-8029D5D0 297E80 0090+00 2/2 0/0 0/0 .text getLowestChannel__13JASDSPChannelFi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::getLowestChannel(int param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/getLowestChannel__13JASDSPChannelFi.s" +JASDSPChannel* JASDSPChannel::getLowestChannel(int i_priority) { + s16 best_priority = 0xff; + int best_index = -1; + int best_unknown = 0; + for (int i = 0; i < 0x40; i++) { + JASDSPChannel* channel = &sDspChannels[i]; + s16 priority = channel->mPriority; + if (priority < 0) { + return channel; + } + if (priority <= i_priority && priority <= best_priority) { + if (priority != best_priority || channel->field_0xc > best_unknown) { + best_unknown = channel->field_0xc; + best_index = i; + best_priority = priority; + } + } + } + if (best_index < 0) { + return NULL; + } + return &sDspChannels[best_index]; } -#pragma pop /* 8029D5D0-8029D65C 297F10 008C+00 1/1 0/0 0/0 .text getLowestActiveChannel__13JASDSPChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::getLowestActiveChannel() { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/getLowestActiveChannel__13JASDSPChannelFv.s" +JASDSPChannel* JASDSPChannel::getLowestActiveChannel() { + s16 best_priority = 0xff; + int best_index = -1; + int best_unknown = 0; + for (int i = 0; i < 0x40; i++) { + JASDSPChannel* channel = &sDspChannels[i]; + if (channel->mStatus == STATUS_ACTIVE) { + s16 priority = channel->mPriority; + if (priority < 0x7f && priority <= best_priority) { + if (priority != best_priority || channel->field_0xc > best_unknown) { + best_unknown = channel->field_0xc; + best_index = i; + best_priority = priority; + } + } + } + } + if (best_index < 0) { + return NULL; + } + return &sDspChannels[best_index]; } -#pragma pop /* 8029D65C-8029D89C 297F9C 0240+00 1/1 0/0 0/0 .text updateProc__13JASDSPChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::updateProc() { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/updateProc__13JASDSPChannelFv.s" +void JASDSPChannel::updateProc() { + int ret; + if (mChannel->isFinish()) { + mFlags &= ~2; + if (mStatus == STATUS_ACTIVE) { + if (mCallback != NULL) { + ret = mCallback(CB_STOP, NULL, mCallbackData); + } else { + ret = -1; + } + if (ret < 0) { + mPriority = -1; + } + } + mStatus = STATUS_INACTIVE; + mChannel->replyFinishRequest(); + mChannel->flush(); + } else if (mFlags & 2) { + mFlags &= ~2; + mChannel->forceStop(); + mChannel->flush(); + } else if (mStatus != STATUS_DROP) { + if ((mFlags & 1) && mStatus == STATUS_INACTIVE) { + mFlags &= ~1; + mStatus = STATUS_ACTIVE; + mChannel->init(); + if (mCallback != NULL) { + ret = mCallback(CB_START, mChannel, mCallbackData); + } else { + ret = 0; + } + if (ret < 0) { + mStatus = STATUS_INACTIVE; + if (mCallback != NULL) { + ret = mCallback(CB_STOP, NULL, mCallbackData); + } else { + ret = -1; + } + if (ret < 0) { + mPriority = -1; + } + mChannel->flush(); + } else { + mChannel->playStart(); + mChannel->flush(); + } + } else if (mStatus != STATUS_INACTIVE) { + bool flush = false; + if (mCallback != NULL) { + ret = mCallback(CB_PLAY, mChannel, mCallbackData); + flush = true; + } else { + ret = 0; + } + if (ret < 0) { + mStatus = STATUS_INACTIVE; + if (mCallback != NULL) { + ret = mCallback(CB_STOP, NULL, mCallbackData); + } else { + ret = -1; + } + if (ret < 0) { + mPriority = -1; + } + mChannel->playStop(); + mChannel->flush(); + } else { + field_0xc++; + if (flush) { + mChannel->flush(); + } + } + } + } } -#pragma pop /* 8029D89C-8029D910 2981DC 0074+00 0/0 1/1 0/0 .text updateAll__13JASDSPChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::updateAll() { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/updateAll__13JASDSPChannelFv.s" +void JASDSPChannel::updateAll() { + for (u32 i = 0; i < 0x40; i++) { + if ((i & 0xf) == 0 && i != 0) { + JASDsp::releaseHalt((i - 1) >> 4); + } + sDspChannels[i].updateProc(); + } + JASDsp::releaseHalt(3); } -#pragma pop /* 8029D910-8029D948 298250 0038+00 0/0 1/1 0/0 .text killActiveChannel__13JASDSPChannelFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::killActiveChannel() { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/killActiveChannel__13JASDSPChannelFv.s" +int JASDSPChannel::killActiveChannel() { + JASDSPChannel* channel = getLowestActiveChannel(); + if (channel == NULL) { + return 0; + } else { + channel->drop(); + return 1; + } } -#pragma pop /* 8029D948-8029D958 298288 0010+00 0/0 1/1 0/0 .text getHandle__13JASDSPChannelFUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASDSPChannel::getHandle(u32 param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASDSPChannel/getHandle__13JASDSPChannelFUl.s" +JASDSPChannel* JASDSPChannel::getHandle(u32 i_index) { + return &sDspChannels[i_index]; } -#pragma pop diff --git a/libs/JSystem/JAudio2/JASDSPInterface.cpp b/libs/JSystem/JAudio2/JASDSPInterface.cpp index 87e4024e33..9c601948c2 100644 --- a/libs/JSystem/JAudio2/JASDSPInterface.cpp +++ b/libs/JSystem/JAudio2/JASDSPInterface.cpp @@ -749,10 +749,5 @@ u16 DSP_CreateMap2(u32 param_0) { return r30; } -/* ############################################################################################## */ /* 804507B8-804507C0 000238 0004+04 0/0 5/5 0/0 .sdata one__11JASWaveInfo */ -u32 JASWaveInfo::one[1 + 1 /* padding */] = { - 0x00000001, - /* padding */ - 0x00000000, -}; +u32 JASWaveInfo::one = 1; diff --git a/libs/JSystem/JAudio2/JASDrumSet.cpp b/libs/JSystem/JAudio2/JASDrumSet.cpp index 0320754549..d0cf360165 100644 --- a/libs/JSystem/JAudio2/JASDrumSet.cpp +++ b/libs/JSystem/JAudio2/JASDrumSet.cpp @@ -75,7 +75,7 @@ bool JASDrumSet::getParam(int param_0, int param_1, JASInstParam* param_2) const param_2->mPitch = perc->mPitch; param_2->mPan = perc->mPan; param_2->field_0x18 = perc->field_0xc; - osc._00 = 0; + osc.mTarget = 0; osc._04 = 1.0f; osc.mTable = NULL; osc._0C = NULL; diff --git a/libs/JSystem/JAudio2/JASHeapCtrl.cpp b/libs/JSystem/JAudio2/JASHeapCtrl.cpp index 04de9ef7ee..0dca0bbc74 100644 --- a/libs/JSystem/JAudio2/JASHeapCtrl.cpp +++ b/libs/JSystem/JAudio2/JASHeapCtrl.cpp @@ -340,7 +340,7 @@ u32 JASKernel::sAramBase; JKRHeap* JASKernel::sSystemHeap; /* 8045121C-80451220 00071C 0004+00 2/1 0/0 0/0 .sbss sCommandHeap__9JASKernel */ -void* JASKernel::sCommandHeap; +JASMemChunkPool<1024, JASThreadingModel::ObjectLevelLockable>* JASKernel::sCommandHeap; /* 802909B8-80290AC0 28B2F8 0108+00 0/0 1/1 0/0 .text setupRootHeap__9JASKernelFP12JKRSolidHeapUl */ @@ -371,7 +371,7 @@ JKRHeap* JASKernel::getSystemHeap() { } /* 80290AC8-80290AD0 -00001 0008+00 0/0 0/0 0/0 .text getCommandHeap__9JASKernelFv */ -void* JASKernel::getCommandHeap() { +JASMemChunkPool<1024, JASThreadingModel::ObjectLevelLockable>* JASKernel::getCommandHeap() { return JASKernel::sCommandHeap; } diff --git a/libs/JSystem/JAudio2/JASTaskThread.cpp b/libs/JSystem/JAudio2/JASTaskThread.cpp index 4020226837..7d9091f6f6 100644 --- a/libs/JSystem/JAudio2/JASTaskThread.cpp +++ b/libs/JSystem/JAudio2/JASTaskThread.cpp @@ -47,15 +47,6 @@ extern "C" u8 sSystemHeap__7JKRHeap[4]; // Declarations: // -/* ############################################################################################## */ -/* 803C5B58-803C5B68 022C78 0010+00 2/2 0/0 0/0 .data __vt__13JASTaskThread */ -SECTION_DATA extern void* __vt__13JASTaskThread[4] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__13JASTaskThreadFv, - (void*)run__13JASTaskThreadFv, -}; - /* 8028F6C4-8028F724 28A004 0060+00 0/0 1/1 0/0 .text __ct__13JASTaskThreadFiiUl */ JASTaskThread::JASTaskThread(int param_0, int param_1, u32 param_2) : JKRThread(JASDram, param_2, param_1, param_0) { field_0x84 = false; @@ -63,37 +54,25 @@ JASTaskThread::JASTaskThread(int param_0, int param_1, u32 param_2) : JKRThread( } /* 8028F724-8028F850 28A064 012C+00 1/0 0/0 0/0 .text __dt__13JASTaskThreadFv */ -// vtable maybe -#ifdef NONMATCHING JASTaskThread::~JASTaskThread() { OSMessage msg; BOOL received; - waitmsg: - msg = waitMessage(&received); - if (!received) return; - u32 heap = JASKernel::getCommandHeap(); - ((ThreadMemPool*)msg)->free((void*)heap); - goto waitmsg; -} -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -// asm JASTaskThread::~JASTaskThread() { -extern "C" asm void __dt__13JASTaskThreadFv() { - nofralloc -#include "asm/JSystem/JAudio2/JASTaskThread/__dt__13JASTaskThreadFv.s" + while (true) { + msg = waitMessage(&received); + if (!received) { + return; + } + ThreadMemPool* heap = JASKernel::getCommandHeap(); + heap->free(msg); + } } -#pragma pop -#endif /* 8028F850-8028F9EC 28A190 019C+00 1/1 0/0 0/0 .text allocCallStack__13JASTaskThreadFPFPv_vPCvUl */ void* JASTaskThread::allocCallStack(void (*param_0)(void*), void const* param_1, u32 param_2) { ThreadMemPool* heap; u32 size = param_2 + 8; - heap = - (ThreadMemPool*)JASKernel::getCommandHeap(); + heap = JASKernel::getCommandHeap(); JASThreadCallStack *callStack = (JASThreadCallStack*) heap->alloc(size); if (callStack == NULL) { return NULL; @@ -108,8 +87,7 @@ void* JASTaskThread::allocCallStack(void (*param_0)(void*), void const* param_1, void* JASTaskThread::allocCallStack(void (*runFunc)(void*), void* param_1) { ThreadMemPool* heap; JASThreadCallStack *callStack; - heap = - (ThreadMemPool*)JASKernel::getCommandHeap(); + heap = JASKernel::getCommandHeap(); callStack = (JASThreadCallStack*)heap->alloc(0xc); if (callStack == NULL) { return NULL; @@ -130,8 +108,8 @@ int JASTaskThread::sendCmdMsg(void (*param_0)(void*), void const* param_1, u32 p } int iVar2 = sendMessage(pvVar1); if (iVar2 == 0) { - void* heap = JASKernel::getCommandHeap(); - ((ThreadMemPool*)pvVar1)->free(heap); + ThreadMemPool* heap = JASKernel::getCommandHeap(); + heap->free(pvVar1); } return iVar2; } @@ -146,8 +124,8 @@ int JASTaskThread::sendCmdMsg(void (*param_0)(void*), void* param_1) { } int iVar2 = sendMessage(pvVar1); if (iVar2 == 0) { - void* heap = JASKernel::getCommandHeap(); - ((ThreadMemPool*)pvVar1)->free(heap); + ThreadMemPool* heap = JASKernel::getCommandHeap(); + heap->free(pvVar1); } return iVar2; } @@ -155,7 +133,7 @@ int JASTaskThread::sendCmdMsg(void (*param_0)(void*), void* param_1) { /* 8028FD4C-8028FE88 28A68C 013C+00 1/0 0/0 0/0 .text run__13JASTaskThreadFv */ // Regalloc #ifdef NONMATCHING -void JASTaskThread::run() { +void* JASTaskThread::run() { OSInitFastCast(); do { JASThreadCallStack* ppcVar1 = (JASThreadCallStack*)waitMessageBlock(); @@ -167,15 +145,15 @@ void JASTaskThread::run() { } else { ppcVar1->mRunFunc(ppcVar1->field_0x8.pBuffer); } - u32 heap = JASKernel::getCommandHeap(); - ((ThreadMemPool*)ppcVar1)->free((void*)heap); + ThreadMemPool* heap = JASKernel::getCommandHeap(); + heap->free(ppcVar1); } while (true); } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void JASTaskThread::run() { +asm void* JASTaskThread::run() { nofralloc #include "asm/JSystem/JAudio2/JASTaskThread/run__13JASTaskThreadFv.s" } |
