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/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 */ -} -