all functions named

This commit is contained in:
z64a 2025-05-24 00:19:58 -04:00
parent b38ba22a90
commit c9eee0142f
12 changed files with 220 additions and 208 deletions

View File

@ -62,7 +62,9 @@ typedef u8* WaveData;
#define AU_MAX_VOLUME_16 0x7FFF #define AU_MAX_VOLUME_16 0x7FFF
#define AU_MAX_VOLUME_32 0x7FFFFFFF #define AU_MAX_VOLUME_32 0x7FFFFFFF
#define AU_PAN_MIN 0
#define AU_PAN_MID 64 #define AU_PAN_MID 64
#define AU_PAN_MAX 127
// only valid for vol != 0 // only valid for vol != 0
#define AU_VOL_8_TO_16(vol) (((vol) << 8) | 0xFF) #define AU_VOL_8_TO_16(vol) (((vol) << 8) | 0xFF)
@ -144,18 +146,18 @@ typedef enum MusicState {
MUSIC_STATE_PLAY_NEXT = 5, MUSIC_STATE_PLAY_NEXT = 5,
} MusicState; } MusicState;
enum MusicFlags { typedef enum MusicFlags {
MUSIC_FLAG_PLAYING = 0x01, MUSIC_FLAG_PLAYING = 0x01,
MUSIC_FLAG_ENABLE_PROX_MIX = 0x02, MUSIC_FLAG_ENABLE_PROX_MIX = 0x02,
MUSIC_FLAG_PUSHING = 0x04, MUSIC_FLAG_PUSHING = 0x04,
MUSIC_FLAG_POPPING = 0x08, MUSIC_FLAG_POPPING = 0x08,
MUSIC_FLAG_IGNORE_POP = 0x10, MUSIC_FLAG_IGNORE_POP = 0x10,
MUSIC_FLAG_FADE_IN_NEXT = 0x20, MUSIC_FLAG_FADE_IN_NEXT = 0x20,
}; } MusicFlags;
enum MusicFades { typedef enum BGMSnapshots {
MUSIC_CROSS_FADE = 0, BGM_SNAPSHOT_0 = 0,
}; } BGMSnapshots;
typedef enum BGMPlayerState { typedef enum BGMPlayerState {
BGM_PLAY_STATE_IDLE = 0, BGM_PLAY_STATE_IDLE = 0,
@ -197,6 +199,12 @@ typedef enum DelayChannel {
AU_DELAY_CHANNEL_RIGHT = 2, AU_DELAY_CHANNEL_RIGHT = 2,
} DelayChannel; } DelayChannel;
typedef enum DelayState {
AU_DELAY_STATE_ON = 0, /// channel delay is enabled (though not necessarily applied)
AU_DELAY_STATE_OFF = 1, /// channel delay is disabled
AU_DELAY_STATE_REQUEST_OFF = 2, /// game thread has scheduled the channel delay to be disabled
} DelayState;
typedef enum EnvelopeCommand { typedef enum EnvelopeCommand {
ENV_CMD_END_LOOP = 0xFB, ENV_CMD_END_LOOP = 0xFB,
ENV_CMD_START_LOOP = 0xFC, ENV_CMD_START_LOOP = 0xFC,
@ -445,7 +453,7 @@ typedef union SeqArgs {
u8 type; u8 type;
u8 arg1; u8 arg1;
u8 arg2; u8 arg2;
} UnkCmdFF; } Special;
} SeqArgs; } SeqArgs;
/// Structure for volume fading for SFX and BGM. Has independent controls for base and envelope volumes. /// Structure for volume fading for SFX and BGM. Has independent controls for base and envelope volumes.
@ -965,11 +973,11 @@ typedef struct AuEffectChange {
/* 0x2 */ char unk_02[2]; /* 0x2 */ char unk_02[2];
} AuEffectChange; } AuEffectChange;
typedef struct SndGlobalsSub6C { typedef struct BGMPlayerSnapshot {
/* 0x00 */ struct BGMPlayer* bgmPlayer; /* 0x00 */ struct BGMPlayer* bgmPlayer;
/* 0x04 */ u8 assigned; /* 0x04 */ u8 assigned;
/* 0x05 */ u8 priority; /* 0x05 */ u8 priority;
} SndGlobalsSub6C; } BGMPlayerSnapshot;
// found at 801D57A0 // found at 801D57A0
typedef struct AuGlobals { typedef struct AuGlobals {
@ -995,14 +1003,14 @@ typedef struct AuGlobals {
/* 0x0058 */ BGMInstrumentInfo* dataPRG; /* 0x0058 */ BGMInstrumentInfo* dataPRG;
/* 0x005C */ struct BGMHeader* dataBGM[2]; /* 0x005C */ struct BGMHeader* dataBGM[2];
/* 0x0064 */ struct MSEQHeader* dataMSEQ[2]; /* 0x0064 */ struct MSEQHeader* dataMSEQ[2];
/* 0x006C */ SndGlobalsSub6C unk_globals_6C[1]; /* 0x006C */ BGMPlayerSnapshot snapshots[1];
/* 0x0074 */ struct BGMPlayer* unk_74; /* 0x0074 */ struct BGMPlayer* resumeCopyTo;
/* 0x0078 */ struct BGMPlayer* unk_78; /* 0x0078 */ struct BGMPlayer* resumeCopyFrom;
/* 0x007C */ s32 unkSongName; /* 0x007C */ s32 resumeSongName;
/* 0x0080 */ s32 unk_80; /* 0x0080 */ b32 resumeRequested;
/* 0x0084 */ s32 unkFadeTime; /* 0x0084 */ s32 resumeFadeTime;
/* 0x0088 */ s32 unkFadeStart; /* 0x0088 */ s32 resumeFadeStart;
/* 0x008C */ s32 unkFadeEnd; /* 0x008C */ s32 resumeFadeEnd;
/* 0x0090 */ MusicEventTrigger* musicEventQueuePos; /* 0x0090 */ MusicEventTrigger* musicEventQueuePos;
/* 0x0094 */ MusicEventTrigger* musicEventQueue; /* 0x0094 */ MusicEventTrigger* musicEventQueue;
/* 0x0098 */ u32 musicEventQueueCount; /* 0x0098 */ u32 musicEventQueueCount;
@ -1017,7 +1025,7 @@ typedef struct AuGlobals {
/* 0x0DEC */ InstrumentBank bankSet5[16]; /* 0x0DEC */ InstrumentBank bankSet5[16];
/* 0x11EC */ InstrumentBank bankSet6[4]; /* 0x11EC */ InstrumentBank bankSet6[4];
/* 0x12EC */ InstrumentBank* bankSets[8]; /* 0x12EC */ InstrumentBank* bankSets[8];
/* 0x130C */ u8 unk_130C; /* 0x130C */ u8 channelDelayState;
/* 0x130D */ char unk_130D[3]; /* 0x130D */ char unk_130D[3];
/* 0x1310 */ BKFileBuffer* auxBanks[3]; /* 0x1310 */ BKFileBuffer* auxBanks[3];
/* 0x131C */ char unk_131C[4]; /* 0x131C */ char unk_131C[4];
@ -1033,12 +1041,12 @@ typedef struct BGMPlayerTrack {
/* 0x18 */ s8_24 subTrackVolume; /* 0x18 */ s8_24 subTrackVolume;
/* 0x1C */ s16_16 subTrackVolumeStep; /* 0x1C */ s16_16 subTrackVolumeStep;
/* 0x20 */ s16_16 subTrackVolumeTarget; /* 0x20 */ s16_16 subTrackVolumeTarget;
/* 0x24 */ s32 subTrackVolumeTime; /* 0x24 */ s32 subTrackVolumeTicks;
/* 0x28 */ s32 delayTime; /* 0x28 */ s32 delayTime;
/* 0x2C */ s16_16 proxVolume; /* 0x2C */ s16_16 proxVolume;
/* 0x30 */ s16_16 proxVolumeStep; /* 0x30 */ s16_16 proxVolumeStep;
/* 0x34 */ s16 proxVolumeTarget; /* 0x34 */ s16 proxVolumeTarget;
/* 0x36 */ s16 proxVolumeTime; /* 0x36 */ s16 proxVolumeTicks;
/* 0x38 */ s16 segTrackTune; /* 0x38 */ s16 segTrackTune;
/* 0x3A */ s16 tremoloDelay; /* 0x3A */ s16 tremoloDelay;
/* 0x3C */ char unk_3C[0x2]; /* 0x3C */ char unk_3C[0x2];
@ -1093,7 +1101,7 @@ typedef struct BGMPlayer {
/* 0x014 */ s32 updateCounter; /* 0x014 */ s32 updateCounter;
/* 0x018 */ s32 songPlayingCounter; /* 0x018 */ s32 songPlayingCounter;
/* 0x01C */ s32 songName; /* 0x01C */ s32 songName;
/* 0x020 */ s32 fadeSongName; /* 0x020 */ s32 pushSongName;
/* 0x024 */ s32 bgmFileIndex; /* 0x024 */ s32 bgmFileIndex;
/* 0x028 */ s32 songID; /* 0x028 */ s32 songID;
/* 0x02C */ Fade fadeInfo; /* 0x02C */ Fade fadeInfo;
@ -1101,27 +1109,27 @@ typedef struct BGMPlayer {
/* 0x04C */ u8 effectIndices[4]; /* 0x04C */ u8 effectIndices[4];
/* 0x050 */ s32 randomValue1; /* 0x050 */ s32 randomValue1;
/* 0x054 */ s32 randomValue2; /* 0x054 */ s32 randomValue2;
/* 0x058 */ u16 unk_58; /* 0x058 */ u16 unk_58; // related to legacy command system, unused
/* 0x05A */ s16 unk_5A; /* 0x05A */ u16 unk_5A; // related to legacy command system, unused
/* 0x05C */ s16 prevUpdateResult; // unused, may indicate error status /* 0x05C */ s16 prevUpdateResult; // unused, may indicate error status
/* 0x05E */ char pad5E[2]; /* 0x05E */ char pad_5E[2];
/* 0x060 */ s32 curVariation; /* 0x060 */ s32 curVariation;
/* 0x064 */ struct BGMHeader* bgmFile; /* 0x064 */ struct BGMHeader* bgmFile;
/* 0x068 */ SegData* compReadPos; /* 0x068 */ SegData* compReadPos;
/* 0x06C */ SegData* compStartPos; /* 0x06C */ SegData* compStartPos;
/* 0x070 */ SegData* phraseStartPos; /* 0x070 */ SegData* phraseStartPos;
/* 0x074 */ s32 unk_74; /* 0x074 */ u8* tickRatePtr; // related to legacy command system, unused
/* 0x078 */ BGMDrumInfo* drumsInfo; /* 0x078 */ BGMDrumInfo* drumsInfo;
/* 0x07C */ BGMInstrumentInfo* instrumentsInfo; /* 0x07C */ BGMInstrumentInfo* instrumentsInfo;
/* 0x080 */ BGMDrumInfo* drums[12]; /* 0x080 */ BGMDrumInfo* drums[12];
/* 0x0B0 */ s32 masterTempo; /* 0x0B0 */ s32 masterTempo;
/* 0x0B4 */ s32 masterTempoStep; /* 0x0B4 */ s32 masterTempoStep;
/* 0x0B8 */ s32 masterTempoTarget; /* 0x0B8 */ s32 masterTempoTarget;
/* 0x0BC */ s32 masterTempoTime; /* 0x0BC */ s32 masterTempoTicks;
/* 0x0C0 */ s8_24 masterVolume; /* 0x0C0 */ s8_24 masterVolume;
/* 0x0C4 */ s32 masterVolumeStep; /* 0x0C4 */ s32 masterVolumeStep;
/* 0x0C8 */ s32 masterVolumeTarget; /* 0x0C8 */ s32 masterVolumeTarget;
/* 0x0CC */ s32 masterVolumeTime; /* 0x0CC */ s32 masterVolumeTicks;
/* 0x0D0 */ f32 playbackRate; /* 0x0D0 */ f32 playbackRate;
/* 0x0D4 */ SeqArgs seqCmdArgs; /* 0x0D4 */ SeqArgs seqCmdArgs;
/* 0x0D8 */ SegData* compLoopStartLabels[32]; /* 0x0D8 */ SegData* compLoopStartLabels[32];
@ -1130,7 +1138,7 @@ typedef struct BGMPlayer {
/* 0x16C */ s32 proxMixValue; /* 0x16C */ s32 proxMixValue;
/* 0x170 */ u8 proxMixID; /* 0x170 */ u8 proxMixID;
/* 0x171 */ u8 proxMixVolume; /* 0x171 */ u8 proxMixVolume;
/* 0x172 */ char unk_172[0x2]; /* 0x172 */ char pad_172[2];
/* 0x174 */ s16 customPressEnvelopes[8][9]; /// Dynamically customizable press envelopes /* 0x174 */ s16 customPressEnvelopes[8][9]; /// Dynamically customizable press envelopes
/* 0x204 */ u8* trackVolsConfig; /* 0x204 */ u8* trackVolsConfig;
/* 0x208 */ u16 masterTempoBPM; /* 0x208 */ u16 masterTempoBPM;
@ -1145,19 +1153,19 @@ typedef struct BGMPlayer {
/* 0x21C */ u8 bgmDrumCount; /* 0x21C */ u8 bgmDrumCount;
/* 0x21D */ u8 bgmInstrumentCount; /* 0x21D */ u8 bgmInstrumentCount;
/* 0x21E */ u8 unk_21E; /* 0x21E */ u8 unk_21E;
/* 0x21F */ char unk_21F[0x1]; /* 0x21F */ char pad_21F[1];
/* 0x220 */ u8 paused; /* 0x220 */ u8 paused;
/* 0x221 */ u8 masterState; /* 0x221 */ u8 masterState;
/* 0x222 */ u8 unk_222; /* 0x222 */ u8 unk_222;
/* 0x223 */ u8 unk_223; /* 0x223 */ u8 unk_223;
/* 0x224 */ u8 effectValues[4]; /* 0x224 */ u8 effectValues[4];
/* 0x227 */ char unk_228[0x2]; /* 0x227 */ char pad_228[2];
/* 0x22A */ u8 unk_22A[8]; /* 0x22A */ u8 unk_22A[8];
/* 0x232 */ u8 bFadeConfigSetsVolume; /* 0x232 */ u8 bFadeConfigSetsVolume;
/* 0x233 */ u8 initLinkMute; /// Used to mute any linked tracks after the first one encountered. /* 0x233 */ u8 initLinkMute; /// Used to mute any linked tracks after the first one encountered.
/* 0x234 */ u8 priority; /* 0x234 */ u8 priority;
/* 0x235 */ u8 busID; /* 0x235 */ u8 busID;
/* 0x236 */ char unk_236[0x2]; /* 0x236 */ char pad_236[2];
/* 0x238 */ s32 cmdBufData[8]; /// Buffer for an unused (legacy) system for controlling the BGMPlayer from the main thread /* 0x238 */ s32 cmdBufData[8]; /// Buffer for an unused (legacy) system for controlling the BGMPlayer from the main thread
/* 0x258 */ u8 cmdBufPending; /* 0x258 */ u8 cmdBufPending;
/* 0x259 */ u8 cmdBufReadPos; /* 0x259 */ u8 cmdBufReadPos;
@ -1196,7 +1204,7 @@ typedef struct SongUpdateRequestC {
/* 0x08 */ s32 startVolume; /* 0x08 */ s32 startVolume;
/* 0x0C */ s32 finalVolume; /* 0x0C */ s32 finalVolume;
/* 0x10 */ s32 index; /* 0x10 */ s32 index;
/* 0x14 */ s32 pauseMode; /* 0x14 */ s32 pauseMode; /// if true, the player is paused, else it will be saved to a snapshot
/* 0x18 */ char pad_18[8]; /* 0x18 */ char pad_18[8];
} SongUpdateRequestC; // size = 0x1C or 0x20 } SongUpdateRequestC; // size = 0x1C or 0x20

View File

@ -99,7 +99,7 @@ void bgm_update_music_control(void) {
music->state = stateFadeOut; music->state = stateFadeOut;
} }
} else { } else {
if (snd_song_UNK_push_stop(music->songName) == AU_RESULT_OK) { if (snd_song_push_stop(music->songName) == AU_RESULT_OK) {
music->state = stateFadeOut; music->state = stateFadeOut;
} }
} }
@ -108,7 +108,7 @@ void bgm_update_music_control(void) {
music->state = stateFadeOut; music->state = stateFadeOut;
} }
} else { } else {
if (snd_song_UNK_request_push_fade_out(music->songName, 250) == AU_RESULT_OK) { if (snd_song_request_push_fade_out(music->songName, 250) == AU_RESULT_OK) {
music->state = stateFadeOut; music->state = stateFadeOut;
} }
} }
@ -170,7 +170,7 @@ void bgm_update_music_control(void) {
if (music->flags & MUSIC_FLAG_IGNORE_POP) { if (music->flags & MUSIC_FLAG_IGNORE_POP) {
music->state = MUSIC_STATE_IDLE; music->state = MUSIC_STATE_IDLE;
music->flags &= ~(MUSIC_FLAG_IGNORE_POP | MUSIC_FLAG_POPPING); music->flags &= ~(MUSIC_FLAG_IGNORE_POP | MUSIC_FLAG_POPPING);
} else if (snd_song_UNK_request_pop(music->savedSongName) == AU_RESULT_OK) { } else if (snd_song_request_pop(music->savedSongName) == AU_RESULT_OK) {
music->requestedSongID = music->savedSongID; music->requestedSongID = music->savedSongID;
music->variation = music->savedVariation; music->variation = music->savedVariation;
music->songName = music->savedSongName; music->songName = music->savedSongName;
@ -210,7 +210,7 @@ s32 _bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s
bgm_set_target_volume(volume); bgm_set_target_volume(volume);
if (music->flags & MUSIC_FLAG_PUSHING) { if (music->flags & MUSIC_FLAG_PUSHING) {
func_80055B80(music->songName); snd_song_request_snapshot(music->songName);
music->flags &= ~MUSIC_FLAG_PUSHING; music->flags &= ~MUSIC_FLAG_PUSHING;
} }

View File

@ -76,7 +76,7 @@ void au_bgm_begin_video_frame(BGMPlayer* player) {
} }
player->bgmFile = bgmFile; player->bgmFile = bgmFile;
bgmData = &bgmFile->info; bgmData = &bgmFile->info;
au_bgm_set_tick_resolution(player, BGM_SAMPLE_RATE, BgmTicksRates[((u8*)player->unk_74)[0] & 7]); //TODO revise unk_74 typing au_bgm_set_tick_resolution(player, BGM_SAMPLE_RATE, BgmTicksRates[*(player->tickRatePtr) & 7]);
compOffset = bgmData->compositions[compID]; compOffset = bgmData->compositions[compID];
if (compOffset == 0) { if (compOffset == 0) {
@ -109,7 +109,7 @@ void au_bgm_begin_video_frame(BGMPlayer* player) {
player->bgmInstrumentCount = 0; player->bgmInstrumentCount = 0;
} }
} else { } else {
if (player->unk_58) { if (player->unk_58 != 0) {
player->masterState = BGM_PLAY_STATE_STOP; player->masterState = BGM_PLAY_STATE_STOP;
player->nextUpdateCounter = 1; player->nextUpdateCounter = 1;
player->nextUpdateStep = 1; player->nextUpdateStep = 1;
@ -304,7 +304,7 @@ AuResult au_bgm_process_fade_out(SongUpdateRequestB* request) {
player->fadeInfo.baseStep = ((volume << 0x10) - player->fadeInfo.baseVolume) / player->fadeInfo.baseTicks; player->fadeInfo.baseStep = ((volume << 0x10) - player->fadeInfo.baseVolume) / player->fadeInfo.baseTicks;
player->fadeInfo.onCompleteCallback = request->callback; player->fadeInfo.onCompleteCallback = request->callback;
if (request->onPush == 1) { if (request->onPush == 1) {
player->fadeSongName = songName; player->pushSongName = songName;
} }
} }
} }
@ -321,25 +321,25 @@ AuResult au_bgm_process_fade_out(SongUpdateRequestB* request) {
return status; return status;
} }
AuResult func_8004DC80(s32 songName) { AuResult au_bgm_complete_push(s32 songName) {
SongUpdateRequestC s; SongUpdateRequestC s;
s.songName = songName; s.songName = songName;
s.duration = 0; s.duration = 0;
s.startVolume = 0; s.startVolume = 0;
s.finalVolume = 0; s.finalVolume = 0;
s.index = MUSIC_CROSS_FADE; s.index = BGM_SNAPSHOT_0;
s.pauseMode = FALSE; s.pauseMode = FALSE;
return au_bgm_process_suspend(&s, 0); return au_bgm_process_suspend(&s, 0); // force stop
} }
AuResult au_bgm_process_suspend(SongUpdateRequestC* request, s32 clearChanged) { AuResult au_bgm_process_suspend(SongUpdateRequestC* request, b32 skipStop) {
AuResult status; AuResult status;
BGMPlayer* playerA; BGMPlayer* player;
BGMPlayer* playerB; BGMPlayer* snapshot;
s32 songName; s32 songName;
s32 index; //TODO s32 index;
u32 i; u32 i;
u32 j; u32 j;
@ -348,15 +348,15 @@ AuResult au_bgm_process_suspend(SongUpdateRequestC* request, s32 clearChanged) {
status = AU_RESULT_OK; status = AU_RESULT_OK;
if (songName != 0) { if (songName != 0) {
playerA = au_bgm_get_player_with_song_name(songName); player = au_bgm_get_player_with_song_name(songName);
if (playerA != NULL) { if (player != NULL) {
if (!request->pauseMode) { if (!request->pauseMode) {
playerB = au_unk_get_temp_player_for_index(index); snapshot = au_get_snapshot_by_index(index);
if (playerB != NULL) { if (snapshot != NULL) {
if (songName == playerA->songName) { if (songName == player->songName) {
if (!clearChanged) { if (!skipStop) {
for (i = 0; i < ARRAY_COUNT(playerA->tracks); i++) { for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
BGMPlayerTrack* track = &playerA->tracks[i]; BGMPlayerTrack* track = &player->tracks[i];
if (track->bgmReadPos != NULL) { if (track->bgmReadPos != NULL) {
for (j = track->firstVoice; j < track->lastVoice; j++) { for (j = track->firstVoice; j < track->lastVoice; j++) {
track->changed.all = 0; track->changed.all = 0;
@ -364,22 +364,22 @@ AuResult au_bgm_process_suspend(SongUpdateRequestC* request, s32 clearChanged) {
} }
} }
} }
playerA->globals->unk_globals_6C[index].priority = playerA->priority; player->globals->snapshots[index].priority = player->priority;
playerA->globals->unk_globals_6C[index].assigned = 1; player->globals->snapshots[index].assigned = 1;
playerA->fadeSongName = 0; player->pushSongName = 0;
au_copy_words(playerA, playerB, sizeof(*playerA)); au_copy_words(player, snapshot, sizeof(*player));
if (clearChanged == 0) { if (!skipStop) {
au_bgm_stop_player(playerA); au_bgm_stop_player(player);
} }
} }
} else { } else {
status = AU_ERROR_INVALID_SONG_DURATION; status = AU_ERROR_INVALID_SONG_DURATION;
} }
} else { } else {
if (songName == playerA->songName) { if (songName == player->songName) {
if (playerA->masterState != BGM_PLAY_STATE_IDLE) { if (player->masterState != BGM_PLAY_STATE_IDLE) {
playerA->paused = TRUE; player->paused = TRUE;
au_bgm_reset_all_voices(playerA); au_bgm_reset_all_voices(player);
} }
} }
} }
@ -394,8 +394,8 @@ AuResult au_bgm_process_suspend(SongUpdateRequestC* request, s32 clearChanged) {
AuResult au_bgm_process_resume(SongUpdateRequestE* request) { AuResult au_bgm_process_resume(SongUpdateRequestE* request) {
AuResult status; AuResult status;
BGMPlayer* playerA; BGMPlayer* player;
BGMPlayer* playerB; BGMPlayer* snapshot;
s32 index; s32 index;
s32 songName; s32 songName;
s32 volume0; s32 volume0;
@ -408,12 +408,12 @@ AuResult au_bgm_process_resume(SongUpdateRequestE* request) {
if (songName != 0) { if (songName != 0) {
if (!request->pauseMode) { if (!request->pauseMode) {
playerA = au_unk_get_temp_player_for_index(index); snapshot = au_get_snapshot_by_index(index);
if (playerA != NULL && playerA->globals->unk_globals_6C[index].assigned == 1) { if (snapshot != NULL && snapshot->globals->snapshots[index].assigned == 1) {
playerB = au_get_client_by_priority(playerA->globals->unk_globals_6C[index].priority); player = au_get_client_by_priority(snapshot->globals->snapshots[index].priority);
if (playerB != NULL) { if (player != NULL) {
if (!au_bgm_player_is_active(playerB)) { if (!au_bgm_player_is_active(player)) {
status = au_unk_80053E58(playerA->songID, playerA->bgmFile); status = au_reload_song_files(snapshot->songID, snapshot->bgmFile);
duration = request->duration; duration = request->duration;
if (duration != 0) { if (duration != 0) {
if (duration > SND_MAX_DURATION) { if (duration > SND_MAX_DURATION) {
@ -438,13 +438,13 @@ AuResult au_bgm_process_resume(SongUpdateRequestE* request) {
} else { } else {
volume1 = AU_MAX_VOLUME_16; volume1 = AU_MAX_VOLUME_16;
} }
playerB->globals->unk_74 = playerB; player->globals->resumeCopyTo = player;
playerB->globals->unk_78 = playerA; player->globals->resumeCopyFrom = snapshot;
playerB->globals->unkSongName = songName; player->globals->resumeSongName = songName;
playerB->globals->unkFadeTime = duration; player->globals->resumeFadeTime = duration;
playerB->globals->unkFadeStart = volume0; player->globals->resumeFadeStart = volume0;
playerB->globals->unkFadeEnd = volume1; player->globals->resumeFadeEnd = volume1;
playerB->globals->unk_80 = 1; player->globals->resumeRequested = TRUE;
} else { } else {
status = AU_ERROR_7; status = AU_ERROR_7;
} }
@ -455,11 +455,11 @@ AuResult au_bgm_process_resume(SongUpdateRequestE* request) {
status = AU_ERROR_INVALID_SONG_DURATION; status = AU_ERROR_INVALID_SONG_DURATION;
} }
} else { } else {
playerB = au_bgm_get_player_with_song_name(songName); player = au_bgm_get_player_with_song_name(songName);
if (playerB != NULL) { if (player != NULL) {
if (songName == playerB->songName) { if (songName == player->songName) {
if (playerB->paused) { if (player->paused) {
playerB->paused = FALSE; player->paused = FALSE;
} }
} }
} }
@ -470,7 +470,7 @@ AuResult au_bgm_process_resume(SongUpdateRequestE* request) {
return status; return status;
} }
void func_8004DFD4(AuGlobals* globals) { void au_bgm_restore_copied_player(AuGlobals* globals) {
BGMPlayer* player; BGMPlayer* player;
BGMPlayerTrack* track; BGMPlayerTrack* track;
SeqNote* note; SeqNote* note;
@ -478,9 +478,9 @@ void func_8004DFD4(AuGlobals* globals) {
u32 j; u32 j;
s32 k; s32 k;
player = globals->unk_74; player = globals->resumeCopyTo;
au_copy_words(globals->unk_78, globals->unk_74, sizeof(*player)); au_copy_words(globals->resumeCopyFrom, globals->resumeCopyTo, sizeof(*player));
if (globals->unkSongName == player->songName) { if (globals->resumeSongName == player->songName) {
for (i = 0; i < ARRAY_COUNT(player->tracks); i++) { for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
track = &player->tracks[i]; track = &player->tracks[i];
if (track->bgmReadPos != NULL) { if (track->bgmReadPos != NULL) {
@ -497,9 +497,9 @@ void func_8004DFD4(AuGlobals* globals) {
au_BGMCmd_E6_MasterEffect(player, track); au_BGMCmd_E6_MasterEffect(player, track);
} }
} }
au_fade_init(&player->fadeInfo, globals->unkFadeTime, globals->unkFadeStart, globals->unkFadeEnd); au_fade_init(&player->fadeInfo, globals->resumeFadeTime, globals->resumeFadeStart, globals->resumeFadeEnd);
} }
globals->unk_80 = 0; globals->resumeRequested = FALSE;
} }
AuResult au_bgm_adjust_volume(SongUpdateRequestA* request) { AuResult au_bgm_adjust_volume(SongUpdateRequestA* request) {
@ -531,16 +531,16 @@ void au_bgm_player_init(BGMPlayer* player, s32 priority, s32 busID, AuGlobals* g
player->updateCounter = 0; player->updateCounter = 0;
player->songPlayingCounter = 0; player->songPlayingCounter = 0;
player->songName = 0; player->songName = 0;
player->fadeSongName = 0; player->pushSongName = 0;
player->unk_58 = FALSE; player->unk_58 = 0;
player->unk_5A = FALSE; player->unk_5A = 0;
player->compReadPos = NULL; player->compReadPos = NULL;
player->compStartPos = NULL; player->compStartPos = NULL;
player->phraseStartPos = 0; player->phraseStartPos = 0;
player->masterTempoTime = 0; player->masterTempoTicks = 0;
player->masterTempoTarget = 0; player->masterTempoTarget = 0;
player->masterTempoStep = 0; player->masterTempoStep = 0;
player->masterVolumeTime = 0; player->masterVolumeTicks = 0;
player->masterVolumeTarget = 0; player->masterVolumeTarget = 0;
player->masterVolumeStep = 0; player->masterVolumeStep = 0;
player->masterPitchShift = 0; player->masterPitchShift = 0;
@ -631,8 +631,9 @@ void au_bgm_update_fade(BGMPlayer* player) {
player->fadeInfo.onCompleteCallback(); player->fadeInfo.onCompleteCallback();
} }
if (player->fadeSongName != 0) { // Was this fade tagged as a push?
func_8004DC80(player->fadeSongName); if (player->pushSongName != 0) {
au_bgm_complete_push(player->pushSongName);
} else if (player->fadeInfo.baseVolume == 0) { } else if (player->fadeInfo.baseVolume == 0) {
au_bgm_stop_player(player); au_bgm_stop_player(player);
} }
@ -725,10 +726,10 @@ void au_bgm_player_initialize(BGMPlayer* player) {
track->tremoloRate = 0; track->tremoloRate = 0;
track->subTrackVolumeStep = 0; track->subTrackVolumeStep = 0;
track->subTrackVolumeTarget = 0; track->subTrackVolumeTarget = 0;
track->subTrackVolumeTime = 0; track->subTrackVolumeTicks = 0;
track->proxVolumeStep = 0; track->proxVolumeStep = 0;
track->proxVolumeTarget = 0; track->proxVolumeTarget = 0;
track->proxVolumeTime = 0; track->proxVolumeTicks = 0;
track->unk_4D = FALSE; track->unk_4D = FALSE;
track->unk_4E = 0; track->unk_4E = 0;
track->unk_4F = 0; track->unk_4F = 0;
@ -759,12 +760,12 @@ void au_bgm_player_initialize(BGMPlayer* player) {
player->masterTempoBPM = BGM_DEFAULT_TEMPO / 100; player->masterTempoBPM = BGM_DEFAULT_TEMPO / 100;
player->unk_21E = 0x80; player->unk_21E = 0x80;
player->masterVolume = AU_MAX_VOLUME_8 << 24; player->masterVolume = AU_MAX_VOLUME_8 << 24;
player->fadeSongName = 0; player->pushSongName = 0;
player->unk_74 = 0; player->tickRatePtr = NULL;
player->masterTempoTarget = 0; player->masterTempoTarget = 0;
player->masterPitchShift = 0; player->masterPitchShift = 0;
player->detune = 0; player->detune = 0;
player->masterVolumeTime = 0; player->masterVolumeTicks = 0;
player->masterVolumeTarget = 0; player->masterVolumeTarget = 0;
player->masterVolumeStep = 0; player->masterVolumeStep = 0;
player->proxMixValue = 0; player->proxMixValue = 0;
@ -852,7 +853,7 @@ void au_bgm_player_read_composition(BGMPlayer* player) {
u32 cmd; u32 cmd;
player->masterTempoStep = 0; player->masterTempoStep = 0;
player->masterTempoTime = 0; player->masterTempoTicks = 0;
while (continueReading) { while (continueReading) {
cmd = *player->compReadPos++; cmd = *player->compReadPos++;
@ -995,9 +996,9 @@ void au_bgm_player_update_stop(BGMPlayer* player) {
player->paused = FALSE; player->paused = FALSE;
player->songName = 0; player->songName = 0;
player->fadeSongName = 0; player->pushSongName = 0;
player->unk_58 = FALSE; player->unk_58 = 0;
player->unk_5A = FALSE; player->unk_5A = 0;
for (i = 0; i < ARRAY_COUNT(player->tracks); i++) { for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
player->tracks[i].bgmReadPos = NULL; player->tracks[i].bgmReadPos = NULL;
} }
@ -1014,6 +1015,7 @@ if (track->detourLength != 0) {\
}\ }\
} }
/// play next tick
void au_bgm_player_update_playing(BGMPlayer *player) { void au_bgm_player_update_playing(BGMPlayer *player) {
s32 bVolumeFading; s32 bVolumeFading;
u8 sp1F; u8 sp1F;
@ -1037,9 +1039,9 @@ void au_bgm_player_update_playing(BGMPlayer *player) {
bVolumeFading = FALSE; bVolumeFading = FALSE;
bFinished = FALSE; bFinished = FALSE;
if (player->masterTempoTime != 0) { if (player->masterTempoTicks != 0) {
player->masterTempoTime--; player->masterTempoTicks--;
if (player->masterTempoTime == 0) { if (player->masterTempoTicks == 0) {
player->masterTempo = player->masterTempoTarget; player->masterTempo = player->masterTempoTarget;
player->masterTempoTarget = 0; player->masterTempoTarget = 0;
player->masterTempoStep = 0; player->masterTempoStep = 0;
@ -1048,9 +1050,9 @@ void au_bgm_player_update_playing(BGMPlayer *player) {
} }
player->nextUpdateStep = player->masterTempo * 10; player->nextUpdateStep = player->masterTempo * 10;
} }
if (player->masterVolumeTime != 0) { if (player->masterVolumeTicks != 0) {
player->masterVolumeTime--; player->masterVolumeTicks--;
if (player->masterVolumeTime == 0) { if (player->masterVolumeTicks == 0) {
player->masterVolume = player->masterVolumeTarget; player->masterVolume = player->masterVolumeTarget;
player->masterVolumeTarget = 0; player->masterVolumeTarget = 0;
player->masterVolumeStep = 0; player->masterVolumeStep = 0;
@ -1106,18 +1108,18 @@ void au_bgm_player_update_playing(BGMPlayer *player) {
} else { } else {
track->changed.volume = FALSE; track->changed.volume = FALSE;
} }
if (track->subTrackVolumeTime != 0) { if (track->subTrackVolumeTicks != 0) {
track->subTrackVolumeTime--; track->subTrackVolumeTicks--;
if (track->subTrackVolumeTime == 0) { if (track->subTrackVolumeTicks == 0) {
track->subTrackVolume = track->subTrackVolumeTarget; track->subTrackVolume = track->subTrackVolumeTarget;
} else { } else {
track->subTrackVolume += track->subTrackVolumeStep; track->subTrackVolume += track->subTrackVolumeStep;
} }
track->changed.volume = TRUE; track->changed.volume = TRUE;
} }
if (track->proxVolumeTime != 0) { if (track->proxVolumeTicks != 0) {
track->proxVolumeTime--; track->proxVolumeTicks--;
if (track->proxVolumeTime == 0) { if (track->proxVolumeTicks == 0) {
track->proxVolume = track->proxVolumeTarget << 16; track->proxVolume = track->proxVolumeTarget << 16;
} else { } else {
track->proxVolume += track->proxVolumeStep; track->proxVolume += track->proxVolumeStep;
@ -1325,7 +1327,7 @@ void au_bgm_player_update_playing(BGMPlayer *player) {
voice->reverb = track->subTrackReverb; voice->reverb = track->subTrackReverb;
if (track->envelopeOverride != 0) { if (track->envelopeOverride != 0) {
voice->envelope.cmdListPress = (u8*) player->customPressEnvelopes[track->envelopeOverride - 1]; //TODO ??? voice->envelope.cmdListPress = (u8*) player->customPressEnvelopes[track->envelopeOverride - 1];
} else { } else {
voice->envelope.cmdListPress = track->envelope.cmdListPress; voice->envelope.cmdListPress = track->envelope.cmdListPress;
} }
@ -1503,7 +1505,7 @@ void au_BGMCmd_E0_MasterTempo(BGMPlayer* player, BGMPlayerTrack* track) {
tempo = au_bgm_bpm_to_tempo(player, bpm); tempo = au_bgm_bpm_to_tempo(player, bpm);
player->masterTempo = tempo; player->masterTempo = tempo;
player->nextUpdateStep = tempo * 10; player->nextUpdateStep = tempo * 10;
player->masterTempoTime = 0; player->masterTempoTicks = 0;
player->masterTempoTarget = 0; player->masterTempoTarget = 0;
player->masterTempoStep = 0; player->masterTempoStep = 0;
} }
@ -1531,7 +1533,7 @@ void au_BGMCmd_E1_MasterVolume(BGMPlayer* player, BGMPlayerTrack* track) {
} }
player->masterVolume = volume; player->masterVolume = volume;
player->masterVolumeTime = 0; player->masterVolumeTicks = 0;
player->masterVolumeTarget = 0; player->masterVolumeTarget = 0;
player->masterVolumeStep = 0; player->masterVolumeStep = 0;
player->volumeChanged = TRUE; player->volumeChanged = TRUE;
@ -1568,7 +1570,7 @@ void au_BGMCmd_E4_MasterTempoFade(BGMPlayer* player, BGMPlayerTrack* track) {
time = 1; time = 1;
} }
player->masterTempoTime = time; player->masterTempoTicks = time;
player->masterTempoTarget = tempo; player->masterTempoTarget = tempo;
player->masterTempoStep = (tempo - player->masterTempo) / time; player->masterTempoStep = (tempo - player->masterTempo) / time;
} }
@ -1585,7 +1587,7 @@ void au_BGMCmd_E5_MasterVolumeFade(BGMPlayer* player, BGMPlayerTrack* track) {
time = 1; time = 1;
} }
player->masterVolumeTime = time; player->masterVolumeTicks = time;
player->masterVolumeTarget = volume; player->masterVolumeTarget = volume;
player->masterVolumeStep = (volume - player->masterVolume) / time; player->masterVolumeStep = (volume - player->masterVolume) / time;
} }
@ -1619,7 +1621,7 @@ void au_BGMCmd_F6_TrackVolumeFade(BGMPlayer* player, BGMPlayerTrack* track) {
time = 1; time = 1;
} }
track->subTrackVolumeTime = time; track->subTrackVolumeTicks = time;
track->subTrackVolumeTarget = volume; track->subTrackVolumeTarget = volume;
track->subTrackVolumeStep = (volume - track->subTrackVolume) / time; track->subTrackVolumeStep = (volume - track->subTrackVolume) / time;
} }
@ -1773,7 +1775,7 @@ void au_BGMCmd_FC_Jump(BGMPlayer* player, BGMPlayerTrack* track) {
track->envelopeOverride = 0; track->envelopeOverride = 0;
track->segTrackTune = 0; track->segTrackTune = 0;
track->tremoloDepth = 0; track->tremoloDepth = 0;
track->subTrackVolumeTime = 0; track->subTrackVolumeTicks = 0;
track->randomPanAmount = 0; track->randomPanAmount = 0;
track->busID = player->busID; track->busID = player->busID;
} }
@ -1784,9 +1786,9 @@ void au_BGMCmd_FF(BGMPlayer* player, BGMPlayerTrack* track) {
u8 delayTime; u8 delayTime;
u32 i; u32 i;
u32 type = player->seqCmdArgs.UnkCmdFF.type; u32 type = player->seqCmdArgs.Special.type;
u32 arg1 = player->seqCmdArgs.UnkCmdFF.arg1; u32 arg1 = player->seqCmdArgs.Special.arg1;
u32 arg2 = player->seqCmdArgs.UnkCmdFF.arg2; u32 arg2 = player->seqCmdArgs.Special.arg2;
switch (type) { switch (type) {
case BGM_SPECIAL_SET_STEREO_DELAY: case BGM_SPECIAL_SET_STEREO_DELAY:
@ -1904,10 +1906,10 @@ static u8 au_bgm_get_random_pan(BGMPlayer* player, u8 pan, u8 amplitude) {
} else { } else {
retPan = base - ((amplitude * random) >> 8); retPan = base - ((amplitude * random) >> 8);
} }
if (retPan < 0) { if (retPan < AU_PAN_MIN) {
retPan = 0; retPan = AU_PAN_MIN;
} else if (retPan >= 0x80) { } else if (retPan > AU_PAN_MAX) {
retPan = 0x7F; retPan = AU_PAN_MAX;
} }
return retPan; return retPan;
} }
@ -1997,7 +1999,7 @@ void au_bgm_set_playback_rate(BGMPlayer* player, f32 rate) {
player->playbackRate = rate; player->playbackRate = rate;
player->masterTempo = au_bgm_bpm_to_tempo(player, player->masterTempoBPM); player->masterTempo = au_bgm_bpm_to_tempo(player, player->masterTempoBPM);
player->nextUpdateStep = player->masterTempo * 10; player->nextUpdateStep = player->masterTempo * 10;
player->masterTempoTime = 0; player->masterTempoTicks = 0;
player->masterTempoTarget = 0; player->masterTempoTarget = 0;
player->masterTempoStep = 0; player->masterTempoStep = 0;
} }
@ -2037,10 +2039,10 @@ void au_bgm_set_prox_mix_fade(BGMPlayer* player, BGMPlayerTrack* track, s32 targ
duration = 1000; duration = 1000;
} }
if (target == track->proxVolume) { if (target == track->proxVolume) {
track->proxVolumeTime = 0; track->proxVolumeTicks = 0;
return; return;
} }
track->proxVolumeTime = duration; track->proxVolumeTicks = duration;
track->proxVolumeTarget = target; track->proxVolumeTarget = target;
track->proxVolumeStep = ((target << 0x10) - track->proxVolume) / duration; track->proxVolumeStep = ((target << 0x10) - track->proxVolume) / duration;
} }

View File

@ -59,8 +59,8 @@ Instrument* au_get_instrument(AuGlobals* globals, BankSetIndex bank, s32 patch,
void au_get_bgm_player_and_file(u32 playerIndex, BGMHeader** outCurrentTrackData, BGMPlayer** outPlayer); void au_get_bgm_player_and_file(u32 playerIndex, BGMHeader** outCurrentTrackData, BGMPlayer** outPlayer);
void au_get_bgm_player(u32 playerIndex, BGMPlayer** outPlayer); void au_get_bgm_player(u32 playerIndex, BGMPlayer** outPlayer);
AuResult au_load_song_files(u32 arg0, BGMHeader* arg1, BGMPlayer* arg2); AuResult au_load_song_files(u32 arg0, BGMHeader* arg1, BGMPlayer* arg2);
AuResult au_unk_80053E58(s32 songID, BGMHeader* arg1); AuResult au_reload_song_files(s32 songID, BGMHeader* arg1);
BGMPlayer* au_unk_get_temp_player_for_index(s32 arg0); BGMPlayer* au_get_snapshot_by_index(s32 index);
AuResult au_ambient_load(u32 arg0); AuResult au_ambient_load(u32 arg0);
BGMPlayer* au_get_client_by_priority(u8 arg0); BGMPlayer* au_get_client_by_priority(u8 arg0);
void au_load_INIT(AuGlobals* arg0, s32 romAddr, ALHeap* heap); void au_load_INIT(AuGlobals* arg0, s32 romAddr, ALHeap* heap);
@ -75,7 +75,7 @@ s32 au_load_aux_bank(s32 bkFileOffset, s32 bankIndex);
void au_clear_instrument_group(s32 bankIndex, BankSet bankSet); void au_clear_instrument_group(s32 bankIndex, BankSet bankSet);
void au_set_bus_volume_level(s32 arg0, u32 idx); void au_set_bus_volume_level(s32 arg0, u32 idx);
s32 au_set_reverb_type(s32 arg0, s32 arg1); s32 au_set_reverb_type(s32 arg0, s32 arg1);
void au_unk_80054DA8(u32 arg0); void au_sync_channel_delay_enabled(u32 arg0);
void au_read_rom(s32 romAddr, void* buffer, u32 size); void au_read_rom(s32 romAddr, void* buffer, u32 size);
void au_memset(void* dst, s32 size, u8 value); void au_memset(void* dst, s32 size, u8 value);
void au_copy_bytes(s8* src, s8* dest, s32 size); void au_copy_bytes(s8* src, s8* dest, s32 size);
@ -90,7 +90,7 @@ void au_driver_release(void);
void au_use_global_volume(void); void au_use_global_volume(void);
void au_set_global_volume(s16 arg0); void au_set_global_volume(s16 arg0);
s16 au_get_global_volume(void); s16 au_get_global_volume(void);
void func_80056D5C(b8 arg0); void au_set_stereo_enabled(b8 enabled);
void au_bus_set_volume(u8 busID, u16 value); void au_bus_set_volume(u8 busID, u16 value);
u16 au_bus_get_volume(u8 busID); u16 au_bus_get_volume(u8 busID);
void au_bus_set_effect(u8 busID, u8 effectID); void au_bus_set_effect(u8 busID, u8 effectID);

View File

@ -59,8 +59,8 @@ void au_engine_init(s32 outputRate) {
globals->dataMSEQ[0] = (MSEQHeader*) &dummyTrackData[0x1C00]; globals->dataMSEQ[0] = (MSEQHeader*) &dummyTrackData[0x1C00];
globals->dataMSEQ[1] = (MSEQHeader*) &dummyTrackData[0x1400]; globals->dataMSEQ[1] = (MSEQHeader*) &dummyTrackData[0x1400];
for (i = 0; i < ARRAY_COUNT(globals->unk_globals_6C); i++) { for (i = 0; i < ARRAY_COUNT(globals->snapshots); i++) {
globals->unk_globals_6C[i].bgmPlayer = alHeapAlloc(alHeap, 1, sizeof(BGMPlayer)); globals->snapshots[i].bgmPlayer = alHeapAlloc(alHeap, 1, sizeof(BGMPlayer));
} }
globals->dataSEF = alHeapAlloc(alHeap, 1, 0x5200); globals->dataSEF = alHeapAlloc(alHeap, 1, 0x5200);
@ -77,9 +77,9 @@ void au_engine_init(s32 outputRate) {
globals->audioThreadCallbacks[0] = NULL; globals->audioThreadCallbacks[0] = NULL;
globals->audioThreadCallbacks[1] = NULL; globals->audioThreadCallbacks[1] = NULL;
for (i = 0; i < ARRAY_COUNT(globals->unk_globals_6C); i++) { for (i = 0; i < ARRAY_COUNT(globals->snapshots); i++) {
globals->unk_globals_6C[i].assigned = 0; globals->snapshots[i].assigned = 0;
globals->unk_globals_6C[i].priority = 0; globals->snapshots[i].priority = 0;
} }
for (i = 0; i < ARRAY_COUNT(globals->effectChanges); i++) { for (i = 0; i < ARRAY_COUNT(globals->effectChanges); i++) {
@ -206,7 +206,7 @@ static void au_reset_instrument_entry(BGMInstrumentInfo* info) {
} }
/// Called exactly once per audio frame (every 5.75ms at 32kHz). /// Called exactly once per audio frame (every 5.75ms at 32kHz).
/// Updates synthesizer, ambience, SFX, and BGM players for the current audio frame. /// Updates MSEQ, SFX, and BGM players for the current audio frame.
void au_update_clients_for_audio_frame(void) { void au_update_clients_for_audio_frame(void) {
AuGlobals* globals = gSoundGlobals; AuGlobals* globals = gSoundGlobals;
SoundManager* sfxManager = gSoundManager; SoundManager* sfxManager = gSoundManager;
@ -235,7 +235,7 @@ void au_update_clients_for_audio_frame(void) {
sfxManager->prevUpdateResult = au_sfx_manager_audio_frame_update(sfxManager); sfxManager->prevUpdateResult = au_sfx_manager_audio_frame_update(sfxManager);
} }
// update gBGMPlayerB // Update gBGMPlayerB
if (!PreventBGMPlayerUpdate) { if (!PreventBGMPlayerUpdate) {
bgmPlayer = gBGMPlayerB; bgmPlayer = gBGMPlayerB;
if (bgmPlayer->fadeInfo.baseTicks != 0) { if (bgmPlayer->fadeInfo.baseTicks != 0) {
@ -252,9 +252,10 @@ void au_update_clients_for_audio_frame(void) {
} }
} }
// Update gBGMPlayerA
if (!PreventBGMPlayerUpdate) { if (!PreventBGMPlayerUpdate) {
if (globals->unk_80 != 0) { if (globals->resumeRequested) {
func_8004DFD4(globals); au_bgm_restore_copied_player(globals);
} }
bgmPlayer = gBGMPlayerA; bgmPlayer = gBGMPlayerA;
if (bgmPlayer->fadeInfo.envelopeTicks != 0) { if (bgmPlayer->fadeInfo.envelopeTicks != 0) {
@ -277,6 +278,8 @@ void au_update_clients_for_audio_frame(void) {
bgmPlayer->prevUpdateResult = au_bgm_player_audio_frame_update(bgmPlayer); bgmPlayer->prevUpdateResult = au_bgm_player_audio_frame_update(bgmPlayer);
} }
} }
// With all clients updated, now update all voices
au_update_voices(globals); au_update_voices(globals);
} }
@ -305,12 +308,12 @@ void au_update_clients_for_video_frame(void) {
void au_syn_begin_audio_frame(AuGlobals* globals) { void au_syn_begin_audio_frame(AuGlobals* globals) {
u32 i; u32 i;
if (globals->unk_130C == 2) { if (globals->channelDelayState == AU_DELAY_STATE_REQUEST_OFF) {
globals->unk_130C = 1; globals->channelDelayState = AU_DELAY_STATE_OFF;
au_disable_channel_delay(); au_disable_channel_delay();
} }
if (globals->channelDelayPending && (globals->unk_130C == 0)) { if (globals->channelDelayPending && (globals->channelDelayState == AU_DELAY_STATE_ON)) {
switch (globals->channelDelaySide) { switch (globals->channelDelaySide) {
case AU_DELAY_CHANNEL_LEFT: case AU_DELAY_CHANNEL_LEFT:
au_set_delay_time(globals->channelDelayTime); au_set_delay_time(globals->channelDelayTime);
@ -495,7 +498,6 @@ void au_fade_update_envelope(Fade* fade) {
} }
} }
//TODO cleanup and documentation
/// Note that bank is supplied as BankSetIndex and not BankSet, which means it will be used to perform a raw /// Note that bank is supplied as BankSetIndex and not BankSet, which means it will be used to perform a raw
/// access into AuGlobals::bankSets. This does not affect values above 3, but 1 and 2 differ. /// access into AuGlobals::bankSets. This does not affect values above 3, but 1 and 2 differ.
Instrument* au_get_instrument(AuGlobals* globals, BankSetIndex bank, s32 patch, EnvelopeData* envData) { Instrument* au_get_instrument(AuGlobals* globals, BankSetIndex bank, s32 patch, EnvelopeData* envData) {
@ -614,7 +616,7 @@ AuResult au_load_song_files(u32 songID, BGMHeader* bgmFile, BGMPlayer* player) {
} }
} }
AuResult au_unk_80053E58(s32 songID, BGMHeader* bgmFile) { AuResult au_reload_song_files(s32 songID, BGMHeader* bgmFile) {
AuResult status; AuResult status;
SBNFileEntry fileEntry; SBNFileEntry fileEntry;
SBNFileEntry sbnEntry; SBNFileEntry sbnEntry;
@ -652,9 +654,9 @@ AuResult au_unk_80053E58(s32 songID, BGMHeader* bgmFile) {
return status; return status;
} }
BGMPlayer* au_unk_get_temp_player_for_index(s32 index) { BGMPlayer* au_get_snapshot_by_index(s32 index) {
if (index == MUSIC_CROSS_FADE) { if (index == BGM_SNAPSHOT_0) {
return gSoundGlobals->unk_globals_6C[MUSIC_CROSS_FADE].bgmPlayer; return gSoundGlobals->snapshots[BGM_SNAPSHOT_0].bgmPlayer;
} }
return NULL; return NULL;
} }
@ -1188,17 +1190,17 @@ s32 au_set_reverb_type(s32 soundTypeFlags, s32 reverbType) {
return 0; return 0;
} }
void au_unk_80054DA8(u32 bMonoSound) { void au_sync_channel_delay_enabled(u32 bMonoSound) {
if (bMonoSound % 2 == 1) { if (bMonoSound % 2 == 1) {
// mono sound // mono sound
if (gSoundGlobals->unk_130C == 0) { if (gSoundGlobals->channelDelayState == AU_DELAY_STATE_ON) {
gSoundGlobals->unk_130C = 2; gSoundGlobals->channelDelayState = AU_DELAY_STATE_REQUEST_OFF;
} }
} else { } else {
// stereo sound // stereo sound
if (gSoundGlobals->unk_130C != 0) { if (gSoundGlobals->channelDelayState != AU_DELAY_STATE_ON) {
gSoundGlobals->channelDelayPending = TRUE; gSoundGlobals->channelDelayPending = TRUE;
gSoundGlobals->unk_130C = 0; gSoundGlobals->channelDelayState = AU_DELAY_STATE_ON;
} }
} }
} }

View File

@ -14,7 +14,7 @@ BSS s32 AuDelayCount;
AuSynDriver* gActiveSynDriverPtr = NULL; AuSynDriver* gActiveSynDriverPtr = NULL;
AuSynDriver* gSynDriverPtr = NULL; AuSynDriver* gSynDriverPtr = NULL;
u8 AuUseGlobalVolume = FALSE; u8 AuUseGlobalVolume = FALSE;
u16 AuGlobalVolume = 0x7FFF; u16 AuGlobalVolume = AU_MAX_VOLUME_16;
u8 AuSynStereoDirty = FALSE; u8 AuSynStereoDirty = FALSE;
extern s16 AuEqPower[128]; extern s16 AuEqPower[128];
@ -40,7 +40,7 @@ void au_driver_init(AuSynDriver* driver, ALConfig* config) {
gActiveSynDriverPtr = driver; gActiveSynDriverPtr = driver;
gSynDriverPtr = driver; gSynDriverPtr = driver;
AuUseGlobalVolume = FALSE; AuUseGlobalVolume = FALSE;
AuGlobalVolume = 0x7FFF; AuGlobalVolume = AU_MAX_VOLUME_16;
AuSynStereoDirty = TRUE; AuSynStereoDirty = TRUE;
gSynDriverPtr->pvoices = alHeapAlloc(heap, config->num_pvoice, sizeof(*gSynDriverPtr->pvoices)); gSynDriverPtr->pvoices = alHeapAlloc(heap, config->num_pvoice, sizeof(*gSynDriverPtr->pvoices));
@ -281,8 +281,8 @@ s16 au_get_global_volume(void) {
return AuGlobalVolume; return AuGlobalVolume;
} }
void func_80056D5C(b8 bStereoSound) { void au_set_stereo_enabled(b8 enabled) {
AuSynUseStereo = bStereoSound; AuSynUseStereo = enabled;
AuSynStereoDirty = TRUE; AuSynStereoDirty = TRUE;
} }

View File

@ -54,10 +54,10 @@ void au_bgm_stop_all(void);
AuResult au_bgm_is_song_playing(s32 songName); AuResult au_bgm_is_song_playing(s32 songName);
b32 au_bgm_player_is_active(BGMPlayer* player); b32 au_bgm_player_is_active(BGMPlayer* player);
AuResult au_bgm_process_fade_out(SongUpdateRequestB* s); AuResult au_bgm_process_fade_out(SongUpdateRequestB* s);
AuResult func_8004DC80(s32 songName); AuResult au_bgm_complete_push(s32 songName);
AuResult au_bgm_process_suspend(SongUpdateRequestC* update, s32 clearChanged); AuResult au_bgm_process_suspend(SongUpdateRequestC* update, b32 skipStop);
AuResult au_bgm_process_resume(SongUpdateRequestE* update); AuResult au_bgm_process_resume(SongUpdateRequestE* update);
void func_8004DFD4(AuGlobals* globals); void au_bgm_restore_copied_player(AuGlobals* globals);
AuResult au_bgm_adjust_volume(SongUpdateRequestA* update); AuResult au_bgm_adjust_volume(SongUpdateRequestA* update);
void au_bgm_player_init(BGMPlayer* player, s32 arg1, s32 arg2, AuGlobals* arg3); void au_bgm_player_init(BGMPlayer* player, s32 arg1, s32 arg2, AuGlobals* arg3);
void au_bgm_set_effect_indices(BGMPlayer* player, u8* list); void au_bgm_set_effect_indices(BGMPlayer* player, u8* list);
@ -148,10 +148,10 @@ AuResult snd_song_is_playing(s32 songName);
AuResult snd_song_request_fade_in(s32 songName, s32 variation, s32 fadeInTime, s32 startVolume, s32 endVolume); AuResult snd_song_request_fade_in(s32 songName, s32 variation, s32 fadeInTime, s32 startVolume, s32 endVolume);
AuResult snd_song_request_fade_in_default(s32 songName, s32 fadeInTime, s32 startVolume, s32 endVolume); AuResult snd_song_request_fade_in_default(s32 songName, s32 fadeInTime, s32 startVolume, s32 endVolume);
AuResult snd_song_request_fade_out(s32 songName, s32 fadeTime, AuCallback callback); AuResult snd_song_request_fade_out(s32 songName, s32 fadeTime, AuCallback callback);
AuResult snd_song_UNK_push_stop(s32 songName); AuResult snd_song_push_stop(s32 songName);
AuResult snd_song_UNK_request_pop(s32 songName); AuResult snd_song_request_pop(s32 songName);
AuResult func_80055B80(s32 songName); AuResult snd_song_request_snapshot(s32 songName);
AuResult snd_song_UNK_request_push_fade_out(s32 songName, s32 fadeTime); AuResult snd_song_request_push_fade_out(s32 songName, s32 fadeTime);
AuResult snd_song_request_pause(s32 songName); AuResult snd_song_request_pause(s32 songName);
AuResult snd_song_request_unpause(s32 songName); AuResult snd_song_request_unpause(s32 songName);
AuResult snd_song_set_volume_quiet(s32 songName); AuResult snd_song_set_volume_quiet(s32 songName);

View File

@ -41,10 +41,10 @@ AuResult snd_song_is_playing(s32 songName);
AuResult snd_song_request_fade_in(s32 songName, s32 variation, s32 fadeInTime, s32 startVolume, s32 endVolume); AuResult snd_song_request_fade_in(s32 songName, s32 variation, s32 fadeInTime, s32 startVolume, s32 endVolume);
AuResult snd_song_request_fade_in_default(s32 songName, s32 fadeInTime, s32 startVolume, s32 endVolume); AuResult snd_song_request_fade_in_default(s32 songName, s32 fadeInTime, s32 startVolume, s32 endVolume);
AuResult snd_song_request_fade_out(s32 songName, s32 fadeTime, AuCallback callback); AuResult snd_song_request_fade_out(s32 songName, s32 fadeTime, AuCallback callback);
AuResult snd_song_UNK_push_stop(s32 songName); AuResult snd_song_push_stop(s32 songName);
AuResult snd_song_UNK_request_pop(s32 songName); AuResult snd_song_request_pop(s32 songName);
AuResult func_80055B80(s32 songName); AuResult snd_song_request_snapshot(s32 songName);
AuResult snd_song_UNK_request_push_fade_out(s32 songName, s32 fadeTime); AuResult snd_song_request_push_fade_out(s32 songName, s32 fadeTime);
AuResult snd_song_request_pause(s32 songName); AuResult snd_song_request_pause(s32 songName);
AuResult snd_song_request_unpause(s32 songName); AuResult snd_song_request_unpause(s32 songName);
AuResult snd_song_set_volume_quiet(s32 songName); AuResult snd_song_set_volume_quiet(s32 songName);

View File

@ -587,8 +587,8 @@ void sfx_get_spatialized_sound_params(f32 x, f32 y, f32 z, s16* volume, s16* pan
if (*pan < 1) { if (*pan < 1) {
*pan = 1; *pan = 1;
} }
if (*pan > 127) { if (*pan > AU_PAN_MAX) {
*pan = 127; *pan = AU_PAN_MAX;
} }
} }

View File

@ -1478,10 +1478,10 @@ static u8 au_sfx_get_random_pan(s32 seed, s32 pan, s32 amplitude) {
} else { } else {
retPan = pan - (((amplitude & 0xFF) * random) >> 8); retPan = pan - (((amplitude & 0xFF) * random) >> 8);
} }
if (retPan < 0) { if (retPan < AU_PAN_MIN) {
retPan = 0; retPan = AU_PAN_MIN;
} else if (retPan > 0x7F) { } else if (retPan > AU_PAN_MAX) {
retPan = 0x7F; retPan = AU_PAN_MAX;
} }
return retPan; return retPan;
} }

View File

@ -202,8 +202,8 @@ void snd_start_sound(s32 soundID, u8 volume, u8 pan) {
vol |= 0xFF; vol |= 0xFF;
} }
if (pan > 0x7F) { if (pan > AU_PAN_MAX) {
pan = 0x7F; pan = AU_PAN_MAX;
} }
au_sfx_enqueue_event(soundManager, soundID, vol, 0, pan); au_sfx_enqueue_event(soundManager, soundID, vol, 0, pan);
@ -217,8 +217,8 @@ void snd_start_sound_with_shift(s32 soundID, u8 volume, u8 pan, s16 pitchShift)
vol |= 0xFF; vol |= 0xFF;
} }
if (pan > 0x7F) { if (pan > AU_PAN_MAX) {
pan = 0x7F; pan = AU_PAN_MAX;
} }
if (pitchShift > 2 * AU_OCTAVE) { if (pitchShift > 2 * AU_OCTAVE) {
@ -238,8 +238,8 @@ void snd_adjust_sound(s32 soundID, u8 volume, u8 pan) {
vol |= 0xFF; vol |= 0xFF;
} }
if (pan > 0x7F) { if (pan > AU_PAN_MAX) {
pan = 0x7F; pan = AU_PAN_MAX;
} }
au_sfx_enqueue_event(soundManager, soundID | SOUND_ID_ADJUST, vol, 0, pan); au_sfx_enqueue_event(soundManager, soundID | SOUND_ID_ADJUST, vol, 0, pan);
@ -253,8 +253,8 @@ void snd_adjust_sound_with_shift(s32 soundID, u8 volume, u8 pan, s16 pitchShift)
vol |= 0xFF; vol |= 0xFF;
} }
if (pan > 0x7F) { if (pan > AU_PAN_MAX) {
pan = 0x7F; pan = AU_PAN_MAX;
} }
if (pitchShift > 2 * AU_OCTAVE) { if (pitchShift > 2 * AU_OCTAVE) {
@ -555,20 +555,20 @@ AuResult snd_song_request_fade_out(s32 songName, s32 fadeTime, AuCallback callba
return au_bgm_process_fade_out(&s); return au_bgm_process_fade_out(&s);
} }
AuResult snd_song_UNK_push_stop(s32 songName) { AuResult snd_song_push_stop(s32 songName) {
SongUpdateRequestC s; SongUpdateRequestC s;
s.songName = songName; s.songName = songName;
s.duration = 0; s.duration = 0;
s.startVolume = 0; s.startVolume = 0;
s.finalVolume = 0; s.finalVolume = 0;
s.index = MUSIC_CROSS_FADE; s.index = BGM_SNAPSHOT_0;
s.pauseMode = FALSE; s.pauseMode = FALSE;
return au_bgm_process_suspend(&s, 0); return au_bgm_process_suspend(&s, 0); // force stop
} }
AuResult snd_song_UNK_request_pop(s32 songName) { AuResult snd_song_request_pop(s32 songName) {
AuResult status; AuResult status;
SongUpdateRequestE s; SongUpdateRequestE s;
@ -577,7 +577,7 @@ AuResult snd_song_UNK_request_pop(s32 songName) {
s.duration = 2000; s.duration = 2000;
s.startVolume = 1; s.startVolume = 1;
s.finalVolume = AU_MAX_VOLUME_8; s.finalVolume = AU_MAX_VOLUME_8;
s.index = MUSIC_CROSS_FADE; s.index = BGM_SNAPSHOT_0;
s.pauseMode = FALSE; s.pauseMode = FALSE;
status = au_bgm_process_resume(&s); status = au_bgm_process_resume(&s);
PreventBGMPlayerUpdate = FALSE; PreventBGMPlayerUpdate = FALSE;
@ -585,20 +585,20 @@ AuResult snd_song_UNK_request_pop(s32 songName) {
return status; return status;
} }
AuResult func_80055B80(s32 songName) { AuResult snd_song_request_snapshot(s32 songName) {
SongUpdateRequestC s; SongUpdateRequestC s;
s.songName = songName; s.songName = songName;
s.duration = 0; s.duration = 0;
s.startVolume = 0; s.startVolume = 0;
s.finalVolume = 0; s.finalVolume = 0;
s.index = MUSIC_CROSS_FADE; s.index = BGM_SNAPSHOT_0;
s.pauseMode = FALSE; s.pauseMode = FALSE;
return au_bgm_process_suspend(&s, 1); return au_bgm_process_suspend(&s, 1); // no stop
} }
AuResult snd_song_UNK_request_push_fade_out(s32 songName, s32 fadeTime) { AuResult snd_song_request_push_fade_out(s32 songName, s32 fadeTime) {
SongUpdateRequestB s; SongUpdateRequestB s;
s.songName = songName; s.songName = songName;
@ -618,10 +618,10 @@ AuResult snd_song_request_pause(s32 songName) {
s.duration = 0; s.duration = 0;
s.startVolume = 0; s.startVolume = 0;
s.finalVolume = 0; s.finalVolume = 0;
s.index = MUSIC_CROSS_FADE; s.index = BGM_SNAPSHOT_0;
s.pauseMode = TRUE; s.pauseMode = TRUE;
return au_bgm_process_suspend(&s, 0); return au_bgm_process_suspend(&s, 0); // force stop
} }
AuResult snd_song_request_unpause(s32 songName) { AuResult snd_song_request_unpause(s32 songName) {
@ -631,7 +631,7 @@ AuResult snd_song_request_unpause(s32 songName) {
s.duration = 0; s.duration = 0;
s.startVolume = 0; s.startVolume = 0;
s.finalVolume = 0; s.finalVolume = 0;
s.index = MUSIC_CROSS_FADE; s.index = BGM_SNAPSHOT_0;
s.pauseMode = TRUE; s.pauseMode = TRUE;
return au_bgm_process_resume(&s); return au_bgm_process_resume(&s);
@ -871,13 +871,13 @@ void snd_register_callback(AuCallback func, s32 index) {
} }
void snd_set_stereo(void) { void snd_set_stereo(void) {
func_80056D5C(1); au_set_stereo_enabled(TRUE);
au_unk_80054DA8(0); au_sync_channel_delay_enabled(0);
} }
void snd_set_mono(void) { void snd_set_mono(void) {
func_80056D5C(0); au_set_stereo_enabled(FALSE);
au_unk_80054DA8(1); au_sync_channel_delay_enabled(1);
} }
void snd_set_bgm_volume(VolumeLevels volume) { void snd_set_bgm_volume(VolumeLevels volume) {

View File

@ -557,7 +557,7 @@ au_bgm_process_fade_out = 0x8004DB4C; // type:func rom:0x28F4C
func_8004DC80 = 0x8004DC80; // type:func rom:0x29080 func_8004DC80 = 0x8004DC80; // type:func rom:0x29080
au_bgm_process_suspend = 0x8004DCB8; // type:func rom:0x290B8 au_bgm_process_suspend = 0x8004DCB8; // type:func rom:0x290B8
au_bgm_process_resume = 0x8004DE2C; // type:func rom:0x2922C au_bgm_process_resume = 0x8004DE2C; // type:func rom:0x2922C
func_8004DFD4 = 0x8004DFD4; // type:func rom:0x293D4 au_bgm_restore_copied_player = 0x8004DFD4; // type:func rom:0x293D4
au_bgm_adjust_volume = 0x8004E0F4; // type:func rom:0x294F4 au_bgm_adjust_volume = 0x8004E0F4; // type:func rom:0x294F4
au_bgm_player_init = 0x8004E158; // type:func rom:0x29558 au_bgm_player_init = 0x8004E158; // type:func rom:0x29558
au_bgm_set_effect_indices = 0x8004E344; // type:func rom:0x29744 au_bgm_set_effect_indices = 0x8004E344; // type:func rom:0x29744
@ -665,7 +665,7 @@ au_get_bgm_player_and_file = 0x80053C58; // type:func rom:0x2F058
au_get_bgm_player = 0x80053CB4; // type:func rom:0x2F0B4 au_get_bgm_player = 0x80053CB4; // type:func rom:0x2F0B4
au_load_song_files = 0x80053CF8; // type:func rom:0x2F0F8 au_load_song_files = 0x80053CF8; // type:func rom:0x2F0F8
au_unk_80053E58 = 0x80053E58; // type:func rom:0x2F258 au_unk_80053E58 = 0x80053E58; // type:func rom:0x2F258
au_unk_get_temp_player_for_index = 0x80053F64; // type:func rom:0x2F364 au_get_snapshot_by_index = 0x80053F64; // type:func rom:0x2F364
au_ambient_load = 0x80053F80; // type:func rom:0x2F380 au_ambient_load = 0x80053F80; // type:func rom:0x2F380
au_get_client_by_priority = 0x80054248; // type:func rom:0x2F648 au_get_client_by_priority = 0x80054248; // type:func rom:0x2F648
au_load_INIT = 0x800542BC; // type:func rom:0x2F6BC au_load_INIT = 0x800542BC; // type:func rom:0x2F6BC
@ -681,7 +681,7 @@ snd_load_BK = 0x80054C4C; // type:func rom:0x3004C
func_80054C84 = 0x80054C84; // type:func rom:0x30084 func_80054C84 = 0x80054C84; // type:func rom:0x30084
au_set_bus_volume_level = 0x80054CE0; // type:func rom:0x300E0 au_set_bus_volume_level = 0x80054CE0; // type:func rom:0x300E0
au_set_reverb_type = 0x80054D74; // type:func rom:0x30174 au_set_reverb_type = 0x80054D74; // type:func rom:0x30174
au_unk_80054DA8 = 0x80054DA8; // type:func rom:0x301A8 au_sync_channel_delay_enabled = 0x80054DA8; // type:func rom:0x301A8
au_read_rom = 0x80054E00; // type:func rom:0x30200 au_read_rom = 0x80054E00; // type:func rom:0x30200
au_memset = 0x80054E90; // type:func rom:0x30290 au_memset = 0x80054E90; // type:func rom:0x30290
au_copy_bytes = 0x80054F48; // type:func rom:0x30348 au_copy_bytes = 0x80054F48; // type:func rom:0x30348