mirror of https://github.com/zeldaret/tp.git
JAudio2 debug (#3006)
This commit is contained in:
parent
ce41820bf0
commit
038b8fd62f
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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_;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(®ion);
|
||||
return user_->releaseSeqData(region);
|
||||
int result = user_->releaseSeqData(region);
|
||||
return result;
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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))));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue