JAudio2 debug (#3006)

This commit is contained in:
Jcw87 2025-12-27 14:23:15 -08:00 committed by GitHub
parent ce41820bf0
commit 038b8fd62f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
39 changed files with 629 additions and 297 deletions

View File

@ -1051,8 +1051,8 @@ config.libs = [
[
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASCalc.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASTaskThread.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASDvdThread.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASCallback.cpp"),
Object(MatchingFor(ALL_GCN, "ShieldD"), "JSystem/JAudio2/JASDvdThread.cpp"),
Object(MatchingFor(ALL_GCN, "ShieldD"), "JSystem/JAudio2/JASCallback.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASHeapCtrl.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASResArcLoader.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASProbe.cpp"),
@ -1084,8 +1084,8 @@ config.libs = [
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASOscillator.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASAiCtrl.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASAudioThread.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASAudioReseter.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASDSPChannel.cpp"),
Object(MatchingFor(ALL_GCN, "ShieldD"), "JSystem/JAudio2/JASAudioReseter.cpp"),
Object(MatchingFor(ALL_GCN, "ShieldD"), "JSystem/JAudio2/JASDSPChannel.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASDSPInterface.cpp"),
Object(MatchingFor(ALL_GCN), "JSystem/JAudio2/JASDriverIF.cpp"),
Object(MatchingFor(ALL_GCN, "Shield"), "JSystem/JAudio2/JASSoundParams.cpp"), # debug weak func order

View File

@ -111,7 +111,11 @@ public:
virtual bool isUsingSeqData(const JAISeqDataRegion& seqDataRegion);
virtual int releaseSeqData(const JAISeqDataRegion& seqDataRegion);
JAISeCategoryMgr* getCategory(int index) { return &mCategoryMgrs[index]; }
JAISeCategoryMgr* getCategory(int categoryIndex) {
JUT_ASSERT(222, categoryIndex >= 0);
JUT_ASSERT(223, categoryIndex < NUM_CATEGORIES);
return &mCategoryMgrs[categoryIndex];
}
JAIAudience* getAudience() { return mAudience; }
JAIAudience* getAudience(int index) {
if (index >= 0 && index < NUM_CATEGORIES) {

View File

@ -12,7 +12,7 @@ class JAISoundChild;
* @ingroup jsystem-jaudio
*
*/
class JAISeq : public JASPoolAllocObject<JAISeq>, public JAISound, public JSULink<JAISeq> {
class JAISeq : public JAISound, public JSULink<JAISeq>, public JASPoolAllocObject<JAISeq> {
public:
static const int NUM_CHILDREN = 32;
@ -53,6 +53,7 @@ public:
void JAISeqMgr_mixOut_(const JASSoundParams& params, JAISoundActivity activity);
const JAISeqData& getSeqData() const { return inner_.mSeqData; }
s32 getCategory() const { return inner_.field_0x39c; }
/* 0x0A8 */ TInner inner_;
/* 0x3A8 */ JAISoundStrategyMgr__unknown<JAISeq>* field_0x3a8;

View File

@ -14,8 +14,8 @@ struct JAISeqData {
field_0x4 = param_1;
}
void set(void* param_0, u32 param_1) {
field_0x0 = param_0;
void set(const void* param_0, u32 param_1) {
field_0x0 = (void*)param_0;
field_0x4 = param_1;
}

View File

@ -6,6 +6,36 @@
#include "JSystem/JUtility/JUTAssert.h"
#include "global.h"
class JAISound;
/**
* @ingroup jsystem-jaudio
*
*/
class JAISoundHandle {
public:
JAISoundHandle() {sound_ = NULL;};
~JAISoundHandle() { releaseSound(); }
bool isSoundAttached() const { return sound_ != NULL; }
JAISound* getSound() {
JUT_ASSERT(41, sound_ != NULL);
return sound_;
}
JAISound* operator->() const {
JUT_ASSERT(58, sound_ != NULL);
return sound_;
}
operator bool() const { return isSoundAttached(); }
void releaseSound();
JAISound* sound_;
};
/**
* @ingroup jsystem-jaudio
*
@ -63,7 +93,7 @@ struct JAISoundStatus_ {
bool isMute() const { return field_0x0.flags.mute; }
bool isPaused() const { return field_0x0.flags.paused; }
void pauseWhenOut() {
field_0x1.flags.flag6 = 1;
field_0x1.flags.flag3 = 1;
}
/* 0x0 */ union {

View File

@ -7,34 +7,6 @@
class JAISound;
class JAISoundID;
/**
* @ingroup jsystem-jaudio
*
*/
class JAISoundHandle {
public:
JAISoundHandle() {sound_ = NULL;};
~JAISoundHandle() { releaseSound(); }
bool isSoundAttached() const { return sound_ != NULL; }
JAISound* getSound() {
JUT_ASSERT(41, sound_ != NULL);
return sound_;
}
JAISound* operator->() const {
JUT_ASSERT(58, sound_ != NULL);
return sound_;
}
operator bool() const { return isSoundAttached(); }
void releaseSound();
JAISound* sound_;
};
/**
* @ingroup jsystem-jaudio
*

View File

@ -11,7 +11,7 @@ class JAIStreamMgr;
* @ingroup jsystem-jaudio
*
*/
class JAIStream : public JASPoolAllocObject<JAIStream>, public JAISound, public JSULink<JAIStream> {
class JAIStream : public JAISound, public JSULink<JAIStream>, public JASPoolAllocObject<JAIStream> {
public:
struct TInner {
JASAramStream aramStream_;

View File

@ -17,6 +17,7 @@ enum JASMixMode {
namespace JASDriver {
typedef s16* (*MixCallback)(s32);
typedef void (*MixFunc)(s16*, u32, MixCallback);
typedef void (*DSPBufCallback)(s16*, u32);
void initAI(void (*)(void));
void startDMA();
@ -27,6 +28,7 @@ namespace JASDriver {
void readDspBuffer(s16*, u32);
void finishDSPFrame();
void registerMixCallback(MixCallback, JASMixMode);
void registDSPBufCallback(DSPBufCallback);
f32 getDacRate();
u32 getSubFrames();
u32 getDacSize();
@ -48,7 +50,7 @@ namespace JASDriver {
extern s32 sDspDacWriteBuffer;
extern s32 sDspDacReadBuffer;
extern s32 sDspStatus;
extern void (*sDspDacCallback)(s16*, u32);
extern DSPBufCallback sDspDacCallback;
extern s16* lastRspMadep;
extern void (*dacCallbackFunc)(s16*, u32);
extern MixCallback extMixCallback;

View File

@ -18,8 +18,8 @@ struct JASAudioReseter {
/* 0x0 */ u32 field_0x0;
/* 0x4 */ f32 mDSPLevel;
/* 0x8 */ s32 mIsDone;
/* 0xC */ bool field_0xc;
/* 0x8 */ s32 mDoneFlag;
/* 0xC */ bool mThreadStopFlag;
}; // Size: 0x10
#endif /* JASAUDIORESETER_H */

View File

@ -132,7 +132,10 @@ namespace JASBNKParser {
JASBank* createBank(void const*, JKRHeap*);
JASBasicBank* createBasicBank(void const*, JKRHeap*);
inline u32 getBankNumber(const void* param_0) { return ((u32*)param_0)[2]; }
inline u32 getBankNumber(const void* param_0) {
u32* ptr = (u32*)param_0;
return ptr[2];
}
extern u32 sUsedHeapSize;
};

View File

@ -10,9 +10,9 @@
*/
struct JASBasicWaveBank : public JASWaveBank {
struct TWaveHandle : public JASWaveHandle {
int getWavePtr() const;
TWaveHandle() { mHeap = NULL; }
const JASWaveInfo* getWaveInfo() const { return &field_0x4; }
virtual int getWavePtr() const;
virtual const JASWaveInfo* getWaveInfo() const { return &field_0x4; }
bool compareHeap(JASHeap* heap) const { return mHeap == heap;}
/* 0x04 */ JASWaveInfo field_0x4;
@ -31,10 +31,10 @@ struct JASBasicWaveBank : public JASWaveBank {
struct TWaveGroup : JASWaveArc {
TWaveGroup();
~TWaveGroup();
virtual ~TWaveGroup();
void setWaveCount(u32, JKRHeap*);
void onLoadDone();
void onEraseDone();
virtual void onLoadDone();
virtual void onEraseDone();
u32 getWaveID(int) const;
/* 0x74 */ JASBasicWaveBank* mBank;

View File

@ -38,6 +38,9 @@ struct JASDSPChannel {
static void updateAll();
static int killActiveChannel();
static JASDSPChannel* getHandle(u32);
static u32 getNumUse();
static u32 getNumFree();
static u32 getNumBreak();
static JASDSPChannel* sDspChannels;

View File

@ -19,14 +19,14 @@ namespace JASDsp {
};
typedef struct {
s16 field_0x0;
s16 field_0x2;
u16 field_0x0;
u16 field_0x2;
s16* field_0x4;
s16 field_0x8;
u16 field_0x8;
s16 field_0xa;
s16 field_0xc;
u16 field_0xc;
s16 field_0xe;
s16 field_0x10[8];
u16 field_0x10[8];
} FxBuf;
struct TChannel {
@ -63,7 +63,7 @@ namespace JASDsp {
/* 0x00E */ short field_0x00E;
/* 0x010 */ u16 field_0x010[1][4]; // array size unknown
/* 0x018 */ u8 field_0x018[0x050 - 0x018];
/* 0x050 */ short field_0x050;
/* 0x050 */ u16 field_0x050;
/* 0x052 */ u16 field_0x052;
/* 0x054 */ u16 field_0x054;
/* 0x056 */ u16 field_0x056;
@ -106,11 +106,13 @@ namespace JASDsp {
void setDSPMixerLevel(f32);
f32 getDSPMixerLevel();
TChannel* getDSPHandle(int);
TChannel* getDSPHandleNc(int);
void setFilterTable(s16*, s16*, u32);
void flushBuffer();
void invalChannelAll();
void initBuffer();
int setFXLine(u8, s16*, JASDsp::FxlineConfig_*);
BOOL changeFXLineParam(u8, u8, u32);
extern u8 const DSPADPCM_FILTER[64];
extern u32 const DSPRES_FILTER[320];

View File

@ -8,6 +8,7 @@ typedef s32 (*DriverCallback)(void*);
namespace JASDriver {
void setDSPLevel(f32);
u16 getChannelLevel_dsp();
f32 getChannelLevel();
f32 getDSPLevel();
void setOutputMode(u32);
u32 getOutputMode();

View File

@ -31,4 +31,23 @@ public:
/* 0x0C */ JAUSection* mSection;
};
class JAUAudioArcLoader_withoutCopy : public JAUAudioArcInterpreter {
virtual void readWS(u32, void const*, u32);
virtual void readBNK(u32, void const*);
virtual void readBSC(void const*, u32);
virtual void readBST(void const*, u32);
virtual void readBSTN(void const*, u32);
virtual void readBMS(u32, void const*, u32);
virtual void readBMS_fromArchive(u32);
virtual void newVoiceBank(u32, u32);
virtual void newDynamicSeqBlock(u32);
virtual void readBSFT(void const*);
virtual void beginBNKList(u32, u32);
virtual void endBNKList();
virtual void readMaxSeCategory(int, int, int);
virtual ~JAUAudioArcLoader_withoutCopy() {}
/* 0x0C */ JAUSection* mSection;
};
#endif /* JAUAUDIOARCLOADER_H */

View File

@ -64,7 +64,12 @@ public:
bool isBuilding() const { return field_0x2c; }
bool isOpen() const;
JAUSectionHeap* asSectionHeap() { return (JAUSection*)sectionHeap_ == this ? sectionHeap_ : NULL; }
JAUSectionHeap* asSectionHeap() {
if ((JAUSection*)sectionHeap_ == this) {
return sectionHeap_;
}
return NULL;
}
const TSectionData& getSectionData() const { return data_; }
JKRHeap* getHeap_();
@ -99,6 +104,7 @@ public:
u32 releaseIdleDynamicSeqDataBlock();
JAUSectionHeap(JKRSolidHeap*, bool, s32);
JAUSection* getOpenSection();
JAUSection* getSection(int);
bool setSeqDataUser(JAISeqDataUser*);
bool newDynamicSeqBlock(u32);
SeqDataReturnValue getSeqData(JAISoundID, JAISeqData*);
@ -123,7 +129,7 @@ public:
};
inline JKRHeap* JAUSection::getHeap_() { return sectionHeap_->mHeap; }
inline bool JAUSection::isOpen() const { return this == sectionHeap_->getOpenSection(); }
inline bool JAUSection::isOpen() const { return sectionHeap_->getOpenSection() == this; }
JAUSectionHeap* JAUNewSectionHeap(bool);

View File

@ -29,7 +29,7 @@ public:
bool getSeqData(int, int, JAISeqData*);
bool getSeqDataRegion(JAISeqDataRegion*);
bool isValid() { return field_0x8; }
bool isValid() const { return field_0x8; }
/* 0x00 */ u16 field_0x0;
/* 0x04 */ const u32* field_0x4;

View File

@ -17,7 +17,7 @@ struct JAUSeqDataBlock {
/* 0x00 */ JSULink<JAUSeqDataBlock> field_0x0;
/* 0x10 */ JAISoundID field_0x10;
/* 0x14 */ JAISeqDataRegion field_0x14;
/* 0x14 */ JAISeqDataRegion region;
/* 0x1C */ int field_0x1c;
};

View File

@ -4,8 +4,8 @@
#include "JSystem/JAudio2/JAIStreamDataMgr.h"
struct BinaryStreamFileTable {
/* 0x0 */ char mIdentifier[4];
/* 0x4 */ int mNumFiles;
/* 0x0 */ u8 mIdentifier[4];
/* 0x4 */ u32 mNumFiles;
/* 0x8 */ int mFilePathOffsets[];
};
@ -16,7 +16,7 @@ struct BinaryStreamFileTable {
struct JAUStreamFileTable {
JAUStreamFileTable();
void init(void const*);
int getNumFiles() const;
u32 getNumFiles() const;
const char* getFilePath(int) const;
bool isValid() { return mData; }

View File

@ -65,6 +65,7 @@ public:
bool setErrorFlag(bool errorFlag);
bool isSubHeap(JKRHeap* heap) const;
void* getAltAramStartAdr();
/* vt[03] */ virtual void callAllDisposer();
/* vt[04] */ virtual u32 getHeapType() = 0;

View File

@ -73,10 +73,12 @@ void JAISeq::reserveChildTracks_(int param_0) {
track->connectChild(j, track2);
} else {
JUT_WARN(117, "%s", "JASPoolAllocObject::<JASTrack>::operator new failed .\n");
continue;
}
}
} else {
JUT_WARN(124, "%s", "JASPoolAllocObject::<JASTrack>::operator new failed .\n");
continue;
}
}
}

View File

@ -10,19 +10,20 @@ JAISoundStarter::~JAISoundStarter() {}
bool JAISoundStarter::startLevelSound(JAISoundID id, JAISoundHandle* handlePtr, const JGeometry::TVec3<f32>* posPtr) {
JUT_ASSERT(20, handlePtr);
if (*handlePtr) {
if ((*handlePtr)->getID() == id) {
(*handlePtr)->updateLifeTime(1);
JAISoundHandle* handlePtr2 = handlePtr;
if (*handlePtr2) {
if ((*handlePtr2)->getID() == id) {
(*handlePtr2)->updateLifeTime(1);
if (posPtr != NULL) {
(*handlePtr)->setPos(*posPtr);
(*handlePtr2)->setPos(*posPtr);
}
return true;
}
}
bool rt = startSound(id, handlePtr, posPtr);
if (rt && *handlePtr) {
(*handlePtr)->setLifeTime(1, false);
if (rt && *handlePtr2) {
(*handlePtr2)->setLifeTime(1, false);
}
return rt;
}

View File

@ -251,7 +251,7 @@ JAISoundChild* JAIStream::getChild(int index) {
if (children_[index] == NULL) {
children_[index] = new JAISoundChild();
if (children_[index] == NULL) {
JUT_WARN(370, "%s", "JASPoolAllocObject::<JAISoundChild>::operator new failed .")
JUT_WARN(370, "%s", "JASPoolAllocObject::<JAISoundChild>::operator new failed .\n")
}
}
return children_[index];

View File

@ -30,7 +30,7 @@ s32 JASDriver::sDspDacReadBuffer;
s32 JASDriver::sDspStatus;
void (*JASDriver::sDspDacCallback)(s16*, u32);
JASDriver::DSPBufCallback JASDriver::sDspDacCallback;
s16* JASDriver::lastRspMadep;
@ -140,7 +140,6 @@ void JASDriver::updateDac() {
}
void JASDriver::updateDSP() {
static u32 history[10] = {0x000F4240};
JASProbe::start(3, "SFR-UPDATE");
JASDsp::invalChannelAll();
@ -151,6 +150,7 @@ void JASDriver::updateDSP() {
JASPortCmd::execAllCommand();
DSPSyncCallback();
static u32 old_time = 0;
static u32 history[10] = {0x000F4240};
u32 r28 = OSGetTick();
u32 r27 = r28 - old_time;
old_time = r28;
@ -210,15 +210,37 @@ void JASDriver::readDspBuffer(s16* param_0, u32 param_1) {
JASCalc::imixcopy(endDacBuffer, dacBuffer, param_0, param_1);
}
u32 sDspUpCount;
void JASDriver::finishDSPFrame() {
static u32 waitcount;
int r30 = sDspDacWriteBuffer + 1;
if (r30 == data_804507A8) {
r30 = 0;
}
if (r30 == sDspDacReadBuffer) {
sDspStatus = 0;
#if DEBUG
if (sDspStatus != 0) {
waitcount = 0;
} else {
waitcount++;
}
if (waitcount != 7) {
return;
}
if (sDspUpCount != 0) {
JUT_WARN(0, "forth DSP return\n");
}
if (sDspUpCount == 0) {
sDspUpCount += 1;
}
JASReport("finishDSPFrame nbuf:%d sWBuf:%d BCount:%d stat:%d", r30, sDspDacWriteBuffer, data_804507A8, sDspStatus);
#else
return;
#endif
}
sDspDacWriteBuffer = r30;
JASAudioThread::setDSPSyncCount(getSubFrames());
JASProbe::start(7, "DSP-MAIN");
@ -236,6 +258,10 @@ void JASDriver::registerMixCallback(MixCallback param_0, JASMixMode param_1) {
sMixMode = param_1;
}
void JASDriver::registDSPBufCallback(DSPBufCallback cb) {
sDspDacCallback = cb;
}
f32 JASDriver::getDacRate() {
return sDacRate;
}
@ -254,68 +280,84 @@ u32 JASDriver::getFrameSamples() {
void JASDriver::mixMonoTrack(s16* buffer, u32 param_1, MixCallback param_2) {
JASProbe::start(5, "MONO-MIX");
s16* r31 = param_2(param_1);
s16* pTrack = buffer;
if (r31 == NULL) {
s16* r26 = param_2(param_1);
if (r26 == NULL) {
return;
}
JASProbe::stop(5);
s16* pTrack = buffer;
s16* r28 = r26;
for (u32 i = param_1; i != 0; i--) {
pTrack[0] = JASCalc::clamp<s16, s32>(pTrack[0] + r31[0]);
pTrack[1] = JASCalc::clamp<s16, s32>(pTrack[1] + r31[0]);
pTrack += 2;
r31++;
s32 src = pTrack[0];
src += r28[0];
pTrack[0] = JASCalc::clamp<s16, s32>(src);
pTrack++;
src = pTrack[0];
src += r28[0];
pTrack[0] = JASCalc::clamp<s16, s32>(src);
pTrack++;
r28++;
}
}
void JASDriver::mixMonoTrackWide(s16* buffer, u32 param_1, MixCallback param_2) {
JASProbe::start(5, "MONO(W)-MIX");
s16* r31 = param_2(param_1);
s16* pTrack = buffer;
if (!r31) {
s16* r26 = param_2(param_1);
if (!r26) {
return;
}
JASProbe::stop(5);
s16* pTrack = buffer;
s16* r28 = r26;
for (u32 i = param_1; i != 0; i--) {
pTrack[0] = JASCalc::clamp<s16, s32>(pTrack[0] + r31[0]);
s32 src = pTrack[1];
src -= r31[0];
pTrack[1] = JASCalc::clamp<s16, s32>(src);
pTrack += 2;
r31++;
s32 src = pTrack[0];
src += r28[0];
pTrack[0] = JASCalc::clamp<s16, s32>(src);
pTrack++;
src = pTrack[0];
src -= r28[0];
pTrack[0] = JASCalc::clamp<s16, s32>(src);
pTrack++;
r28++;
}
}
void JASDriver::mixExtraTrack(s16* buffer, u32 param_1, MixCallback param_2) {
JASProbe::start(5, "DSPMIX");
s16* r31 = param_2(param_1);
if (!r31) {
s16* r27 = param_2(param_1);
if (!r27) {
return;
}
JASProbe::stop(5);
JASProbe::start(6, "MIXING");
s16* pTrack = buffer;
s16* r29 = r31 + getFrameSamples();
s16* r29 = r27;
s16* r28 = r27 + getFrameSamples();
for (u32 i = param_1; i != 0; i--) {
pTrack[0] = JASCalc::clamp<s16, s32>(pTrack[0] + r29[0]);
pTrack[1] = JASCalc::clamp<s16, s32>(pTrack[1] + r31[0]);
pTrack += 2;
s32 r25 = pTrack[0] + r28[0];
pTrack[0] = JASCalc::clamp<s16, s32>(r25);
pTrack++;
r25 = pTrack[0] + r29[0];
pTrack[0] = JASCalc::clamp<s16, s32>(r25);
pTrack++;
r28++;
r29++;
r31++;
}
JASProbe::stop(6);
}
void JASDriver::mixInterleaveTrack(s16* buffer, u32 param_1, MixCallback param_2) {
s16* r31 = param_2(param_1);
if (r31) {
s16* pTrack = buffer;
s16* r30 = r31;
for (u32 i = param_1 * 2; i != 0; i--) {
pTrack[0] = JASCalc::clamp<s16, s32>(pTrack[0] + r30[0]);
pTrack += 1;
r30++;
}
if (!r31) {
return;
}
s16* pTrack = buffer;
s16* r30 = r31;
for (u32 i = param_1 * 2; i != 0; i--) {
s32 r26 = pTrack[0] + r30[0];
pTrack[0] = JASCalc::clamp<s16, s32>(r26);
pTrack++;
r30++;
}
}

View File

@ -10,41 +10,46 @@ struct JASDSPChannel {
void drop();
static JASDSPChannel* getHandle(u32);
inline u32 getStatus() {return mStatus;}
inline u8 getStatus() const { return mStatus; }
u32 mStatus;
};
JASAudioReseter::JASAudioReseter() {
field_0x0 = 0;
mIsDone = true;
field_0xc = false;
mDoneFlag = true;
mThreadStopFlag = false;
mDSPLevel = JASDriver::getDSPLevel();
}
JASAudioReseter::~JASAudioReseter() {}
JASAudioReseter::~JASAudioReseter() {
JUT_ASSERT(28, mDoneFlag);
}
bool JASAudioReseter::start(u32 param_0, bool param_1) {
if (mIsDone == false) {
if (mDoneFlag == false) {
return false;
}
field_0xc = param_1;
mThreadStopFlag = param_1;
JASCriticalSection critical;
if (!JASDriver::registerDspSyncCallback(callback, this)) {
JUT_WARN(40, "%s", "Failed JASAudioReseter start\n");
return false;
} else {
mDSPLevel = JASDriver::getDSPLevel();
field_0x0 = param_0;
mIsDone = false;
mDoneFlag = false;
return true;
}
}
void JASAudioReseter::resume() {
JUT_ASSERT(55, mDoneFlag);
JUT_ASSERT(56, ! mThreadStopFlag);
JASDriver::setDSPLevel(mDSPLevel);
}
s32 JASAudioReseter::checkDone() const {
return mIsDone;
return mDoneFlag;
}
@ -52,23 +57,24 @@ s32 JASAudioReseter::calc() {
if(field_0x0==0) {
for(size_t i = 0; i<64; i++) {
JASDSPChannel* handle = JASDSPChannel::getHandle(i);
if ((handle->getStatus()&0xFF)==0) {
if ((handle->getStatus())==0) {
handle->drop();
}
}
if(field_0xc!=false) {
JASGlobalInstance<JASAudioThread>::getInstance()->stop();//JASGlobalInstance<JASAudioThread>::sInstance->stop();
if(mThreadStopFlag!=false) {
JASAudioThread* pAudioThread = JASGlobalInstance<JASAudioThread>::getInstance();
JUT_ASSERT(78, pAudioThread);
pAudioThread->stop();
}
mIsDone = 1;
mDoneFlag = 1;
return -1;
}
field_0x0--;
u32 unk = field_0x0;
float dspLevel = JASDriver::getDSPLevel();
JASDriver::setDSPLevel(((float)unk*dspLevel)/(float)(unk+1));
JASDriver::setDSPLevel(field_0x0 * JASDriver::getDSPLevel() / (field_0x0 + 1));
return 0;
}
s32 JASAudioReseter::callback(void* param_0) {
return ((JASAudioReseter*)param_0)->calc();
JASAudioReseter* i_this = (JASAudioReseter*) param_0;
return i_this->calc();
}

View File

@ -7,6 +7,7 @@
#include "JSystem/JAudio2/JASDSPInterface.h"
#include "JSystem/JAudio2/JASHeapCtrl.h"
#include "JSystem/JAudio2/JASProbe.h"
#include "JSystem/JAudio2/JASReport.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "dolphin/dsp.h"
#include "stdint.h"
@ -21,9 +22,17 @@ JASAudioThread::JASAudioThread(int stackSize, int msgCount, u32 threadPriority)
}
void JASAudioThread::create(s32 threadPriority) {
JASAudioThread* sAudioThread = new (JASDram, 0) JASAudioThread(threadPriority, 0x10, 0x1400);
sAudioThread->setCurrentHeap(JKRGetSystemHeap());
sAudioThread->resume();
#if PLATFORM_GCN
const int size = 0x1400;
#else
const int size = 0x2800;
#endif
JASAudioThread* pAudioThread = new (JASDram, 0) JASAudioThread(threadPriority, 0x10, size);
JUT_ASSERT(46, pAudioThread);
JKRHeap* pCurrentHeap = JKRGetSystemHeap();
JUT_ASSERT(48, pCurrentHeap);
pAudioThread->setCurrentHeap(pCurrentHeap);
pAudioThread->resume();
}
void JASAudioThread::stop() {
@ -59,19 +68,27 @@ void* JASAudioThread::run() {
JASPoolAllocObject_MultiThreaded<JASChannel>::newMemPool(0x48);
JASDriver::startDMA();
OSMessage msg;
while (true) {
OSMessage msg = waitMessageBlock();
msg = waitMessageBlock();
switch ((intptr_t)msg) {
case AUDIOMSG_DMA:
if (sbPauseFlag) {
JUT_PANIC(107, "AUDIO THREAD PAUSED\n");
JASDriver::stopDMA();
OSSleepThread(&sThreadQueue);
}
#if DEBUG
if (snIntCount != 0) {
JASReport("DSP process is over.");
}
#endif
JASDriver::updateDac();
JASDriver::updateDacCallback();
break;
continue;
case AUDIOMSG_DSP:
JUT_ASSERT(125, snIntCount != 0);
snIntCount--;
if (snIntCount == 0) {
JASProbe::stop(7);
@ -81,31 +98,41 @@ void* JASAudioThread::run() {
JASDriver::updateDSP();
JASProbe::stop(2);
}
break;
continue;
case AUDIOMSG_STOP:
JASDriver::stopDMA();
OSExitThread(NULL);
break;
continue;
default:
JUT_PANIC(152, "AUDIO THREAD INVALID MESSAGE\n");
}
}
}
void JASAudioThread::DMACallback() {
JASAudioThread* thread = getInstance();
JASAudioThread* pAudioThread = getInstance();
JUT_ASSERT(167, pAudioThread);
JASProbe::stop(4);
JASProbe::start(4, "UPDATE-DAC");
thread->sendMessage((void*)AUDIOMSG_DMA);
if (!pAudioThread->sendMessage((void*)AUDIOMSG_DMA)) {
JUT_WARN_DEVICE(173, 1, "%s","----- DMACallback : Can\'t send DAC_SYNC message\n");
}
}
void JASAudioThread::DSPCallback(void*) {
JASAudioThread* thread = getInstance();
JASAudioThread* pAudioThread = getInstance();
JUT_ASSERT(184, pAudioThread);
while (DSPCheckMailFromDSP() == 0) { }
u32 mail = DSPReadMailFromDSP();
if (mail >> 0x10 == 0xF355) {
if (mail >> 0x10 != 0xF355) {
JUT_WARN(196, "DSP Mail format error %x\n", mail);
} else {
if ((mail & 0xFF00) == 0xFF00) {
thread->sendMessage((void*)AUDIOMSG_DSP);
if (!pAudioThread->sendMessage((void*)AUDIOMSG_DSP)) {
JUT_WARN_DEVICE(204, 1, "%s", "----- syncDSP : Send Miss\n");
}
} else {
JASDsp::finishWork(mail);
}

View File

@ -43,6 +43,7 @@ void JASDSPChannel::drop() {
void JASDSPChannel::initAll() {
sDspChannels = new (JASDram, 0x20) JASDSPChannel[0x40];
JUT_ASSERT(102, sDspChannels);
for (int i = 0; i < 0x40; i++) {
sDspChannels[i].mChannel = JASDsp::getDSPHandle(i);
}
@ -87,7 +88,7 @@ JASDSPChannel* JASDSPChannel::getLowestChannel(int i_priority) {
JASDSPChannel* channel = &sDspChannels[i];
s16 priority = channel->mPriority;
if (priority < 0) {
return channel;
return &sDspChannels[i];
}
if (priority <= i_priority && priority <= best_priority) {
if (priority != best_priority || channel->field_0xc > best_unknown) {
@ -127,7 +128,8 @@ JASDSPChannel* JASDSPChannel::getLowestActiveChannel() {
}
void JASDSPChannel::updateProc() {
int ret;
int ret = 0;
bool flush;
if (mChannel->isFinish()) {
mFlags &= ~2;
if (mStatus == STATUS_ACTIVE) {
@ -173,7 +175,7 @@ void JASDSPChannel::updateProc() {
mChannel->flush();
}
} else if (mStatus != STATUS_INACTIVE) {
bool flush = false;
flush = false;
if (mCallback != NULL) {
ret = mCallback(CB_PLAY, mChannel, mCallbackData);
flush = true;
@ -225,3 +227,33 @@ int JASDSPChannel::killActiveChannel() {
JASDSPChannel* JASDSPChannel::getHandle(u32 i_index) {
return &sDspChannels[i_index];
}
u32 JASDSPChannel::getNumUse() {
u32 count = 0;
for (int i = 0; i < 0x40; i++) {
if (sDspChannels[i].mStatus == 0) {
count++;
}
}
return count;
}
u32 JASDSPChannel::getNumFree() {
u32 count = 0;
for (int i = 0; i < 0x40; i++) {
if (sDspChannels[i].mStatus == 1) {
count++;
}
}
return count;
}
u32 JASDSPChannel::getNumBreak() {
u32 count = 0;
for (int i = 0; i < 0x40; i++) {
if (sDspChannels[i].mStatus == 2) {
count++;
}
}
return count;
}

View File

@ -17,10 +17,34 @@ JASDsp::FxBuf* JASDsp::FX_BUF;
f32 JASDsp::sDSPVolume;
u16 JASDsp::SEND_TABLE[] = {
0x0D00,
0x0D60,
0x0DC8,
0x0E28,
0x0E88,
0x0EE8,
0x0CA0,
0x0F40,
0x0FA0,
0x0B00,
0x09A0,
0x0000,
};
u32 JASWaveInfo::one = 1;
#if DEBUG
s32 JASDsp::dspMutex = 1;
#endif
void JASDsp::boot(void (*param_0)(void*)) {
static bool data_804512F4 = true;
if (data_804512F4) {
DspBoot(param_0);
#if !PLATFORM_GCN
// DsetVARAM(JKRHeap::getAltAramStartAdr());
#endif
data_804512F4 = false;
}
}
@ -40,6 +64,7 @@ void JASDsp::syncFrame(u32 param_0, u32 param_1, u32 param_2) {
void JASDsp::setDSPMixerLevel(f32 dsp_level) {
sDSPVolume = dsp_level;
dsp_level *= 4.0f;
JUT_ASSERT(277, (0.0 <= dsp_level) && (dsp_level <= 8.0));
DsetMixerLevel(dsp_level);
}
@ -51,6 +76,10 @@ JASDsp::TChannel* JASDsp::getDSPHandle(int param_0) {
return CH_BUF + param_0;
}
JASDsp::TChannel* JASDsp::getDSPHandleNc(int param_0) {
return (TChannel*)OSCachedToUncached(CH_BUF + param_0);
}
void JASDsp::setFilterTable(s16* param_0, s16* param_1, u32 param_2) {
for (int i = 0; i < param_2; i++) {
*param_0++ = *param_1++;
@ -398,7 +427,9 @@ u32 const ATTRIBUTE_ALIGN(32) JASDsp::DSPRES_FILTER[320] = {
void JASDsp::initBuffer() {
CH_BUF = new(JASDram, 0x20) TChannel[64];
JUT_ASSERT(354, CH_BUF);
FX_BUF = new(JASDram, 0x20) FxBuf[4];
JUT_ASSERT(356, FX_BUF);
JASCalc::bzero(CH_BUF, 0x6000);
JASCalc::bzero(FX_BUF, sizeof(FxBuf) * 4);
for (u8 i = 0; i < 4; i++) {
@ -408,22 +439,7 @@ void JASDsp::initBuffer() {
flushBuffer();
}
u16 JASDsp::SEND_TABLE[] = {
0x0D00,
0x0D60,
0x0DC8,
0x0E28,
0x0E88,
0x0EE8,
0x0CA0,
0x0F40,
0x0FA0,
0x0B00,
0x09A0,
0x0000,
};
int JASDsp::setFXLine(u8 param_0, s16* param_1, JASDsp::FxlineConfig_* param_2) {
int JASDsp::setFXLine(u8 param_0, s16* buffer, JASDsp::FxlineConfig_* param_2) {
FxBuf* puVar3 = FX_BUF + param_0;
JASCriticalSection aJStack_20;
puVar3->field_0x0 = 0;
@ -433,15 +449,17 @@ int JASDsp::setFXLine(u8 param_0, s16* param_1, JASDsp::FxlineConfig_* param_2)
puVar3->field_0xe = param_2->field_0x8;
puVar3->field_0xc = SEND_TABLE[param_2->field_0x6];
puVar3->field_0x2 = param_2->field_0xc;
setFilterTable(puVar3->field_0x10, param_2->field_0x10, 8);
setFilterTable((s16*)puVar3->field_0x10, param_2->field_0x10, 8);
}
if (param_1 != NULL && param_2 != NULL) {
u32 iVar1 = param_2->field_0xc * 0xa0;
puVar3->field_0x4 = param_1;
JASCalc::bzero(param_1, iVar1);
DCFlushRange(param_1, iVar1);
} else if (param_2 == NULL || param_1 != NULL) {
puVar3->field_0x4 = param_1;
if (buffer != NULL && param_2 != NULL) {
u32 bufsize = param_2->field_0xc * 0xa0;
puVar3->field_0x4 = buffer;
JASCalc::bzero(buffer, bufsize);
JUT_ASSERT(420, (reinterpret_cast<u32>(buffer) & 0x1f) == 0);
JUT_ASSERT(421, (bufsize & 0x1f) == 0);
DCFlushRange(buffer, bufsize);
} else if (param_2 == NULL || buffer != NULL) {
puVar3->field_0x4 = buffer;
}
if (puVar3->field_0x4 != NULL) {
@ -453,7 +471,31 @@ int JASDsp::setFXLine(u8 param_0, s16* param_1, JASDsp::FxlineConfig_* param_2)
return 1;
}
BOOL JASDsp::changeFXLineParam(u8 param_0, u8 param_1, u32 param_2) {
JUT_ASSERT(450, dspMutex);
FxBuf* buf = &FX_BUF[param_0];
switch (param_1) {
case 0: buf->field_0x8 = param_2; break;
case 1: buf->field_0xc = param_2; break;
case 2: buf->field_0xa = param_2; break;
case 3: buf->field_0xe = param_2; break;
case 4: buf->field_0x2 = param_2; break;
case 5: buf->field_0x10[0] = param_2; break;
case 6: buf->field_0x10[1] = param_2; break;
case 7: buf->field_0x10[2] = param_2; break;
case 8: buf->field_0x10[3] = param_2; break;
case 9: buf->field_0x10[4] = param_2; break;
case 10: buf->field_0x10[5] = param_2; break;
case 11: buf->field_0x10[6] = param_2; break;
case 12: buf->field_0x10[7] = param_2; break;
case 13: setFilterTable((s16*)buf->field_0x10, (s16*)param_2, 8); break;
case 14: buf->field_0x0 = param_2; break;
}
return 1;
}
void JASDsp::TChannel::init() {
JUT_ASSERT(489, dspMutex);
mPauseFlag = 0;
mIsFinished = 0;
mForcedStop = 0;
@ -464,6 +506,7 @@ void JASDsp::TChannel::init() {
}
void JASDsp::TChannel::playStart() {
JUT_ASSERT(508, dspMutex);
field_0x10c = 0;
field_0x060 = 0;
field_0x008 = 1;
@ -480,27 +523,34 @@ void JASDsp::TChannel::playStart() {
}
void JASDsp::TChannel::playStop() {
JUT_ASSERT(540, dspMutex);
mIsActive = 0;
}
void JASDsp::TChannel::replyFinishRequest() {
JUT_ASSERT(549, dspMutex);
mIsFinished = 0;
mIsActive = 0;
}
void JASDsp::TChannel::forceStop() {
JUT_ASSERT(559, dspMutex);
mForcedStop = 1;
}
bool JASDsp::TChannel::isActive() const {
JUT_ASSERT(568, dspMutex);
return mIsActive != 0;
}
bool JASDsp::TChannel::isFinish() const {
JUT_ASSERT(577, dspMutex);
return mIsFinished != 0;
}
void JASDsp::TChannel::setWaveInfo(JASWaveInfo const& param_0, u32 param_1, u32 param_2) {
int i;
JUT_ASSERT(610, dspMutex);
field_0x118 = param_1;
static const u8 COMP_BLOCKSAMPLES[8] = {0x10, 0x10, 0x01, 0x01, 0x01, 0x10, 0x10, 0x01};
field_0x064 = COMP_BLOCKSAMPLES[param_0.field_0x00];
@ -536,19 +586,21 @@ void JASDsp::TChannel::setWaveInfo(JASWaveInfo const& param_0, u32 param_1, u32
break;
}
}
for (int i = 0; i < 16; i++) {
for (i = 0; i < 16; i++) {
field_0x0b0[i] = 0;
}
}
}
void JASDsp::TChannel::setOscInfo(u32 param_0) {
JUT_ASSERT(671, dspMutex);
field_0x118 = 0;
field_0x064 = 16;
field_0x100 = param_0;
}
void JASDsp::TChannel::initAutoMixer() {
JUT_ASSERT(688, dspMutex);
if (field_0x058) {
field_0x054 = field_0x056;
} else {
@ -559,6 +611,7 @@ void JASDsp::TChannel::initAutoMixer() {
void JASDsp::TChannel::setAutoMixer(u16 param_0, u8 param_1, u8 param_2, u8 param_3,
u8 param_4) {
JUT_ASSERT(709, dspMutex);
field_0x050 = (param_1 << 8) | param_2;
field_0x052 = param_3 << 8 | param_3 << 1;
field_0x056 = param_0;
@ -566,6 +619,7 @@ void JASDsp::TChannel::setAutoMixer(u16 param_0, u8 param_1, u8 param_2, u8 para
}
void JASDsp::TChannel::setPitch(u16 param_0) {
JUT_ASSERT(763, dspMutex);
if (param_0 >= 0x7fff) {
param_0 = 0x7fff;
}
@ -573,6 +627,7 @@ void JASDsp::TChannel::setPitch(u16 param_0) {
}
void JASDsp::TChannel::setMixerInitVolume(u8 param_0, s16 param_1) {
JUT_ASSERT(798, dspMutex);
u16* tmp = field_0x010[param_0];
tmp[2] = param_1;
tmp[1] = param_1;
@ -580,14 +635,17 @@ void JASDsp::TChannel::setMixerInitVolume(u8 param_0, s16 param_1) {
}
void JASDsp::TChannel::setMixerVolume(u8 param_0, s16 param_1) {
u16* tmp;
JUT_ASSERT(841, dspMutex);
if (mForcedStop == 0) {
u16* tmp = field_0x010[param_0];
tmp = field_0x010[param_0];
tmp[1] = param_1;
tmp[3] &= 0xff;
}
}
void JASDsp::TChannel::setPauseFlag(u8 param_0) {
JUT_ASSERT(863, dspMutex);
mPauseFlag = param_0;
}
@ -596,7 +654,8 @@ void JASDsp::TChannel::flush() {
}
void JASDsp::TChannel::initFilter() {
int i;
u32 i;
JUT_ASSERT(888, dspMutex);
for (i = 0; i < 8; i++) {
fir_filter_params[i] = 0;
}
@ -609,6 +668,7 @@ void JASDsp::TChannel::initFilter() {
}
void JASDsp::TChannel::setFilterMode(u16 param_0) {
JUT_ASSERT(914, dspMutex);
u8 r30 = param_0 & 0x20;
u8 r31 = param_0 & 0x1f;
if (r30) {
@ -624,24 +684,30 @@ void JASDsp::TChannel::setFilterMode(u16 param_0) {
}
void JASDsp::TChannel::setIIRFilterParam(s16* param_0) {
JUT_ASSERT(937, dspMutex);
setFilterTable(iir_filter_params, param_0, 8);
}
void JASDsp::TChannel::setFIR8FilterParam(s16* param_0) {
JUT_ASSERT(948, dspMutex);
setFilterTable(fir_filter_params, param_0, 8);
}
void JASDsp::TChannel::setDistFilter(s16 param_0) {
JUT_ASSERT(959, dspMutex);
iir_filter_params[4] = param_0;
}
void JASDsp::TChannel::setBusConnect(u8 param_0, u8 param_1) {
JUT_ASSERT(973, dspMutex);
u16* tmp = field_0x010[param_0];
static u16 const connect_table[12] = {
0x0000, 0x0D00, 0x0D60, 0x0DC0, 0x0E20, 0x0E80,
0x0EE0, 0x0CA0, 0x0F40, 0x0FA0, 0x0B00, 0x09A0,
};
tmp[0] = connect_table[param_1];
u16 r30 = 0;
r30 = connect_table[param_1];
tmp[0] = r30;
}
u16 DSP_CreateMap2(u32 param_0) {
@ -656,9 +722,3 @@ u16 DSP_CreateMap2(u32 param_0) {
}
return r30;
}
u32 JASWaveInfo::one = 1;
#if DEBUG
s32 dspMutex = 1;
#endif

View File

@ -15,6 +15,10 @@ u16 JASDriver::getChannelLevel_dsp() {
return JASDriver::MAX_MIXERLEVEL;
}
f32 JASDriver::getChannelLevel() {
return MAX_MIXERLEVEL / 16383.5f;
}
f32 JASDriver::getDSPLevel() {
return JASDsp::getDSPMixerLevel();
}

View File

@ -8,10 +8,7 @@ JASOscillator::JASOscillator() {
mDirectRelease = 0;
_18 = 0;
_1C = 0;
_0C = 0.0f;
_10 = 0.0f;
_08 = 0.0f;
_04 = 0.0f;
_04 = _08 = _10 = _0C = 0.0f;
}
@ -52,6 +49,7 @@ void JASOscillator::incCounter(f32 param_0) {
}
f32 JASOscillator::getValue() const {
JUT_ASSERT(120, mData);
return _08 * mData->mScale + mData->_14;
}
@ -71,8 +69,9 @@ void JASOscillator::release() {
update();
return;
}
if (mData->mTable != mData->rel_table) {
JUT_ASSERT(157, mData->rel_table != NULL);
_04 = 0.0f;
_0C = _08;
_10 = mData->rel_table[0]._4 / 32768.0f;
@ -86,7 +85,7 @@ void JASOscillator::release() {
void JASOscillator::update() {
if (_1C == 4) {
s16 x = mDirectRelease & 0x3FFF;
s32 x = mDirectRelease & 0x3FFF;
if (_04 < x) {
updateCurrentValue(x);
} else {
@ -98,25 +97,21 @@ void JASOscillator::update() {
if (_1C == 2) return;
const Point* psVar1;
if (_1C == 1) {
psVar1 = mData->mTable;
} else {
psVar1 = mData->rel_table;
}
const Point* psVar1 = _1C == 1 ? mData->mTable : mData->rel_table;
if (psVar1 == NULL) {
_1C = 2;
return;
}
while (_04 >= psVar1[_14]._2) {
_04 -= psVar1[_14]._2;
_08 = _10;
_14++;
_0C = _08;
const s16* ps = &psVar1[_14]._0;
switch(ps[0]) {
s16 r26 = ps[0];
switch(r26) {
case 0xf:
_1C = 0;
return;
@ -127,7 +122,7 @@ void JASOscillator::update() {
_14 = ps[2];
break;
default:
_18 = ps[0];
_18 = r26;
_10 = ps[2] / 32768.0f;
break;
}
@ -172,7 +167,6 @@ void JASOscillator::updateCurrentValue(f32 param_0) {
f32 fVar1 = 16.0f * (_04 / param_0);
u32 index = (u32) fVar1;
f32 fVar3 = (fVar1 - index);
f32 fVar2 = (1.0f - fVar3) * table[index];
f32 fVar4 = fVar2 + fVar3 * table[index + 1];
f32 fVar4 = (1.0f - fVar3) * table[index] + fVar3 * table[index + 1];
_08 = _0C * fVar4 + _10 * (1.0f - fVar4);
}

View File

@ -98,11 +98,11 @@ bool JAUAudioArcInterpreter::readCommand_() {
break;
}
case 'sect': {
readU8_();
u8 var1 = readU8_();
u8 var2 = readU8_();
u8 var3 = readU8_();
readMaxSeCategory(var1, var2, var3);
u8 var4 = readU8_();
readMaxSeCategory(var2, var3, var4);
break;
}
default:

View File

@ -2,11 +2,12 @@
#include "JSystem/JAudio2/JAUAudioArcLoader.h"
#include "JSystem/JAudio2/JAISeMgr.h"
#include "JSystem/JAudio2/JASReport.h"
#include "JSystem/JAudio2/JAUSectionHeap.h"
JAUAudioArcLoader::JAUAudioArcLoader(JAUSection* section) {
//JUT_ASSERT(13, section->isOpen());
//JUT_ASSERT(14, section->isBuilding());
JUT_ASSERT(13, section->isOpen());
JUT_ASSERT(14, section->isBuilding());
mSection = section;
}
@ -68,9 +69,80 @@ void JAUAudioArcLoader::endBNKList() {
}
void JAUAudioArcLoader::readMaxSeCategory(int param_0, int param_1, int param_2) {
JAISeMgr* seMgr = JASGlobalInstance<JAISeMgr>::getInstance();
if (seMgr) {
seMgr->getCategory(param_0)->setMaxActiveSe(param_1);
seMgr->getCategory(param_0)->setMaxInactiveSe(param_2);
{
JAISeMgr* seMgr = JASGlobalInstance<JAISeMgr>::getInstance();
if (seMgr) {
seMgr->getCategory(param_0)->setMaxActiveSe(param_1);
seMgr->getCategory(param_0)->setMaxInactiveSe(param_2);
}
}
}
void JAUAudioArcLoader_withoutCopy::readWS(u32 param_0, void const* param_1, u32 param_2) {
mSection->newWaveBank(param_0, param_1);
if (param_2) {
mSection->loadWaveArc(param_0, param_2);
}
JASReport(".ws resource remains at Heap Head\n");
}
void JAUAudioArcLoader_withoutCopy::readBNK(u32 param_0, void const* param_1) {
mSection->newBank(param_1, param_0);
JASReport(".bnk resource remains at Heap Head\n");
}
void JAUAudioArcLoader_withoutCopy::readBSC(void const* param_0, u32 param_1) {
UNUSED(param_1);
mSection->newSeSeqCollection(param_0, 0);
}
void JAUAudioArcLoader_withoutCopy::readBST(void const* param_0, u32 param_1) {
UNUSED(param_1);
mSection->newSoundTable(param_0, 0, true);
}
void JAUAudioArcLoader_withoutCopy::readBSTN(void const* param_0, u32 param_1) {
UNUSED(param_1);
mSection->newSoundNameTable(param_0, 0, true);
}
void JAUAudioArcLoader_withoutCopy::readBMS(u32 param_0, void const* param_1, u32 param_2) {
UNUSED(param_2);
mSection->newStaticSeqData(param_0, param_1, 0);
}
void JAUAudioArcLoader_withoutCopy::readBMS_fromArchive(u32 param_0) {
mSection->newStaticSeqData(param_0);
}
void JAUAudioArcLoader_withoutCopy::newVoiceBank(u32 param_0, u32 param_1) {
mSection->newVoiceBank(param_1, param_0);
}
void JAUAudioArcLoader_withoutCopy::newDynamicSeqBlock(u32 param_0) {
JAUSectionHeap* sectionHeap = mSection->asSectionHeap();
JUT_ASSERT(166, sectionHeap);
sectionHeap->newDynamicSeqBlock(param_0);
}
void JAUAudioArcLoader_withoutCopy::readBSFT(void const* param_0) {
mSection->newStreamFileTable(param_0, false);
}
void JAUAudioArcLoader_withoutCopy::beginBNKList(u32 param_0, u32 param_1) {
mSection->beginNewBankTable(param_0, param_1);
}
void JAUAudioArcLoader_withoutCopy::endBNKList() {
mSection->endNewBankTable();
}
void JAUAudioArcLoader_withoutCopy::readMaxSeCategory(int param_0, int param_1, int param_2) {
{
JAISeMgr* seMgr = JASGlobalInstance<JAISeMgr>::getInstance();
if (seMgr) {
seMgr->getCategory(param_0)->setMaxActiveSe(param_1);
seMgr->getCategory(param_0)->setMaxInactiveSe(param_2);
}
}
}

View File

@ -6,8 +6,11 @@
#include "JSystem/JAudio2/JAUClusterSound.h"
#include "JSystem/JAudio2/JAISoundHandles.h"
#include "JSystem/JAudio2/JAISoundStarter.h"
// Dummy function to generate JAISoundHandle::JAISoundHandle
static void dummyCtor() {
JASGlobalInstance<JAISoundStarter>::getInstance();
JAISoundHandle dummy[20];
JAISoundHandles handles(dummy, 20);
}

View File

@ -195,7 +195,7 @@ JAIStreamDataMgr* JAUSection::newStreamFileTable(void const* param_0, bool param
}
JAISeqDataMgr* JAUSection::newSeSeqCollection(void const* bsc, u32 param_1) {
// JUT_ASSERT(398, asSectionHeap() == this);
JUT_ASSERT(398, asSectionHeap() == this);
JUT_ASSERT(399, sectionHeap_->sectionHeapData_.seSeqDataMgr_ == NULL);
if (param_1) {
bsc = newCopy(bsc, param_1, 4);
@ -224,14 +224,16 @@ u8* JAUSection::newStaticSeqDataBlock_(JAISoundID param_0, u32 size) {
}
JSULink<JAUSeqDataBlock>* link = new JSULink<JAUSeqDataBlock>(seqDataBlock);
if (!link) {
JUT_WARN(432, "%s", "created UNUSED object in Heap\n");
return NULL;
}
u8* r28 = new(0x20) u8[size];
if (!r28) {
JUT_WARN(438, "%s", "created UNUSED object in Heap\n");
return NULL;
}
seqDataBlock->field_0x14.addr = r28;
seqDataBlock->field_0x14.size = size;
seqDataBlock->region.addr = r28;
seqDataBlock->region.size = size;
seqDataBlock->field_0x10 = param_0;
JASCriticalSection cs;
if(data_.field_0x00.appendDynamicSeqDataBlock(seqDataBlock)) {
@ -243,10 +245,12 @@ u8* JAUSection::newStaticSeqDataBlock_(JAISoundID param_0, u32 size) {
}
bool JAUSection::newStaticSeqData(JAISoundID param_0, void const* param_1, u32 param_2) {
u8* r30 = newStaticSeqDataBlock_(param_0, param_2);
if (r30) {
memcpy(r30, param_1, param_2);
return true;
{
u8* r30 = newStaticSeqDataBlock_(param_0, param_2);
if (r30) {
memcpy(r30, param_1, param_2);
return true;
}
}
return false;
}
@ -256,6 +260,7 @@ bool JAUSection::newStaticSeqData(JAISoundID param_0) {
JUT_ASSERT(481, seqArchive);
JAUSoundInfo* soundInfo = JASGlobalInstance<JAUSoundInfo>::getInstance();
if (!soundInfo) {
JUT_WARN(485, "%s","cannot JAUSoundInfo::getInstance().");
return false;
}
u16 r26 = soundInfo->getBgmSeqResourceID(param_0);
@ -286,15 +291,17 @@ static bool dummy_string(int i) {
JASWaveBank* JAUSection::newWaveBank(u32 bank_no, void const* param_1) {
JUT_ASSERT(528, isOpen());
JUT_ASSERT(529, isBuilding());
TPushCurrentHeap push(getHeap_());
s32 r27 = getHeap_()->getFreeSize();
JASWaveBank* waveBank = JASWSParser::createWaveBank(param_1, getHeap_());
if (waveBank) {
JUT_ASSERT(536, sectionHeap_->getWaveBankTable().getWaveBank( bank_no ) == NULL);
sectionHeap_->getWaveBankTable().registWaveBank(bank_no, waveBank);
data_.registeredWaveBankTables.set(bank_no, true);
data_.field_0xa0 += r27 - getHeap_()->getFreeSize();
return waveBank;
{
TPushCurrentHeap push(getHeap_());
s32 r27 = getHeap_()->getFreeSize();
JASWaveBank* waveBank = JASWSParser::createWaveBank(param_1, getHeap_());
if (waveBank) {
JUT_ASSERT(536, sectionHeap_->getWaveBankTable().getWaveBank( bank_no ) == NULL);
sectionHeap_->getWaveBankTable().registWaveBank(bank_no, waveBank);
data_.registeredWaveBankTables.set(bank_no, true);
data_.field_0xa0 += r27 - getHeap_()->getFreeSize();
return waveBank;
}
}
return NULL;
@ -306,7 +313,8 @@ bool JAUSection::loadWaveArc(u32 param_0, u32 param_1) {
if (waveBank) {
for (u32 i = 0; i < waveBank->getArcCount(); i++) {
if (param_1 & 1 << i) {
waveBank->getWaveArc(i)->load(NULL);
JASWaveArc* waveArc = waveBank->getWaveArc(i);
waveArc->load(NULL);
}
}
return true;
@ -320,22 +328,24 @@ JASBank* JAUSection::newBank(void const* param_0, u32 param_1) {
JUT_ASSERT(648, isBuilding());
JASWaveBank* waveBank = sectionHeap_->getWaveBankTable().getWaveBank(param_1);
JUT_ASSERT(650, waveBank != NULL);
TPushCurrentHeap push(getHeap_());
u32 bank_no = JASBNKParser::getBankNumber(param_0);
s32 r25 = getHeap_()->getFreeSize();
JASBank* bank = JASBNKParser::createBank(param_0, getHeap_());
if (bank) {
if (buildingBankTable_) {
JUT_ASSERT(660, buildingBankTable_->getBank( bank_no ) == NULL);
buildingBankTable_->registBank(bank_no, bank);
} else {
JUT_ASSERT(665, JASDefaultBankTable::getInstance() ->getBank( bank_no ) == NULL);
JASDefaultBankTable::getInstance()->registBank(bank_no, bank);
data_.registeredBankTables.set(bank_no, true);
{
TPushCurrentHeap push(getHeap_());
u32 bank_no = JASBNKParser::getBankNumber(param_0);
s32 r25 = getHeap_()->getFreeSize();
JASBank* bank = JASBNKParser::createBank(param_0, getHeap_());
if (bank) {
if (buildingBankTable_) {
JUT_ASSERT(660, buildingBankTable_->getBank( bank_no ) == NULL);
buildingBankTable_->registBank(bank_no, bank);
} else {
JUT_ASSERT(665, JASDefaultBankTable::getInstance() ->getBank( bank_no ) == NULL);
JASDefaultBankTable::getInstance()->registBank(bank_no, bank);
data_.registeredBankTables.set(bank_no, true);
}
bank->assignWaveBank(waveBank);
data_.field_0x9c += r25 - getHeap_()->getFreeSize();
return bank;
}
bank->assignWaveBank(waveBank);
data_.field_0x9c += r25 - getHeap_()->getFreeSize();
return bank;
}
return 0;
}
@ -377,10 +387,10 @@ bool JAUSection::beginNewBankTable(u32 param_0, u32 param_1) {
if (bankTableLink) {
buildingBankTable_ = bankTableLink;
} else {
JUT_WARN(730, "%s","created UNUSED object in Heap\n");
}
} else {
JUT_WARN(735, "%s","created UNUSED object in Heap\n");
}
}
return bankTableLink;
@ -406,7 +416,8 @@ JAUSectionHeap::TSectionHeapData::TSectionHeapData() {
void JAUSectionHeap::setSeqDataArchive(JKRArchive* param_0) {
sectionHeapData_.seqDataBlocks.setSeqDataArchive(param_0);
for (JSULink<JAUSection>* link = mSectionList.getFirst(); link; link = link->getNext()) {
JSULink<JAUSection>* link;
for (link = mSectionList.getFirst(); link; link = link->getNext()) {
link->getObject()->data_.field_0x00.setSeqDataArchive(param_0);
}
}
@ -423,7 +434,8 @@ static JAUSectionHeap* JAUNewSectionHeap(JKRSolidHeap* heap, bool param_1) {
JUT_ASSERT(809, JKRSolidHeap_isEmpty( heap ));
TPushCurrentHeap push(heap);
s32 r29 = heap->getFreeSize();
return new JAUSectionHeap(heap, param_1, r29);
JAUSectionHeap* sectionHeap = new JAUSectionHeap(heap, param_1, r29);
return sectionHeap;
}
JAUSectionHeap* JAUNewSectionHeap(bool param_0) {
@ -443,42 +455,61 @@ JAUSection* JAUSectionHeap::getOpenSection() {
return mSectionList.getLast()->getObject();
}
JAUSection* JAUSectionHeap::getSection(int param_0) {
JSULink<JAUSection>* link = mSectionList.getFirst();
while (param_0 > 0) {
JSULink<JAUSection>* link2 = link->getNext();
if (!link2) {
return NULL;
}
link = link2;
param_0--;
}
return link->getObject();
}
bool JAUSectionHeap::setSeqDataUser(JAISeqDataUser* param_0) {
sectionHeapData_.seqDataUser = param_0;
return true;
}
bool JAUSectionHeap::newDynamicSeqBlock(u32 size) {
/* JUT_ASSERT(937, isOpen());
JUT_ASSERT(937, isOpen());
JUT_ASSERT(938, isBuilding());
JUT_ASSERT(939, sectionHeap_ == this); */
TPushCurrentHeap push(getHeap_());
JAUSeqDataBlock * seqDataBlock = new JAUSeqDataBlock();
if (!seqDataBlock) {
return false;
}
JSULink<JAUSeqDataBlock> * link = new JSULink<JAUSeqDataBlock>(seqDataBlock);
if (!link) {
return false;
}
u8* r25 = new(0x20) u8[size];
if (!r25) {
return false;
}
seqDataBlock->field_0x14.addr = r25;
seqDataBlock->field_0x14.size = size;
seqDataBlock->field_0x10.setAnonymous();
JASCriticalSection cs;
if (sectionHeap_->sectionHeapData_.seqDataBlocks.appendDynamicSeqDataBlock(seqDataBlock)) {
return true;
JUT_ASSERT(939, sectionHeap_ == this);
{
TPushCurrentHeap push(getHeap_());
JAUSeqDataBlock * seqDataBlock = new JAUSeqDataBlock();
if (!seqDataBlock) {
return false;
}
JSULink<JAUSeqDataBlock> * link = new JSULink<JAUSeqDataBlock>(seqDataBlock);
if (!link) {
JUT_WARN(950, "%s", "created UNUSED object in Heap\n");
return false;
}
u8* r25 = new(0x20) u8[size];
if (!r25) {
JUT_WARN(956, "%s", "created UNUSED object in Heap\n");
return false;
}
seqDataBlock->region.addr = r25;
seqDataBlock->region.size = size;
seqDataBlock->field_0x10.setAnonymous();
JASCriticalSection cs;
if (sectionHeap_->sectionHeapData_.seqDataBlocks.appendDynamicSeqDataBlock(seqDataBlock)) {
return true;
}
JUT_WARN(968, "%s","created UNUSED object in Heap\n");
}
return false;
}
JAISeqDataMgr::SeqDataReturnValue JAUSectionHeap::getSeqData(JAISoundID param_0, JAISeqData* param_1) {
const int JAI_ASYNC_RESULT_RETRY = 1;
for (JSULink<JAUSection> * link = mSectionList.getFirst(); link; link = link->getNext()) {
s32 result = link->getObject()->data_.field_0x00.getSeqData(param_0, sectionHeapData_.seqDataUser, param_1, false);
// JUT_ASSERT(994, result != JAI_ASYNC_RESULT_RETRY);
JUT_ASSERT(994, result != JAI_ASYNC_RESULT_RETRY);
if (result == 2) {
return JAISeqDataMgr::SeqDataReturnValue_2;
}
@ -487,5 +518,6 @@ JAISeqDataMgr::SeqDataReturnValue JAUSectionHeap::getSeqData(JAISoundID param_0,
}
int JAUSectionHeap::releaseSeqData() {
JUT_WARN(1005, "%s", "JAUSectionHeap cannot release SeqData all at once. Please pop Section.\n");
return 0;
}

View File

@ -24,7 +24,8 @@ bool JAUSeqCollection::getSeqData(int param_0, int param_1, JAISeqData* param_2)
if (param_0 >= field_0x0) {
return false;
}
u32* puVar2 = (u32*)((u8*)field_0x8 + field_0x4[param_0]);
u32 r29 = field_0x4[param_0];
u32* puVar2 = (u32*)((u8*)field_0x8 + r29);
if (param_1 >= puVar2[0]) {
return false;
}
@ -55,7 +56,8 @@ int JAUSeqDataMgr_SeqCollection::releaseSeqData() {
if (user_) {
JAISeqDataRegion region;
getSeqDataRegion(&region);
return user_->releaseSeqData(region);
int result = user_->releaseSeqData(region);
return result;
}
return 2;
}

View File

@ -20,7 +20,7 @@ u8* JAUSeqDataBlocks::getSeqData(JAISoundID param_0) {
link = link->getNext())
{
if ((u32)link->getObject()->field_0x10 == (u32)param_0) {
return link->getObject()->field_0x14.addr;
return link->getObject()->region.addr;
}
}
return NULL;
@ -32,7 +32,7 @@ JSULink<JAUSeqDataBlock>* JAUSeqDataBlocks::seekFreeBlock(u32 size) {
for (JSULink<JAUSeqDataBlock>* link = getFirst(); link != NULL; link = link->getNext())
{
if (link->getObject()->field_0x10.isAnonymous()) {
u32 blockSize = link->getObject()->field_0x14.size;
u32 blockSize = link->getObject()->region.size;
if (blockSize >= size && blockSize < currentBlockSize) {
rv = link;
currentBlockSize = blockSize;
@ -54,8 +54,8 @@ bool JAUSeqDataBlocks::remove(JSULink<JAUSeqDataBlock>* param_0) {
}
bool JAUSeqDataBlocks::hasFailedBlock(JAISoundID param_0) {
JSULink<JAUSeqDataBlock>* rv = NULL;
for (JSULink<JAUSeqDataBlock>* link = getFirst(); link != NULL; link = link->getNext())
JSULink<JAUSeqDataBlock>* link;
for (link = getFirst(); link != NULL; link = link->getNext())
{
if (link->getObject()->field_0x10 == param_0) {
link->getObject()->field_0x10.setAnonymous();
@ -70,6 +70,7 @@ JAUDynamicSeqDataBlocks::JAUDynamicSeqDataBlocks() {
}
void JAUDynamicSeqDataBlocks::setSeqDataArchive(JKRArchive* param_0) {
JUT_ASSERT(104, seqDataArchive_ == NULL);
seqDataArchive_ = param_0;
}
@ -98,17 +99,21 @@ s32 JAUDynamicSeqDataBlocks::getSeqData(JAISoundID param_0, JAISeqDataUser* para
}
bool JAUDynamicSeqDataBlocks::appendDynamicSeqDataBlock(JAUSeqDataBlock* seqDataBlock) {
JUT_ASSERT(135, ( reinterpret_cast < u32 > ( seqDataBlock->region.addr ) & 0x1f ) == 0);
rearrangeLoadingSeqs_();
bool result;
if (seqDataBlock->field_0x10.isAnonymous()) {
mFreeBlocks.append(&seqDataBlock->field_0x0);
result = mFreeBlocks.append(&seqDataBlock->field_0x0);
} else {
mLoadedBlocks.append(&seqDataBlock->field_0x0);
result = mLoadedBlocks.append(&seqDataBlock->field_0x0);
}
JUT_ASSERT(144, result);
return 1;
}
static void JAUDynamicSeqDataBlocks_receiveLoaded_(u32 param_0, u32 param_1) {
JAUSeqDataBlock* seqDataBlock = ((JSULink<JAUSeqDataBlock>*)param_1)->getObject();
JSULink<JAUSeqDataBlock>* link = (JSULink<JAUSeqDataBlock>*)param_1;
JAUSeqDataBlock* seqDataBlock = link->getObject();
if (param_0 != NULL) {
seqDataBlock->field_0x1c = 2;
} else {
@ -118,35 +123,38 @@ static void JAUDynamicSeqDataBlocks_receiveLoaded_(u32 param_0, u32 param_1) {
bool JAUDynamicSeqDataBlocks::loadDynamicSeq(JAISoundID param_0, bool param_1,
JAISeqDataUser* param_2) {
if (seqDataArchive_ == NULL) {
return false;
}
JAUSoundInfo* soundInfo = JASGlobalInstance<JAUSoundInfo>::getInstance();
if (soundInfo == NULL) {
return false;
}
u16 resourceId = soundInfo->getBgmSeqResourceID(param_0);
size_t resSize = JASResArcLoader::getResSize(seqDataArchive_, resourceId);
JSULink<JAUSeqDataBlock>* link = mFreeBlocks.seekFreeBlock(resSize);
if (link == NULL) {
if (param_1) {
link = &releaseIdleDynamicSeqDataBlock_(param_2, resSize)->field_0x0;
if (link == NULL) {
return false;
}
} else {
{
if (seqDataArchive_ == NULL) {
JUT_WARN(192, "%s", "cannot get sequence data archive.");
return false;
}
JAUSoundInfo* soundInfo = JASGlobalInstance<JAUSoundInfo>::getInstance();
if (soundInfo == NULL) {
JUT_WARN(198, "%s", "cannot JAUSoundInfo::getInstance().");
return false;
}
u16 resourceId = soundInfo->getBgmSeqResourceID(param_0);
size_t resSize = JASResArcLoader::getResSize(seqDataArchive_, resourceId);
JSULink<JAUSeqDataBlock>* link = mFreeBlocks.seekFreeBlock(resSize);
if (link == NULL) {
if (param_1) {
link = &releaseIdleDynamicSeqDataBlock_(param_2, resSize)->field_0x0;
if (link == NULL) {
return false;
}
} else {
return false;
}
}
mFreeBlocks.remove(link);
link->getObject()->field_0x10 = param_0;
link->getObject()->field_0x1c = 1;
field_0xc.append(link);
JASResArcLoader::loadResourceAsync(
seqDataArchive_, resourceId,
link->getObject()->region.addr, link->getObject()->region.size,
JAUDynamicSeqDataBlocks_receiveLoaded_, (u32)link);
}
mFreeBlocks.remove(link);
JAUSeqDataBlock* seqDataBlock = link->getObject();
seqDataBlock->field_0x10 = param_0;
link->getObject()->field_0x1c = 1;
field_0xc.append(link);
JASResArcLoader::loadResourceAsync(
seqDataArchive_, resourceId,
link->getObject()->field_0x14.addr, link->getObject()->field_0x14.size,
JAUDynamicSeqDataBlocks_receiveLoaded_, (u32)link);
return true;
}
@ -157,12 +165,12 @@ u32 JAUDynamicSeqDataBlocks::releaseIdleDynamicSeqDataBlock(JAISeqDataUser* para
for (JSULink<JAUSeqDataBlock>* link = mLoadedBlocks.getFirst(); link != NULL; ) {
nextLink = link->getNext();
JAUSeqDataBlock* seqDataBlock = link->getObject();
if (param_0 == NULL || !param_0->isUsingSeqData(seqDataBlock->field_0x14)) {
if (param_0 == NULL || !param_0->isUsingSeqData(seqDataBlock->region)) {
mLoadedBlocks.remove(link);
JAUSeqDataBlock* seqDataBlock = link->getObject();
link->getObject()->field_0x10.setAnonymous();
if (size < seqDataBlock->field_0x14.size) {
size = seqDataBlock->field_0x14.size;
seqDataBlock->field_0x10.setAnonymous();
if (size < seqDataBlock->region.size) {
size = seqDataBlock->region.size;
}
mFreeBlocks.append(link);
}
@ -181,8 +189,8 @@ JAUDynamicSeqDataBlocks::releaseIdleDynamicSeqDataBlock_(JAISeqDataUser* param_0
while (link != NULL) {
nextLink = link->getNext();
JAUSeqDataBlock* seqDataBlock = link->getObject();
if (param_0 == NULL || !param_0->isUsingSeqData(seqDataBlock->field_0x14)) {
u32 size = seqDataBlock->field_0x14.size;
if (param_0 == NULL || !param_0->isUsingSeqData(seqDataBlock->region)) {
u32 size = seqDataBlock->region.size;
if (size >= param_1 && size < minSize) {
foundBlock = link;
minSize = size;

View File

@ -7,18 +7,17 @@ JAUStreamFileTable::JAUStreamFileTable() {
}
void JAUStreamFileTable::init(void const* data) {
if (data == NULL) {
const BinaryStreamFileTable* binaryTable = (const BinaryStreamFileTable*)data;
if (binaryTable == NULL) {
mData = NULL;
return;
}
const BinaryStreamFileTable* binaryTable = (const BinaryStreamFileTable*)data;
const char* ident = binaryTable->mIdentifier;
if (ident[0] == 'b' && ident[1] == 's' && ident[2] == 'f' && ident[3] == 't') {
if (binaryTable->mIdentifier[0] == 'b' && binaryTable->mIdentifier[1] == 's' && binaryTable->mIdentifier[2] == 'f' && binaryTable->mIdentifier[3] == 't') {
mData = binaryTable;
}
}
int JAUStreamFileTable::getNumFiles() const {
u32 JAUStreamFileTable::getNumFiles() const {
return mData->mNumFiles;
}
@ -26,8 +25,8 @@ const char* JAUStreamFileTable::getFilePath(int index) const {
if (mData == NULL) {
return 0;
}
ASSERT(index >= 0);
ASSERT(index < getNumFiles());
JUT_ASSERT(52, index >= 0);
JUT_ASSERT(53, index < getNumFiles());
char* data = (char*)mData;
return (char*)(data + *(int*)(data + 8 + (index * sizeof(s32))));
}

View File

@ -10,6 +10,8 @@
#include "JSystem/JUtility/JUTException.h"
#include <stdint.h>
void* ARALT_AramStartAdr = (void*)0x90000000;
bool data_804508B0 = 1;
#if DEBUG
@ -447,6 +449,8 @@ void JKRHeap::state_dump(const JKRHeap::TState& p) const {
JUT_LOG(1248, "used size : %u", p.getUsedSize());
}
void* JKRHeap::getAltAramStartAdr() { return ARALT_AramStartAdr; }
s32 JKRHeap::do_changeGroupID(u8 param_0) {
return 0;
}

View File

@ -157,7 +157,7 @@ bool Z2SoundMgr::startSound(JAISoundID soundID, JAISoundHandle* handle, const JG
OS_REPORT("[Z2SoundMgr::startSound] FAILED!!! LOAD SEQ_DATA id: %08x\n", *(u32*)&soundID);
for (JSULink<JAUSeqDataBlock>* link = sectionHeap->getSectionHeapData().seqDataBlocks.getFreeBlocks().getFirst(); link != NULL; link = link->getNext()) {
OS_REPORT(" freeSeqBlock: %d\n", link->getObject()->field_0x14.size);
OS_REPORT(" freeSeqBlock: %d\n", link->getObject()->region.size);
}
}