audio_seqplayer.c OK and partial docs (#833)

* Import audio_seqplayer progress from main audio branch

* cleanup

* Better docs

* Small fix

* More

* Cleanup and update

* PR Suggestions

* PR Suggestions

* mute flags
This commit is contained in:
engineer124
2022-07-22 01:21:02 -04:00
committed by GitHub
parent fed7cec4ed
commit 601f44cb7f
13 changed files with 2482 additions and 266 deletions
+8 -34
View File
@@ -3124,8 +3124,8 @@ void AudioLoad_AsyncLoadFont(s32 fontId, s32 arg1, s32 retData, OSMesgQueue* ret
u8* AudioLoad_GetFontsForSequence(s32 seqId, u32* outNumFonts);
void AudioLoad_DiscardSeqFonts(s32 seqId);
void func_8018FA60(u32 tableType, u32 id, s32 arg2, s32 arg3);
s32 AudioLoad_SyncIniPlayer(s32 playerIdx, s32 seqId, s32 arg2);
s32 AudioLoad_SyncInitSetSeqqPlayerSkipTicks(s32 playerIdx, s32 seqId, s32 skipTicks);
s32 AudioLoad_SyncInitSeqPlayer(s32 playerIndex, s32 seqId, s32 arg2);
s32 AudioLoad_SyncInitSeqPlayerSkipTicks(s32 playerIndex, s32 seqId, s32 skipTicks);
void AudioLoad_ProcessLoads(s32 resetStatus);
void AudioLoad_SetDmaHandler(DmaHandler callback);
void AudioLoad_Init(void* heap, u32 heapSize);
@@ -3198,43 +3198,17 @@ void AudioEffects_SequencePlayerProcessSound(SequencePlayer* seqPlayer);
void AudioEffects_NoteVibratoUpdate(Note* note);
void AudioEffects_NoteVibratoInit(Note* note);
void AudioEffects_NotePortamentoInit(Note* note);
void AudioEffects_AdsrInit(AdsrState* adsr, AdsrEnvelope* envelope, s16* volOut);
void AudioEffects_AdsrInit(AdsrState* adsr, EnvelopePoint* envelope, s16* volOut);
f32 AudioEffects_AdsrUpdate(AdsrState* adsr);
// void func_801974D0(void);
// void func_80197538(void);
// void func_80197714(void);
// void func_80197880(void);
// void func_801979D8(void);
// void func_80197A54(void);
void AudioSeq_SequenceChannelDisable(SequenceChannel* channel);
// void func_80197B14(void);
// void func_80197C0C(void);
// void func_80197C8C(void);
void AudioSeq_SequencePlayerDisableAsFinished(SequencePlayer* seqPlayer);
void AudioSeq_SequencePlayerDisable(SequencePlayer* seqPlayer);
void AudioSeq_AudioListPushBack(AudioListItem* list, AudioListItem* item);
void* AudioSeq_AudioListPopBack(AudioListItem* list);
// void func_80197E88(void);
// void func_80197F28(void);
// void func_80197F3C(void);
// void func_80197F74(void);
// void func_80197FB4(void);
// void func_801980D0(void);
// void func_8019815C(void);
// void func_8019825C(void);
// void func_80198640(void);
// void func_80198CE0(void);
// void func_801990F4(void);
// void func_80199124(void);
// void func_80199198(void);
// void func_80199244(void);
void func_80199268(s32* param_1);
// void func_8019A0BC(void);
// void func_8019AA3C(void);
// void func_8019AAF0(void);
void AudioSeq_ProcessSequences(s32 arg0);
void AudioSeq_SkipForwardSequence(SequencePlayer* seqPlayer);
void AudioSeq_ResetSequencePlayer(SequencePlayer* seqPlayer);
void AudioSeq_InitSequencePlayerChannels(s32 playerIdx);
// void func_8019ACEC(void);
void AudioSeq_InitSequencePlayerChannels(s32 playerIndex);
void AudioSeq_InitSequencePlayers(void);
void func_8019AE40(s32 param_1, s32 param_2, u32 param_3, s32 param_4);
void func_8019AEC0(UNK_PTR param_1, UNK_PTR param_2);
@@ -3356,7 +3330,7 @@ void func_801A1DB8(Vec3f* vec, u8 seqId, f32 arg2);
// void func_801A1E0C(void);
void func_801A1F00(u8 arg0, u16 seqId);
void func_801A1F88(void);
void func_801A1FB4(u8 playerIdx, Vec3f* pos, u16 seqId, f32 maxDist);
void func_801A1FB4(u8 playerIndex, Vec3f* pos, u16 seqId, f32 maxDist);
// void func_801A2090(void);
void func_801A246C(u8 param_1, u8 param_2);
// void func_801A2544(void);
@@ -3474,7 +3448,7 @@ void Audio_QueueSeqCmd(u32 cmd);
// void func_801A89D0(void);
s32 func_801A8A50(s32 param1);
// void func_801A8ABC(void);
void Audio_SetVolumeScale(u8 playerIdx, u8 scaleIdx, u8 targetVol, u8 volFadeTimer);
void Audio_SetVolumeScale(u8 playerIndex, u8 scaleIndex, u8 targetVol, u8 volFadeTimer);
// void func_801A8D5C(void);
// void func_801A8E90(void);
// void func_801A9768(void);
+5 -9
View File
@@ -1554,16 +1554,12 @@ extern s16 gHighPassFilterData[];
extern s16 gBandStopFilterData[];
extern s16 gBandPassFilterData[];
extern s16* gWaveSamples[9];
extern UNK_PTR D_801D4D98;
extern UNK_PTR D_801D4DB0;
extern f32 gBendPitchOneOctaveFrequencies[256];
// extern UNK_TYPE1 D_801D4FB4;
// extern UNK_TYPE4 gBendPitchTwoSemitonesFrequencies;
// extern UNK_TYPE4 D_801D53B4;
// extern UNK_TYPE1 gPitchFrequencies;
// extern UNK_TYPE1 gDefaultShortNoteVelocityTable;
// extern UNK_TYPE1 gDefaultShortNoteGateTimeTable;
// extern UNK_TYPE1 gDefaultEnvelope;
extern f32 gBendPitchTwoSemitonesFrequencies[];
extern f32 gPitchFrequencies[];
extern u8 gDefaultShortNoteVelocityTable[];
extern u8 gDefaultShortNoteGateTimeTable[];
extern EnvelopePoint gDefaultEnvelope[];
extern NoteSubEu gZeroNoteSub;
extern NoteSubEu gDefaultNoteSub;
extern u16 gHeadsetPanQuantization[];
+39 -32
View File
@@ -8,9 +8,16 @@
#define TATUMS_PER_BEAT 48
#define IS_SEQUENCE_CHANNEL_VALID(ptr) ((uintptr_t)(ptr) != (uintptr_t)&gAudioContext.sequenceChannelNone)
#define SEQ_NUM_CHANNELS 16
#define MAX_CHANNELS_PER_BANK 3
#define MUTE_FLAGS_3 (1 << 3) // prevent further noteSubEus from playing
#define MUTE_FLAGS_4 (1 << 4) // stop something in seqLayer scripts
#define MUTE_FLAGS_SOFTEN (1 << 5) // lower volume, by default to half
#define MUTE_FLAGS_STOP_NOTES (1 << 6) // prevent further notes from playing
#define MUTE_FLAGS_STOP_SCRIPT (1 << 7) // stop processing sequence/channel scripts
#define AUDIO_LERPIMP(v0, v1, t) (v0 + ((v1 - v0) * t))
#define ADSR_DISABLE 0
@@ -86,12 +93,12 @@ typedef enum {
} AudioCacheType;
typedef enum {
/* 0 */ LOAD_STATUS_0,
/* 1 */ LOAD_STATUS_1,
/* 2 */ LOAD_STATUS_2, // Samples/Seqplayer
/* 3 */ LOAD_STATUS_3, // Sequences
/* 4 */ LOAD_STATUS_4, // SoundFonts
/* 5 */ LOAD_STATUS_5 // Permanent
/* 0 */ LOAD_STATUS_NOT_LOADED,
/* 1 */ LOAD_STATUS_IN_PROGRESS,
/* 2 */ LOAD_STATUS_COMPLETE,
/* 3 */ LOAD_STATUS_DISCARDABLE,
/* 4 */ LOAD_STATUS_MAYBE_DISCARDABLE,
/* 5 */ LOAD_STATUS_PERMANENT
} AudioLoadStatus;
typedef s32 (*DmaHandler)(OSPiHandle* handle, OSIoMesg* mb, s32 direction);
@@ -139,7 +146,7 @@ typedef struct {
typedef struct {
/* 0x0 */ s16 delay;
/* 0x2 */ s16 arg;
} AdsrEnvelope; // size = 0x4
} EnvelopePoint; // size = 0x4
typedef struct {
/* 0x00 */ u32 start;
@@ -231,19 +238,19 @@ typedef struct {
/* 0x00 */ u8 loaded;
/* 0x01 */ u8 normalRangeLo;
/* 0x02 */ u8 normalRangeHi;
/* 0x03 */ u8 releaseRate;
/* 0x04 */ AdsrEnvelope* envelope;
/* 0x03 */ u8 adsrDecayIndex; // index used to obtain adsr decay rate from adsrDecayTable
/* 0x04 */ EnvelopePoint* envelope;
/* 0x08 */ SoundFontSound lowNotesSound;
/* 0x10 */ SoundFontSound normalNotesSound;
/* 0x18 */ SoundFontSound highNotesSound;
} Instrument; // size = 0x20
typedef struct {
/* 0x00 */ u8 releaseRate;
/* 0x00 */ u8 adsrDecayIndex; // index used to obtain adsr decay rate from adsrDecayTable
/* 0x01 */ u8 pan;
/* 0x02 */ u8 loaded;
/* 0x04 */ SoundFontSound sound;
/* 0x14 */ AdsrEnvelope* envelope;
/* 0x14 */ EnvelopePoint* envelope;
} Drum; // size = 0x18
typedef struct {
@@ -277,11 +284,11 @@ typedef struct {
/* 0x000 */ u8 applyBend : 1;
/* 0x001 */ u8 state;
/* 0x002 */ u8 noteAllocPolicy;
/* 0x003 */ u8 muteBehavior;
/* 0x003 */ u8 muteFlags;
/* 0x004 */ u8 seqId;
/* 0x005 */ u8 defaultFont;
/* 0x006 */ u8 unk_06[1];
/* 0x007 */ s8 playerIdx;
/* 0x007 */ s8 playerIndex;
/* 0x008 */ u16 tempo; // tatums per minute
/* 0x00A */ u16 tempoAcc;
/* 0x00C */ s16 unk_0C;
@@ -289,7 +296,7 @@ typedef struct {
/* 0x010 */ u16 delay;
/* 0x012 */ u16 fadeTimer;
/* 0x014 */ u16 fadeTimerUnkEu;
/* 0x016 */ u16 unk_16; // New to MM
/* 0x016 */ u16 unk_16;
union {
/* 0x018 */ u8* seqData;
/* 0x018 */ u16* seqData16;
@@ -313,9 +320,9 @@ typedef struct {
} SequencePlayer; // size = 0x160
typedef struct {
/* 0x0 */ u8 releaseRate;
/* 0x0 */ u8 decayIndex; // index used to obtain adsr decay rate from adsrDecayTable
/* 0x1 */ u8 sustain;
/* 0x4 */ AdsrEnvelope* envelope;
/* 0x4 */ EnvelopePoint* envelope;
} AdsrSettings; // size = 0x8
typedef struct {
@@ -337,7 +344,7 @@ typedef struct {
/* 0x10 */ f32 current;
/* 0x14 */ f32 target;
/* 0x18 */ char unk_18[4];
/* 0x1C */ AdsrEnvelope* envelope;
/* 0x1C */ EnvelopePoint* envelope;
} AdsrState; // size = 0x20
typedef struct {
@@ -356,7 +363,7 @@ typedef union {
typedef struct {
/* 0x00 */ u8 reverb;
/* 0x01 */ u8 unk_1;
/* 0x01 */ u8 gain; // Increases volume by a multiplicative scaling factor. Represented as a UQ4.4 number
/* 0x02 */ u8 pan;
/* 0x03 */ u8 unk_3; // Possibly part of stereo?
/* 0x04 */ Stereo stereo;
@@ -397,7 +404,7 @@ typedef struct SequenceChannel {
/* 0x01 */ u8 asByte;
} changes;
/* 0x02 */ u8 noteAllocPolicy;
/* 0x03 */ u8 muteBehavior;
/* 0x03 */ u8 muteFlags;
/* 0x04 */ u8 reverb; // or dry/wet mix
/* 0x05 */ u8 notePriority; // 0-3
/* 0x06 */ u8 someOtherPriority;
@@ -406,12 +413,12 @@ typedef struct SequenceChannel {
/* 0x09 */ u8 bookOffset;
/* 0x0A */ u8 newPan;
/* 0x0B */ u8 panChannelWeight; // proportion of pan that comes from the channel (0..128)
/* 0x0C */ u8 unk_0C;
/* 0x0C */ u8 gain; // Increases volume by a multiplicative scaling factor. Represented as a UQ4.4 number
/* 0x0D */ u8 velocityRandomVariance;
/* 0x0E */ u8 gateTimeRandomVariance;
/* 0x0F */ u8 unk_0F;
/* 0x10 */ u8 unk_10; // New to MM
/* 0x11 */ u8 unk_11; // New to MM
/* 0x10 */ u8 unk_10;
/* 0x11 */ u8 unk_11;
/* 0x12 */ VibratoSubStruct vibrato;
/* 0x20 */ u16 delay;
/* 0x22 */ u16 unk_20;
@@ -434,11 +441,11 @@ typedef struct SequenceChannel {
/* 0x80 */ AdsrSettings adsr;
/* 0x88 */ NotePool notePool;
/* 0xC8 */ s8 soundScriptIO[8]; // bridge between sound script and audio lib, "io ports"
/* 0xD0 */ u8* unk_D0; // New to MM
/* 0xD0 */ u8* sfxState;
/* 0xD4 */ s16* filter;
/* 0xD8 */ Stereo stereo;
/* 0xDC */ s32 unk_DC; // New to MM
/* 0xE0 */ s32 unk_E0; // New to MM
/* 0xDC */ s32 unk_DC;
/* 0xE0 */ s32 unk_E0;
} SequenceChannel; // size = 0xE4
// Might also be known as a Track, according to sm64 debug strings (?).
@@ -531,7 +538,7 @@ typedef struct {
/* 0x04 */ u8 reverbVol;
/* 0x05 */ u8 numParts;
/* 0x06 */ u16 samplePosFrac;
/* 0x08 */ u16 unk_08; // New to MM
/* 0x08 */ u16 unk_08;
/* 0x0C */ s32 samplePosInt;
/* 0x10 */ NoteSynthesisBuffers* synthesisBuffers;
/* 0x14 */ s16 curVolLeft;
@@ -596,7 +603,7 @@ typedef struct {
/* 0x01 */ u8 hasTwoParts : 1;
/* 0x01 */ u8 usesHeadsetPanEffects2 : 1;
} bitField1;
/* 0x02 */ u8 unk_2;
/* 0x02 */ u8 gain; // Increases volume by a multiplicative scaling factor. Represented as a UQ4.4 number
/* 0x03 */ u8 headsetPanRight;
/* 0x04 */ u8 headsetPanLeft;
/* 0x05 */ u8 reverbVol;
@@ -611,8 +618,8 @@ typedef struct {
/* 0x10 */ s16* samples; // used for synthetic waves
} sound;
/* 0x14 */ s16* filter;
/* 0x18 */ u8 unk_18; // New to MM
/* 0x19 */ u8 unk_19; // New to MM
/* 0x18 */ u8 unk_18;
/* 0x19 */ u8 unk_19;
/* 0x1A */ UNK_TYPE1 pad_1A[0x6];
} NoteSubEu; // size = 0x20
@@ -965,7 +972,7 @@ typedef struct {
/* 0x4448 */ volatile u8 resetStatus;
/* 0x4449 */ u8 audioResetSpecIdToLoad;
/* 0x444C */ s32 audioResetFadeOutFramesLeft;
/* 0x4450 */ f32* unk_3520; // fadeOutVelocities for ADSR
/* 0x4450 */ f32* adsrDecayTable; // A table on the audio heap that stores decay rates used for ADSR
/* 0x4454 */ u8* audioHeap;
/* 0x4458 */ size_t audioHeapSize;
/* 0x445C */ Note* notes;
@@ -994,7 +1001,7 @@ typedef struct {
typedef struct {
/* 0x00 */ u8 reverbVol;
/* 0x01 */ u8 unk_1;
/* 0x01 */ u8 gain; // Increases volume by a multiplicative scaling factor. Represented as a UQ4.4 number
/* 0x02 */ u8 pan;
/* 0x03 */ u8 unk_3;
/* 0x04 */ Stereo stereo;
@@ -1050,7 +1057,7 @@ typedef struct {
/* 0x218 */ u8 unk_4C;
/* 0x219 */ u8 unk_4D;
/* 0x21A */ u8 unk_4E;
/* 0x21B */ u8 unk_21B; // New to MM
/* 0x21B */ u8 unk_21B;
} unk_D_8016E750; // size = 0x21C
typedef struct {