diff --git a/configure.py b/configure.py index b7fd70f21..3b955d139 100644 --- a/configure.py +++ b/configure.py @@ -664,21 +664,21 @@ config.libs = [ Object(Matching, "JSystem/JAudio/JASSystemHeap.cpp"), Object(NonMatching, "JSystem/JAudio/JASNoteMgr.cpp"), Object(NonMatching, "JSystem/JAudio/JASOuterParam.cpp"), - Object(NonMatching, "JSystem/JAudio/JASPlayer_impl.cpp"), - Object(NonMatching, "JSystem/JAudio/JASRegisterParam.cpp"), + Object(Matching, "JSystem/JAudio/JASPlayer_impl.cpp"), + Object(Matching, "JSystem/JAudio/JASRegisterParam.cpp"), Object(NonMatching, "JSystem/JAudio/JASSeqCtrl.cpp"), Object(NonMatching, "JSystem/JAudio/JASSeqParser.cpp"), Object(NonMatching, "JSystem/JAudio/JASTrack.cpp"), Object(Matching, "JSystem/JAudio/JASTrackInterrupt.cpp"), Object(Matching, "JSystem/JAudio/JASTrackPort.cpp"), Object(Matching, "JSystem/JAudio/JASBank.cpp"), - Object(NonMatching, "JSystem/JAudio/JASWaveBank.cpp"), - Object(NonMatching, "JSystem/JAudio/JASBasicBank.cpp"), + Object(Matching, "JSystem/JAudio/JASWaveBank.cpp"), + Object(Matching, "JSystem/JAudio/JASBasicBank.cpp"), Object(NonMatching, "JSystem/JAudio/JASBasicInst.cpp"), Object(NonMatching, "JSystem/JAudio/JASDrumSet.cpp"), Object(NonMatching, "JSystem/JAudio/JASBasicWaveBank.cpp"), - Object(NonMatching, "JSystem/JAudio/JASSimpleWaveBank.cpp"), - Object(NonMatching, "JSystem/JAudio/JASInstEffect.cpp"), + Object(Matching, "JSystem/JAudio/JASSimpleWaveBank.cpp"), + Object(Matching, "JSystem/JAudio/JASInstEffect.cpp"), Object(NonMatching, "JSystem/JAudio/JASInstSense.cpp"), Object(NonMatching, "JSystem/JAudio/JASInstRand.cpp"), Object(NonMatching, "JSystem/JAudio/JASWSParser.cpp"), diff --git a/include/JSystem/JAudio/JASBNKParser.h b/include/JSystem/JAudio/JASBNKParser.h new file mode 100644 index 000000000..89ceff910 --- /dev/null +++ b/include/JSystem/JAudio/JASBNKParser.h @@ -0,0 +1,25 @@ +#ifndef JASBNKPARSER_H +#define JASBNKPARSER_H + +#include "dolphin/types.h" + +namespace JASystem { + class TBasicBank; + namespace BNKParser { + struct THeader; + struct TInst; + struct TKeymap; + struct TOsc; + struct TPerc; + struct TPmap; + struct TRand; + struct TSense; + struct TVmap; + + TBasicBank* createBasicBank(void*); + void findOscPtr(JASystem::TBasicBank*, JASystem::BNKParser::THeader*, JASystem::BNKParser::TOsc*); + void getOscTableEndPtr(short*); + }; +} + +#endif /* JASBNKPARSER_H */ diff --git a/include/JSystem/JAudio/JASBank.h b/include/JSystem/JAudio/JASBank.h index 7763ef23e..4a447c914 100644 --- a/include/JSystem/JAudio/JASBank.h +++ b/include/JSystem/JAudio/JASBank.h @@ -6,10 +6,22 @@ class JKRHeap; namespace JASystem { - namespace TBank { - JKRHeap* getCurrentHeap(); + class TInst; + class TWaveBank; + class TBank { + public: + TBank() { + field_0x4 = 0; + } + virtual ~TBank() {} + virtual TInst* getInst(int) const = 0; + virtual u32 getType() const = 0; - extern JKRHeap* sCurrentHeap; + static JKRHeap* getCurrentHeap(); + + static JKRHeap* sCurrentHeap; + + /* 0x04 */ TWaveBank* field_0x4; }; } diff --git a/include/JSystem/JAudio/JASBankMgr.h b/include/JSystem/JAudio/JASBankMgr.h new file mode 100644 index 000000000..7e797e8a7 --- /dev/null +++ b/include/JSystem/JAudio/JASBankMgr.h @@ -0,0 +1,32 @@ +#ifndef JASBANKMGR_H +#define JASBANKMGR_H + +#include "JSystem/JAudio/JASOscillator.h" + +namespace JASystem { + class TBank; + class TChannel; + class TChannelMgr; + + namespace BankMgr { + void init(int); + bool registBank(int, TBank*); + bool registBankBNK(int, void*); + TBank* getBank(int); + u16 getPhysicalNumber(u16); + void setVir2PhyTable(u32, int); + bool assignWaveBank(int, int); + float clamp01(float); + TChannel* noteOn(TChannelMgr*, int, int, u8, u8, u32); + TChannel* noteOnOsc(TChannelMgr*, int, u8, u8, u32); + void gateOn(TChannel*, u8, u8, u32); + + extern s32 sTableSize; + extern TBank** sBankArray; + extern u16* sVir2PhyTable; + + extern TOscillator::Osc_ OSC_ENV; + } +} + +#endif /* JASBANKMGR_H */ diff --git a/include/JSystem/JAudio/JASBasicBank.h b/include/JSystem/JAudio/JASBasicBank.h new file mode 100644 index 000000000..6c760bfb0 --- /dev/null +++ b/include/JSystem/JAudio/JASBasicBank.h @@ -0,0 +1,21 @@ +#ifndef JASBASICBANK_H +#define JASBASICBANK_H + +#include "JSystem/JAudio/JASBank.h" + +namespace JASystem { + class TBasicBank : public TBank { + public: + TBasicBank(); + ~TBasicBank(); + void setInstCount(u32); + void setInst(int, JASystem::TInst*); + TInst* getInst(int) const; + u32 getType() const { return 'BSIC'; } + + /* 0x08 */ TInst** mInstTable; + /* 0x0C */ u32 mInstCount; + }; +} + +#endif /* JASBASICBANK_H */ diff --git a/include/JSystem/JAudio/JASBasicInst.h b/include/JSystem/JAudio/JASBasicInst.h new file mode 100644 index 000000000..f491534d9 --- /dev/null +++ b/include/JSystem/JAudio/JASBasicInst.h @@ -0,0 +1,51 @@ +#ifndef JASBASICINST_H +#define JASBASICINST_H + +#include "JSystem/JAudio/JASInst.h" +#include "JSystem/JAudio/JASOscillator.h" + +namespace JASystem { + class TInstEffect; + class TBasicInst : public TInst { + public: + class TKeymap { + public: + TKeymap() { + field_0x0 = -1; + field_0x4 = 0; + mVelomap = NULL; + } + ~TKeymap(); + void setVeloRegionCount(u32); + void* getVeloRegion(int); + const void* getVeloRegion(int) const; + + /* 0x00 */ int field_0x0; + /* 0x04 */ u32 field_0x4; + /* 0x08 */ void* mVelomap; + }; + + TBasicInst(); + ~TBasicInst(); + bool getParam(int, int, TInstParam*) const; + int getKeymapIndex(int) const; + void setKeyRegionCount(u32); + void setEffectCount(u32); + void setEffect(int, TInstEffect*); + void setOscCount(u32); + void setOsc(int, TOscillator::Osc_*); + TKeymap* getKeyRegion(int); + u32 getType() const { return 'BSIC'; } + + /* 0x04 */ f32 field_0x4; + /* 0x08 */ f32 field_0x8; + /* 0x0C */ TInstEffect** mEffect; + /* 0x10 */ u32 mEffectCount; + /* 0x14 */ TOscillator::Osc_** mOsc; + /* 0x18 */ u32 mOscCount; + /* 0x1C */ u32 field_0x1c; + /* 0x20 */ TKeymap* mKeymap; + }; +} + +#endif /* JASBASICINST_H */ diff --git a/include/JSystem/JAudio/JASBasicWaveBank.h b/include/JSystem/JAudio/JASBasicWaveBank.h new file mode 100644 index 000000000..172cdc694 --- /dev/null +++ b/include/JSystem/JAudio/JASBasicWaveBank.h @@ -0,0 +1,79 @@ +#ifndef JASBASICWAVEBANK_H +#define JASBASICWAVEBANK_H + +#include "JSystem/JAudio/JASWaveArcLoader.h" +#include "JSystem/JAudio/JASWaveBank.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "dolphin/os/OSMutex.h" + +namespace JASystem { + class TBasicWaveBank : public TWaveBank { + public: + class TWaveHandle : public JASystem::TWaveHandle { + public: + ~TWaveHandle() {} + const JASystem::TWaveInfo* getWaveInfo() const { + return &field_0x4; + } + const void* getWavePtr() const { + JUT_ASSERT(77, mHeap); + if (!mHeap->mBase) { + return NULL; + } + return (u8*)mHeap->mBase + field_0x4.field_0x8; + } + + /* 0x04 */ JASystem::TWaveInfo field_0x4; + /* 0x30 */ Kernel::THeap* mHeap; + }; + + class TWaveInfo { + public: + TWaveInfo() { + field_0x0.mHeap = NULL; + field_0x34 = 0; + field_0x38 = NULL; + field_0x3c = NULL; + } + ~TWaveInfo(); + + /* 0x00 */ TWaveHandle field_0x0; + /* 0x34 */ u32 field_0x34; + /* 0x38 */ TWaveInfo* field_0x38; + /* 0x3C */ TWaveInfo* field_0x3c; + }; + + class TWaveGroup : public TWaveArc { + public: + TWaveGroup(TBasicWaveBank*); + ~TWaveGroup(); + void setWaveCount(u32); + void setWaveInfo(int, u32, const JASystem::TWaveInfo&); + void onLoadDone(); + void onEraseDone(); + u32 getWaveID(int) const; + + /* 0x78 */ TBasicWaveBank* mBank; + /* 0x7C */ TWaveInfo* mCtrlWaveArray; + /* 0x80 */ u32 mWaveCount; + }; + + TBasicWaveBank(); + ~TBasicWaveBank(); + TWaveGroup* getWaveGroup(int); + void setGroupCount(u32); + void setWaveTableSize(u32); + void incWaveTable(const TWaveGroup*); + void decWaveTable(const TWaveGroup*); + JASystem::TWaveHandle* getWaveHandle(u32) const; + TWaveArc* getWaveArc(int param_1) { return getWaveGroup(param_1); } + + /* 0x04 */ OSMutex mMutex; + /* 0x1C */ TWaveInfo** mWaveTable; + /* 0x20 */ int mWaveCount; + /* 0x24 */ TWaveGroup** mWaveGroupArray; + /* 0x28 */ u32 mWaveGroupCount; + }; +} + +#endif /* JASBASICWAVEBANK_H */ diff --git a/include/JSystem/JAudio/JASChannel.h b/include/JSystem/JAudio/JASChannel.h index 14c59529e..3f9363658 100644 --- a/include/JSystem/JAudio/JASChannel.h +++ b/include/JSystem/JAudio/JASChannel.h @@ -37,7 +37,7 @@ namespace JASystem { void setPauseFlagReq(u8); void setPanPower(f32, f32, f32, f32); BOOL checkLogicalChannel(); - bool play(u32); + BOOL play(u32); void stop(u16); void updateJcToDSP(); bool forceStopLogicalChannel(); @@ -75,7 +75,7 @@ namespace JASystem { /* 0x48 */ u32 field_0x48; /* 0x4C */ short field_0x4c; /* 0x50 */ f32 field_0x50; - /* 0x54 */ int field_0x54; + /* 0x54 */ f32 field_0x54; /* 0x58 */ f32 field_0x58; /* 0x5C */ f32 field_0x5c; /* 0x60 */ u8 field_0x60[3]; diff --git a/include/JSystem/JAudio/JASDSPInterface.h b/include/JSystem/JAudio/JASDSPInterface.h index d264986d8..69b279176 100644 --- a/include/JSystem/JAudio/JASDSPInterface.h +++ b/include/JSystem/JAudio/JASDSPInterface.h @@ -127,10 +127,7 @@ namespace JASystem { extern u16 JAS_DSP_PREFIX; extern DSPBuffer* CH_BUF; extern FXBuffer* FX_BUF; - extern float sDSPVolume; - - extern u32 DSPADPCM_FILTER[]; - extern u32 DSPRES_FILTER[]; + extern f32 sDSPVolume; }; } diff --git a/include/JSystem/JAudio/JASDriverIF.h b/include/JSystem/JAudio/JASDriverIF.h index 972e473b7..6244d863e 100644 --- a/include/JSystem/JAudio/JASDriverIF.h +++ b/include/JSystem/JAudio/JASDriverIF.h @@ -23,8 +23,6 @@ namespace JASystem { extern u16 MAX_AUTOMIXERLEVEL; extern u32 JAS_SYSTEM_OUTPUT_MODE; extern u8 JAS_UPDATE_INTERVAL; - - extern int C5BASE_PITCHTABLE; }; } diff --git a/include/JSystem/JAudio/JASDriverTables.h b/include/JSystem/JAudio/JASDriverTables.h new file mode 100644 index 000000000..b43306c3f --- /dev/null +++ b/include/JSystem/JAudio/JASDriverTables.h @@ -0,0 +1,16 @@ +#ifndef JASDRIVERTABLES_H +#define JASDRIVERTABLES_H + +#include "dolphin/types.h" + +namespace JASystem { + namespace Driver { + extern f32 C5BASE_PITCHTABLE[]; + } + namespace DSPInterface { + extern u16 DSPADPCM_FILTER[]; + extern u16 DSPRES_FILTER[]; + } +} + +#endif /* JASDRIVERTABLES_H */ diff --git a/include/JSystem/JAudio/JASDvdThread.h b/include/JSystem/JAudio/JASDvdThread.h index c48738d33..52accbde9 100644 --- a/include/JSystem/JAudio/JASDvdThread.h +++ b/include/JSystem/JAudio/JASDvdThread.h @@ -19,7 +19,7 @@ public: OSInitThreadQueue(&field_0x68); } ~JASTaskThread(); - bool sendCmdMsg(s32 (*)(void*), void*, u32); + BOOL sendCmdMsg(s32 (*)(void*), void*, u32); void* run(); void pause(bool); @@ -31,7 +31,7 @@ namespace JASystem { namespace Dvd { bool createThread(int, int, u32); void resumeThread(); - void sendCmdMsg(s32 (*)(void*), void*, u32); + BOOL sendCmdMsg(s32 (*)(void*), void*, u32); int checkPassDvdT(u32, u32*, void (*)(u32)); u32 checkFile(char*); void unpauseDvdT(); diff --git a/include/JSystem/JAudio/JASHeapCtrl.h b/include/JSystem/JAudio/JASHeapCtrl.h index 27f9fc805..f800f16be 100644 --- a/include/JSystem/JAudio/JASHeapCtrl.h +++ b/include/JSystem/JAudio/JASHeapCtrl.h @@ -19,6 +19,7 @@ namespace JASystem { }; THeap(TDisposer*); + ~THeap() {} void initRootHeap(void*, u32, Type); bool alloc(THeap*, u32); bool free(); @@ -42,9 +43,9 @@ namespace JASystem { public: TSolidHeap(); ~TSolidHeap() {} - int alloc(long param_1); + void* alloc(s32 param_1); void freeAll(); - void init(u8* param_1, long param_2); + void init(u8* param_1, s32 param_2); int getRemain(); /* 0x00 */ u32 field_0x0; diff --git a/include/JSystem/JAudio/JASInst.h b/include/JSystem/JAudio/JASInst.h new file mode 100644 index 000000000..6043cbf75 --- /dev/null +++ b/include/JSystem/JAudio/JASInst.h @@ -0,0 +1,36 @@ +#ifndef JASINST_H +#define JASINST_H + +#include "JSystem/JAudio/JASOscillator.h" +#include "dolphin/types.h" + +namespace JASystem { + struct TInstParam { + /* 0x00 */ u8 field_0x0; + /* 0x04 */ int field_0x4; + /* 0x08 */ TOscillator::Osc_** field_0x8; + /* 0x0C */ int field_0xc; + /* 0x10 */ f32 field_0x10; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ f32 field_0x1c; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ u8 field_0x24[0x2C - 0x24]; + /* 0x2C */ f32 field_0x2c; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ f32 field_0x34; + /* 0x38 */ u8 field_0x38; + /* 0x3A */ short field_0x3a; + /* 0x3C */ int field_0x3c; + }; + class TInst { + public: + TInst() {} + virtual ~TInst() {} + virtual bool getParam(int, int, TInstParam*) const = 0; + virtual u32 getType() const = 0; + virtual int getKeymapIndex(int) const = 0; + }; +} + +#endif /* JASINST_H */ diff --git a/include/JSystem/JAudio/JASInstEffect.h b/include/JSystem/JAudio/JASInstEffect.h new file mode 100644 index 000000000..78f4a56c4 --- /dev/null +++ b/include/JSystem/JAudio/JASInstEffect.h @@ -0,0 +1,17 @@ +#ifndef JASINSTEFFECT_H +#define JASINSTEFFECT_H + +#include "dolphin/types.h" + +namespace JASystem { + class TInstEffect { + public: + TInstEffect() { mTarget = 0; } + virtual f32 getY(int, int) const = 0; + void setTarget(int); + + /* 0x04 */ u8 mTarget; + }; +} + +#endif /* JASINSTEFFECT_H */ diff --git a/include/JSystem/JAudio/JASOscillator.h b/include/JSystem/JAudio/JASOscillator.h index 821f857a2..d3aaaab94 100644 --- a/include/JSystem/JAudio/JASOscillator.h +++ b/include/JSystem/JAudio/JASOscillator.h @@ -9,8 +9,8 @@ namespace JASystem { struct Osc_ { /* 0x00 */ u8 field_0x0; /* 0x04 */ f32 field_0x4; - /* 0x08 */ u32 table; - /* 0x0C */ int rel_table; + /* 0x08 */ void* table; + /* 0x0C */ void* rel_table; /* 0x10 */ f32 field_0x10; /* 0x14 */ f32 field_0x14; }; diff --git a/include/JSystem/JAudio/JASPlayer.h b/include/JSystem/JAudio/JASPlayer.h new file mode 100644 index 000000000..1ebc5fa56 --- /dev/null +++ b/include/JSystem/JAudio/JASPlayer.h @@ -0,0 +1,26 @@ +#ifndef JASPLAYER_H +#define JASPLAYER_H + +#include "JSystem/JAudio/JASOscillator.h" +#include "dolphin/types.h" + +namespace JASystem { + namespace Player { + s16 extend8to16(u8 param_1); + f32 pitchToCent(f32 param_1, f32 param_2); + s32 getRandomS32(); + + extern const f32 s_key_table[]; + extern const TOscillator::Osc_ sAdsrDef; + extern const TOscillator::Osc_ sEnvelopeDef; + extern const TOscillator::Osc_ sVibratoDef; + extern const TOscillator::Osc_ sTremoroDef; + extern s16 CUTOFF_TO_IIR_TABLE[]; + extern s16 sAdsTable[]; + extern s16 sRelTable[]; + extern s16 sVibTable[]; + extern s16 sTreTable[]; + } +} + +#endif /* JASPLAYER_H */ diff --git a/include/JSystem/JAudio/JASRegisterParam.h b/include/JSystem/JAudio/JASRegisterParam.h new file mode 100644 index 000000000..5f3b6378d --- /dev/null +++ b/include/JSystem/JAudio/JASRegisterParam.h @@ -0,0 +1,33 @@ +#ifndef JASREGISTERPARAM_H +#define JASREGISTERPARAM_H + +#include "dolphin/types.h" + +namespace JASystem { + class TRegisterParam { + public: + TRegisterParam(); + void init(); + void inherit(const TRegisterParam&); + u8 getBankNumber() const; + u8 getProgramNumber() const; + + /* 0x00 */ short field_0x0; + /* 0x02 */ short field_0x2; + /* 0x04 */ short field_0x4; + /* 0x06 */ short field_0x6; + /* 0x08 */ short field_0x8; + /* 0x0A */ short field_0xa; + /* 0x0C */ u16 field_0xc; + /* 0x0E */ u16 field_0xe; + /* 0x10 */ u16 field_0x10[5]; + /* 0x1A */ u16 field_0x1a; + /* 0x1C */ int field_0x1c; + /* 0x20 */ int field_0x20; + /* 0x24 */ int field_0x24; + /* 0x28 */ int field_0x28; + /* 0x2C */ int field_0x2c; + }; +} + +#endif /* JASREGISTERPARAM_H */ diff --git a/include/JSystem/JAudio/JASSeqCtrl.h b/include/JSystem/JAudio/JASSeqCtrl.h new file mode 100644 index 000000000..df3fda2d2 --- /dev/null +++ b/include/JSystem/JAudio/JASSeqCtrl.h @@ -0,0 +1,34 @@ +#ifndef JASSEQCTRL_H +#define JASSEQCTRL_H + +#include "dolphin/types.h" + +namespace JASystem { + class TTrack; + + class TSeqCtrl { + public: + void init(); + void start(void*, u32); + int loopEnd(); + bool waitCountDown(); + bool callIntr(void*); + bool retIntr(); + u32 get16(u32) const; + u32 get24(u32) const; + u32 get32(u32) const; + u32 read16(); + u32 read24(); + + /* 0x00 */ u8* field_0x0; + /* 0x04 */ u8* field_0x4; + /* 0x08 */ int field_0x8; + /* 0x0C */ u32 field_0xc; + /* 0x10 */ u8* field_0x10[8]; + /* 0x30 */ u16 field_0x30[8]; + /* 0x40 */ int field_0x40; + /* 0x44 */ u8* field_0x44; + }; +} + +#endif /* JASSEQCTRL_H */ diff --git a/include/JSystem/JAudio/JASSimpleWaveBank.h b/include/JSystem/JAudio/JASSimpleWaveBank.h new file mode 100644 index 000000000..9a3d56bef --- /dev/null +++ b/include/JSystem/JAudio/JASSimpleWaveBank.h @@ -0,0 +1,39 @@ +#ifndef JASSIMPLEWAVEBANK_H +#define JASSIMPLEWAVEBANK_H + +#include "JSystem/JAudio/JASWaveArcLoader.h" +#include "JSystem/JAudio/JASWaveBank.h" +#include "dolphin/types.h" + +namespace JASystem { + class TSimpleWaveBank : public TWaveBank, TWaveArc { + public: + class TWaveHandle : public JASystem::TWaveHandle { + public: + TWaveHandle() { mHeap = NULL; } + ~TWaveHandle(); + const TWaveInfo* getWaveInfo() const { return &field_0x4; }; + const void* getWavePtr() const { + if (mHeap->mBase == NULL) { + return NULL; + } + return (u8*)mHeap->mBase + field_0x4.field_0x8; + } + + /* 0x04 */ TWaveInfo field_0x4; + /* 0x30 */ Kernel::THeap* mHeap; + }; + + TSimpleWaveBank(); + ~TSimpleWaveBank(); + void setWaveTableSize(u32); + TWaveHandle* getWaveHandle(u32) const; + void setWaveInfo(u32, const JASystem::TWaveInfo&); + TWaveArc* getWaveArc(int); + + /* 0x7C */ TWaveHandle* mWaveTable; + /* 0x80 */ u32 mWaveCount; + }; +} + +#endif /* JASSIMPLEWAVEBANK_H */ diff --git a/include/JSystem/JAudio/JASSystemHeap.h b/include/JSystem/JAudio/JASSystemHeap.h index e42bfc34a..477312828 100644 --- a/include/JSystem/JAudio/JASSystemHeap.h +++ b/include/JSystem/JAudio/JASSystemHeap.h @@ -14,7 +14,7 @@ namespace JASystem { void sysDramSetup(JKRSolidHeap*); void* allocFromSysDram(u32); void sysAramSetup(u32); - void allocFromSysAramFull(u32*); + void* allocFromSysAramFull(u32*); extern TSolidHeap audioAramHeap; extern u32 audioDramSize; diff --git a/include/JSystem/JAudio/JASWSParser.h b/include/JSystem/JAudio/JASWSParser.h new file mode 100644 index 000000000..2e29c5365 --- /dev/null +++ b/include/JSystem/JAudio/JASWSParser.h @@ -0,0 +1,24 @@ +#ifndef JASWSPARSER_H +#define JASWSPARSER_H + +#include "dolphin/types.h" + +namespace JASystem { + class TBasicWaveBank; + class TSimpleWaveBank; + namespace WSParser { + struct TCtrl; + struct TCtrlGroup; + struct TCtrlScene; + struct TCtrlWave; + struct TWave; + struct TWaveArchive; + struct TWaveArchiveBank; + + u32 getGroupCount(void*); + TBasicWaveBank* createBasicWaveBank(void*); + TSimpleWaveBank* createSimpleWaveBank(void*); + } +} + +#endif /* JASWSPARSER_H */ diff --git a/include/JSystem/JAudio/JASWaveArcLoader.h b/include/JSystem/JAudio/JASWaveArcLoader.h new file mode 100644 index 000000000..2580c790a --- /dev/null +++ b/include/JSystem/JAudio/JASWaveArcLoader.h @@ -0,0 +1,43 @@ +#ifndef JASWAVEARCLOADER_H +#define JASWAVEARCLOADER_H + +#include "JSystem/JAudio/JASHeapCtrl.h" +#include "dolphin/os/OSMutex.h" + +namespace JASystem { + namespace WaveArcLoader { + bool init(); + Kernel::THeap* getRootHeap(); + void setCurrentDir(const char*); + char* getCurrentDir(); + + extern Kernel::THeap sAramHeap; + extern char sCurrentDir[]; + }; + + class TWaveArc : public Kernel::TDisposer { + public: + TWaveArc(); + virtual void onLoadDone() {} + virtual void onEraseDone() {} + bool loadSetup(u32); + bool eraseSetup(); + static s32 loadToAramCallback(void*); + bool sendLoadCmd(); + bool load(Kernel::THeap*); + bool erase(); + void onDispose(); + void setEntryNum(s32); + void setFileName(const char*); + + /* 0x04 */ Kernel::THeap field_0x4; + /* 0x4C */ int field_0x4c; + /* 0x50 */ OSMutex mMutex; + /* 0x68 */ int field_0x68; + /* 0x6C */ int field_0x6c; + /* 0x70 */ int field_0x70; + /* 0x74 */ int field_0x74; + }; +} + +#endif /* JASWAVEARCLOADER_H */ diff --git a/include/JSystem/JAudio/JASWaveBank.h b/include/JSystem/JAudio/JASWaveBank.h new file mode 100644 index 000000000..1c891f887 --- /dev/null +++ b/include/JSystem/JAudio/JASWaveBank.h @@ -0,0 +1,47 @@ +#ifndef JASWAVEBANK_H +#define JASWAVEBANK_H + +#include "dolphin/types.h" + +class JKRHeap; + +namespace JASystem { + class TWaveArc; + + struct TWaveInfo { + /* 0x00 */ u8 field_0x0; + /* 0x01 */ u8 field_0x1; + /* 0x02 */ u8 field_0x2; + /* 0x04 */ f32 field_0x4; + /* 0x08 */ int field_0x8; + /* 0x0C */ int field_0xc; + /* 0x10 */ int field_0x10; + /* 0x14 */ int field_0x14; + /* 0x18 */ int field_0x18; + /* 0x1C */ int field_0x1c; + /* 0x20 */ s16 field_0x20; + /* 0x22 */ s16 field_0x22; + /* 0x24 */ void* field_0x24; + /* 0x28 */ int field_0x28; + }; + + class TWaveHandle { + public: + virtual ~TWaveHandle() {} + virtual const TWaveInfo* getWaveInfo() const = 0; + virtual const void* getWavePtr() const = 0; + }; + + class TWaveBank { + public: + TWaveBank() {} + virtual ~TWaveBank() {} + virtual TWaveHandle* getWaveHandle(u32) const = 0; + virtual TWaveArc* getWaveArc(int) = 0; + static JKRHeap* getCurrentHeap(); + + static JKRHeap* sCurrentHeap; + }; +} + +#endif /* JASWAVEBANK_H */ diff --git a/include/JSystem/JAudio/JASWaveBankMgr.h b/include/JSystem/JAudio/JASWaveBankMgr.h new file mode 100644 index 000000000..72c46a1a9 --- /dev/null +++ b/include/JSystem/JAudio/JASWaveBankMgr.h @@ -0,0 +1,26 @@ +#ifndef JASWAVEBANKMGR_H +#define JASWAVEBANKMGR_H + +#include "dolphin/types.h" + +namespace JASystem { + class TWaveArc; + class TWaveBank; + namespace Kernel { + class THeap; + } + namespace WaveBankMgr { + void init(int); + TWaveBank* getWaveBank(int); + bool registWaveBank(int, TWaveBank*); + bool registWaveBankWS(int, void*); + TWaveArc* getWaveArc(int, int); + bool loadWave(int, int, Kernel::THeap*); + bool eraseWave(int, int); + + extern int sTableSize; + extern TWaveBank** sWaveBank; + } +} + +#endif /* JASWAVEBANKMGR_H */ diff --git a/include/JSystem/JKernel/JKRThread.h b/include/JSystem/JKernel/JKRThread.h index ca4e85678..d293a4d96 100644 --- a/include/JSystem/JKernel/JKRThread.h +++ b/include/JSystem/JKernel/JKRThread.h @@ -31,11 +31,11 @@ public: protected: void resume() { OSResumeThread(mThreadRecord); } - void sendMessage(OSMessage message) { - OSSendMessage(&mMessageQueue, message, OS_MESSAGE_NOBLOCK); + BOOL sendMessage(OSMessage message) { + return OSSendMessage(&mMessageQueue, message, OS_MESSAGE_NOBLOCK); } - void sendMessageBlock(OSMessage message) { - OSSendMessage(&mMessageQueue, message, OS_MESSAGE_BLOCK); + BOOL sendMessageBlock(OSMessage message) { + return OSSendMessage(&mMessageQueue, message, OS_MESSAGE_BLOCK); } OSMessage waitMessage() { OSMessage message; diff --git a/src/JSystem/JAudio/JASBankMgr.cpp b/src/JSystem/JAudio/JASBankMgr.cpp index 98da2bf5b..ed42711ec 100644 --- a/src/JSystem/JAudio/JASBankMgr.cpp +++ b/src/JSystem/JAudio/JASBankMgr.cpp @@ -3,61 +3,154 @@ // Translation Unit: JASBankMgr.cpp // -#include "JASBankMgr.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASBankMgr.h" +#include "JSystem/JAudio/JASBNKParser.h" +#include "JSystem/JAudio/JASBasicBank.h" +#include "JSystem/JAudio/JASCalc.h" +#include "JSystem/JAudio/JASChannel.h" +#include "JSystem/JAudio/JASChannelMgr.h" +#include "JSystem/JAudio/JASDriverTables.h" +#include "JSystem/JAudio/JASRate.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JAudio/JASWaveBankMgr.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JUtility/JUTAssert.h" + +s32 JASystem::BankMgr::sTableSize; +JASystem::TBank** JASystem::BankMgr::sBankArray; +u16* JASystem::BankMgr::sVir2PhyTable; /* 80288594-80288698 .text init__Q28JASystem7BankMgrFi */ -void JASystem::BankMgr::init(int) { - /* Nonmatching */ +void JASystem::BankMgr::init(int param_1) { + u32 r31 = param_1 * 4; + sBankArray = (TBank**)new (JASDram, 0) u8[r31]; + JUT_ASSERT(69, sBankArray != 0); + sVir2PhyTable = new (JASDram, 0) u16[param_1]; + JUT_ASSERT(72, sVir2PhyTable != 0); + Calc::bzero(sBankArray, r31); + for (int i = 0; i < param_1; i++) { + sVir2PhyTable[i] = 0xffffffff; + } + sTableSize = param_1; } /* 80288698-8028874C .text registBank__Q28JASystem7BankMgrFiPQ28JASystem5TBank */ -void JASystem::BankMgr::registBank(int, JASystem::TBank*) { - /* Nonmatching */ +bool JASystem::BankMgr::registBank(int banknum, TBank* bank) { + JUT_ASSERT(86, banknum >= 0); + JUT_ASSERT(87, banknum < sTableSize); + sBankArray[banknum] = bank; + return true; } /* 8028874C-802887AC .text registBankBNK__Q28JASystem7BankMgrFiPv */ -void JASystem::BankMgr::registBankBNK(int, void*) { - /* Nonmatching */ +bool JASystem::BankMgr::registBankBNK(int banknum, void* param_2) { + setVir2PhyTable(*((u32*)(param_2) + 2), banknum); + TBasicBank* bank = BNKParser::createBasicBank(param_2); + if (bank == NULL) { + return false; + } + return registBank(banknum, bank); } /* 802887AC-802887E0 .text getBank__Q28JASystem7BankMgrFi */ -void JASystem::BankMgr::getBank(int) { - /* Nonmatching */ +JASystem::TBank* JASystem::BankMgr::getBank(int param_1) { + if (param_1 < 0) { + return NULL; + } + if (param_1 >= sTableSize) { + return NULL; + } + return sBankArray[param_1]; } /* 802887E0-802887F0 .text getPhysicalNumber__Q28JASystem7BankMgrFUs */ -void JASystem::BankMgr::getPhysicalNumber(unsigned short) { - /* Nonmatching */ +u16 JASystem::BankMgr::getPhysicalNumber(u16 param_1) { + return sVir2PhyTable[param_1]; } /* 802887F0-802888A0 .text setVir2PhyTable__Q28JASystem7BankMgrFUli */ -void JASystem::BankMgr::setVir2PhyTable(unsigned long, int) { - /* Nonmatching */ +void JASystem::BankMgr::setVir2PhyTable(u32 vir_id, int banknum) { + if (vir_id == 0xFFFF) { + return; + } + JUT_ASSERT(127, vir_id < sTableSize); + if (sVir2PhyTable[vir_id] != 0xFFFF) { + OSReport("Warning : Duplicated Bank vir_id ID %d (%d,%d)\n", vir_id, sVir2PhyTable[vir_id], banknum); + } + sVir2PhyTable[vir_id] = banknum; } /* 802888A0-80288904 .text assignWaveBank__Q28JASystem7BankMgrFii */ -void JASystem::BankMgr::assignWaveBank(int, int) { - /* Nonmatching */ +bool JASystem::BankMgr::assignWaveBank(int param_1, int param_2) { + TBank* bank = getBank(param_1); + if (!bank) { + return false; + } + TWaveBank* waveBank = WaveBankMgr::getWaveBank(param_2); + if (!waveBank) { + return false; + } + bank->field_0x4 = waveBank; + return true; } /* 80288904-8028892C .text clamp01__Q28JASystem7BankMgrFf */ -void JASystem::BankMgr::clamp01(float) { - /* Nonmatching */ +f32 JASystem::BankMgr::clamp01(f32 param_1) { + if (param_1 < 0.0f) { + return 0.0f; + } + if (param_1 > 1.0f) { + return 1.0f; + } + return param_1; } /* 8028892C-80288CE8 .text noteOn__Q28JASystem7BankMgrFPQ28JASystem11TChannelMgriiUcUcUl */ -void JASystem::BankMgr::noteOn(JASystem::TChannelMgr*, int, int, unsigned char, unsigned char, unsigned long) { +JASystem::TChannel* JASystem::BankMgr::noteOn(TChannelMgr*, int, int, u8, u8, u32) { /* Nonmatching */ } /* 80288CE8-80288E44 .text noteOnOsc__Q28JASystem7BankMgrFPQ28JASystem11TChannelMgriUcUcUl */ -void JASystem::BankMgr::noteOnOsc(JASystem::TChannelMgr*, int, unsigned char, unsigned char, unsigned long) { +JASystem::TChannel* JASystem::BankMgr::noteOnOsc(TChannelMgr* param_1, int param_2, u8 param_3, u8 param_4, u32 param_5) { /* Nonmatching */ + TChannel* channel = param_1->getLogicalChannel(0); + if (!channel) { + return NULL; + } + channel->field_0x14 = param_2; + channel->field_0xc = 2; + channel->field_0x0 = param_4; + channel->field_0x1 = param_3; + channel->field_0x50 = 16736.016f / Kernel::gDacRate; + channel->field_0x58 = channel->field_0x50; + s32 var1 = param_3; + if (var1 < 0) { + var1 = 0; + } + if (var1 > 127) { + var1 = 127; + } + channel->field_0x58 *= Driver::C5BASE_PITCHTABLE[var1]; + channel->field_0x54 = 1.0f; + channel->field_0x5c = channel->field_0x0 / 127.0f; + channel->field_0x5c = channel->field_0x54 * (channel->field_0x5c * channel->field_0x5c); + channel->field_0x70.field_0x0 = 0.5f; + channel->field_0x7c.field_0x0 = 0.0f; + channel->field_0x88.field_0x0 = 0.0f; + channel->field_0x70.field_0x4 = 0.5f; + channel->field_0x7c.field_0x4 = 0.0f; + channel->field_0x88.field_0x4 = 0.0f; + channel->field_0x94 = 1.0f; + channel->field_0x98 = 1.0f; + channel->setOscInit(0, &OSC_ENV); + channel->field_0xcc = 0; + if (!channel->play(param_5)) { + return NULL; + } + return channel; } /* 80288E44-80288F08 .text gateOn__Q28JASystem7BankMgrFPQ28JASystem8TChannelUcUcUl */ -void JASystem::BankMgr::gateOn(JASystem::TChannel*, unsigned char, unsigned char, unsigned long) { +void JASystem::BankMgr::gateOn(JASystem::TChannel*, u8, u8, u32) { /* Nonmatching */ } - diff --git a/src/JSystem/JAudio/JASBasicBank.cpp b/src/JSystem/JAudio/JASBasicBank.cpp index 76d7cd128..bf833a286 100644 --- a/src/JSystem/JAudio/JASBasicBank.cpp +++ b/src/JSystem/JAudio/JASBasicBank.cpp @@ -3,41 +3,43 @@ // Translation Unit: JASBasicBank.cpp // -#include "JASBasicBank.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASBasicBank.h" +#include "JSystem/JAudio/JASCalc.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JUtility/JUTAssert.h" /* 80284570-8028459C .text __ct__Q28JASystem10TBasicBankFv */ JASystem::TBasicBank::TBasicBank() { - /* Nonmatching */ + mInstTable = NULL; + mInstCount = 0; } /* 8028459C-80284610 .text __dt__Q28JASystem10TBasicBankFv */ JASystem::TBasicBank::~TBasicBank() { - /* Nonmatching */ + delete[] mInstTable; } /* 80284610-802846B0 .text setInstCount__Q28JASystem10TBasicBankFUl */ -void JASystem::TBasicBank::setInstCount(unsigned long) { - /* Nonmatching */ +void JASystem::TBasicBank::setInstCount(u32 param_1) { + delete[] mInstTable; + mInstTable = new (getCurrentHeap(), 0) TInst*[param_1]; + JUT_ASSERT(36, mInstTable != 0); + Calc::bzero(mInstTable, param_1 * 4); + mInstCount = param_1; } /* 802846B0-80284768 .text setInst__Q28JASystem10TBasicBankFiPQ28JASystem5TInst */ -void JASystem::TBasicBank::setInst(int, JASystem::TInst*) { - /* Nonmatching */ +void JASystem::TBasicBank::setInst(int prg_no, JASystem::TInst* param_2) { + JUT_ASSERT(45, prg_no < mInstCount); + JUT_ASSERT(46, prg_no >= 0); + mInstTable[prg_no] = param_2; } /* 80284768-802847F0 .text getInst__Q28JASystem10TBasicBankCFi */ -void JASystem::TBasicBank::getInst(int) const { - /* Nonmatching */ +JASystem::TInst* JASystem::TBasicBank::getInst(int prg_no) const { + JUT_ASSERT(53, prg_no >= 0); + if (prg_no >= mInstCount) { + return 0; + } + return mInstTable[prg_no]; } - -/* 802847F0-80284838 .text __dt__Q28JASystem5TBankFv */ -JASystem::TBank::~TBank() { - /* Nonmatching */ -} - -/* 80284838-80284844 .text getType__Q28JASystem10TBasicBankCFv */ -void JASystem::TBasicBank::getType() const { - /* Nonmatching */ -} - diff --git a/src/JSystem/JAudio/JASBasicInst.cpp b/src/JSystem/JAudio/JASBasicInst.cpp index 0361aff64..dac876e3f 100644 --- a/src/JSystem/JAudio/JASBasicInst.cpp +++ b/src/JSystem/JAudio/JASBasicInst.cpp @@ -3,91 +3,174 @@ // Translation Unit: JASBasicInst.cpp // -#include "JASBasicInst.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASBasicInst.h" +#include "JSystem/JAudio/JASBank.h" +#include "JSystem/JAudio/JASCalc.h" +#include "JSystem/JAudio/JASInstEffect.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" /* 80284844-80284888 .text __ct__Q28JASystem10TBasicInstFv */ JASystem::TBasicInst::TBasicInst() { - /* Nonmatching */ + field_0x4 = 1.0f; + field_0x8 = 1.0f; + mEffect = NULL; + mEffectCount = 0; + mOsc = NULL; + mOscCount = 0; + field_0x1c = 0; + mKeymap = NULL; } /* 80284888-80284914 .text __dt__Q28JASystem10TBasicInstFv */ JASystem::TBasicInst::~TBasicInst() { - /* Nonmatching */ + delete[] mKeymap; + delete[] mEffect; + delete[] mOsc; } /* 80284914-80284B4C .text getParam__Q28JASystem10TBasicInstCFiiPQ28JASystem10TInstParam */ -void JASystem::TBasicInst::getParam(int, int, JASystem::TInstParam*) const { +bool JASystem::TBasicInst::getParam(int param_1, int param_2, TInstParam* param_3) const { /* Nonmatching */ + param_3->field_0x0 = 0; + param_3->field_0x38 = 0; + param_3->field_0x8 = mOsc; + param_3->field_0xc = mOscCount; + param_3->field_0x10 *= field_0x4; + param_3->field_0x14 *= field_0x8; + for (int i = 0; i < mEffectCount; i++) { + TInstEffect* effect = mEffect[i]; + if (!effect) { + continue; + } + f32 y = effect->getY(param_1, param_2); + switch (effect->mTarget) { + case 0: + param_3->field_0x18 *= y; + break; + case 1: + param_3->field_0x1c *= y; + break; + case 2: + param_3->field_0x2c += y - 0.5; + break; + case 3: + param_3->field_0x30 += y; + break; + case 4: + param_3->field_0x34 += y; + break; + default: + JUT_ASSERT(93, 0); + } + } + TKeymap* keymap = NULL; + for (int i = 0; i < field_0x1c; i++) { + keymap = &mKeymap[i]; + if (param_1 <= keymap->field_0x0) { + param_3->field_0x3c = i; + break; + } + } + if (!keymap) { + return false; + } + for (int i = 0; i < keymap->field_0x4; i++) { + void* region = keymap->getVeloRegion(i); + // TODO + } + return false; } /* 80284B4C-80284B54 .text getKeymapIndex__Q28JASystem10TBasicInstCFi */ -void JASystem::TBasicInst::getKeymapIndex(int) const { - /* Nonmatching */ +int JASystem::TBasicInst::getKeymapIndex(int param_1) const { + return param_1; } /* 80284B54-80284C10 .text setKeyRegionCount__Q28JASystem10TBasicInstFUl */ -void JASystem::TBasicInst::setKeyRegionCount(unsigned long) { - /* Nonmatching */ +void JASystem::TBasicInst::setKeyRegionCount(u32 param_1) { + delete[] mKeymap; + mKeymap = new (TBank::getCurrentHeap(), 0) TKeymap[param_1]; + JUT_ASSERT(140, mKeymap != 0); + field_0x1c = param_1; } /* 80284C10-80284CC4 .text setEffectCount__Q28JASystem10TBasicInstFUl */ -void JASystem::TBasicInst::setEffectCount(unsigned long) { - /* Nonmatching */ +void JASystem::TBasicInst::setEffectCount(u32 param_1) { + delete[] mEffect; + mEffectCount = param_1; + if (param_1 == 0) { + mEffect = NULL; + return; + } + mEffect = new (TBank::getCurrentHeap(), 0) TInstEffect*[param_1]; + JUT_ASSERT(157, mEffect != 0); + Calc::bzero(mEffect, param_1 * 4); } /* 80284CC4-80284D7C .text setEffect__Q28JASystem10TBasicInstFiPQ28JASystem11TInstEffect */ -void JASystem::TBasicInst::setEffect(int, JASystem::TInstEffect*) { - /* Nonmatching */ +void JASystem::TBasicInst::setEffect(int index, TInstEffect* effect) { + JUT_ASSERT(164, index < mEffectCount); + JUT_ASSERT(165, index >= 0); + mEffect[index] = effect; } /* 80284D7C-80284E30 .text setOscCount__Q28JASystem10TBasicInstFUl */ -void JASystem::TBasicInst::setOscCount(unsigned long) { - /* Nonmatching */ +void JASystem::TBasicInst::setOscCount(u32 param_1) { + delete[] mOsc; + mOscCount = param_1; + if (param_1 == 0) { + mOsc = NULL; + return; + } + mOsc = new (TBank::getCurrentHeap(), 0) TOscillator::Osc_*[param_1]; + JUT_ASSERT(193, mOsc != 0); + Calc::bzero(mOsc, param_1 * 4); } /* 80284E30-80284EE8 .text setOsc__Q28JASystem10TBasicInstFiPQ38JASystem11TOscillator4Osc_ */ -void JASystem::TBasicInst::setOsc(int, JASystem::TOscillator::Osc_*) { - /* Nonmatching */ +void JASystem::TBasicInst::setOsc(int index, TOscillator::Osc_* osc) { + JUT_ASSERT(199, index < mOscCount); + JUT_ASSERT(200, index >= 0); + mOsc[index] = osc; } /* 80284EE8-80284F70 .text getKeyRegion__Q28JASystem10TBasicInstFi */ -void JASystem::TBasicInst::getKeyRegion(int) { - /* Nonmatching */ +JASystem::TBasicInst::TKeymap* JASystem::TBasicInst::getKeyRegion(int index) { + JUT_ASSERT(217, index >= 0); + if (index >= field_0x1c) { + return NULL; + } + return &mKeymap[index]; } /* 80284F70-80284FC4 .text __dt__Q38JASystem10TBasicInst7TKeymapFv */ JASystem::TBasicInst::TKeymap::~TKeymap() { - /* Nonmatching */ + delete[] mVelomap; } /* 80284FC4-80285058 .text setVeloRegionCount__Q38JASystem10TBasicInst7TKeymapFUl */ -void JASystem::TBasicInst::TKeymap::setVeloRegionCount(unsigned long) { - /* Nonmatching */ +void JASystem::TBasicInst::TKeymap::setVeloRegionCount(u32 param_1) { + delete[] mVelomap; + mVelomap = new (TBank::getCurrentHeap(), 0) u8[param_1 * 16]; + JUT_ASSERT(244, mVelomap != 0); + field_0x4 = param_1; } /* 80285058-802850E0 .text getVeloRegion__Q38JASystem10TBasicInst7TKeymapFi */ -void JASystem::TBasicInst::TKeymap::getVeloRegion(int) { - /* Nonmatching */ +void* JASystem::TBasicInst::TKeymap::getVeloRegion(int index) { + JUT_ASSERT(252, index >= 0); + if (index >= field_0x4) { + return NULL; + } + return (u8*)mVelomap + index * 16; } /* 802850E0-80285168 .text getVeloRegion__Q38JASystem10TBasicInst7TKeymapCFi */ -void JASystem::TBasicInst::TKeymap::getVeloRegion(int) const { - /* Nonmatching */ +const void* JASystem::TBasicInst::TKeymap::getVeloRegion(int index) const { + JUT_ASSERT(261, index >= 0); + if (index >= field_0x4) { + return NULL; + } + return (u8*)mVelomap + index * 16; } - -/* 80285168-802851B0 .text __dt__Q28JASystem5TInstFv */ -JASystem::TInst::~TInst() { - /* Nonmatching */ -} - -/* 802851B0-802851C8 .text __ct__Q38JASystem10TBasicInst7TKeymapFv */ -JASystem::TBasicInst::TKeymap::TKeymap() { - /* Nonmatching */ -} - -/* 802851C8-802851D4 .text getType__Q28JASystem10TBasicInstCFv */ -void JASystem::TBasicInst::getType() const { - /* Nonmatching */ -} - diff --git a/src/JSystem/JAudio/JASBasicWaveBank.cpp b/src/JSystem/JAudio/JASBasicWaveBank.cpp index 51e632192..800416ba2 100644 --- a/src/JSystem/JAudio/JASBasicWaveBank.cpp +++ b/src/JSystem/JAudio/JASBasicWaveBank.cpp @@ -3,121 +3,144 @@ // Translation Unit: JASBasicWaveBank.cpp // -#include "JASBasicWaveBank.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASBasicWaveBank.h" +#include "JSystem/JAudio/JASCalc.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JUtility/JUTAssert.h" /* 80285968-802859C8 .text __ct__Q28JASystem14TBasicWaveBankFv */ JASystem::TBasicWaveBank::TBasicWaveBank() { - /* Nonmatching */ + mWaveTable = NULL; + mWaveCount = 0; + mWaveGroupArray = NULL; + mWaveGroupCount = 0; + OSInitMutex(&mMutex); } /* 802859C8-80285A74 .text __dt__Q28JASystem14TBasicWaveBankFv */ JASystem::TBasicWaveBank::~TBasicWaveBank() { - /* Nonmatching */ + delete[] mWaveTable; + for (int i = 0; i < mWaveGroupCount; i++) { + delete mWaveGroupArray[i]; + } + delete[] mWaveGroupArray; } /* 80285A74-80285AFC .text getWaveGroup__Q28JASystem14TBasicWaveBankFi */ -void JASystem::TBasicWaveBank::getWaveGroup(int) { - /* Nonmatching */ +JASystem::TBasicWaveBank::TWaveGroup* JASystem::TBasicWaveBank::getWaveGroup(int group_no) { + JUT_ASSERT(41, group_no >= 0); + if (group_no >= mWaveGroupCount) { + return NULL; + } + return mWaveGroupArray[group_no]; } /* 80285AFC-80285C10 .text setGroupCount__Q28JASystem14TBasicWaveBankFUl */ -void JASystem::TBasicWaveBank::setGroupCount(unsigned long) { - /* Nonmatching */ +void JASystem::TBasicWaveBank::setGroupCount(u32 param_1) { + for (int i = 0; i < mWaveGroupCount; i++) { + delete mWaveGroupArray[i]; + } + delete[] mWaveGroupArray; + mWaveGroupCount = param_1; + mWaveGroupArray = new (getCurrentHeap(), 0) TWaveGroup*[param_1]; + JUT_ASSERT(58, mWaveGroupArray != 0); + for (int i = 0; i < mWaveGroupCount; i++) { + mWaveGroupArray[i] = new (getCurrentHeap(), 0) TWaveGroup(this); + } } /* 80285C10-80285CB0 .text setWaveTableSize__Q28JASystem14TBasicWaveBankFUl */ -void JASystem::TBasicWaveBank::setWaveTableSize(unsigned long) { - /* Nonmatching */ +void JASystem::TBasicWaveBank::setWaveTableSize(u32 param_1) { + delete[] mWaveTable; + mWaveTable = new (getCurrentHeap(), 0) TWaveInfo*[param_1]; + JUT_ASSERT(70, mWaveTable != 0); + Calc::bzero(mWaveTable, param_1 * 4); + mWaveCount = param_1; } /* 80285CB0-80285D54 .text incWaveTable__Q28JASystem14TBasicWaveBankFPCQ38JASystem14TBasicWaveBank10TWaveGroup */ -void JASystem::TBasicWaveBank::incWaveTable(const JASystem::TBasicWaveBank::TWaveGroup*) { +void JASystem::TBasicWaveBank::incWaveTable(const TWaveGroup* param_1) { /* Nonmatching */ + OSLockMutex(&mMutex); + for (int i = 0; i < param_1->mWaveCount; i++) { + u32 waveID = param_1->getWaveID(i); + TWaveInfo** table = mWaveTable; + TWaveInfo* waveInfo = ¶m_1->mCtrlWaveArray[i]; + waveInfo->field_0x3c = 0; + waveInfo->field_0x38 = table[waveID]; + if (table[waveID]) { + table[waveID]->field_0x3c = waveInfo; + } + table[waveID] = waveInfo; + } + OSUnlockMutex(&mMutex); } /* 80285D54-80285E28 .text decWaveTable__Q28JASystem14TBasicWaveBankFPCQ38JASystem14TBasicWaveBank10TWaveGroup */ -void JASystem::TBasicWaveBank::decWaveTable(const JASystem::TBasicWaveBank::TWaveGroup*) { +void JASystem::TBasicWaveBank::decWaveTable(const TWaveGroup*) { /* Nonmatching */ } /* 80285E28-80285E58 .text getWaveHandle__Q28JASystem14TBasicWaveBankCFUl */ -void JASystem::TBasicWaveBank::getWaveHandle(unsigned long) const { - /* Nonmatching */ +JASystem::TWaveHandle* JASystem::TBasicWaveBank::getWaveHandle(u32 param_1) const { + if (param_1 >= mWaveCount) { + return NULL; + } + if (mWaveTable[param_1]) { + return &mWaveTable[param_1]->field_0x0; + } + return NULL; } /* 80285E58-80285EB0 .text __ct__Q38JASystem14TBasicWaveBank10TWaveGroupFPQ28JASystem14TBasicWaveBank */ -JASystem::TBasicWaveBank::TWaveGroup::TWaveGroup(JASystem::TBasicWaveBank*) { - /* Nonmatching */ +JASystem::TBasicWaveBank::TWaveGroup::TWaveGroup(TBasicWaveBank* param_1) { + mBank = param_1; + mCtrlWaveArray = NULL; + mWaveCount = 0; } /* 80285EB0-80285F64 .text __dt__Q38JASystem14TBasicWaveBank10TWaveGroupFv */ JASystem::TBasicWaveBank::TWaveGroup::~TWaveGroup() { - /* Nonmatching */ + delete[] mCtrlWaveArray; } /* 80285F64-80285FC4 .text __dt__Q38JASystem14TBasicWaveBank9TWaveInfoFv */ -JASystem::TBasicWaveBank::TWaveInfo::~TWaveInfo() { - /* Nonmatching */ -} +JASystem::TBasicWaveBank::TWaveInfo::~TWaveInfo() {} /* 80285FC4-802860B8 .text setWaveCount__Q38JASystem14TBasicWaveBank10TWaveGroupFUl */ -void JASystem::TBasicWaveBank::TWaveGroup::setWaveCount(unsigned long) { - /* Nonmatching */ +void JASystem::TBasicWaveBank::TWaveGroup::setWaveCount(u32 param_1) { + delete[] mCtrlWaveArray; + mWaveCount = param_1; + mCtrlWaveArray = new (getCurrentHeap(), 0) TWaveInfo[param_1]; + JUT_ASSERT(180, mCtrlWaveArray != 0); + for (int i = 0; i < param_1; i++) { + mCtrlWaveArray[i].field_0x0.mHeap = &field_0x4; + mCtrlWaveArray[i].field_0x0.field_0x4.field_0x24 = &field_0x4c; + } } /* 802860B8-80286204 .text setWaveInfo__Q38JASystem14TBasicWaveBank10TWaveGroupFiUlRCQ28JASystem9TWaveInfo */ -void JASystem::TBasicWaveBank::TWaveGroup::setWaveInfo(int, unsigned long, const JASystem::TWaveInfo&) { - /* Nonmatching */ +void JASystem::TBasicWaveBank::TWaveGroup::setWaveInfo(int index, u32 param_2, const JASystem::TWaveInfo& param_3) { + JUT_ASSERT(190, index < mWaveCount); + JUT_ASSERT(191, index >= 0); + mCtrlWaveArray[index].field_0x34 = param_2; + mCtrlWaveArray[index].field_0x0.field_0x4 = param_3; + mCtrlWaveArray[index].field_0x0.field_0x4.field_0x24 = &field_0x4c; } /* 80286204-80286274 .text onLoadDone__Q38JASystem14TBasicWaveBank10TWaveGroupFv */ void JASystem::TBasicWaveBank::TWaveGroup::onLoadDone() { - /* Nonmatching */ + JUT_ASSERT(201, mBank); + mBank->incWaveTable(this); } /* 80286274-802862E4 .text onEraseDone__Q38JASystem14TBasicWaveBank10TWaveGroupFv */ void JASystem::TBasicWaveBank::TWaveGroup::onEraseDone() { - /* Nonmatching */ + JUT_ASSERT(207, mBank); + mBank->decWaveTable(this); } /* 802862E4-802862F8 .text getWaveID__Q38JASystem14TBasicWaveBank10TWaveGroupCFi */ -void JASystem::TBasicWaveBank::TWaveGroup::getWaveID(int) const { - /* Nonmatching */ +u32 JASystem::TBasicWaveBank::TWaveGroup::getWaveID(int param_1) const { + return mCtrlWaveArray[param_1].field_0x34; } - -/* 802862F8-80286340 .text __dt__Q28JASystem9TWaveBankFv */ -JASystem::TWaveBank::~TWaveBank() { - /* Nonmatching */ -} - -/* 80286340-80286388 .text __dt__Q28JASystem11TWaveHandleFv */ -JASystem::TWaveHandle::~TWaveHandle() { - /* Nonmatching */ -} - -/* 80286388-802863B8 .text __ct__Q38JASystem14TBasicWaveBank9TWaveInfoFv */ -JASystem::TBasicWaveBank::TWaveInfo::TWaveInfo() { - /* Nonmatching */ -} - -/* 802863B8-80286414 .text __dt__Q38JASystem14TBasicWaveBank11TWaveHandleFv */ -JASystem::TBasicWaveBank::TWaveHandle::~TWaveHandle() { - /* Nonmatching */ -} - -/* 80286414-8028641C .text getWaveInfo__Q38JASystem14TBasicWaveBank11TWaveHandleCFv */ -void JASystem::TBasicWaveBank::TWaveHandle::getWaveInfo() const { - /* Nonmatching */ -} - -/* 8028641C-802864A8 .text getWavePtr__Q38JASystem14TBasicWaveBank11TWaveHandleCFv */ -void JASystem::TBasicWaveBank::TWaveHandle::getWavePtr() const { - /* Nonmatching */ -} - -/* 802864A8-802864C8 .text getWaveArc__Q28JASystem14TBasicWaveBankFi */ -void JASystem::TBasicWaveBank::getWaveArc(int) { - /* Nonmatching */ -} - diff --git a/src/JSystem/JAudio/JASChannel.cpp b/src/JSystem/JAudio/JASChannel.cpp index f7801bc03..8f9b5c0d1 100644 --- a/src/JSystem/JAudio/JASChannel.cpp +++ b/src/JSystem/JAudio/JASChannel.cpp @@ -176,7 +176,7 @@ BOOL JASystem::TChannel::checkLogicalChannel() { } /* 8028BEB8-8028BF40 .text play__Q28JASystem8TChannelFUl */ -bool JASystem::TChannel::play(u32 param_1) { +BOOL JASystem::TChannel::play(u32 param_1) { /* Nonmatching */ if (param_1 == 0) { param_1 = -1; diff --git a/src/JSystem/JAudio/JASDSPInterface.cpp b/src/JSystem/JAudio/JASDSPInterface.cpp index cf2323953..66580b090 100644 --- a/src/JSystem/JAudio/JASDSPInterface.cpp +++ b/src/JSystem/JAudio/JASDSPInterface.cpp @@ -5,6 +5,7 @@ #include "JSystem/JAudio/JASDSPInterface.h" #include "JSystem/JAudio/JASCalc.h" +#include "JSystem/JAudio/JASDriverTables.h" #include "JSystem/JAudio/JASSystemHeap.h" #include "JSystem/JAudio/dspproc.h" #include "JSystem/JKernel/JKRSolidHeap.h" diff --git a/src/JSystem/JAudio/JASDriverTables.cpp b/src/JSystem/JAudio/JASDriverTables.cpp index 2bc938290..c4ddabec9 100644 --- a/src/JSystem/JAudio/JASDriverTables.cpp +++ b/src/JSystem/JAudio/JASDriverTables.cpp @@ -3,6 +3,129 @@ // Translation Unit: JASDriverTables.cpp // -#include "JASDriverTables.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASDriverTables.h" +f32 JASystem::Driver::C5BASE_PITCHTABLE[] = { + 0.031250f, 0.033108f, 0.035077f, 0.037162f, + 0.039372f, 0.041713f, 0.044194f, 0.046822f, + 0.049606f, 0.052556f, 0.055681f, 0.058992f, + 0.062500f, 0.066216f, 0.070154f, 0.074325f, + 0.078745f, 0.083427f, 0.088388f, 0.093644f, + 0.099213f, 0.105112f, 0.111362f, 0.117984f, + 0.125000f, 0.132433f, 0.140308f, 0.148651f, + 0.157490f, 0.166855f, 0.176777f, 0.187288f, + 0.198425f, 0.210224f, 0.222725f, 0.235969f, + 0.250000f, 0.264866f, 0.280616f, 0.297302f, + 0.314980f, 0.333710f, 0.353553f, 0.374577f, + 0.396850f, 0.420448f, 0.445449f, 0.471937f, + 0.500000f, 0.529732f, 0.561231f, 0.594604f, + 0.629961f, 0.667420f, 0.707107f, 0.749154f, + 0.793701f, 0.840897f, 0.890899f, 0.943875f, + 1.000000f, 1.059463f, 1.122462f, 1.189207f, + 1.259921f, 1.334840f, 1.414214f, 1.498307f, + 1.587401f, 1.681793f, 1.781798f, 1.887749f, + 2.000000f, 2.118926f, 2.244924f, 2.378414f, + 2.519842f, 2.669680f, 2.828428f, 2.996615f, + 3.174803f, 3.363586f, 3.563596f, 3.775498f, + 4.000000f, 4.237853f, 4.489849f, 4.756829f, + 5.039685f, 5.339360f, 5.656855f, 5.993229f, + 6.349606f, 6.727173f, 7.127192f, 7.550996f, + 8.000000f, 8.475705f, 8.979697f, 9.513658f, + 10.079370f, 10.678720f, 11.313710f, 11.986459f, + 12.699211f, 13.454346f, 14.254383f, 15.101993f, + 16.000000f, 16.951410f, 17.959394f, 19.027315f, + 20.158739f, 21.357441f, 22.627420f, 23.972918f, + 25.398422f, 26.908691f, 28.508766f, 30.203985f, + 32.000000f, 33.902821f, 35.918789f, 38.054630f, + 40.317478f, 42.714882f, 45.254840f, 47.945835f, +}; + +u16 JASystem::DSPInterface::DSPADPCM_FILTER[] = { + 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0800, 0x0400, 0x0400, + 0x1000, 0xF800, 0x0E00, 0xFA00, 0x0C00, 0xFC00, 0x1200, 0xF600, + 0x1068, 0xF738, 0x12C0, 0xF704, 0x1400, 0xF400, 0x0800, 0xF800, + 0x0400, 0xFC00, 0xFC00, 0x0400, 0xFC00, 0x0000, 0xF800, 0x0000, +}; + +u16 JASystem::DSPInterface::DSPRES_FILTER[] = { + 0x0C39, 0x66AD, 0x0D46, 0xFFDF, 0x0B39, 0x6696, 0x0E5F, 0xFFD8, + 0x0A44, 0x6669, 0x0F83, 0xFFD0, 0x095A, 0x6626, 0x10B4, 0xFFC8, + 0x087D, 0x65CD, 0x11F0, 0xFFBF, 0x07AB, 0x655E, 0x1338, 0xFFB6, + 0x06E4, 0x64D9, 0x148C, 0xFFAC, 0x0628, 0x643F, 0x15EB, 0xFFA1, + 0x0577, 0x638F, 0x1756, 0xFF96, 0x04D1, 0x62CB, 0x18CB, 0xFF8A, + 0x0435, 0x61F3, 0x1A4C, 0xFF7E, 0x03A4, 0x6106, 0x1BD7, 0xFF71, + 0x031C, 0x6007, 0x1D6C, 0xFF64, 0x029F, 0x5EF5, 0x1F0B, 0xFF56, + 0x022A, 0x5DD0, 0x20B3, 0xFF48, 0x01BE, 0x5C9A, 0x2264, 0xFF3A, + 0x015B, 0x5B53, 0x241E, 0xFF2C, 0x0101, 0x59FC, 0x25E0, 0xFF1E, + 0x00AE, 0x5896, 0x27A9, 0xFF10, 0x0063, 0x5720, 0x297A, 0xFF02, + 0x001F, 0x559D, 0x2B50, 0xFEF4, 0xFFE2, 0x540D, 0x2D2C, 0xFEE8, + 0xFFAC, 0x5270, 0x2F0D, 0xFEDB, 0xFF7C, 0x50C7, 0x30F3, 0xFED0, + 0xFF53, 0x4F14, 0x32DC, 0xFEC6, 0xFF2E, 0x4D57, 0x34C8, 0xFEBD, + 0xFF0F, 0x4B91, 0x36B6, 0xFEB6, 0xFEF5, 0x49C2, 0x38A5, 0xFEB0, + 0xFEDF, 0x47ED, 0x3A95, 0xFEAC, 0xFECE, 0x4611, 0x3C85, 0xFEAB, + 0xFEC0, 0x4430, 0x3E74, 0xFEAC, 0xFEB6, 0x424A, 0x4060, 0xFEAF, + 0xFEAF, 0x4060, 0x424A, 0xFEB6, 0xFEAC, 0x3E74, 0x4430, 0xFEC0, + 0xFEAB, 0x3C85, 0x4611, 0xFECE, 0xFEAC, 0x3A95, 0x47ED, 0xFEDF, + 0xFEB0, 0x38A5, 0x49C2, 0xFEF5, 0xFEB6, 0x36B6, 0x4B91, 0xFF0F, + 0xFEBD, 0x34C8, 0x4D57, 0xFF2E, 0xFEC6, 0x32DC, 0x4F14, 0xFF53, + 0xFED0, 0x30F3, 0x50C7, 0xFF7C, 0xFEDB, 0x2F0D, 0x5270, 0xFFAC, + 0xFEE8, 0x2D2C, 0x540D, 0xFFE2, 0xFEF4, 0x2B50, 0x559D, 0x001F, + 0xFF02, 0x297A, 0x5720, 0x0063, 0xFF10, 0x27A9, 0x5896, 0x00AE, + 0xFF1E, 0x25E0, 0x59FC, 0x0101, 0xFF2C, 0x241E, 0x5B53, 0x015B, + 0xFF3A, 0x2264, 0x5C9A, 0x01BE, 0xFF48, 0x20B3, 0x5DD0, 0x022A, + 0xFF56, 0x1F0B, 0x5EF5, 0x029F, 0xFF64, 0x1D6C, 0x6007, 0x031C, + 0xFF71, 0x1BD7, 0x6106, 0x03A4, 0xFF7E, 0x1A4C, 0x61F3, 0x0435, + 0xFF8A, 0x18CB, 0x62CB, 0x04D1, 0xFF96, 0x1756, 0x638F, 0x0577, + 0xFFA1, 0x15EB, 0x643F, 0x0628, 0xFFAC, 0x148C, 0x64D9, 0x06E4, + 0xFFB6, 0x1338, 0x655E, 0x07AB, 0xFFBF, 0x11F0, 0x65CD, 0x087D, + 0xFFC8, 0x10B4, 0x6626, 0x095A, 0xFFD0, 0x0F83, 0x6669, 0x0A44, + 0xFFD8, 0x0E5F, 0x6696, 0x0B39, 0xFFDF, 0x0D46, 0x66AD, 0x0C39, + 0x0000, 0x0C8B, 0x18F8, 0x2527, 0x30FB, 0x3C56, 0x471C, 0x5133, + 0x5A82, 0x62F1, 0x6A6D, 0x70E2, 0x7641, 0x7A7C, 0x7D89, 0x7F61, + 0x7FFF, 0x7F61, 0x7D89, 0x7A7C, 0x7641, 0x70E2, 0x6A6D, 0x62F1, + 0x5A82, 0x5133, 0x471C, 0x3C56, 0x30FB, 0x2527, 0x18F8, 0x0C8B, + 0x0000, 0xF375, 0xE708, 0xDAD9, 0xCF05, 0xC3AA, 0xB8E4, 0xAECD, + 0xA57E, 0x9D0F, 0x9593, 0x8F1E, 0x89BF, 0x8584, 0x8277, 0x809F, + 0x8001, 0x809F, 0x8277, 0x8584, 0x89BF, 0x8F1E, 0x9593, 0x9D0F, + 0xA57E, 0xAECD, 0xB8E4, 0xC3AA, 0xCF05, 0xDAD9, 0xE708, 0xF375, + 0x0000, 0x07FF, 0x0FFF, 0x17FF, 0x1FFF, 0x27FF, 0x2FFF, 0x37FF, + 0x3FFF, 0x47FF, 0x4FFF, 0x57FF, 0x5FFF, 0x67FF, 0x6FFF, 0x77FF, + 0x7FFF, 0x7800, 0x7000, 0x6800, 0x6000, 0x5800, 0x5000, 0x4800, + 0x4000, 0x3800, 0x3000, 0x2800, 0x2000, 0x1800, 0x1000, 0x0800, + 0x0000, 0xF801, 0xF001, 0xE801, 0xE001, 0xD801, 0xD001, 0xC801, + 0xC001, 0xB801, 0xB001, 0xA801, 0xA001, 0x9801, 0x9001, 0x8801, + 0x0000, 0x0000, 0x9000, 0x9800, 0xA000, 0xA800, 0xB000, 0xB800, + 0xC000, 0xC800, 0xD000, 0xD800, 0xE000, 0xE800, 0xF000, 0xF800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFF, 0x3FFF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFF, 0xC001, + 0x0000, 0x0192, 0x0324, 0x04B6, 0x0647, 0x07D9, 0x096A, 0x0AFB, + 0x0C8B, 0x0E1B, 0x0FAB, 0x1139, 0x12C7, 0x1455, 0x15E1, 0x176D, + 0x18F8, 0x1A82, 0x1C0B, 0x1D93, 0x1F19, 0x209F, 0x2223, 0x23A6, + 0x2527, 0x26A7, 0x2826, 0x29A3, 0x2B1F, 0x2C98, 0x2E10, 0x2F87, + 0x30FB, 0x326E, 0x33DE, 0x354D, 0x36B9, 0x3824, 0x398C, 0x3AF2, + 0x3C56, 0x3DB7, 0x3F17, 0x4073, 0x41CD, 0x4325, 0x447A, 0x45CC, + 0x471C, 0x4869, 0x49B3, 0x4AFB, 0x4C3F, 0x4D81, 0x4EBF, 0x4FFB, + 0x5133, 0x5268, 0x539A, 0x54C9, 0x55F5, 0x571D, 0x5842, 0x5964, + 0x5A82, 0x5B9C, 0x5CB3, 0x5DC7, 0x5ED7, 0x5FE3, 0x60EB, 0x61F0, + 0x62F1, 0x63EE, 0x64E8, 0x65DD, 0x66CF, 0x67BC, 0x68A6, 0x698B, + 0x6A6D, 0x6B4A, 0x6C23, 0x6CF8, 0x6DC9, 0x6E96, 0x6F5E, 0x7022, + 0x70E2, 0x719D, 0x7254, 0x7307, 0x73B5, 0x745F, 0x7504, 0x75A5, + 0x7641, 0x76D8, 0x776B, 0x77FA, 0x7884, 0x7909, 0x7989, 0x7A05, + 0x7A7C, 0x7AEE, 0x7B5C, 0x7BC5, 0x7C29, 0x7C88, 0x7CE3, 0x7D39, + 0x7D89, 0x7DD5, 0x7E1D, 0x7E5F, 0x7E9C, 0x7ED5, 0x7F09, 0x7F37, + 0x7F61, 0x7F86, 0x7FA6, 0x7FC1, 0x7FD8, 0x7FE9, 0x7FF5, 0x7FFD, +}; diff --git a/src/JSystem/JAudio/JASDvdThread.cpp b/src/JSystem/JAudio/JASDvdThread.cpp index ceffbc437..134059ca6 100644 --- a/src/JSystem/JAudio/JASDvdThread.cpp +++ b/src/JSystem/JAudio/JASDvdThread.cpp @@ -22,14 +22,14 @@ JASTaskThread::TCallStack::~TCallStack() { } /* 8027B5D8-8027B66C .text sendCmdMsg__13JASTaskThreadFPFPv_lPvUl */ -bool JASTaskThread::sendCmdMsg(s32 (*param_1)(void*), void* param_2, u32 param_3) { +BOOL JASTaskThread::sendCmdMsg(s32 (*param_1)(void*), void* param_2, u32 param_3) { TCallStack* stack = new(JKRGetSystemHeap(), -4) TCallStack(param_3); if (!stack) { return false; } JASystem::Calc::bcopy(param_2, stack->argspace, param_3); stack->field_0x0 = param_1; - sendMessageBlock(stack); + return sendMessageBlock(stack); } /* 8027B66C-8027B6D4 .text run__13JASTaskThreadFv */ @@ -79,9 +79,9 @@ void JASystem::Dvd::resumeThread() { } /* 8027B84C-8027B8D4 .text sendCmdMsg__Q28JASystem3DvdFPFPv_lPvUl */ -void JASystem::Dvd::sendCmdMsg(s32 (*param_1)(void*), void* param_2, u32 param_3) { +BOOL JASystem::Dvd::sendCmdMsg(s32 (*param_1)(void*), void* param_2, u32 param_3) { JUT_ASSERT(152, sThread); - sThread->sendCmdMsg(param_1, param_2, param_3); + return sThread->sendCmdMsg(param_1, param_2, param_3); } /* 8027B8D4-8027B914 .text checkPassDvdT__Q28JASystem3DvdFUlPUlPFUl_v */ diff --git a/src/JSystem/JAudio/JASHeapCtrl.cpp b/src/JSystem/JAudio/JASHeapCtrl.cpp index 0682a2ad9..9d69be89c 100644 --- a/src/JSystem/JAudio/JASHeapCtrl.cpp +++ b/src/JSystem/JAudio/JASHeapCtrl.cpp @@ -197,7 +197,7 @@ JASystem::Kernel::TSolidHeap::TSolidHeap() { } /* 8027D370-8027D40C .text alloc__Q38JASystem6Kernel10TSolidHeapFl */ -int JASystem::Kernel::TSolidHeap::alloc(s32 size) { +void* JASystem::Kernel::TSolidHeap::alloc(s32 size) { /* Nonmatching */ u32 tmp1 = OSRoundUp32B(size); if (field_0x0 == 0) { @@ -213,7 +213,7 @@ int JASystem::Kernel::TSolidHeap::alloc(s32 size) { } field_0xc++; field_0x10 = tmp2; - return tmp2; + return (void*)tmp2; } /* 8027D40C-8027D424 .text freeAll__Q38JASystem6Kernel10TSolidHeapFv */ diff --git a/src/JSystem/JAudio/JASInstEffect.cpp b/src/JSystem/JAudio/JASInstEffect.cpp index a91f7cd29..aa3986ff4 100644 --- a/src/JSystem/JAudio/JASInstEffect.cpp +++ b/src/JSystem/JAudio/JASInstEffect.cpp @@ -3,11 +3,12 @@ // Translation Unit: JASInstEffect.cpp // -#include "JASInstEffect.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASInstEffect.h" +#include "JSystem/JUtility/JUTAssert.h" /* 8028684C-802868F0 .text setTarget__Q28JASystem11TInstEffectFi */ -void JASystem::TInstEffect::setTarget(int) { - /* Nonmatching */ +void JASystem::TInstEffect::setTarget(int target) { + JUT_ASSERT(16, target >= 0); + JUT_ASSERT(17, target < 256); + mTarget = target; } - diff --git a/src/JSystem/JAudio/JASPlayer_impl.cpp b/src/JSystem/JAudio/JASPlayer_impl.cpp index a4f3ec46b..6252b85bc 100644 --- a/src/JSystem/JAudio/JASPlayer_impl.cpp +++ b/src/JSystem/JAudio/JASPlayer_impl.cpp @@ -3,21 +3,160 @@ // Translation Unit: JASPlayer_impl.cpp // -#include "JASPlayer_impl.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASPlayer.h" +#include "JSystem/JAudio/JASDriverTables.h" /* 8027E170-8027E190 .text extend8to16__Q28JASystem6PlayerFUc */ -void JASystem::Player::extend8to16(unsigned char) { - /* Nonmatching */ +s16 JASystem::Player::extend8to16(u8 param_1) { + s16 var1 = param_1; + if (param_1 & 0x80) { + var1 += 0xFF00; + } + return var1; } +const f32 JASystem::Player::s_key_table[] = { + 1.000000, 1.000910, 1.001821, 1.002733, + 1.003645, 1.004559, 1.005473, 1.006388, + 1.007304, 1.008220, 1.009138, 1.010056, + 1.010975, 1.011896, 1.012816, 1.013738, + 1.014661, 1.015584, 1.016508, 1.017433, + 1.018359, 1.019286, 1.020214, 1.021142, + 1.022071, 1.023002, 1.023933, 1.024864, + 1.025797, 1.026731, 1.027665, 1.028600, + 1.029536, 1.030473, 1.031411, 1.032350, + 1.033289, 1.034230, 1.035171, 1.036113, + 1.037056, 1.038000, 1.038944, 1.039890, + 1.040836, 1.041783, 1.042731, 1.043680, + 1.044630, 1.045581, 1.046532, 1.047485, + 1.048438, 1.049392, 1.050347, 1.051303, + 1.052260, 1.053217, 1.054176, 1.055135, + 1.056095, 1.057056, 1.058018, 1.058981, +}; + /* 8027E190-8027E250 .text pitchToCent__Q28JASystem6PlayerFff */ -void JASystem::Player::pitchToCent(float, float) { - /* Nonmatching */ +f32 JASystem::Player::pitchToCent(f32 param_1, f32 param_2) { + f32 var1 = param_1 * 4.0f * param_2; + s16 var3 = var1; + f32 var2 = var1 - var3; + if (var1 < 0.0f && var2 != 0.0f) { + var2 += 1.0f; + var3 -= 1; + } + if (var2 >= 1.0f) { + var2 -= 1.0f; + var3 += 1; + } + return s_key_table[u16(var2 * 64.0f)] * Driver::C5BASE_PITCHTABLE[var3 + 0x3c]; } /* 8027E250-8027E2C0 .text getRandomS32__Q28JASystem6PlayerFv */ -void JASystem::Player::getRandomS32() { - /* Nonmatching */ +s32 JASystem::Player::getRandomS32() { + static s32 sV0 = 0x1000; + static s32 sV1 = 0x5555; + s32 result = sV1 * -0x6789abce + 1 + (sV0 * 0x13579bde >> 4); + sV0 = sV1; + sV1 = result; + return result; } +const JASystem::TOscillator::Osc_ JASystem::Player::sAdsrDef = { + 0, 1.0f, NULL, NULL, 1.0f, 0.0f +}; + +const JASystem::TOscillator::Osc_ JASystem::Player::sEnvelopeDef = { + 0, 1.0f, NULL, &sRelTable, 1.0f, 0.0f +}; + +const JASystem::TOscillator::Osc_ JASystem::Player::sVibratoDef = { + 1, 0.5f, &sVibTable, &sVibTable, 0.0f, 1.0f +}; + +const JASystem::TOscillator::Osc_ JASystem::Player::sTremoroDef = { + 0, 0.5f, &sTreTable, &sTreTable, 0.0f, 1.0f +}; + +s16 JASystem::Player::CUTOFF_TO_IIR_TABLE[] = { + 0x0F5C, 0x0A3D, 0x4665, 0x3999, 0x103F, 0x0A28, 0x45D7, 0x3925, + 0x1122, 0x0A14, 0x454A, 0x38B0, 0x1205, 0x09FF, 0x44BC, 0x383C, + 0x12E8, 0x09EA, 0x442E, 0x37C8, 0x13CB, 0x09D6, 0x43A0, 0x3754, + 0x14AE, 0x09C1, 0x4312, 0x36E0, 0x1591, 0x09AC, 0x4284, 0x366C, + 0x1674, 0x0998, 0x41F6, 0x35F8, 0x1757, 0x0983, 0x4168, 0x3584, + 0x183A, 0x096E, 0x40DA, 0x3510, 0x191D, 0x095A, 0x404C, 0x349C, + 0x1A00, 0x0945, 0x3FBE, 0x3427, 0x1AE3, 0x0931, 0x3F31, 0x33B3, + 0x1BC6, 0x091C, 0x3EA3, 0x333F, 0x1CA9, 0x0907, 0x3E15, 0x32CB, + 0x1D8C, 0x08F3, 0x3D87, 0x3257, 0x1E6F, 0x08DE, 0x3CF9, 0x31E3, + 0x1F52, 0x08C9, 0x3C6B, 0x316F, 0x2035, 0x08B5, 0x3BDD, 0x30FB, + 0x2118, 0x08A0, 0x3B4F, 0x3087, 0x21FC, 0x088B, 0x3AC1, 0x3012, + 0x22DF, 0x0877, 0x3A33, 0x2F9E, 0x23C2, 0x0862, 0x39A6, 0x2F2A, + 0x24A5, 0x084D, 0x3918, 0x2EB6, 0x2588, 0x0839, 0x388A, 0x2E42, + 0x266B, 0x0824, 0x37FC, 0x2DCE, 0x274E, 0x0810, 0x376E, 0x2D5A, + 0x2831, 0x07FB, 0x36E0, 0x2CE6, 0x2914, 0x07E6, 0x3652, 0x2C72, + 0x29F7, 0x07D2, 0x35C4, 0x2BFE, 0x2ADA, 0x07BD, 0x3536, 0x2B89, + 0x2BBD, 0x07A8, 0x34A8, 0x2B15, 0x2CA0, 0x0794, 0x341B, 0x2AA1, + 0x2D83, 0x077F, 0x338D, 0x2A2D, 0x2E66, 0x076A, 0x32FF, 0x29B9, + 0x2F49, 0x0756, 0x3271, 0x2945, 0x302C, 0x0741, 0x31E3, 0x28D1, + 0x310F, 0x072D, 0x3155, 0x285D, 0x31F2, 0x0718, 0x30C7, 0x27E9, + 0x32D5, 0x0703, 0x3039, 0x2775, 0x33B8, 0x06EF, 0x2FAB, 0x2700, + 0x349C, 0x06DA, 0x2F1D, 0x268C, 0x357F, 0x06C5, 0x2E8F, 0x2618, + 0x3662, 0x06B1, 0x2E02, 0x25A4, 0x3745, 0x069C, 0x2D74, 0x2530, + 0x3828, 0x0687, 0x2CE6, 0x24BC, 0x390B, 0x0673, 0x2C58, 0x2448, + 0x39EE, 0x065E, 0x2BCA, 0x23D4, 0x3AD1, 0x0649, 0x2B3C, 0x2360, + 0x3BB4, 0x0635, 0x2AAE, 0x22EB, 0x3C97, 0x0620, 0x2A20, 0x2277, + 0x3D7A, 0x060C, 0x2992, 0x2203, 0x3E5D, 0x05F7, 0x2904, 0x218F, + 0x3F40, 0x05E2, 0x2877, 0x211B, 0x4023, 0x05CE, 0x27E9, 0x20A7, + 0x4106, 0x05B9, 0x275B, 0x2033, 0x41E9, 0x05A4, 0x26CD, 0x1FBF, + 0x42CC, 0x0590, 0x263F, 0x1F4B, 0x43AF, 0x057B, 0x25B1, 0x1ED7, + 0x4492, 0x0566, 0x2523, 0x1E62, 0x4575, 0x0552, 0x2495, 0x1DEE, + 0x4658, 0x053D, 0x2407, 0x1D7A, 0x473B, 0x0529, 0x2379, 0x1D06, + 0x481F, 0x0514, 0x22EB, 0x1C92, 0x4902, 0x04FF, 0x225E, 0x1C1E, + 0x49E5, 0x04EB, 0x21D0, 0x1BAA, 0x4AC8, 0x04D6, 0x2142, 0x1B36, + 0x4BAB, 0x04C1, 0x20B4, 0x1AC2, 0x4C8E, 0x04AD, 0x2026, 0x1A4E, + 0x4D71, 0x0498, 0x1F98, 0x19D9, 0x4E54, 0x0483, 0x1F0A, 0x1965, + 0x4F37, 0x046F, 0x1E7C, 0x18F1, 0x501A, 0x045A, 0x1DEE, 0x187D, + 0x50FD, 0x0445, 0x1D60, 0x1809, 0x51E0, 0x0431, 0x1CD3, 0x1795, + 0x52C3, 0x041C, 0x1C45, 0x1721, 0x53A6, 0x0408, 0x1BB7, 0x16AD, + 0x5489, 0x03F3, 0x1B29, 0x1639, 0x556C, 0x03DE, 0x1A9B, 0x15C4, + 0x564F, 0x03CA, 0x1A0D, 0x1550, 0x5732, 0x03B5, 0x197F, 0x14DC, + 0x5815, 0x03A0, 0x18F1, 0x1468, 0x58F8, 0x038C, 0x1863, 0x13F4, + 0x59DB, 0x0377, 0x17D5, 0x1380, 0x5ABF, 0x0362, 0x1747, 0x130C, + 0x5BA2, 0x034E, 0x16BA, 0x1298, 0x5C85, 0x0339, 0x162C, 0x1224, + 0x5D68, 0x0324, 0x159E, 0x11B0, 0x5E4B, 0x0310, 0x1510, 0x113B, + 0x5F2E, 0x02FB, 0x1482, 0x10C7, 0x6011, 0x02E7, 0x13F4, 0x1053, + 0x60F4, 0x02D2, 0x1366, 0x0FDF, 0x61D7, 0x02BD, 0x12D8, 0x0F6B, + 0x62BA, 0x02A9, 0x124A, 0x0EF7, 0x639D, 0x0294, 0x11BC, 0x0E83, + 0x6480, 0x027F, 0x112F, 0x0E0F, 0x6563, 0x026B, 0x10A1, 0x0D9B, + 0x6646, 0x0256, 0x1013, 0x0D27, 0x6729, 0x0241, 0x0F85, 0x0CB2, + 0x680C, 0x022D, 0x0EF7, 0x0C3E, 0x68EF, 0x0218, 0x0E69, 0x0BCA, + 0x69D2, 0x0204, 0x0DDB, 0x0B56, 0x6AB5, 0x01EF, 0x0D4D, 0x0AE2, + 0x6B98, 0x01DA, 0x0CBF, 0x0A6E, 0x6C7B, 0x01C6, 0x0C31, 0x09FA, + 0x6D5F, 0x01B1, 0x0BA3, 0x0986, 0x6E42, 0x019C, 0x0B16, 0x0912, + 0x6F25, 0x0188, 0x0A88, 0x089D, 0x7008, 0x0173, 0x09FA, 0x0829, + 0x70EB, 0x015E, 0x096C, 0x07B5, 0x71CE, 0x014A, 0x08DE, 0x0741, + 0x72B1, 0x0135, 0x0850, 0x06CD, 0x7394, 0x0120, 0x07C2, 0x0659, + 0x7477, 0x010C, 0x0734, 0x05E5, 0x755A, 0x00F7, 0x06A6, 0x0571, + 0x763D, 0x00E3, 0x0618, 0x04FD, 0x7720, 0x00CE, 0x058B, 0x0489, + 0x7803, 0x00B9, 0x04FD, 0x0414, 0x78E6, 0x00A5, 0x046F, 0x03A0, + 0x79C9, 0x0090, 0x03E1, 0x032C, 0x7AAC, 0x007B, 0x0353, 0x02B8, + 0x7B8F, 0x0067, 0x02C5, 0x0244, 0x7C72, 0x0052, 0x0237, 0x01D0, + 0x7D55, 0x003D, 0x01A9, 0x015C, 0x7E38, 0x0029, 0x011B, 0x00E8, + 0x7F1B, 0x0014, 0x008D, 0x0074, 0x7FFF, 0x0000, 0x0000, 0x0000, +}; + +s16 JASystem::Player::sAdsTable[] = { + 0x0000, 0x0000, 0x7FFF, 0x0000, + 0x0000, 0x7FFF, 0x0000, 0x0000, + 0x0000, 0x000E, 0x0000, 0x0000, +}; + +s16 JASystem::Player::sRelTable[] = { + 0, 10, 0, 15, 1, 0 +}; + +s16 JASystem::Player::sVibTable[] = { + 0, 0, 0, 0, 12, 0x7FFF, 0, 12, 0, 0, 12, 0xC000, 0, 12, 0, 13, 0, 1 +}; + +s16 JASystem::Player::sTreTable[] = { + 0, 0, 0x7FFF, 0, 20, 0, 0, 20, 0x8001, 0, 20, 0, 0, 20, 0x7FFF, 13, 0, 1 +}; diff --git a/src/JSystem/JAudio/JASRegisterParam.cpp b/src/JSystem/JAudio/JASRegisterParam.cpp index 3523d59a1..7bff29b3a 100644 --- a/src/JSystem/JAudio/JASRegisterParam.cpp +++ b/src/JSystem/JAudio/JASRegisterParam.cpp @@ -3,31 +3,79 @@ // Translation Unit: JASRegisterParam.cpp // -#include "JASRegisterParam.h" +#include "JSystem/JAudio/JASRegisterParam.h" #include "dolphin/types.h" /* 8027E2C0-8027E310 .text __ct__Q28JASystem14TRegisterParamFv */ JASystem::TRegisterParam::TRegisterParam() { - /* Nonmatching */ + field_0x0 = 0; + field_0x2 = 0; + field_0x4 = 0; + field_0x6 = 0; + field_0x8 = 0; + field_0xa = 0; + field_0xc = 0; + field_0xe = 0; + field_0x1a = 0; + field_0x10[0] = 0; + field_0x10[1] = 0; + field_0x10[2] = 0; + field_0x10[3] = 0; + field_0x10[4] = 0; + field_0x20 = 0; + field_0x24 = 0; + field_0x28 = 0; + field_0x2c = 0; } /* 8027E310-8027E378 .text init__Q28JASystem14TRegisterParamFv */ void JASystem::TRegisterParam::init() { - /* Nonmatching */ + field_0x0 = 0; + field_0x2 = 0; + field_0x4 = 0; + field_0x6 = 0; + field_0x8 = 0; + field_0xa = 0; + field_0xc = 0xf0; + field_0xe = 0x0c; + field_0x1a = 0x40; + field_0x10[0] = 0; + field_0x10[1] = 1; + field_0x10[2] = 1; + field_0x10[3] = 0x7fff; + field_0x10[4] = 0x4000; + field_0x20 = 0; + field_0x24 = 0; + field_0x28 = 0; + field_0x2c = 0; } /* 8027E378-8027E3E0 .text inherit__Q28JASystem14TRegisterParamFRCQ28JASystem14TRegisterParam */ -void JASystem::TRegisterParam::inherit(const JASystem::TRegisterParam&) { - /* Nonmatching */ +void JASystem::TRegisterParam::inherit(const JASystem::TRegisterParam& param_1) { + field_0x0 = 0; + field_0x2 = 0; + field_0x4 = 0; + field_0x6 = 0; + field_0x8 = 0; + field_0xa = 0; + field_0xc = param_1.field_0xc; + field_0xe = param_1.field_0xe; + field_0x1a = param_1.field_0x1a; + for (int i = 0; i < 5; i++) { + field_0x10[i] = param_1.field_0x10[i]; + } + field_0x20 = 0; + field_0x24 = 0; + field_0x28 = 0; + field_0x2c = 0; } /* 8027E3E0-8027E3EC .text getBankNumber__Q28JASystem14TRegisterParamCFv */ -void JASystem::TRegisterParam::getBankNumber() const { - /* Nonmatching */ +u8 JASystem::TRegisterParam::getBankNumber() const { + return field_0xc >> 8 & 0xff; } /* 8027E3EC-8027E3F8 .text getProgramNumber__Q28JASystem14TRegisterParamCFv */ -void JASystem::TRegisterParam::getProgramNumber() const { - /* Nonmatching */ +u8 JASystem::TRegisterParam::getProgramNumber() const { + return field_0xc & 0xff; } - diff --git a/src/JSystem/JAudio/JASSeqCtrl.cpp b/src/JSystem/JAudio/JASSeqCtrl.cpp index 35459f4f7..864aee9ee 100644 --- a/src/JSystem/JAudio/JASSeqCtrl.cpp +++ b/src/JSystem/JAudio/JASSeqCtrl.cpp @@ -3,61 +3,125 @@ // Translation Unit: JASSeqCtrl.cpp // -#include "JASSeqCtrl.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASSeqCtrl.h" +#include "JSystem/JUtility/JUTAssert.h" /* 8027E3F8-8027E448 .text init__Q28JASystem8TSeqCtrlFv */ void JASystem::TSeqCtrl::init() { - /* Nonmatching */ + field_0x0 = NULL; + field_0x4 = NULL; + field_0x8 = 0; + field_0xc = 0; + for (int i = 0; i < 8; i++) { + field_0x10[i] = NULL; + field_0x30[i] = 0; + } + field_0x40 = 0; + field_0x44 = NULL; } /* 8027E448-8027E45C .text start__Q28JASystem8TSeqCtrlFPvUl */ -void JASystem::TSeqCtrl::start(void*, unsigned long) { - /* Nonmatching */ +void JASystem::TSeqCtrl::start(void* param_1, u32 param_2) { + field_0x0 = (u8*)param_1; + field_0x4 = field_0x0 + param_2; } /* 8027E45C-8027E500 .text loopEnd__Q28JASystem8TSeqCtrlFv */ -void JASystem::TSeqCtrl::loopEnd() { +int JASystem::TSeqCtrl::loopEnd() { /* Nonmatching */ + u32 var1 = field_0xc; + if (var1 == 0) { + JUT_WARN(45, "%s", "cannot loopE for call-stack is NULL"); + return 0; + } + u16 var3 = field_0x30[var1 - 1]; + if (var3) { + var3--; + } + if (var3 == 0) { + field_0xc--; + return true; + } + field_0x30[var1 - 1] = var3; + field_0x4 = field_0x10[field_0xc - 1]; + return true; } /* 8027E500-8027E530 .text waitCountDown__Q28JASystem8TSeqCtrlFv */ -void JASystem::TSeqCtrl::waitCountDown() { - /* Nonmatching */ +bool JASystem::TSeqCtrl::waitCountDown() { + if (field_0x8 > 0) { + field_0x8--; + if (field_0x8) { + return false; + } + } + return true; } /* 8027E530-8027E568 .text callIntr__Q28JASystem8TSeqCtrlFPv */ -void JASystem::TSeqCtrl::callIntr(void*) { - /* Nonmatching */ +bool JASystem::TSeqCtrl::callIntr(void* param_1) { + if (field_0x44) { + return false; + } + field_0x44 = field_0x4; + field_0x4 = (u8*)param_1; + field_0x40 = field_0x8; + field_0x8 = 0; + return true; } /* 8027E568-8027E59C .text retIntr__Q28JASystem8TSeqCtrlFv */ -void JASystem::TSeqCtrl::retIntr() { - /* Nonmatching */ +bool JASystem::TSeqCtrl::retIntr() { + if (!field_0x44) { + return false; + } + field_0x8 = field_0x40; + field_0x4 = field_0x44; + field_0x44 = NULL; + return true; } /* 8027E59C-8027E5B4 .text get16__Q28JASystem8TSeqCtrlCFUl */ -void JASystem::TSeqCtrl::get16(unsigned long) const { - /* Nonmatching */ +u32 JASystem::TSeqCtrl::get16(u32 param_1) const { + u32 result = field_0x0[param_1++] << 8; + result |= field_0x0[param_1++]; + return result; } /* 8027E5B4-8027E5DC .text get24__Q28JASystem8TSeqCtrlCFUl */ -void JASystem::TSeqCtrl::get24(unsigned long) const { +u32 JASystem::TSeqCtrl::get24(u32 param_1) const { /* Nonmatching */ + u32 result = field_0x0[param_1++] << 8; + result |= field_0x0[param_1++]; + result <<= 8; + result |= field_0x0[param_1++]; + return result; } /* 8027E5DC-8027E614 .text get32__Q28JASystem8TSeqCtrlCFUl */ -void JASystem::TSeqCtrl::get32(unsigned long) const { +u32 JASystem::TSeqCtrl::get32(u32 param_1) const { /* Nonmatching */ + u32 result = field_0x0[param_1++] << 8; + result |= field_0x0[param_1++]; + result <<= 8; + result |= field_0x0[param_1++]; + result <<= 8; + result |= field_0x0[param_1++]; + return result; } /* 8027E614-8027E63C .text read16__Q28JASystem8TSeqCtrlFv */ -void JASystem::TSeqCtrl::read16() { - /* Nonmatching */ +u32 JASystem::TSeqCtrl::read16() { + u32 result = *(field_0x4++) << 8; + result |= *(field_0x4++); + return result; } /* 8027E63C-8027E680 .text read24__Q28JASystem8TSeqCtrlFv */ -void JASystem::TSeqCtrl::read24() { - /* Nonmatching */ +u32 JASystem::TSeqCtrl::read24() { + u32 result = *(field_0x4++) << 8; + result |= *(field_0x4++); + result <<= 8; + result |= *(field_0x4++); + return result; } - diff --git a/src/JSystem/JAudio/JASSimpleWaveBank.cpp b/src/JSystem/JAudio/JASSimpleWaveBank.cpp index 86330d19d..38f3d4483 100644 --- a/src/JSystem/JAudio/JASSimpleWaveBank.cpp +++ b/src/JSystem/JAudio/JASSimpleWaveBank.cpp @@ -3,66 +3,52 @@ // Translation Unit: JASSimpleWaveBank.cpp // -#include "JASSimpleWaveBank.h" +#include "JSystem/JAudio/JASSimpleWaveBank.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" #include "dolphin/types.h" /* 802864C8-80286528 .text __ct__Q28JASystem15TSimpleWaveBankFv */ JASystem::TSimpleWaveBank::TSimpleWaveBank() { - /* Nonmatching */ + mWaveTable = NULL; + mWaveCount = 0; } /* 80286528-802865F4 .text __dt__Q28JASystem15TSimpleWaveBankFv */ JASystem::TSimpleWaveBank::~TSimpleWaveBank() { - /* Nonmatching */ + delete[] mWaveTable; } /* 802865F4-80286650 .text __dt__Q38JASystem15TSimpleWaveBank11TWaveHandleFv */ -JASystem::TSimpleWaveBank::TWaveHandle::~TWaveHandle() { - /* Nonmatching */ -} +JASystem::TSimpleWaveBank::TWaveHandle::~TWaveHandle() {} /* 80286650-8028670C .text setWaveTableSize__Q28JASystem15TSimpleWaveBankFUl */ -void JASystem::TSimpleWaveBank::setWaveTableSize(unsigned long) { - /* Nonmatching */ +void JASystem::TSimpleWaveBank::setWaveTableSize(u32 param_1) { + delete[] mWaveTable; + mWaveTable = new (getCurrentHeap(), 0) TWaveHandle[param_1]; + JUT_ASSERT(34, mWaveTable != 0); + mWaveCount = param_1; } /* 8028670C-80286730 .text getWaveHandle__Q28JASystem15TSimpleWaveBankCFUl */ -void JASystem::TSimpleWaveBank::getWaveHandle(unsigned long) const { - /* Nonmatching */ +JASystem::TSimpleWaveBank::TWaveHandle* JASystem::TSimpleWaveBank::getWaveHandle(u32 param_1) const { + if (param_1 >= mWaveCount) { + return NULL; + } + return mWaveTable + param_1; } /* 80286730-802867D4 .text setWaveInfo__Q28JASystem15TSimpleWaveBankFUlRCQ28JASystem9TWaveInfo */ -void JASystem::TSimpleWaveBank::setWaveInfo(unsigned long, const JASystem::TWaveInfo&) { - /* Nonmatching */ +void JASystem::TSimpleWaveBank::setWaveInfo(u32 param_1, const JASystem::TWaveInfo& param_2) { + mWaveTable[param_1].field_0x4 = param_2; + mWaveTable[param_1].field_0x4.field_0x24 = &field_0x4c; + mWaveTable[param_1].mHeap = &field_0x4; } /* 802867D4-802867F4 .text getWaveArc__Q28JASystem15TSimpleWaveBankFi */ -void JASystem::TSimpleWaveBank::getWaveArc(int) { - /* Nonmatching */ +JASystem::TWaveArc* JASystem::TSimpleWaveBank::getWaveArc(int param_1) { + if (param_1 != 0) { + return NULL; + } + return this; } - -/* 802867F4-80286818 .text __ct__Q38JASystem15TSimpleWaveBank11TWaveHandleFv */ -JASystem::TSimpleWaveBank::TWaveHandle::TWaveHandle() { - /* Nonmatching */ -} - -/* 80286818-80286820 .text getWaveInfo__Q38JASystem15TSimpleWaveBank11TWaveHandleCFv */ -void JASystem::TSimpleWaveBank::TWaveHandle::getWaveInfo() const { - /* Nonmatching */ -} - -/* 80286820-80286844 .text getWavePtr__Q38JASystem15TSimpleWaveBank11TWaveHandleCFv */ -void JASystem::TSimpleWaveBank::TWaveHandle::getWavePtr() const { - /* Nonmatching */ -} - -/* 80286844-80286848 .text onLoadDone__Q28JASystem8TWaveArcFv */ -void JASystem::TWaveArc::onLoadDone() { - /* Nonmatching */ -} - -/* 80286848-8028684C .text onEraseDone__Q28JASystem8TWaveArcFv */ -void JASystem::TWaveArc::onEraseDone() { - /* Nonmatching */ -} - diff --git a/src/JSystem/JAudio/JASSystemHeap.cpp b/src/JSystem/JAudio/JASSystemHeap.cpp index 6f6daf828..27f535573 100644 --- a/src/JSystem/JAudio/JASSystemHeap.cpp +++ b/src/JSystem/JAudio/JASSystemHeap.cpp @@ -52,8 +52,9 @@ void JASystem::Kernel::sysAramSetup(u32 param_1) { } /* 8027DC84-8027DCDC .text allocFromSysAramFull__Q28JASystem6KernelFPUl */ -void JASystem::Kernel::allocFromSysAramFull(u32* param_1) { +void* JASystem::Kernel::allocFromSysAramFull(u32* param_1) { u32 size = audioAramHeap.getRemain(); - audioAramHeap.alloc(size - 0x20); + void* var1 = audioAramHeap.alloc(size - 0x20); *param_1 = size - 0x20; + return var1; } diff --git a/src/JSystem/JAudio/JASWaveArcLoader.cpp b/src/JSystem/JAudio/JASWaveArcLoader.cpp index 262e4b564..b6e4706c4 100644 --- a/src/JSystem/JAudio/JASWaveArcLoader.cpp +++ b/src/JSystem/JAudio/JASWaveArcLoader.cpp @@ -3,81 +3,174 @@ // Translation Unit: JASWaveArcLoader.cpp // -#include "JASWaveArcLoader.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASWaveArcLoader.h" +#include "JSystem/JAudio/JASDvdThread.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JKernel/JKRDvdAramRipper.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "MSL_C/string.h" + +const u32 DIR_MAX = 64; + +JASystem::Kernel::THeap JASystem::WaveArcLoader::sAramHeap(NULL); /* 80287BD8-80287C24 .text init__Q28JASystem13WaveArcLoaderFv */ -void JASystem::WaveArcLoader::init() { - /* Nonmatching */ +bool JASystem::WaveArcLoader::init() { + u32 local_8; + void* var1 = Kernel::allocFromSysAramFull(&local_8); + if (!var1) { + return false; + } + sAramHeap.initRootHeap(var1, local_8, Kernel::THeap::Type0); + return true; } /* 80287C24-80287C30 .text getRootHeap__Q28JASystem13WaveArcLoaderFv */ -void JASystem::WaveArcLoader::getRootHeap() { - /* Nonmatching */ +JASystem::Kernel::THeap* JASystem::WaveArcLoader::getRootHeap() { + return &sAramHeap; } +char JASystem::WaveArcLoader::sCurrentDir[DIR_MAX] = "/Banks/"; + /* 80287C30-80287D24 .text setCurrentDir__Q28JASystem13WaveArcLoaderFPCc */ -void JASystem::WaveArcLoader::setCurrentDir(const char*) { +void JASystem::WaveArcLoader::setCurrentDir(const char* dir) { /* Nonmatching */ + //JUT_ASSERT(60, std::strlen(dir) < DIR_MAX); + strcpy(sCurrentDir, dir); + int len = strlen(sCurrentDir); + if (sCurrentDir[len - 1] == '/') { + return; + } + JUT_ASSERT(65, len+1 < DIR_MAX); + sCurrentDir[len] = '/'; + sCurrentDir[len+1] = 0; } /* 80287D24-80287D30 .text getCurrentDir__Q28JASystem13WaveArcLoaderFv */ -void JASystem::WaveArcLoader::getCurrentDir() { - /* Nonmatching */ +char* JASystem::WaveArcLoader::getCurrentDir() { + return sCurrentDir; } /* 80287D30-80287DA4 .text __ct__Q28JASystem8TWaveArcFv */ -JASystem::TWaveArc::TWaveArc() { - /* Nonmatching */ +JASystem::TWaveArc::TWaveArc() : field_0x4(this) { + field_0x4c = 0; + field_0x68 = 0; + field_0x6c = -1; + field_0x70 = 0; + field_0x74 = 0; + OSInitMutex(&mMutex); } /* 80287DA4-80287E34 .text loadSetup__Q28JASystem8TWaveArcFUl */ -void JASystem::TWaveArc::loadSetup(unsigned long) { - /* Nonmatching */ +bool JASystem::TWaveArc::loadSetup(u32 param_1) { + OSLockMutex(&mMutex); + if (field_0x74 != param_1) { + OSUnlockMutex(&mMutex); + return false; + } + if (field_0x68 != 1) { + OSUnlockMutex(&mMutex); + return false; + } + field_0x4c = 1; + field_0x68 = 2; + OSUnlockMutex(&mMutex); + return true; } /* 80287E34-80287EB8 .text eraseSetup__Q28JASystem8TWaveArcFv */ -void JASystem::TWaveArc::eraseSetup() { - /* Nonmatching */ +bool JASystem::TWaveArc::eraseSetup() { + OSLockMutex(&mMutex); + if (field_0x68 == 0) { + OSUnlockMutex(&mMutex); + return false; + } + if (field_0x68 == 1) { + field_0x68 = 0; + OSUnlockMutex(&mMutex); + return false; + } + field_0x4c = 0; + field_0x68 = 0; + OSUnlockMutex(&mMutex); + return true; } +struct unk_message { + JASystem::TWaveArc* field_0x0; + int field_0x4; + void* field_0x8; + u32 field_0xc; +}; + /* 80287EB8-80287F48 .text loadToAramCallback__Q28JASystem8TWaveArcFPv */ -void JASystem::TWaveArc::loadToAramCallback(void*) { +s32 JASystem::TWaveArc::loadToAramCallback(void* param_1) { /* Nonmatching */ + unk_message* msg = (unk_message*)param_1; + if (JKRDvdAramRipper::loadToAram(msg->field_0x4, u32(msg->field_0x8), EXPAND_SWITCH_UNKNOWN0, 0, 0) == 0) { + return -1; + } + TWaveArc* waveArc = msg->field_0x0; + if (!waveArc->loadSetup(msg->field_0xc)) { + return 0; + } + waveArc->onLoadDone(); + return 0; } /* 80287F48-80287FE4 .text sendLoadCmd__Q28JASystem8TWaveArcFv */ -void JASystem::TWaveArc::sendLoadCmd() { +bool JASystem::TWaveArc::sendLoadCmd() { /* Nonmatching */ + OSLockMutex(&mMutex); + field_0x4c = 0; + field_0x68 = 1; + unk_message msg; + msg.field_0x0 = this; + msg.field_0x4 = field_0x6c; + msg.field_0x8 = field_0x4.mBase; + msg.field_0xc = ++field_0x74; + OSUnlockMutex(&mMutex); + if (!Dvd::sendCmdMsg(loadToAramCallback, &msg, sizeof(msg))) { + field_0x4.free(); + return false; + } + return true; } /* 80287FE4-802880A0 .text load__Q28JASystem8TWaveArcFPQ38JASystem6Kernel5THeap */ -void JASystem::TWaveArc::load(JASystem::Kernel::THeap*) { +bool JASystem::TWaveArc::load(Kernel::THeap*) { /* Nonmatching */ } /* 802880A0-802880C4 .text erase__Q28JASystem8TWaveArcFv */ -void JASystem::TWaveArc::erase() { - /* Nonmatching */ +bool JASystem::TWaveArc::erase() { + return field_0x4.free(); } /* 802880C4-8028810C .text onDispose__Q28JASystem8TWaveArcFv */ void JASystem::TWaveArc::onDispose() { - /* Nonmatching */ + if (eraseSetup()) { + onEraseDone(); + } } /* 8028810C-8028816C .text setEntryNum__Q28JASystem8TWaveArcFl */ -void JASystem::TWaveArc::setEntryNum(long) { +void JASystem::TWaveArc::setEntryNum(s32) { /* Nonmatching */ } /* 8028816C-80288214 .text setFileName__Q28JASystem8TWaveArcFPCc */ -void JASystem::TWaveArc::setFileName(const char*) { - /* Nonmatching */ +void JASystem::TWaveArc::setFileName(const char* param_1) { + char* currentDir = WaveArcLoader::getCurrentDir(); + size_t size = strlen(currentDir); + size += strlen(param_1); + char* str = new (JKRGetSystemHeap(), -4) char[size + 1]; + strcpy(str, currentDir); + strcat(str, param_1); + str[size] = 0; + s32 entry = DVDConvertPathToEntrynum(str); + delete[] str; + if (entry >= 0) { + setEntryNum(entry); + } } - -/* 80288214-8028828C .text __dt__Q38JASystem6Kernel5THeapFv */ -JASystem::Kernel::THeap::~THeap() { - /* Nonmatching */ -} - diff --git a/src/JSystem/JAudio/JASWaveBank.cpp b/src/JSystem/JAudio/JASWaveBank.cpp index 14cab90f4..d8509058d 100644 --- a/src/JSystem/JAudio/JASWaveBank.cpp +++ b/src/JSystem/JAudio/JASWaveBank.cpp @@ -3,11 +3,16 @@ // Translation Unit: JASWaveBank.cpp // -#include "JASWaveBank.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASWaveBank.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JKernel/JKRSolidHeap.h" + +JKRHeap* JASystem::TWaveBank::sCurrentHeap; /* 8028455C-80284570 .text getCurrentHeap__Q28JASystem9TWaveBankFv */ -void JASystem::TWaveBank::getCurrentHeap() { - /* Nonmatching */ +JKRHeap* JASystem::TWaveBank::getCurrentHeap() { + if (sCurrentHeap) { + return sCurrentHeap; + } + return JASDram; } - diff --git a/src/JSystem/JAudio/JASWaveBankMgr.cpp b/src/JSystem/JAudio/JASWaveBankMgr.cpp index 57dcbbd8d..a1438f222 100644 --- a/src/JSystem/JAudio/JASWaveBankMgr.cpp +++ b/src/JSystem/JAudio/JASWaveBankMgr.cpp @@ -3,41 +3,88 @@ // Translation Unit: JASWaveBankMgr.cpp // -#include "JASWaveBankMgr.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASWaveBankMgr.h" +#include "JSystem/JAudio/JASBasicWaveBank.h" +#include "JSystem/JAudio/JASCalc.h" +#include "JSystem/JAudio/JASSimpleWaveBank.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JAudio/JASWSParser.h" +#include "JSystem/JAudio/JASWaveArcLoader.h" +#include "JSystem/JAudio/JASWaveBank.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JUtility/JUTAssert.h" + +int JASystem::WaveBankMgr::sTableSize; +JASystem::TWaveBank** JASystem::WaveBankMgr::sWaveBank; /* 802882CC-8028835C .text init__Q28JASystem11WaveBankMgrFi */ -void JASystem::WaveBankMgr::init(int) { - /* Nonmatching */ +void JASystem::WaveBankMgr::init(int param_1) { + u32 size = param_1 * 4; + sWaveBank = (TWaveBank**) new (JASDram, 0) u8[size]; + JUT_ASSERT(39, sWaveBank != 0); + Calc::bzero(sWaveBank, size); + sTableSize = param_1; } /* 8028835C-80288390 .text getWaveBank__Q28JASystem11WaveBankMgrFi */ -void JASystem::WaveBankMgr::getWaveBank(int) { - /* Nonmatching */ +JASystem::TWaveBank* JASystem::WaveBankMgr::getWaveBank(int banknum) { + if (banknum < 0) { + return NULL; + } + if (banknum >= sTableSize) { + return NULL; + } + return sWaveBank[banknum]; } /* 80288390-80288444 .text registWaveBank__Q28JASystem11WaveBankMgrFiPQ28JASystem9TWaveBank */ -void JASystem::WaveBankMgr::registWaveBank(int, JASystem::TWaveBank*) { +bool JASystem::WaveBankMgr::registWaveBank(int banknum, TWaveBank* param_2) { /* Nonmatching */ + JUT_ASSERT(57, banknum >= 0); + JUT_ASSERT(58, banknum < sTableSize); + sWaveBank[banknum] = param_2; + return true; } /* 80288444-802884BC .text registWaveBankWS__Q28JASystem11WaveBankMgrFiPv */ -void JASystem::WaveBankMgr::registWaveBankWS(int, void*) { +bool JASystem::WaveBankMgr::registWaveBankWS(int param_1, void* param_2) { /* Nonmatching */ + TWaveBank* bank; + if (WSParser::getGroupCount(param_2) == 1) { + bank = WSParser::createSimpleWaveBank(param_2); + } else { + bank = WSParser::createBasicWaveBank(param_2); + } + if (!bank) { + return false; + } + return registWaveBank(param_1, bank); } /* 802884BC-8028850C .text getWaveArc__Q28JASystem11WaveBankMgrFii */ -void JASystem::WaveBankMgr::getWaveArc(int, int) { - /* Nonmatching */ +JASystem::TWaveArc* JASystem::WaveBankMgr::getWaveArc(int banknum, int param_2) { + TWaveBank* bank = getWaveBank(banknum); + if (bank == NULL) { + return NULL; + } + return bank->getWaveArc(param_2); } /* 8028850C-80288550 .text loadWave__Q28JASystem11WaveBankMgrFiiPQ38JASystem6Kernel5THeap */ -void JASystem::WaveBankMgr::loadWave(int, int, JASystem::Kernel::THeap*) { - /* Nonmatching */ +bool JASystem::WaveBankMgr::loadWave(int banknum, int param_2, Kernel::THeap* param_3) { + TWaveArc* arc = getWaveArc(banknum, param_2); + if (arc == NULL) { + return false; + } + return arc->load(param_3); } /* 80288550-80288594 .text eraseWave__Q28JASystem11WaveBankMgrFii */ -void JASystem::WaveBankMgr::eraseWave(int, int) { +bool JASystem::WaveBankMgr::eraseWave(int banknum, int param_2) { /* Nonmatching */ + TWaveArc* arc = getWaveArc(banknum, param_2); + if (arc == NULL) { + return false; + } + return arc->erase() != false; } -