From 9437e9ef4eda769b7a0d61e1ab722cc31bab62bf Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Fri, 20 Oct 2023 00:00:29 -0700 Subject: [PATCH] JASDSPInterface --- include/JSystem/JAudio/JASDSPInterface.h | 139 +++++++++++ src/JSystem/JAudio/JASDSPInterface.cpp | 286 +++++++++++++++++++---- 2 files changed, 374 insertions(+), 51 deletions(-) create mode 100644 include/JSystem/JAudio/JASDSPInterface.h diff --git a/include/JSystem/JAudio/JASDSPInterface.h b/include/JSystem/JAudio/JASDSPInterface.h new file mode 100644 index 000000000..a8f8d0a3b --- /dev/null +++ b/include/JSystem/JAudio/JASDSPInterface.h @@ -0,0 +1,139 @@ +#ifndef JASDSPINTERFACE_H +#define JASDSPINTERFACE_H + +#include "dolphin/types.h" + +namespace JASystem { + namespace Driver { + struct Wave_ { + /* 0x00 */ u8 field_0x0; + /* 0x01 */ u8 field_0x1; + /* 0x02 */ u8 field_0x2[0x10 - 0x2]; + /* 0x10 */ int field_0x10; + /* 0x14 */ int field_0x14; + /* 0x18 */ int field_0x18; + /* 0x1C */ int field_0x1c; + /* 0x20 */ short field_0x20; + /* 0x22 */ short field_0x22; + }; + } + namespace DSPInterface { + struct FxlineConfig_ { + /* 0x00 */ u8 field_0x0; + /* 0x02 */ u16 field_0x2; + /* 0x04 */ short field_0x4; + /* 0x06 */ u16 field_0x6; + /* 0x08 */ short field_0x8; + /* 0x0C */ int field_0xc; + /* 0x10 */ short field_0x10[8]; + }; + + class FXBuffer { + public: + bool setFXLine(s16* param_1, FxlineConfig_* param_2); + + /* 0x00 */ short field_0x0; + /* 0x02 */ short field_0x2; + /* 0x04 */ s16* field_0x4; + /* 0x08 */ short field_0x8; + /* 0x0A */ short field_0xa; + /* 0x0C */ short field_0xc; + /* 0x0E */ short field_0xe; + /* 0x10 */ short field_0x10[8]; + }; + + class DSPBuffer { + public: + void allocInit(); + void playStart(); + void setWaveInfo(Driver::Wave_* param_1, u32 param_2, u32 param_3); + void setOscInfo(u32 param_1); + void initAutoMixer(); + void setAutoMixer(u16 param_1, u8 param_2, u8 param_3, u8 param_4, u8 param_5); + void setPitch(u16 param_1); + void setMixerInitDelayMax(u8 param_1); + void setMixerInitVolume(u8 param_1, s16 param_2, u8 param_3); + void setMixerVolume(u8 param_1, s16 param_2, u8 param_3); + void setMixerVolumeOnly(u8 param_1, short param_2); + void setPauseFlag(u8 param_1); + void flushChannel(); + void initFilter(); + void setFilterMode(u16 param_1); + void setIIRFilterParam(s16* param_1); + void setFIR8FilterParam(s16* param_1); + void setDistFilter(s16 param_1); + void setBusConnect(u8 param_1, u8 param_2); + + /* 0x00 */ u16 field_0x0; + /* 0x02 */ u16 field_0x2; + /* 0x04 */ u16 field_0x4; + /* 0x06 */ u8 field0x6[0x8 - 0x6]; + /* 0x08 */ u16 field_0x8; + /* 0x0A */ u8 field_0xa[0xc - 0xa]; + /* 0x0C */ u16 field_0xc; + /* 0x0E */ u16 field_0xe; + /* 0x10 */ u16 field_0x10[1][4]; + /* 0x18 */ u8 field_0x18[0x50 - 0x18]; + /* 0x50 */ u16 field_0x50; + /* 0x52 */ u16 field_0x52; + /* 0x54 */ short field_0x54; + /* 0x56 */ u16 field_0x56; + /* 0x58 */ u16 field_0x58; + /* 0x5A */ u8 field_0x5a[0x60 - 0x5a]; + /* 0x60 */ short field_0x60; + /* 0x62 */ u8 field_0x62[0x64 - 0x62]; + /* 0x64 */ short field_0x64; + /* 0x66 */ short field_0x66; + /* 0x68 */ int field_0x68; + /* 0x6C */ int field_0x6c; + /* 0x70 */ u8 field_0x70[0x74 - 0x70]; + /* 0x74 */ int field_0x74; + /* 0x78 */ short field_0x78[4]; + /* 0x80 */ short field_0x80[20]; + /* 0xA8 */ short field_0xa8[4]; + /* 0xB8 */ short field_0xb0[16]; + /* 0xD0 */ u8 field_0xd0[0x100 - 0xd0]; + /* 0x100 */ u16 field_0x100; + /* 0x102 */ u16 field_0x102; + /* 0x104 */ short field_0x104; + /* 0x106 */ short field_0x106; + /* 0x108 */ short field_0x108; + /* 0x10A */ u16 field_0x10a; + /* 0x10C */ int field_0x10c; + /* 0x110 */ int field_0x110; + /* 0x114 */ int field_0x114; + /* 0x118 */ int field_0x118; + /* 0x11C */ int field_0x11c; + /* 0x120 */ short field_0x120[8]; + /* 0x130 */ u8 field_0x130[0x148 - 0x130]; + /* 0x148 */ short field_0x148[4]; + /* 0x150 */ short field_0x150; + /* 0x152 */ u8 field_0x152[0x180 - 0x152]; + }; + + + void setDSPMixerLevel(float param_1); + DSPBuffer* getDSPHandle(u8 param_1); + void setFilterTable(short* param_1, short* param_2, u32 param_3); + void flushBuffer(); + void invalChannelAll(); + void clearBuffer(); + void setupBuffer(); + void initBuffer(); + FXBuffer* getFXHandle(u8 param_1); + + extern u16 SEND_TABLE[12]; + extern u32 DOLBY2_DELAY_BUF[]; + extern u16 JAS_DSP_PREFIX; + extern DSPBuffer* CH_BUF; + extern FXBuffer* FX_BUF; + extern float sDSPVolume; + + extern u32 DSPADPCM_FILTER[]; + extern u32 DSPRES_FILTER[]; + }; +} + +u16 DSP_CreateMap2(u32 param_1); + +#endif /* JASDSPINTERFACE_H */ diff --git a/src/JSystem/JAudio/JASDSPInterface.cpp b/src/JSystem/JAudio/JASDSPInterface.cpp index 0ab7755f1..82c2e4b9e 100644 --- a/src/JSystem/JAudio/JASDSPInterface.cpp +++ b/src/JSystem/JAudio/JASDSPInterface.cpp @@ -3,156 +3,340 @@ // Translation Unit: JASDSPInterface.cpp // -#include "JASDSPInterface.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASDSPInterface.h" +#include "JSystem/JAudio/JASCalc.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JAudio/dspproc.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "dolphin/os/OSCache.h" + +JASystem::DSPInterface::DSPBuffer* JASystem::DSPInterface::CH_BUF; +JASystem::DSPInterface::FXBuffer* JASystem::DSPInterface::FX_BUF; +f32 JASystem::DSPInterface::sDSPVolume; /* 8028A10C-8028A130 .text setDSPMixerLevel__Q28JASystem12DSPInterfaceFf */ -void JASystem::DSPInterface::setDSPMixerLevel(float) { - /* Nonmatching */ +void JASystem::DSPInterface::setDSPMixerLevel(f32 param_1) { + sDSPVolume = param_1; + DsetMixerLevel(param_1); } /* 8028A130-8028A144 .text getDSPHandle__Q28JASystem12DSPInterfaceFUc */ -void JASystem::DSPInterface::getDSPHandle(unsigned char) { - /* Nonmatching */ +JASystem::DSPInterface::DSPBuffer* JASystem::DSPInterface::getDSPHandle(u8 param_1) { + return CH_BUF + param_1; } /* 8028A144-8028A168 .text setFilterTable__Q28JASystem12DSPInterfaceFPsPsUl */ -void JASystem::DSPInterface::setFilterTable(short*, short*, unsigned long) { - /* Nonmatching */ +void JASystem::DSPInterface::setFilterTable(s16* dest, s16* src, u32 size) { + for (int i = 0; i < size; i++) { + *dest++ = *src++; + } } /* 8028A168-8028A19C .text flushBuffer__Q28JASystem12DSPInterfaceFv */ void JASystem::DSPInterface::flushBuffer() { - /* Nonmatching */ + DCFlushRange(CH_BUF, sizeof(DSPBuffer) * 64); + DCFlushRange(FX_BUF, sizeof(FXBuffer) * 4); } /* 8028A19C-8028A1C4 .text invalChannelAll__Q28JASystem12DSPInterfaceFv */ void JASystem::DSPInterface::invalChannelAll() { - /* Nonmatching */ + DCInvalidateRange(CH_BUF, sizeof(DSPBuffer) * 64); } /* 8028A1C4-8028A240 .text clearBuffer__Q28JASystem12DSPInterfaceFv */ void JASystem::DSPInterface::clearBuffer() { - /* Nonmatching */ + for (u32 i = 0; i < 64; i++) { + Calc::bzero(CH_BUF + i, sizeof(DSPBuffer)); + } + for (u32 i = 0; i < 4; i++) { + Calc::bzero(FX_BUF + i, sizeof(FXBuffer)); + } } +u32 JASystem::DSPInterface::DOLBY2_DELAY_BUF[600]; + /* 8028A240-8028A28C .text setupBuffer__Q28JASystem12DSPInterfaceFv */ void JASystem::DSPInterface::setupBuffer() { - /* Nonmatching */ + DsetupTable(64, (u32)CH_BUF, (u32)&DSPRES_FILTER, (u32)&DSPADPCM_FILTER, (u32)FX_BUF); + DsetDolbyDelay((u32)&DOLBY2_DELAY_BUF, 10); } /* 8028A28C-8028A368 .text initBuffer__Q28JASystem12DSPInterfaceFv */ void JASystem::DSPInterface::initBuffer() { - /* Nonmatching */ + CH_BUF = new(JASDram, 0x20) DSPBuffer[64]; + FX_BUF = new(JASDram, 0x20) FXBuffer[4]; + JUT_ASSERT(163, (CH_BUF != 0) && (FX_BUF != 0)); + for (u8 i = 0; i < 4; i++) { + FX_BUF[i].setFXLine(NULL, NULL); + } + clearBuffer(); + setupBuffer(); + flushBuffer(); } /* 8028A368-8028A378 .text getFXHandle__Q28JASystem12DSPInterfaceFUc */ -void JASystem::DSPInterface::getFXHandle(unsigned char) { - /* Nonmatching */ +JASystem::DSPInterface::FXBuffer* JASystem::DSPInterface::getFXHandle(u8 param_1) { + return FX_BUF + param_1; } +u16 JASystem::DSPInterface::SEND_TABLE[] = { + 0x0D00, 0x0D60, 0x0DC0, 0x0E20, + 0x0E80, 0x0EE0, 0x0CA0, 0x0F40, + 0x0FA0, 0x0B00, 0x09A0, 0x0000, +}; + /* 8028A378-8028A528 .text setFXLine__Q38JASystem12DSPInterface8FXBufferFPsPQ38JASystem12DSPInterface13FxlineConfig_ */ -void JASystem::DSPInterface::FXBuffer::setFXLine(short*, JASystem::DSPInterface::FxlineConfig_*) { - /* Nonmatching */ +bool JASystem::DSPInterface::FXBuffer::setFXLine(s16* buffer, JASystem::DSPInterface::FxlineConfig_* config) { + BOOL enable = OSDisableInterrupts(); + field_0x0 = 0; + if (config) { + field_0xa = config->field_0x4; + field_0x8 = SEND_TABLE[config->field_0x2]; + field_0xe = config->field_0x8; + field_0xc = SEND_TABLE[config->field_0x6]; + field_0x2 = config->field_0xc; + OSReport("FX LINE Buffer %x/ SIZE %d\n", buffer, config->field_0xc); + setFilterTable(field_0x10, config->field_0x10, 8); + } + if (buffer && config) { + u32 bufsize = config->field_0xc * 0xa0; + field_0x4 = buffer; + Calc::bzero(buffer, bufsize); + JUT_ASSERT(219, (reinterpret_cast(buffer) & 0x1f) == 0); + JUT_ASSERT(220, (bufsize & 0x1f) == 0); + DCFlushRange(buffer, bufsize); + } else if (!config || buffer) { + field_0x4 = buffer; + } + if (field_0x4) { + field_0x0 = config->field_0x0; + } else { + field_0x0 = 0; + } + DCFlushRange(this, 0x20); + OSRestoreInterrupts(enable); + return true; } /* 8028A528-8028A574 .text allocInit__Q38JASystem12DSPInterface9DSPBufferFv */ void JASystem::DSPInterface::DSPBuffer::allocInit() { - /* Nonmatching */ + field_0xc = 0; + field_0x2 = 0; + field_0x10a = 0; + field_0x0 = 0; + field_0x58 = 0; + initFilter(); + flushChannel(); } /* 8028A574-8028A5D8 .text playStart__Q38JASystem12DSPInterface9DSPBufferFv */ void JASystem::DSPInterface::DSPBuffer::playStart() { /* Nonmatching */ + field_0x10c = 0; + field_0x60 = 0; + field_0x8 = 1; + field_0x66 = 1; + for (int i = 0; i < 4; i++) { + field_0x78[i] = 0; + field_0xa8[i] = 0; + } + for (int i = 0; i < 20; i++) { + field_0x80[i] = 0; + } + field_0x0 = 1; } +u16 JASystem::DSPInterface::JAS_DSP_PREFIX = 0xF355; + /* 8028A5D8-8028A6FC .text setWaveInfo__Q38JASystem12DSPInterface9DSPBufferFPQ38JASystem6Driver5Wave_UlUl */ -void JASystem::DSPInterface::DSPBuffer::setWaveInfo(JASystem::Driver::Wave_*, unsigned long, unsigned long) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setWaveInfo(JASystem::Driver::Wave_* param_1, u32 param_2, u32 param_3) { + static u8 COMP_BLOCKSAMPLES[8] = { + 0x10, 0x10, 0x01, 0x01, 0x01, 0x10, 0x10, 0x01, + }; + static u8 COMP_BLOCKBYTES[8] = { + 0x09, 0x05, 0x08, 0x10, 0x01, 0x01, 0x01, 0x01, + }; + + field_0x118 = param_2; + field_0x64 = COMP_BLOCKSAMPLES[param_1->field_0x1]; + field_0x100 = COMP_BLOCKBYTES[param_1->field_0x1]; + field_0x68 = 0; + if (field_0x100 < 4) { + return; + } + field_0x11c = param_1->field_0x1c; + field_0x102 = param_1->field_0x10; + if (field_0x102) { + if (param_3 == 1) { + param_3 = param_1->field_0x14; + } + field_0x110 = param_1->field_0x14; + field_0x114 = param_1->field_0x18; + field_0x104 = param_1->field_0x20; + field_0x106 = param_1->field_0x22; + } else { + field_0x114 = field_0x11c; + } + if (param_3 && field_0x114 > param_3) { + switch (param_1->field_0x1) { + case 0: + case 1: + field_0x68 = param_3; + field_0x118 += (param_3 * field_0x100 >> 4); + field_0x110 -= param_3; + field_0x114 -= param_3; + break; + case 2: + case 3: + field_0x68 = param_3; + break; + } + } + for (int i = 0; i < 16; i++) { + field_0xb0[i] = 0; + } } /* 8028A6FC-8028A714 .text setOscInfo__Q38JASystem12DSPInterface9DSPBufferFUl */ -void JASystem::DSPInterface::DSPBuffer::setOscInfo(unsigned long) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setOscInfo(u32 param_1) { + field_0x118 = 0; + field_0x64 = 16; + field_0x100 = param_1; } /* 8028A714-8028A740 .text initAutoMixer__Q38JASystem12DSPInterface9DSPBufferFv */ void JASystem::DSPInterface::DSPBuffer::initAutoMixer() { - /* Nonmatching */ + if (field_0x58) { + field_0x54 = field_0x56; + return; + } + field_0x54 = 0; + field_0x58 = 1; } /* 8028A740-8028A764 .text setAutoMixer__Q38JASystem12DSPInterface9DSPBufferFUsUcUcUcUc */ -void JASystem::DSPInterface::DSPBuffer::setAutoMixer(unsigned short, unsigned char, unsigned char, unsigned char, unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setAutoMixer(u16 param_1, u8 param_2, u8 param_3, u8 param_4, u8 param_5) { + field_0x50 = param_2 << 8 | param_3; + field_0x52 = param_4 << 8; + field_0x56 = param_1; + field_0x58 = 1; } /* 8028A764-8028A77C .text setPitch__Q38JASystem12DSPInterface9DSPBufferFUs */ -void JASystem::DSPInterface::DSPBuffer::setPitch(unsigned short) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setPitch(u16 param_1) { + if (param_1 >= 0x7fff) { + param_1 = 0x7fff; + } + field_0x4 = param_1; } /* 8028A77C-8028A788 .text setMixerInitDelayMax__Q38JASystem12DSPInterface9DSPBufferFUc */ -void JASystem::DSPInterface::DSPBuffer::setMixerInitDelayMax(unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setMixerInitDelayMax(u8 param_1) { + field_0xe = param_1; } /* 8028A788-8028A7AC .text setMixerInitVolume__Q38JASystem12DSPInterface9DSPBufferFUcsUc */ -void JASystem::DSPInterface::DSPBuffer::setMixerInitVolume(unsigned char, short, unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setMixerInitVolume(u8 param_1, s16 param_2, u8 param_3) { + u16* tmp = field_0x10[param_1]; + tmp[2] = param_2; + tmp[1] = param_2; + tmp[3] = param_3 << 8 | param_3; } /* 8028A7AC-8028A7DC .text setMixerVolume__Q38JASystem12DSPInterface9DSPBufferFUcsUc */ -void JASystem::DSPInterface::DSPBuffer::setMixerVolume(unsigned char, short, unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setMixerVolume(u8 param_1, s16 param_2, u8 param_3) { + if (field_0x10a) { + return; + } + u16* tmp = field_0x10[param_1]; + tmp[1] = param_2; + tmp[3] = param_3 << 8 | tmp[3] & 0xff; } /* 8028A7DC-8028A7F8 .text setMixerVolumeOnly__Q38JASystem12DSPInterface9DSPBufferFUcs */ -void JASystem::DSPInterface::DSPBuffer::setMixerVolumeOnly(unsigned char, short) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setMixerVolumeOnly(u8 param_1, s16 param_2) { + if (field_0x10a) { + return; + } + field_0x10[param_1][1] = param_2; } /* 8028A7F8-8028A804 .text setPauseFlag__Q38JASystem12DSPInterface9DSPBufferFUc */ -void JASystem::DSPInterface::DSPBuffer::setPauseFlag(unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setPauseFlag(u8 param_1) { + field_0xc = param_1; } /* 8028A804-8028A828 .text flushChannel__Q38JASystem12DSPInterface9DSPBufferFv */ void JASystem::DSPInterface::DSPBuffer::flushChannel() { - /* Nonmatching */ + DCFlushRange(this, sizeof(*this)); } /* 8028A828-8028A884 .text initFilter__Q38JASystem12DSPInterface9DSPBufferFv */ void JASystem::DSPInterface::DSPBuffer::initFilter() { /* Nonmatching */ + for (int i = 0; i < 8; i++) { + field_0x120[i] = 0; + } + field_0x120[0] = 0x7fff; + for (int i = 0; i < 4; i++) { + field_0x148[i] = 0; + } + field_0x148[0] = 0x7fff; + field_0x150 = 0; } /* 8028A884-8028A8BC .text setFilterMode__Q38JASystem12DSPInterface9DSPBufferFUs */ -void JASystem::DSPInterface::DSPBuffer::setFilterMode(unsigned short) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setFilterMode(u16 param_1) { + u8 r30 = param_1 & 0x20; + u8 r31 = param_1 & 0x1f; + if (r30) { + if (r31 > 0x14) { + r31 = 0x14; + } + } else { + if (r31 > 0x18) { + r31 = 0x18; + } + } + field_0x108 = r30 + r31; } /* 8028A8BC-8028A8E4 .text setIIRFilterParam__Q38JASystem12DSPInterface9DSPBufferFPs */ -void JASystem::DSPInterface::DSPBuffer::setIIRFilterParam(short*) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setIIRFilterParam(s16* param_1) { + setFilterTable(field_0x148, param_1, 4); } /* 8028A8E4-8028A90C .text setFIR8FilterParam__Q38JASystem12DSPInterface9DSPBufferFPs */ -void JASystem::DSPInterface::DSPBuffer::setFIR8FilterParam(short*) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setFIR8FilterParam(s16* param_1) { + setFilterTable(field_0x120, param_1, 8); } /* 8028A90C-8028A914 .text setDistFilter__Q38JASystem12DSPInterface9DSPBufferFs */ -void JASystem::DSPInterface::DSPBuffer::setDistFilter(short) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setDistFilter(s16 param_1) { + field_0x150 = param_1; } /* 8028A914-8028A934 .text setBusConnect__Q38JASystem12DSPInterface9DSPBufferFUcUc */ -void JASystem::DSPInterface::DSPBuffer::setBusConnect(unsigned char, unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setBusConnect(u8 param_1, u8 param_2) { + static const u16 connect_table[12] = { + 0x0000, 0x0D00, 0x0D60, 0x0DC0, 0x0E20, 0x0E80, + 0x0EE0, 0x0CA0, 0x0F40, 0x0FA0, 0x0B00, 0x09A0, + }; + u16* tmp = field_0x10[param_1]; + tmp[0] = connect_table[param_2]; } /* 8028A934-8028A978 .text DSP_CreateMap2__FUl */ -void DSP_CreateMap2(unsigned long) { - /* Nonmatching */ +u16 DSP_CreateMap2(u32 param_1) { + u16 var1 = 0; + JASystem::DSPInterface::DSPBuffer* buffer = &JASystem::DSPInterface::CH_BUF[param_1 << 4]; + for (int i = 0; i < 16; i++) { + var1 <<= 1; + if (buffer->field_0x0) { + var1 |= 1; + } + buffer++; + } + return var1; } -