diff options
| author | hatal175 <hatal175@users.noreply.github.com> | 2023-06-09 11:55:15 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-09 01:55:15 -0700 |
| commit | f17cf7f6f118367d59903b0018a532e3fa32eb6a (patch) | |
| tree | 30d4ba6c783d868433a3998683d888e8a7db7e0c /libs/JSystem/JAudio2/JASAudioThread.cpp | |
| parent | 98582af6d2999108c2bce482f1a5b91bbc4ac5fa (diff) | |
JASSeqCtrl OK + misc functions (#346)
* JASSeqCtrl OK + misc functions
* Work on JASAudioThread
Diffstat (limited to 'libs/JSystem/JAudio2/JASAudioThread.cpp')
| -rw-r--r-- | libs/JSystem/JAudio2/JASAudioThread.cpp | 216 |
1 files changed, 121 insertions, 95 deletions
diff --git a/libs/JSystem/JAudio2/JASAudioThread.cpp b/libs/JSystem/JAudio2/JASAudioThread.cpp index b67d7c792e..10ba8cd139 100644 --- a/libs/JSystem/JAudio2/JASAudioThread.cpp +++ b/libs/JSystem/JAudio2/JASAudioThread.cpp @@ -4,30 +4,24 @@ // #include "JSystem/JAudio2/JASAudioThread.h" +#include "JSystem/JAudio2/JASDriverIF.h" #include "dol2asm.h" #include "dolphin/types.h" +#include "dolphin/os/OS.h" +#include "dolphin/dsp/dsp.h" // // Types: // -struct JKRHeap { - static u8 sSystemHeap[4]; - static u8 sCurrentHeap[4]; -}; - -struct JKRThread { - /* 802D1610 */ JKRThread(JKRHeap*, u32, int, int); - /* 802D1758 */ ~JKRThread(); -}; - struct JASProbe { - /* 80290EE4 */ void start(s32, char const*); - /* 80290F24 */ void stop(s32); + /* 80290EE4 */ static void start(s32, char const*); + /* 80290F24 */ static void stop(s32); }; template <typename A0> -struct JASMemPool_MultiThreaded {}; +struct JASMemPool {}; + /* JASMemPool_MultiThreaded<JASChannel> */ struct JASMemPool_MultiThreaded__template2 { /* 802978DC */ void func_802978DC(void* _this); @@ -35,27 +29,17 @@ struct JASMemPool_MultiThreaded__template2 { struct JASGenericMemPool { /* 80290848 */ JASGenericMemPool(); - /* 802908C8 */ void newMemPool(u32, int); + /* 802908C8 */ static void newMemPool(u32, int); }; struct JASDsp { - /* 8029D958 */ void boot(void (*)(void*)); - /* 8029D9C4 */ void finishWork(u16); - /* 8029DAC8 */ void initBuffer(); -}; - -struct JASDriver { - /* 8029C388 */ void initAI(void (*)(void)); - /* 8029C4E4 */ void startDMA(); - /* 8029C504 */ void stopDMA(); - /* 8029C568 */ void updateDac(); - /* 8029C6C4 */ void updateDSP(); - /* 8029C900 */ void finishDSPFrame(); - /* 8029E2F8 */ void updateDacCallback(); + /* 8029D958 */ static void boot(void (*)(void*)); + /* 8029D9C4 */ static void finishWork(u16); + /* 8029DAC8 */ static void initBuffer(); }; struct JASDSPChannel { - /* 8029D3C8 */ void initAll(); + /* 8029D3C8 */ static void initAll(); }; // @@ -96,67 +80,41 @@ extern "C" void* __nw__FUlP7JKRHeapi(); extern "C" void __dl__FPv(); extern "C" void __ct__9JKRThreadFP7JKRHeapUlii(); extern "C" void __dt__9JKRThreadFv(); -extern "C" void OSDisableInterrupts(); -extern "C" void OSRestoreInterrupts(); -extern "C" void OSSendMessage(); -extern "C" void OSReceiveMessage(); -extern "C" void OSJamMessage(); -extern "C" void OSInitThreadQueue(); -extern "C" void OSExitThread(); -extern "C" void OSResumeThread(); -extern "C" void OSSleepThread(); -extern "C" void DSPCheckMailFromDSP(); -extern "C" void DSPReadMailFromDSP(); extern "C" void __register_global_object(); extern "C" extern u8 data_80431B34[16 + 4 /* padding */]; -extern "C" extern u8 JASDram[4]; extern "C" extern u8 struct_80451260[8]; extern "C" u8 sSystemHeap__7JKRHeap[4]; extern "C" u8 sCurrentHeap__7JKRHeap[4]; extern "C" extern u8 __OSReport_disable; +extern JKRHeap* JASDram; // // Declarations: // /* ############################################################################################## */ -/* 803C78E0-803C78F0 024A00 0010+00 2/2 0/0 0/0 .data __vt__14JASAudioThread */ -SECTION_DATA extern void* __vt__14JASAudioThread[4] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__14JASAudioThreadFv, - (void*)run__14JASAudioThreadFv, -}; /* 8029CCDC-8029CD4C 29761C 0070+00 1/1 0/0 0/0 .text __ct__14JASAudioThreadFiiUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JASAudioThread::JASAudioThread(int param_0, int param_1, u32 param_2) { - nofralloc -#include "asm/JSystem/JAudio2/JASAudioThread/__ct__14JASAudioThreadFiiUl.s" +JASAudioThread::JASAudioThread(int stackSize, int msgCount, u32 threadPriority) + : + JKRThread(JASDram, threadPriority, msgCount, stackSize), + JASGlobalInstance<JASAudioThread>(true) +{ + sbPauseFlag = false; + OSInitThreadQueue(&sThreadQueue); } -#pragma pop /* 8029CD4C-8029CDC0 29768C 0074+00 0/0 1/1 0/0 .text create__14JASAudioThreadFl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAudioThread::create(s32 param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAudioThread/create__14JASAudioThreadFl.s" +void JASAudioThread::create(long threadPriority) { + JASAudioThread* sAudioThread = new (JASDram, 0) JASAudioThread(threadPriority, 0x10, 0x1400); + sAudioThread->setCurrentHeap(JKRGetSystemHeap()); + sAudioThread->resume(); } -#pragma pop /* 8029CDC0-8029CDEC 297700 002C+00 0/0 1/1 0/0 .text stop__14JASAudioThreadFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAudioThread::stop() { - nofralloc -#include "asm/JSystem/JAudio2/JASAudioThread/stop__14JASAudioThreadFv.s" +void JASAudioThread::stop() { + jamMessageBlock((void*)2); } -#pragma pop /* ############################################################################################## */ /* 8039B338-8039B338 027998 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ @@ -169,18 +127,93 @@ SECTION_DEAD static char const* const stringBase_8039B338 = "SFR_DSP"; static u8 lit_205[12 + 4 /* padding */]; /* 804512D8-804512E0 0007D8 0004+04 1/1 2/2 0/0 .sbss snIntCount__14JASAudioThread */ -u8 JASAudioThread::snIntCount[4 + 4 /* padding */]; +volatile int JASAudioThread::snIntCount; + +class Lock { +public: + Lock() { + mInterrupts = OSDisableInterrupts(); + } + ~Lock() { + OSRestoreInterrupts(mInterrupts); + } +private: + BOOL mInterrupts; +}; + +class JASChannel {}; + +template <class T> +class JASMemPool_MultiThreaded { +public: + static void newMemPool(int param_1) { + Lock lock; + JASGenericMemPool::newMemPool(0x108, param_1); + } +}; + +template <class T> +class JASPoolAllocObject_MultiThreaded { +public: + static void newMemPool(int param_1) { + JASMemPool_MultiThreaded<T>::newMemPool(param_1); + } +}; /* 8029CDEC-8029CF68 29772C 017C+00 1/0 0/0 0/0 .text run__14JASAudioThreadFv */ +// JASPoolAllocObject_MultiThreaded is complex +#ifdef NONMATCHING +void* JASAudioThread::run() { + i_OSInitFastCast(); + JASDriver::initAI(DMACallback); + JASDsp::boot(DSPCallback); + JASDsp::initBuffer(); + JASDSPChannel::initAll(); + + JASPoolAllocObject_MultiThreaded<JASChannel>::newMemPool(0x48); + JASDriver::startDMA(); + + while (true) { + OSMessage msg = waitMessageBlock(); + switch ((int)msg) { + case AUDIOMSG_DMA: + if (sbPauseFlag) { + JASDriver::stopDMA(); + OSSleepThread(&sThreadQueue); + } + JASDriver::updateDac(); + JASDriver::updateDacCallback(); + break; + + case AUDIOMSG_DSP: + snIntCount--; + if (snIntCount == 0) { + JASProbe::stop(7); + JASDriver::finishDSPFrame(); + } else { + JASProbe::start(2, "SFR_DSP"); + JASDriver::updateDSP(); + JASProbe::stop(2); + } + break; + + case AUDIOMSG_STOP: + JASDriver::stopDMA(); + OSExitThread(NULL); + break; + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void JASAudioThread::run() { +asm void* JASAudioThread::run() { nofralloc #include "asm/JSystem/JAudio2/JASAudioThread/run__14JASAudioThreadFv.s" } #pragma pop - +#endif /* ############################################################################################## */ /* 8039B338-8039B338 027998 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ #pragma push @@ -191,33 +224,26 @@ SECTION_DEAD static char const* const pad_8039B34B = "\0\0\0\0\0\0\0\0\0\0\0\0\0 #pragma pop /* 8029CF68-8029CFBC 2978A8 0054+00 1/1 0/0 0/0 .text DMACallback__14JASAudioThreadFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAudioThread::DMACallback() { - nofralloc -#include "asm/JSystem/JAudio2/JASAudioThread/DMACallback__14JASAudioThreadFv.s" +void JASAudioThread::DMACallback() { + JASAudioThread* thread = getInstance(); + JASProbe::stop(4); + JASProbe::start(4, "UPDATE-DAC"); + thread->sendMessage((void*)AUDIOMSG_DMA); } -#pragma pop /* 8029CFBC-8029D028 2978FC 006C+00 1/1 0/0 0/0 .text DSPCallback__14JASAudioThreadFPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JASAudioThread::DSPCallback(void* param_0) { - nofralloc -#include "asm/JSystem/JAudio2/JASAudioThread/DSPCallback__14JASAudioThreadFPv.s" -} -#pragma pop - -/* 8029D028-8029D0B4 297968 008C+00 1/0 0/0 0/0 .text __dt__14JASAudioThreadFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JASAudioThread::~JASAudioThread() { - nofralloc -#include "asm/JSystem/JAudio2/JASAudioThread/__dt__14JASAudioThreadFv.s" +void JASAudioThread::DSPCallback(void*) { + JASAudioThread* thread = getInstance(); + while (DSPCheckMailFromDSP() == 0) { } + + u32 mail = DSPReadMailFromDSP(); + if (mail >> 0x10 == 0xF355) { + if ((mail & 0xFF00) == 0xFF00) { + thread->sendMessage((void*)AUDIOMSG_DSP); + } else { + JASDsp::finishWork(mail); + } + } } -#pragma pop /* 8039B338-8039B338 027998 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ |
