// // Generated By: dol2asm // Translation Unit: JASAiCtrl // #include "JSystem/JAudio2/JASAiCtrl.h" #include "JSystem/JAudio2/JASAudioThread.h" #include "JSystem/JAudio2/JASCalc.h" #include "JSystem/JAudio2/JASChannel.h" #include "JSystem/JAudio2/JASCmdStack.h" #include "JSystem/JAudio2/JASCriticalSection.h" #include "JSystem/JAudio2/JASDSPChannel.h" #include "JSystem/JAudio2/JASDSPInterface.h" #include "JSystem/JAudio2/JASHeapCtrl.h" #include "JSystem/JAudio2/JASProbe.h" #include "JSystem/JAudio2/JASReport.h" #include "JSystem/JAudio2/JASLfo.h" #include "JSystem/JKernel/JKRSolidHeap.h" #include "JSystem/JUtility/JUTAssert.h" #include "dolphin/ai.h" #include /* 80431C58-80431C68 05E978 000C+04 2/2 0/0 0/0 .bss sDmaDacBuffer__9JASDriver */ s16* JASDriver::sDmaDacBuffer[3]; /* 804507A8-804507AC 000228 0004+00 3/3 0/0 0/0 .sdata None */ static u8 data_804507A8 = 3; /* 804512A0-804512A4 0007A0 0004+00 3/3 0/0 0/0 .sbss sDspDacBuffer__9JASDriver */ s16** JASDriver::sDspDacBuffer; /* 804512A4-804512A8 0007A4 0004+00 3/3 0/0 0/0 .sbss sDspDacWriteBuffer__9JASDriver */ s32 JASDriver::sDspDacWriteBuffer; /* 804512A8-804512AC 0007A8 0004+00 3/3 0/0 0/0 .sbss sDspDacReadBuffer__9JASDriver */ s32 JASDriver::sDspDacReadBuffer; /* 804512AC-804512B0 0007AC 0004+00 3/3 0/0 0/0 .sbss sDspStatus__9JASDriver */ s32 JASDriver::sDspStatus; /* 804512B0-804512B4 0007B0 0004+00 1/1 0/0 0/0 .sbss sDspDacCallback__9JASDriver */ void (*JASDriver::sDspDacCallback)(s16*, u32); /* 804512B4-804512B8 0007B4 0004+00 1/1 0/0 0/0 .sbss lastRspMadep__9JASDriver */ s16* JASDriver::lastRspMadep; /* 804512B8-804512BC 0007B8 0004+00 1/1 0/0 0/0 .sbss dacCallbackFunc__9JASDriver */ void (*JASDriver::dacCallbackFunc)(s16*, u32); /* 804512BC-804512C0 0007BC 0004+00 2/2 0/0 0/0 .sbss extMixCallback__9JASDriver */ JASDriver::MixCallback JASDriver::extMixCallback; /* 804512C0-804512C4 0007C0 0004+00 2/2 0/0 0/0 .sbss sOutputRate__9JASDriver */ u32 JASDriver::sOutputRate; /* 804507AC-804507B0 00022C 0004+00 2/2 0/0 0/0 .sdata sMixMode__9JASDriver */ JASMixMode JASDriver::sMixMode = MIX_MODE_EXTRA; /* 804507B0-804507B4 000230 0004+00 2/2 0/0 0/0 .sdata sDacRate__9JASDriver */ f32 JASDriver::sDacRate = 32028.5f; /* 804507B4-804507B8 000234 0004+00 4/3 0/0 0/0 .sdata sSubFrames__9JASDriver */ u32 JASDriver::sSubFrames = 0x00000007; /* 8029C388-8029C4E4 296CC8 015C+00 0/0 1/1 0/0 .text initAI__9JASDriverFPFv_v */ // NONMATCHING missing instructions void JASDriver::initAI(void (*param_0)(void)) { setOutputRate(OUTPUT_RATE_0); u32 dacSize = getDacSize(); u32 size = dacSize * 2; for (int i = 0; i < 3; i++) { sDmaDacBuffer[i] = new(JASDram, 0x20) s16[dacSize]; JUT_ASSERT(102, sDmaDacBuffer[i]) JASCalc::bzero(sDmaDacBuffer[i], size); DCStoreRange(sDmaDacBuffer[i], size); } sDspDacBuffer = new(JASDram, 0) s16*[data_804507A8]; JUT_ASSERT(113, sDspDacBuffer); for (int i = 0; i < data_804507A8; i++) { sDspDacBuffer[i] = new(JASDram, 0x20) s16[getDacSize()]; JUT_ASSERT(119, sDspDacBuffer[i]); JASCalc::bzero(sDspDacBuffer[i], size); DCStoreRange(sDspDacBuffer[i], size); } sDspDacWriteBuffer = data_804507A8 - 1; sDspDacReadBuffer = 0; sDspStatus = 0; JASChannel::initBankDisposeMsgQueue(); AIInit(NULL); AIInitDMA((u32)sDmaDacBuffer[2], size); BOOL isOutputRate; if (sOutputRate == 0) { isOutputRate = FALSE; } else { isOutputRate = TRUE; } AISetDSPSampleRate((u8)isOutputRate); AIRegisterDMACallback(param_0); } /* 8029C4E4-8029C504 296E24 0020+00 0/0 1/1 0/0 .text startDMA__9JASDriverFv */ void JASDriver::startDMA() { AIStartDMA(); } /* 8029C504-8029C524 296E44 0020+00 0/0 1/1 0/0 .text stopDMA__9JASDriverFv */ void JASDriver::stopDMA() { AIStopDMA(); } /* 8029C524-8029C568 296E64 0044+00 1/1 0/0 0/0 .text setOutputRate__9JASDriverF13JASOutputRate */ void JASDriver::setOutputRate(JASOutputRate param_0) { sOutputRate = param_0; if (param_0 == 0) { sSubFrames = 7; sDacRate = 32000.0f; } else { sSubFrames = 10; sDacRate = 48000.0f; } sDacRate *= 1.0008897f; } /* 8039B2E0-8039B2F0 -00001 0010+00 1/1 0/0 0/0 .rodata sMixFuncs__9JASDriver */ const JASDriver::MixFunc JASDriver::sMixFuncs[4] = { mixMonoTrack, mixMonoTrackWide, mixExtraTrack, mixInterleaveTrack, }; /* 804512C4-804512C8 0007C4 0004+00 2/1 0/0 0/0 .sbss sSubFrameCounter__9JASDriver */ u32 JASDriver::sSubFrameCounter; /* 8029C568-8029C6C4 296EA8 015C+00 0/0 1/1 0/0 .text updateDac__9JASDriverFv */ void JASDriver::updateDac() { static u32 dacp = 0; s16* r30 = lastRspMadep; lastRspMadep = NULL; if (r30) { AIInitDMA((u32)r30, getDacSize() * 2); } s32 frameSamples = getFrameSamples(); readDspBuffer(sDmaDacBuffer[dacp], frameSamples); if (sDspStatus == 0) { finishDSPFrame(); } if (extMixCallback) { sMixFuncs[sMixMode](sDmaDacBuffer[dacp], frameSamples, extMixCallback); } { JASCriticalSection cs; DCStoreRange(sDmaDacBuffer[dacp], getDacSize() * 2); } lastRspMadep = sDmaDacBuffer[dacp]; dacp++; if (dacp >= 3) { dacp = 0; } if (dacCallbackFunc) { dacCallbackFunc(lastRspMadep, getFrameSamples()); } } /* 8029C6C4-8029C7E0 297004 011C+00 1/1 1/1 0/0 .text updateDSP__9JASDriverFv */ void JASDriver::updateDSP() { static u32 history[10] = {0x000F4240}; JASProbe::start(3, "SFR-UPDATE"); JASDsp::invalChannelAll(); #ifdef DEBUG JASDsp::dspMutex = 1; #endif JASPortCmd::execAllCommand(); DSPSyncCallback(); static u32 old_time = 0; u32 r28 = OSGetTick(); u32 r27 = r28 - old_time; old_time = r28; u32 subFrame = getSubFrames(); int r26 = JASAudioThread::getDSPSyncCount(); JUT_ASSERT(254, subFrame <= 10); history[subFrame - r26] = r27; if (subFrame != r26 && f32(history[0]) / r27 < 1.1f) { #ifdef DEBUG static int killCounter; JASReport("kill DSP channel", killCounter); JASDSPChannel::killActiveChannel(); killCounter++; #else JASReport("kill DSP channel"); JASDSPChannel::killActiveChannel(); #endif } JASChannel::receiveBankDisposeMsg(); JASDSPChannel::updateAll(); #ifdef DEBUG JASDsp::dspMutex = 0; #endif subframeCallback(); f32 freeRun = 32028.5f / getDacRate(); JASLfo::updateFreeRun(freeRun); JASProbe::stop(3); sSubFrameCounter++; } /* 8029C7E0-8029C900 297120 0120+00 1/1 0/0 0/0 .text readDspBuffer__9JASDriverFPsUl */ void JASDriver::readDspBuffer(s16* param_0, u32 param_1) { s32 nbuf = sDspDacReadBuffer + 1; if (nbuf == data_804507A8) { nbuf = 0; } if (nbuf == sDspDacWriteBuffer && data_804507A8 >= 3) { s16 r25 = (s16)sDspDacBuffer[sDspDacReadBuffer][param_1 / 2 - 1]; s16 r24 = (s16)sDspDacBuffer[sDspDacReadBuffer][param_1 - 1]; for (int i = 0; i < param_1; i++) { sDspDacBuffer[sDspDacReadBuffer][i] = (s16)r25; } for (int i = param_1; i < param_1 * 2; i++) { sDspDacBuffer[sDspDacReadBuffer][i] = (s16)r24; } #ifdef DEBUG JASReport("readDspBuffer nbuf:%d sWBuf:%d BCount:%d stat:%d", nbuf, sDspDacWriteBuffer, data_804507A8, sDspStatus); #endif } else { sDspDacReadBuffer = nbuf; DCInvalidateRange(sDspDacBuffer[sDspDacReadBuffer], param_1 * 2 * 2); } s16* dacBuffer = sDspDacBuffer[sDspDacReadBuffer]; s16* endDacBuffer = dacBuffer + param_1; JASCalc::imixcopy(endDacBuffer, dacBuffer, param_0, param_1); } /* 8029C900-8029C9DC 297240 00DC+00 1/1 1/1 0/0 .text finishDSPFrame__9JASDriverFv */ void JASDriver::finishDSPFrame() { int r30 = sDspDacWriteBuffer + 1; if (r30 == data_804507A8) { r30 = 0; } if (r30 == sDspDacReadBuffer) { sDspStatus = 0; return; } sDspDacWriteBuffer = r30; JASAudioThread::setDSPSyncCount(getSubFrames()); JASProbe::start(7, "DSP-MAIN"); u32 r27 = getFrameSamples(); JASDsp::syncFrame(getSubFrames(), u32(sDspDacBuffer[sDspDacWriteBuffer]), u32(sDspDacBuffer[sDspDacWriteBuffer] + r27)); sDspStatus = 1; updateDSP(); if (sDspDacCallback) { sDspDacCallback(sDspDacBuffer[sDspDacWriteBuffer], r27); } } /* 8029C9DC-8029C9E8 29731C 000C+00 0/0 0/0 2/2 .text * registerMixCallback__9JASDriverFPFl_Ps10JASMixMode */ void JASDriver::registerMixCallback(MixCallback param_0, JASMixMode param_1) { extMixCallback = param_0; sMixMode = param_1; } /* 8029C9E8-8029C9F0 297328 0008+00 1/1 5/5 0/0 .text getDacRate__9JASDriverFv */ f32 JASDriver::getDacRate() { return sDacRate; } /* 8029C9F0-8029C9F8 -00001 0008+00 0/0 0/0 0/0 .text getSubFrames__9JASDriverFv */ u32 JASDriver::getSubFrames() { return sSubFrames; } /* 8029C9F8-8029CA04 297338 000C+00 2/2 0/0 0/0 .text getDacSize__9JASDriverFv */ u32 JASDriver::getDacSize() { return sSubFrames * 0x50 * 2; } /* 8029CA04-8029CA10 297344 000C+00 3/3 0/0 0/0 .text getFrameSamples__9JASDriverFv */ u32 JASDriver::getFrameSamples() { return sSubFrames * 0x50; } /* 8029CA10-8029CAC0 297350 00B0+00 1/0 0/0 0/0 .text mixMonoTrack__9JASDriverFPsUlPFl_Ps */ void JASDriver::mixMonoTrack(s16* buffer, u32 param_1, MixCallback param_2) { JASProbe::start(5, "MONO-MIX"); s16* r31 = param_2(param_1); s16* pTrack = buffer; if (r31 == NULL) { return; } JASProbe::stop(5); for (u32 i = param_1; i != 0; i--) { pTrack[0] = JASCalc::clamp(pTrack[0] + r31[0]); pTrack[1] = JASCalc::clamp(pTrack[1] + r31[0]); pTrack += 2; r31++; } } /* 8029CAC0-8029CB70 297400 00B0+00 1/0 0/0 0/0 .text mixMonoTrackWide__9JASDriverFPsUlPFl_Ps */ void JASDriver::mixMonoTrackWide(s16* buffer, u32 param_1, MixCallback param_2) { JASProbe::start(5, "MONO(W)-MIX"); s16* r31 = param_2(param_1); s16* pTrack = buffer; if (!r31) { return; } JASProbe::stop(5); for (u32 i = param_1; i != 0; i--) { pTrack[0] = JASCalc::clamp(pTrack[0] + r31[0]); s32 src = pTrack[1]; src -= r31[0]; pTrack[1] = JASCalc::clamp(src); pTrack += 2; r31++; } } /* 8029CB70-8029CC50 2974B0 00E0+00 1/0 0/0 0/0 .text mixExtraTrack__9JASDriverFPsUlPFl_Ps */ void JASDriver::mixExtraTrack(s16* buffer, u32 param_1, MixCallback param_2) { JASProbe::start(5, "DSPMIX"); s16* r31 = param_2(param_1); if (!r31) { return; } JASProbe::stop(5); JASProbe::start(6, "MIXING"); s16* pTrack = buffer; s16* r29 = r31 + getFrameSamples(); for (u32 i = param_1; i != 0; i--) { pTrack[0] = JASCalc::clamp(pTrack[0] + r29[0]); pTrack[1] = JASCalc::clamp(pTrack[1] + r31[0]); pTrack += 2; r29++; r31++; } JASProbe::stop(6); } /* 8029CC50-8029CCD4 297590 0084+00 1/0 0/0 0/0 .text mixInterleaveTrack__9JASDriverFPsUlPFl_Ps */ void JASDriver::mixInterleaveTrack(s16* buffer, u32 param_1, MixCallback param_2) { s16* r31 = param_2(param_1); if (r31) { s16* pTrack = buffer; s16* r30 = r31; for (u32 i = param_1 * 2; i != 0; i--) { pTrack[0] = JASCalc::clamp(pTrack[0] + r30[0]); pTrack += 1; r30++; } } } /* 8029CCD4-8029CCDC -00001 0008+00 0/0 0/0 0/0 .text getSubFrameCounter__9JASDriverFv */ u32 JASDriver::getSubFrameCounter() { return sSubFrameCounter; } /* 8039B2F0-8039B2F0 027950 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */