mirror of
https://github.com/izzy2lost/Starship.git
synced 2026-07-05 15:19:42 -07:00
In my nightmares, I see audio_synthesis (#146)
* heapsort * suff * load init * split * split data * begone asm * names * names and cleanup * let's try this * woo macros * general * bgm macro * names * audio_thread * Update Torch * I think it's time to move on * Merge remote-tracking branch 'upstream/master' into play --------- Co-authored-by: Alejandro Javier Asenjo Nitti <alejandro.asenjo88@gmail.com>
This commit is contained in:
co-authored by
Alejandro Javier Asenjo Nitti
parent
f23e2efc05
commit
7e99fe712d
+382
-271
File diff suppressed because it is too large
Load Diff
+11
-13
@@ -1,11 +1,9 @@
|
||||
#ifndef AUDIOTHREAD_CMD_H
|
||||
#define AUDIOTHREAD_CMD_H
|
||||
|
||||
|
||||
void AudioThread_QueueCmd(u32, void**);
|
||||
void AudioThread_QueueCmdF32(u32, f32);
|
||||
void AudioThread_QueueCmdS32(u32, u32);
|
||||
void AudioThread_QueueCmdS8(u32, s8);
|
||||
void AudioThread_QueueCmdF32(u32 opArgs, f32 val);
|
||||
void AudioThread_QueueCmdS32(u32 opArgs, u32 val);
|
||||
void AudioThread_QueueCmdS8(u32 opArgs, s8 val);
|
||||
|
||||
/**
|
||||
* Audio thread commands to safely transfer information/requests/data
|
||||
@@ -247,8 +245,8 @@ typedef enum {
|
||||
* @param ioPort the index of the array to store the input-output value
|
||||
* @param ioData (s8) the value that's written to the input-output array
|
||||
*/
|
||||
#define AUDIOCMD_SEQPLAYER_SET_IO(seqPlayerIndex, unk, ioPort, ioData) \
|
||||
AudioThread_QueueCmdS8(AUDIO_MK_CMD(AUDIOCMD_OP_SEQPLAYER_SET_IO, seqPlayerIndex, unk, ioPort), ioData)
|
||||
#define AUDIOCMD_SEQPLAYER_SET_IO(seqPlayerIndex, unk, ioData) \
|
||||
AudioThread_QueueCmdS8(AUDIO_MK_CMD(AUDIOCMD_OP_SEQPLAYER_SET_IO, seqPlayerIndex, unk, 0), ioData)
|
||||
|
||||
/**
|
||||
* Set the tempo (bpm) of a sequence on a given seqPlayer
|
||||
@@ -344,8 +342,8 @@ typedef enum {
|
||||
* @param seqId the id of the sequence to play, see `SeqId`
|
||||
* @param fadeInTimer (s32) number of ticks to fade in the sequence to the requested volume
|
||||
*/
|
||||
#define AUDIOCMD_GLOBAL_INIT_SEQPLAYER(seqPlayerIndex, seqId, fadeInTimer) \
|
||||
AudioThread_QueueCmdS32(AUDIO_MK_CMD(AUDIOCMD_OP_GLOBAL_INIT_SEQPLAYER, seqPlayerIndex, seqId, 0), fadeInTimer)
|
||||
#define AUDIOCMD_GLOBAL_INIT_SEQPLAYER(seqPlayerIndex, seqId, arg2, fadeInTimer) \
|
||||
AudioThread_QueueCmdS32(AUDIO_MK_CMD(AUDIOCMD_OP_GLOBAL_INIT_SEQPLAYER, seqPlayerIndex, seqId, arg2), fadeInTimer)
|
||||
|
||||
/**
|
||||
* Disable a sequence player
|
||||
@@ -456,8 +454,8 @@ typedef enum {
|
||||
* @param sampleBankId the id of the samplebank to load
|
||||
* @param retData return data from `externalLoadQueue`
|
||||
*/
|
||||
#define AUDIOCMD_GLOBAL_ASYNC_LOAD_SAMPLE_BANK(sampleBankId, retData) \
|
||||
AudioThread_QueueCmdS8(AUDIO_MK_CMD(AUDIOCMD_OP_GLOBAL_ASYNC_LOAD_SAMPLE_BANK, sampleBankId, 0, retData), 0)
|
||||
#define AUDIOCMD_GLOBAL_ASYNC_LOAD_SAMPLE_BANK(sampleBankId, nChunks, retData) \
|
||||
AudioThread_QueueCmdS8(AUDIO_MK_CMD(AUDIOCMD_OP_GLOBAL_ASYNC_LOAD_SAMPLE_BANK, sampleBankId, nChunks, retData), 0)
|
||||
|
||||
/**
|
||||
* Asynchronously load a font
|
||||
@@ -465,8 +463,8 @@ typedef enum {
|
||||
* @param fontId the id of the soundfont to load
|
||||
* @param retData return data from `externalLoadQueue`
|
||||
*/
|
||||
#define AUDIOCMD_GLOBAL_ASYNC_LOAD_FONT(fontId, unk, retData) \
|
||||
AudioThread_QueueCmdS8(AUDIO_MK_CMD(AUDIOCMD_OP_GLOBAL_ASYNC_LOAD_FONT, fontId, unk, retData), 0)
|
||||
#define AUDIOCMD_GLOBAL_ASYNC_LOAD_FONT(fontId, nChunks, retData) \
|
||||
AudioThread_QueueCmdS8(AUDIO_MK_CMD(AUDIOCMD_OP_GLOBAL_ASYNC_LOAD_FONT, fontId, nChunks, retData), 0)
|
||||
|
||||
/**
|
||||
* Discard sequence fonts
|
||||
|
||||
@@ -134,8 +134,8 @@ void AudioLoad_Init(void);
|
||||
void func_80016A50(void);
|
||||
void Audio_InitSounds(void);
|
||||
void Audio_Update(void);
|
||||
SPTask* func_8001DF50(void);
|
||||
void func_8001EE00(void);
|
||||
SPTask* AudioThread_CreateTask(void);
|
||||
void AudioThread_PreNMIReset(void);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -262,7 +262,7 @@ typedef struct {
|
||||
/* 0x005 */ s8 unk_05;
|
||||
/* 0x006 */ u16 windowSize;
|
||||
/* 0x008 */ u16 unk_08;
|
||||
/* 0x00A */ s16 unk_0A;
|
||||
/* 0x00A */ u16 unk_0A;
|
||||
/* 0x00C */ u16 decayRatio; // determines how much reverb persists
|
||||
/* 0x00E */ u16 unk_0E;
|
||||
/* 0x010 */ s32 nextRingBufPos;
|
||||
@@ -302,7 +302,7 @@ typedef struct {
|
||||
/* 0x004 */ u8 seqId;
|
||||
/* 0x005 */ u8 defaultFont;
|
||||
/* 0x006 */ u8 unk_06[1];
|
||||
/* 0x007 */ s8 playerIdx;
|
||||
/* 0x007 */ s8 unk_07[1]; // indexed like an array, but that can't be
|
||||
/* 0x008 */ u16 tempo; // seqTicks per minute
|
||||
/* 0x00A */ u16 tempoAcc; // tempo accumulation, used in a discretized algorithm to apply tempo.
|
||||
/* 0x00C */ u16 tempoChange; // Used to adjust the tempo without altering the base tempo.
|
||||
@@ -318,14 +318,14 @@ typedef struct {
|
||||
/* 0x02C */ f32 fadeVolumeMod;
|
||||
/* 0x030 */ f32 appliedFadeVolume;
|
||||
// /* 0x034 */ f32 bend;
|
||||
/* 0x038 */ struct SequenceChannel* channels[16];
|
||||
/* 0x078 */ SeqScriptState scriptState;
|
||||
/* 0x094 */ u8* shortNoteVelocityTable;
|
||||
/* 0x098 */ u8* shortNoteGateTimeTable;
|
||||
/* 0x09C */ NotePool notePool;
|
||||
/* 0x0DC */ s32 skipTicks;
|
||||
/* 0x0E0 */ u32 scriptCounter;
|
||||
/* 0x0E4 */ char
|
||||
/* 0x034 */ struct SequenceChannel* channels[16];
|
||||
/* 0x074 */ SeqScriptState scriptState;
|
||||
/* 0x090 */ u8* shortNoteVelocityTable;
|
||||
/* 0x094 */ u8* shortNoteGateTimeTable;
|
||||
/* 0x098 */ NotePool notePool;
|
||||
/* 0x0D8 */ s32 skipTicks;
|
||||
/* 0x0DC */ u32 scriptCounter;
|
||||
/* 0x0E0 */ char
|
||||
padE4[0x6C]; // unused struct members for sequence/sound font dma management, according to sm64 decomp
|
||||
} SequencePlayer; // size = 0x14C
|
||||
|
||||
@@ -476,14 +476,28 @@ typedef struct SequenceLayer {
|
||||
/* 0x7C */ char pad7C[4];
|
||||
} SequenceLayer; //size = 0x80
|
||||
|
||||
typedef struct UnkStruct_800097A8 {
|
||||
/* 0x00 */ s16* unk_0;
|
||||
/* 0x04 */ s32 unk_4;
|
||||
/* 0x08 */ s32 unk_8;
|
||||
/* 0x0C */ s16* unk_C;
|
||||
/* 0x10 */ char pad10[4];
|
||||
/* 0x14 */ struct SampleDma* unk_14;
|
||||
/* 0x18 */ s16 unk18;
|
||||
/* 0x1A */ char pad1A[6];
|
||||
} UnkStruct_800097A8; /* size = 0x20 */
|
||||
|
||||
typedef struct {
|
||||
/* 0x000 */ s16 adpcmdecState[16];
|
||||
/* 0x020 */ s16 finalResampleState[16];
|
||||
/* 0x040 */ s16 mixEnvelopeState[32];
|
||||
/* 0x080 */ s16 unusedState[16];
|
||||
/* 0x0A0 */ s16 haasEffectDelayState[32];
|
||||
/* 0x0E0 */ s16 combFilterState[128];
|
||||
} NoteSynthesisBuffers; // size = 0x1E0
|
||||
/* 0x040 */ UnkStruct_800097A8 unk_40;
|
||||
/* 0x060 */ char pad[0x20];
|
||||
/* 0x080 */ s16 panSamplesBuffer[0x20];
|
||||
// /* 0x040 */ s16 mixEnvelopeState[32];
|
||||
// /* 0x080 */ s16 unusedState[16];
|
||||
// /* 0x0A0 */ s16 haasEffectDelayState[32];
|
||||
// /* 0x0E0 */ s16 combFilterState[128];
|
||||
} NoteSynthesisBuffers; // size = 0xC0
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ u8 restart;
|
||||
@@ -547,13 +561,19 @@ typedef struct {
|
||||
} bitField0;
|
||||
struct {
|
||||
/* 0x01 */ u8 reverbIndex : 3;
|
||||
/* 0x01 */ u8 bookOffset : 2;
|
||||
/* 0x01 */ u8 bookOffset : 3;
|
||||
// /* 0x01 */ u8 isSyntheticWave : 1;
|
||||
/* 0x01 */ u8 isSyntheticWave : 1;
|
||||
/* 0x01 */ u8 hasTwoParts : 1;
|
||||
/* 0x01 */ u8 useHaasEffect : 1;
|
||||
} bitField1;
|
||||
/* 0x02 */ u8 pad2[0xA];
|
||||
/* 0x0C*/ s16* waveSampleAddr;
|
||||
/* 0x02 */ u8 unk_02;
|
||||
/* 0x03 */ u8 unk_03;
|
||||
/* 0x04 */ u8 unk_04;
|
||||
/* 0x05 */ u8 unk_05;
|
||||
/* 0x06 */ u16 unk_06;
|
||||
/* 0x08 */ u16 unk_08;
|
||||
/* 0x0A */ u16 unk_0A;
|
||||
/* 0x0C */ s16* waveSampleAddr;
|
||||
} NoteSubEu; // size = 0x10
|
||||
|
||||
typedef struct Note {
|
||||
@@ -781,7 +801,7 @@ typedef struct {
|
||||
/* 0x10 */ AudioTableEntry entries[1]; // (dynamic size)
|
||||
} AudioTable; // size >= 0x20
|
||||
|
||||
typedef struct {
|
||||
typedef struct SampleDma {
|
||||
/* 0x00 */ u8* ramAddr;
|
||||
/* 0x04 */ u32 devAddr;
|
||||
/* 0x08 */ u16 sizeUnused;
|
||||
@@ -998,6 +1018,19 @@ typedef struct {
|
||||
((bit10)<<21)|((bit11)<<20)|((bit12)<<19)|((bit13)<<18))
|
||||
|
||||
void func_80008780(f32 *, s32, f32 *);
|
||||
void func_80009A2C(s32 updateIndex, s32 noteIndex);
|
||||
void func_80009AAC(s32 updateIndex);
|
||||
Acmd* func_8000A700(s32 noteIndex, NoteSubEu* noteSub, NoteSynthesisState* synthState, s16* aiBuf, s32 aiBufLen, Acmd* aList, s32 updateIndex);
|
||||
Acmd* func_8000A25C(s16* aiBuf, s32 aiBufLen, Acmd* aList, s32 updateIndex);
|
||||
Acmd* func_800098DC(Acmd* aList, u16 dmem, u16 startPos, s32 size, s32 reverbIndex);
|
||||
Acmd* func_80009984(Acmd* aList, u16 dmem, u16 startPos, s32 size, s32 reverbIndex);
|
||||
Acmd* func_80009B64(Acmd* aList, s32* cmdCount, s16* aiBufStart, s32 aiBufLen);
|
||||
Acmd* func_80009D78(Acmd* aList, s32 aiBufLen, s16 reverbIndex, s16 updateIndex);
|
||||
Acmd* func_8000A128(Acmd* aList, s16 reverbIndex, s16 updateIndex);
|
||||
Acmd* func_8000B3F0(Acmd* aList, NoteSubEu* noteSub, NoteSynthesisState* synthState, s32 numSamplesToLoad);
|
||||
Acmd* func_8000B480(Acmd* aList, NoteSynthesisState* synthState, s32 size, u16 pitch, u16 inpDmem, u32 resampleFlags);
|
||||
Acmd* func_8000B51C(Acmd* aList, NoteSubEu* noteSub, NoteSynthesisState* synthState, s32 aiBufLen, u16 dmemSrc, s32 delaySide, s32 flags);
|
||||
Acmd* func_8000B98C(Acmd* aList, NoteSubEu* noteSub, NoteSynthesisState* synthState, s32 size, s32 flags, s32 delaySide);
|
||||
|
||||
void AudioHeap_ResetLoadStatus(void);
|
||||
void AudioHeap_DiscardFont(s32 fontId);
|
||||
@@ -1039,12 +1072,12 @@ void* AudioLoad_DmaSampleData(u32 devAddr, u32 size, u32 arg2, u8* dmaIndexRef,
|
||||
void AudioLoad_InitSampleDmaBuffers(s32 numNotes);
|
||||
void AudioLoad_InitTable(AudioTable* table, u8* romAddr, u16 unkMediumParam);
|
||||
void* AudioLoad_SyncLoadSeqFonts(s32 seqId, u32* outFontId);
|
||||
void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 arg1);
|
||||
void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 flags);
|
||||
s32 AudioLoad_SyncLoadSample(Sample* sample, s32 fontId);
|
||||
s32 AudioLoad_SyncLoadInstrument(s32 fontId, s32 instId, s32 drumId);
|
||||
void AudioLoad_AsyncLoadSampleBank(s32 sampleBankId, s32 arg1, s32 retData, OSMesgQueue* retQueue);
|
||||
void AudioLoad_AsyncLoadSeq(s32 seqId, s32 arg1, s32 retData, OSMesgQueue* retQueue);
|
||||
void* AudioLoad_GetFontsForSequence(s32 seqId, u32* outNumFonts);
|
||||
void AudioLoad_AsyncLoadSampleBank(s32 sampleBankId, s32 nChunks, s32 retData, OSMesgQueue* retQueue);
|
||||
void AudioLoad_AsyncLoadSeq(s32 seqId, s32 nChunks, s32 retData, OSMesgQueue* retQueue);
|
||||
u8* AudioLoad_GetFontsForSequence(s32 seqId, u32* outNumFonts);
|
||||
void AudioLoad_DiscardSeqFonts(s32 seqId);
|
||||
s32 AudioLoad_DiscardFont(s32 fontId);
|
||||
void AudioLoad_SyncInitSeqPlayer(s32 playerIdx, s32 seqId, s32 arg2);
|
||||
@@ -1116,19 +1149,20 @@ void func_800132E8(void);
|
||||
|
||||
void func_800144E4(SequencePlayer*);
|
||||
void func_800145BC(AudioListItem*, AudioListItem*);
|
||||
void func_8001678C(s32);
|
||||
void func_80016804(s32);
|
||||
void func_800168BC(void);
|
||||
|
||||
|
||||
|
||||
SPTask* func_8001DF50(void);
|
||||
void func_8001E920(void);
|
||||
OSMesg func_8001ECAC(s32 *);
|
||||
void* func_8001ED14(s32 seqId, u32* outNumFonts);
|
||||
SPTask* AudioThread_CreateTask(void);
|
||||
void AudioThread_ScheduleProcessCmds(void);
|
||||
u32 AudioThread_GetAsyncLoadStatus(u32 *);
|
||||
u8* AudioThread_GetFontsForSequence(s32 seqId, u32* outNumFonts);
|
||||
s32 func_8001ED34(void);
|
||||
void func_8001ED8C(OSMesg);
|
||||
void func_8001EE00(void);
|
||||
void func_8001EE3C(void);
|
||||
void AudioThread_ResetAudioHeap(s32);
|
||||
void AudioThread_PreNMIReset(void);
|
||||
void AudioThread_Init(void);
|
||||
|
||||
|
||||
|
||||
@@ -1197,14 +1231,14 @@ extern u16 gSampleBankMedium;
|
||||
|
||||
|
||||
|
||||
extern s8 gThreadCmdWritePos;
|
||||
extern s8 gThreadCmdReadPos;
|
||||
// extern u8 gThreadCmdWritePos;
|
||||
// extern u8 gThreadCmdReadPos;
|
||||
extern OSMesgQueue* gAudioTaskStartQueue;
|
||||
extern OSMesgQueue* gThreadCmdProcQueue;
|
||||
extern OSMesgQueue* gAudioUnkQueue;
|
||||
extern OSMesgQueue* gAudioResetQueue;
|
||||
extern s32 gMaxAbiCmdCnt;
|
||||
extern AudioTask* gWaitingAudioTask;
|
||||
extern SPTask* gWaitingAudioTask;
|
||||
extern s32 D_800C7C70;
|
||||
extern u8 gCurCmdReadPos;
|
||||
extern u8 gThreadCmdQueueFinished;
|
||||
@@ -1344,14 +1378,14 @@ extern volatile s32 gAudioTaskCountQ;
|
||||
extern s32 gCurAudioFrameDmaCount;
|
||||
extern s32 gAudioTaskIndexQ;
|
||||
extern s32 gCurAiBuffIndex;
|
||||
extern void* gAbiCmdBuffs[2];
|
||||
extern Acmd* gCurAiCmdBuffer;
|
||||
extern AudioTask* gAudioCurTask;
|
||||
extern AudioTask gAudioRspTasks[2];
|
||||
extern Acmd* gAbiCmdBuffs[2];
|
||||
extern Acmd* gCurAbiCmdBuffer;
|
||||
extern SPTask* gAudioCurTask;
|
||||
extern SPTask gAudioRspTasks[2];
|
||||
extern f32 gMaxTempoTvTypeFactors;
|
||||
extern s32 gRefreshRate;
|
||||
extern u16* gAiBuffers[3];
|
||||
extern u16 gAiBuffLengths[3];
|
||||
extern s16* gAiBuffers[3];
|
||||
extern s16 gAiBuffLengths[3];
|
||||
extern u32 gAudioRandom;
|
||||
extern UNK_TYPE D_80155D88;
|
||||
extern volatile u32 gResetTimer;
|
||||
|
||||
Reference in New Issue
Block a user