summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorCaroline Madsen <69010899+randomsalience@users.noreply.github.com>2024-02-11 00:29:35 -0500
committerGitHub <noreply@github.com>2024-02-11 07:29:35 +0200
commitd183f6593a45538312844559c0801f7331185bdd (patch)
treea3711bafc5345a3081139d9fec8630eaea1a79f6 /libs
parentdf653e1d34b91659b22344dcaae44d846ab4e7bd (diff)
JAS work (#2069)
Diffstat (limited to 'libs')
-rw-r--r--libs/JSystem/JAudio2/JASAramStream.cpp803
-rw-r--r--libs/JSystem/JAudio2/JASBasicWaveBank.cpp6
-rw-r--r--libs/JSystem/JAudio2/JASChannel.cpp768
-rw-r--r--libs/JSystem/JAudio2/JASDSPChannel.cpp383
-rw-r--r--libs/JSystem/JAudio2/JASDSPInterface.cpp7
-rw-r--r--libs/JSystem/JAudio2/JASDrumSet.cpp2
-rw-r--r--libs/JSystem/JAudio2/JASHeapCtrl.cpp4
-rw-r--r--libs/JSystem/JAudio2/JASTaskThread.cpp58
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 == &param_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"
}