bgm_control wip

This commit is contained in:
z64a 2025-05-23 03:17:54 -04:00
parent b4bb082669
commit b38ba22a90
17 changed files with 386 additions and 362 deletions

View File

@ -627,22 +627,22 @@ typedef struct Worker {
typedef Worker* WorkerList[MAX_WORKERS];
typedef struct MusicSettings {
typedef struct MusicControlData {
/* 0x00 */ u16 flags;
/* 0x02 */ s16 state;
/* 0x04 */ s32 fadeOutTime;
/* 0x08 */ s32 fadeInTime;
/* 0x0C */ s16 fadeStartVolume;
/* 0x0E */ s16 fadeEndVolume;
/* 0x10 */ s32 songID;
/* 0x10 */ s32 requestedSongID;
/* 0x14 */ s32 variation;
/* 0x18 */ s32 songName;
/* 0x18 */ s32 songName; /// name or handle of currently playing song
/* 0x1C */ s32 battleSongID;
/* 0x20 */ s32 battleVariation;
/* 0x24 */ s32 savedSongID;
/* 0x28 */ s32 savedVariation;
/* 0x2C */ s32 savedSongName;
} MusicSettings; // size = 0x30
} MusicControlData; // size = 0x30
typedef struct MusicProximityTrigger {
/* 0x00 */ VecXZf pos;

View File

@ -4684,15 +4684,6 @@ enum ProjectileHitboxAttackStates {
PROJECTILE_HITBOX_STATE_DONE = 100
};
enum MusicSettingsFlags {
MUSIC_SETTINGS_FLAG_1 = 0x00000001,
MUSIC_SETTINGS_FLAG_ENABLE_PROXIMITY_MIX = 0x00000002,
MUSIC_SETTINGS_FLAG_4 = 0x00000004,
MUSIC_SETTINGS_FLAG_8 = 0x00000008,
MUSIC_SETTINGS_FLAG_10 = 0x00000010,
MUSIC_SETTINGS_FLAG_20 = 0x00000020,
};
// the lower byte of ColliderFlags
enum SurfaceType {
SURFACE_TYPE_DEFAULT = 0,

View File

@ -104,7 +104,7 @@ extern EvtScript EVS_NpcDefeat;
extern EvtScript ShakeCam1;
extern EvtScript ShakeCamX;
extern MusicSettings gMusicSettings[2];
extern MusicControlData gMusicControlData[2];
// gfx
extern DisplayContext* gDisplayContext;

View File

@ -122,34 +122,47 @@ enum AuVoiceSyncFlags {
};
typedef enum AuEffectType {
AU_FX_NONE = 0,
AU_FX_SMALLROOM = 1,
AU_FX_BIGROOM = 2,
AU_FX_CHORUS = 3,
AU_FX_FLANGE = 4,
AU_FX_ECHO = 5,
AU_FX_CUSTOM_0 = 6,
AU_FX_CUSTOM_1 = 7,
AU_FX_CUSTOM_2 = 8,
AU_FX_CUSTOM_3 = 9,
AU_FX_OTHER_BIGROOM = 10
AU_FX_NONE = 0,
AU_FX_SMALLROOM = 1,
AU_FX_BIGROOM = 2,
AU_FX_CHORUS = 3,
AU_FX_FLANGE = 4,
AU_FX_ECHO = 5,
AU_FX_CUSTOM_0 = 6,
AU_FX_CUSTOM_1 = 7,
AU_FX_CUSTOM_2 = 8,
AU_FX_CUSTOM_3 = 9,
AU_FX_OTHER_BIGROOM = 10,
} AuEffectType;
typedef enum MusicState {
MUSIC_STATE_0 = 0,
MUSIC_STATE_1 = 1,
MUSIC_STATE_2 = 2,
MUSIC_STATE_IDLE = 0,
MUSIC_STATE_STOP_CURRENT = 1,
MUSIC_STATE_AWAIT_FADEOUT = 2,
MUSIC_STATE_DELAY_2 = 3,
MUSIC_STATE_DELAY_1 = 4,
MUSIC_STATE_5 = 5,
MUSIC_STATE_PLAY_NEXT = 5,
} MusicState;
enum MusicFlags {
MUSIC_FLAG_PLAYING = 0x01,
MUSIC_FLAG_ENABLE_PROX_MIX = 0x02,
MUSIC_FLAG_PUSHING = 0x04,
MUSIC_FLAG_POPPING = 0x08,
MUSIC_FLAG_IGNORE_POP = 0x10,
MUSIC_FLAG_FADE_IN_NEXT = 0x20,
};
enum MusicFades {
MUSIC_CROSS_FADE = 0,
};
typedef enum BGMPlayerState {
BGM_PLAY_STATE_IDLE = 0,
BGM_PLAY_STATE_ACTIVE = 1,
BGM_PLAY_STATE_FETCH = 2,
BGM_PLAY_STATE_INIT = 3,
BGM_PLAY_STATE_STOP = 4
BGM_PLAY_STATE_IDLE = 0,
BGM_PLAY_STATE_ACTIVE = 1,
BGM_PLAY_STATE_FETCH = 2,
BGM_PLAY_STATE_INIT = 3,
BGM_PLAY_STATE_STOP = 4,
} BGMPlayerState;
typedef enum SegmentControlCommands {
@ -159,7 +172,7 @@ typedef enum SegmentControlCommands {
BGM_COMP_WAIT = 4,
BGM_COMP_END_LOOP = 5,
BGM_COMP_6 = 6,
BGM_COMP_7 = 7
BGM_COMP_7 = 7,
} SegmentControlCommands;
typedef enum BGMSpecialSubops {
@ -954,8 +967,8 @@ typedef struct AuEffectChange {
typedef struct SndGlobalsSub6C {
/* 0x00 */ struct BGMPlayer* bgmPlayer;
/* 0x04 */ u8 unk_4;
/* 0x05 */ u8 unk_5;
/* 0x04 */ u8 assigned;
/* 0x05 */ u8 priority;
} SndGlobalsSub6C;
// found at 801D57A0
@ -1133,7 +1146,7 @@ typedef struct BGMPlayer {
/* 0x21D */ u8 bgmInstrumentCount;
/* 0x21E */ u8 unk_21E;
/* 0x21F */ char unk_21F[0x1];
/* 0x220 */ u8 unk_220;
/* 0x220 */ u8 paused;
/* 0x221 */ u8 masterState;
/* 0x222 */ u8 unk_222;
/* 0x223 */ u8 unk_223;
@ -1155,8 +1168,9 @@ typedef struct BGMPlayer {
} BGMPlayer; // size = 0xA9C
//TODO these are probably one struct with a union at offset 0x10
// keep them separated so that only the "correct" element of the union can be used with functions taking these
typedef struct SongUpdateEventA {
typedef struct SongUpdateRequestA {
/* 0x00 */ s32 songName;
/* 0x04 */ s32 duration;
/* 0x08 */ s32 startVolume;
@ -1164,29 +1178,29 @@ typedef struct SongUpdateEventA {
/* 0x10 */ s32 variation;
/* 0x14 */ s32 unk_14;
/* 0x18 */ char pad_18[8];
} SongUpdateEventA; // size = 0x1C or 0x20
} SongUpdateRequestA; // size = 0x1C or 0x20
typedef struct SongUpdateEventB {
typedef struct SongUpdateRequestB {
/* 0x00 */ s32 songName;
/* 0x04 */ s32 duration;
/* 0x08 */ s32 unk_08;
/* 0x0C */ s32 finalVolume;
/* 0x10 */ AuCallback callback;
/* 0x14 */ s32 unk_14;
/* 0x14 */ s32 onPush;
/* 0x18 */ char pad_18[8];
} SongUpdateEventB; // size = 0x1C or 0x20
} SongUpdateRequestB; // size = 0x1C or 0x20
typedef struct SongUpdateEventC {
typedef struct SongUpdateRequestC {
/* 0x00 */ s32 songName;
/* 0x04 */ s32 duration;
/* 0x08 */ s32 startVolume;
/* 0x0C */ s32 finalVolume;
/* 0x10 */ s32 index;
/* 0x14 */ s32 unk_14;
/* 0x14 */ s32 pauseMode;
/* 0x18 */ char pad_18[8];
} SongUpdateEventC; // size = 0x1C or 0x20
} SongUpdateRequestC; // size = 0x1C or 0x20
typedef struct SongUpdateEventD {
typedef struct SongUpdateRequestD {
/* 0x00 */ s32 songName;
/* 0x04 */ s32 unk_04;
/* 0x08 */ s32 unk_08;
@ -1194,18 +1208,18 @@ typedef struct SongUpdateEventD {
/* 0x10 */ s32 mode; // 0 or 1
/* 0x14 */ s32 unk_14;
/* 0x18 */ char pad_18[8];
} SongUpdateEventD; // size = 0x1C or 0x20
} SongUpdateRequestD; // size = 0x1C or 0x20
// might be same as SongUpdateEventC
typedef struct SongUpdateEventE {
// might be same as SongUpdateRequestC
typedef struct SongUpdateRequestE {
/* 0x00 */ s32 songName;
/* 0x04 */ s32 duration;
/* 0x08 */ s32 startVolume;
/* 0x0C */ s32 finalVolume;
/* 0x10 */ s32 index;
/* 0x14 */ s32 unk_14;
/* 0x14 */ s32 pauseMode;
/* 0x18 */ char pad_18[8];
} SongUpdateEventE; // size = 0x1C or 0x20
} SongUpdateRequestE; // size = 0x1C or 0x20
typedef struct MSEQTrackData {
/* 0x0 */ u8 trackIndex;

View File

@ -10,16 +10,16 @@ BSS s16 MusicTargetVolume;
BSS s16 MusicMaxVolume;
BSS s16 MusicCurrentVolume;
MusicSettings gMusicSettings[2];
MusicControlData gMusicControlData[2];
MusicSettings BlankMusicSettings = {
MusicControlData BlankMusicControlData = {
.flags = 0,
.state = MUSIC_STATE_0,
.state = MUSIC_STATE_IDLE,
.fadeOutTime = -1,
.fadeInTime = 0,
.fadeStartVolume = 0,
.fadeEndVolume = 0,
.songID = AU_SONG_NONE,
.requestedSongID = AU_SONG_NONE,
.variation = -1,
.songName = -1,
.battleSongID = 0,
@ -64,8 +64,8 @@ s32 bgm_get_map_default_variation(s32 songID) {
void bgm_reset_sequence_players(void) {
s32 i;
for (i = 0; i < ARRAY_COUNT(gMusicSettings); i++) {
gMusicSettings[i] = BlankMusicSettings;
for (i = 0; i < ARRAY_COUNT(gMusicControlData); i++) {
gMusicControlData[i] = BlankMusicControlData;
}
MusicTargetVolume = VOL_LEVEL_FULL;
@ -80,95 +80,103 @@ void bgm_reset_volume(void) {
}
//TODO refactor out constants
void bgm_update_music_settings(void) {
MusicSettings* music = gMusicSettings;
void bgm_update_music_control(void) {
MusicControlData* music = gMusicControlData;
s32 i = 0;
s16 state2 = MUSIC_STATE_2;
s16 flag4 = MUSIC_SETTINGS_FLAG_4;
s16 stateFadeOut = MUSIC_STATE_AWAIT_FADEOUT;
s16 pushedFlag = MUSIC_FLAG_PUSHING;
s32 flags;
for (i; i < ARRAY_COUNT(gMusicSettings); i++, music++) {
for (i; i < ARRAY_COUNT(gMusicControlData); i++, music++) {
switch (music->state) {
case MUSIC_STATE_0:
case MUSIC_STATE_IDLE:
break;
case MUSIC_STATE_1:
if (music->flags & MUSIC_SETTINGS_FLAG_1) {
case MUSIC_STATE_STOP_CURRENT:
if (music->flags & MUSIC_FLAG_PLAYING) {
if (music->fadeOutTime < 250) {
if (!(music->flags & MUSIC_SETTINGS_FLAG_4)) {
if (!(music->flags & MUSIC_FLAG_PUSHING)) {
if (snd_song_stop(music->songName) == AU_RESULT_OK) {
music->state = state2;
music->state = stateFadeOut;
}
} else {
if (func_80055AF0(music->songName) == AU_RESULT_OK) {
music->state = state2;
if (snd_song_UNK_push_stop(music->songName) == AU_RESULT_OK) {
music->state = stateFadeOut;
}
}
} else if (!(music->flags & MUSIC_SETTINGS_FLAG_4)) {
if (snd_song_set_variation_fade_time(music->songName, music->fadeOutTime, NULL) == AU_RESULT_OK) {
music->state = state2;
} else if (!(music->flags & MUSIC_FLAG_PUSHING)) {
if (snd_song_request_fade_out(music->songName, music->fadeOutTime, NULL) == AU_RESULT_OK) {
music->state = stateFadeOut;
}
} else {
if (func_80055BB8(music->songName, 250) == AU_RESULT_OK) {
music->state = state2;
if (snd_song_UNK_request_push_fade_out(music->songName, 250) == AU_RESULT_OK) {
music->state = stateFadeOut;
}
}
} else {
if (music->flags & MUSIC_SETTINGS_FLAG_4) {
music->flags |= MUSIC_SETTINGS_FLAG_10;
if (music->flags & MUSIC_FLAG_PUSHING) {
// nothing was playing in this case, so remember to skip the next pop
music->flags |= MUSIC_FLAG_IGNORE_POP;
}
music->flags &= ~flag4;
music->state = MUSIC_STATE_5;
music->flags &= ~pushedFlag;
music->state = MUSIC_STATE_PLAY_NEXT;
}
break;
case MUSIC_STATE_2:
case MUSIC_STATE_AWAIT_FADEOUT:
flags = music->flags;
music->flags &= ~flag4;
if (flags & MUSIC_SETTINGS_FLAG_1) {
music->flags &= ~pushedFlag;
if (flags & MUSIC_FLAG_PLAYING) {
if (snd_song_is_playing(music->songName) == AU_RESULT_OK) {
music->flags &= ~MUSIC_SETTINGS_FLAG_1;
music->flags &= ~MUSIC_FLAG_PLAYING;
music->state = MUSIC_STATE_DELAY_2;
}
} else {
music->state = MUSIC_STATE_5;
music->state = MUSIC_STATE_PLAY_NEXT;
}
break;
case MUSIC_STATE_DELAY_2:
music->state = MUSIC_STATE_DELAY_1;
break;
case MUSIC_STATE_DELAY_1:
music->state = MUSIC_STATE_5;
music->state = MUSIC_STATE_PLAY_NEXT;
break;
case MUSIC_STATE_5:
if (!(music->flags & MUSIC_SETTINGS_FLAG_8)) {
if (music->songID <= AU_SONG_NONE) {
music->state = MUSIC_STATE_0;
case MUSIC_STATE_PLAY_NEXT:
if (!(music->flags & MUSIC_FLAG_POPPING)) {
if (music->requestedSongID <= AU_SONG_NONE) {
// new song is AU_SONG_NONE, play nothing
music->state = MUSIC_STATE_IDLE;
} else {
music->songName = snd_song_load(music->songID, i);
music->songName = snd_song_load(music->requestedSongID, i);
// snd_song_lond may return either songName or an AuResult error code.
// since song names are 4-character big-endian identifiers packed into an s32, we require
// the upper half of the return value to be nonzero for songs which loaded without error.
// this reserves return values from 0 to 0xFFFF for AuResult codes.
if (music->songName > 0xFFFFU) {
if ((music->flags & MUSIC_SETTINGS_FLAG_20)) {
snd_song_set_variation_fade(music->songName, music->variation,
if ((music->flags & MUSIC_FLAG_FADE_IN_NEXT)) {
snd_song_request_fade_in(music->songName, music->variation,
music->fadeInTime, music->fadeStartVolume, music->fadeEndVolume);
music->flags &= ~MUSIC_SETTINGS_FLAG_20;
music->flags &= ~MUSIC_FLAG_FADE_IN_NEXT;
} else {
// if we aren't fading in, just start at the default volume level
bgm_set_target_volume(MusicDefaultVolume);
}
if (snd_song_start_variation(music->songName, music->variation) == 0) {
music->flags |= MUSIC_SETTINGS_FLAG_1;
music->state = MUSIC_STATE_0;
/// @bug this is called even if we are trying to fade in, immediately overriding any fade parameters
if (snd_song_request_play(music->songName, music->variation) == AU_RESULT_OK) {
music->flags |= MUSIC_FLAG_PLAYING;
music->state = MUSIC_STATE_IDLE;
}
}
}
} else {
if (music->flags & MUSIC_SETTINGS_FLAG_10) {
music->state = MUSIC_STATE_0;
music->flags &= ~(MUSIC_SETTINGS_FLAG_10 | MUSIC_SETTINGS_FLAG_8);
} else if (func_80055B28(music->savedSongName) == AU_RESULT_OK) {
music->songID = music->savedSongID;
if (music->flags & MUSIC_FLAG_IGNORE_POP) {
music->state = MUSIC_STATE_IDLE;
music->flags &= ~(MUSIC_FLAG_IGNORE_POP | MUSIC_FLAG_POPPING);
} else if (snd_song_UNK_request_pop(music->savedSongName) == AU_RESULT_OK) {
music->requestedSongID = music->savedSongID;
music->variation = music->savedVariation;
music->songName = music->savedSongName;
music->state = MUSIC_STATE_0;
music->flags |= MUSIC_SETTINGS_FLAG_1;
music->flags &= ~MUSIC_SETTINGS_FLAG_8;
music->state = MUSIC_STATE_IDLE;
music->flags |= MUSIC_FLAG_PLAYING;
music->flags &= ~MUSIC_FLAG_POPPING;
}
}
break;
@ -178,19 +186,18 @@ void bgm_update_music_settings(void) {
}
s32 _bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s16 volume) {
MusicSettings* musicSetting;
MusicControlData* music;
s32 mapSongVariation;
if (gGameStatusPtr->demoState != DEMO_STATE_NONE) {
return 1;
}
musicSetting = &gMusicSettings[playerIndex];
music = &gMusicControlData[playerIndex];
if (!gGameStatusPtr->musicEnabled) {
snd_song_stop(musicSetting->songName);
musicSetting->flags &= ~MUSIC_SETTINGS_FLAG_1;
snd_song_stop(music->songName);
music->flags &= ~MUSIC_FLAG_PLAYING;
return 1;
}
@ -199,47 +206,47 @@ s32 _bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s
variation = mapSongVariation;
}
if (musicSetting->songID == songID && musicSetting->variation == variation) {
if (music->requestedSongID == songID && music->variation == variation) {
bgm_set_target_volume(volume);
if (musicSetting->flags & MUSIC_SETTINGS_FLAG_4) {
func_80055B80(musicSetting->songName);
musicSetting->flags &= ~MUSIC_SETTINGS_FLAG_4;
if (music->flags & MUSIC_FLAG_PUSHING) {
func_80055B80(music->songName);
music->flags &= ~MUSIC_FLAG_PUSHING;
}
return 2;
}
MusicDefaultVolume = volume;
musicSetting->songID = songID;
musicSetting->variation = variation;
musicSetting->fadeOutTime = fadeOutTime;
musicSetting->state = MUSIC_STATE_1;
musicSetting->flags &= ~MUSIC_SETTINGS_FLAG_ENABLE_PROXIMITY_MIX;
music->requestedSongID = songID;
music->variation = variation;
music->fadeOutTime = fadeOutTime;
music->state = MUSIC_STATE_STOP_CURRENT;
music->flags &= ~MUSIC_FLAG_ENABLE_PROX_MIX;
return 1;
}
s32 bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s16 volume) {
gMusicSettings[playerIndex].flags &= ~MUSIC_SETTINGS_FLAG_8;
gMusicControlData[playerIndex].flags &= ~MUSIC_FLAG_POPPING;
return _bgm_set_song(playerIndex, songID, variation, fadeOutTime, volume);
}
s32 bgm_fade_in_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeInTime, s16 fadeStartVolume, s16 fadeEndVolume) {
MusicSettings* musicSetting;
b32 bgm_fade_in_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeInTime, s16 fadeStartVolume, s16 fadeEndVolume) {
MusicControlData* music;
s32 mapSongVariation;
if (gGameStatusPtr->demoState) {
return 1;
return TRUE;
}
musicSetting = &gMusicSettings[playerIndex];
music = &gMusicControlData[playerIndex];
if (!gGameStatusPtr->musicEnabled) {
snd_song_stop(musicSetting->songName);
musicSetting->flags &= ~MUSIC_SETTINGS_FLAG_1;
return 1;
snd_song_stop(music->songName);
music->flags &= ~MUSIC_FLAG_PLAYING;
return TRUE;
}
mapSongVariation = bgm_get_map_default_variation(songID);
@ -247,71 +254,71 @@ s32 bgm_fade_in_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeInTime,
variation = mapSongVariation;
}
musicSetting->fadeInTime = fadeInTime;
musicSetting->fadeStartVolume = fadeStartVolume;
musicSetting->fadeEndVolume = fadeEndVolume;
musicSetting->songID = songID;
musicSetting->variation = variation;
musicSetting->flags |= MUSIC_SETTINGS_FLAG_20;
musicSetting->state = MUSIC_STATE_1;
musicSetting->flags &= ~MUSIC_SETTINGS_FLAG_ENABLE_PROXIMITY_MIX;
music->fadeInTime = fadeInTime;
music->fadeStartVolume = fadeStartVolume;
music->fadeEndVolume = fadeEndVolume;
music->requestedSongID = songID;
music->variation = variation;
music->flags |= MUSIC_FLAG_FADE_IN_NEXT;
music->state = MUSIC_STATE_STOP_CURRENT;
music->flags &= ~MUSIC_FLAG_ENABLE_PROX_MIX;
return 1;
return TRUE;
}
s32 bgm_adjust_proximity(s32 playerIndex, s32 mix, s16 state) {
MusicSettings* musicSetting = &gMusicSettings[playerIndex];
MusicControlData* music = &gMusicControlData[playerIndex];
if (!(musicSetting->flags & MUSIC_SETTINGS_FLAG_1)) {
if (!(music->flags & MUSIC_FLAG_PLAYING)) {
return FALSE;
}
if (!(musicSetting->flags & MUSIC_SETTINGS_FLAG_ENABLE_PROXIMITY_MIX)) {
if (!(music->flags & MUSIC_FLAG_ENABLE_PROX_MIX)) {
return FALSE;
}
switch (state) {
case MUSIC_PROXIMITY_FAR:
snd_song_set_proximity_mix_far(musicSetting->songName, mix);
snd_song_set_proximity_mix_far(music->songName, mix);
break;
case MUSIC_PROXIMITY_NEAR:
snd_song_set_proximity_mix_near(musicSetting->songName, mix);
snd_song_set_proximity_mix_near(music->songName, mix);
break;
case MUSIC_PROXIMITY_FULL:
snd_song_set_proximity_mix_full(musicSetting->songName, mix);
snd_song_set_proximity_mix_full(music->songName, mix);
break;
}
return TRUE;
}
AuResult bgm_set_track_volumes(s32 playerIndex, s16 trackVolSet) {
MusicSettings* musicSetting = &gMusicSettings[playerIndex];
MusicControlData* music = &gMusicControlData[playerIndex];
if (!(musicSetting->flags & MUSIC_SETTINGS_FLAG_1)) {
if (!(music->flags & MUSIC_FLAG_PLAYING)) {
return AU_RESULT_OK;
}
return snd_song_set_track_volumes(musicSetting->songName, trackVolSet);
return snd_song_set_track_volumes(music->songName, trackVolSet);
}
AuResult bgm_clear_track_volumes(s32 playerIndex, s16 trackVolSet) {
MusicSettings* musicSetting = &gMusicSettings[playerIndex];
MusicControlData* music = &gMusicControlData[playerIndex];
if (!(musicSetting->flags & MUSIC_SETTINGS_FLAG_1)) {
if (!(music->flags & MUSIC_FLAG_PLAYING)) {
return AU_RESULT_OK;
}
return snd_song_clear_track_volumes(musicSetting->songName, trackVolSet);
return snd_song_clear_track_volumes(music->songName, trackVolSet);
}
AuResult bgm_set_linked_mode(s32 playerIndex, s16 mode) {
MusicSettings* musicSetting = &gMusicSettings[playerIndex];
MusicControlData* music = &gMusicControlData[playerIndex];
if (!(musicSetting->flags & MUSIC_SETTINGS_FLAG_1)) {
if (!(music->flags & MUSIC_FLAG_PLAYING)) {
return AU_RESULT_OK;
}
return snd_song_set_linked_mode(musicSetting->songName, mode);
return snd_song_set_linked_mode(music->songName, mode);
}
s32 bgm_init_music_players(void) {
@ -358,76 +365,74 @@ void bgm_update_volume(void) {
}
b32 bgm_is_any_song_playing(void) {
MusicSettings* settings = gMusicSettings;
MusicControlData* music = gMusicControlData;
s32 i;
for (i = 0; i < ARRAY_COUNT(gMusicSettings); i++, settings++) {
if (!(settings->flags & MUSIC_SETTINGS_FLAG_1)) {
continue;
}
if (snd_song_is_playing(settings->songName)) {
return TRUE;
for (i = 0; i < ARRAY_COUNT(gMusicControlData); i++, music++) {
if (music->flags & MUSIC_FLAG_PLAYING) {
if (snd_song_is_playing(music->songName)) {
return TRUE;
}
}
}
return FALSE;
}
void bgm_pop_song(void) {
MusicSettings* musicSetting = gMusicSettings;
MusicControlData* music = gMusicControlData;
if (gGameStatusPtr->demoState == DEMO_STATE_NONE) {
musicSetting->flags |= MUSIC_SETTINGS_FLAG_8;
_bgm_set_song(0, musicSetting->savedSongID, musicSetting->savedVariation, 0, VOL_LEVEL_FULL);
music->flags |= MUSIC_FLAG_POPPING;
_bgm_set_song(0, music->savedSongID, music->savedVariation, 0, VOL_LEVEL_FULL);
}
}
void bgm_push_song(s32 songID, s32 variation) {
MusicSettings* musicSetting = gMusicSettings;
MusicControlData* music = gMusicControlData;
if (gGameStatusPtr->demoState == DEMO_STATE_NONE) {
musicSetting->savedSongID = musicSetting->songID;
musicSetting->savedVariation = musicSetting->variation;
musicSetting->savedSongName = musicSetting->songName;
musicSetting->flags |= MUSIC_SETTINGS_FLAG_4;
music->savedSongID = music->requestedSongID;
music->savedVariation = music->variation;
music->savedSongName = music->songName;
music->flags |= MUSIC_FLAG_PUSHING;
bgm_set_song(0, songID, variation, 500, VOL_LEVEL_FULL);
}
}
void bgm_pop_battle_song(void) {
MusicSettings* musicSetting = gMusicSettings;
MusicControlData* music = gMusicControlData;
if (gGameStatusPtr->demoState == DEMO_STATE_NONE) {
if (gOverrideFlags & GLOBAL_OVERRIDES_DONT_RESUME_SONG_AFTER_BATTLE) {
gOverrideFlags &= ~GLOBAL_OVERRIDES_DONT_RESUME_SONG_AFTER_BATTLE;
} else {
musicSetting->flags |= MUSIC_SETTINGS_FLAG_8;
_bgm_set_song(0, musicSetting->savedSongID, musicSetting->savedVariation, 0, VOL_LEVEL_FULL);
music->flags |= MUSIC_FLAG_POPPING;
_bgm_set_song(0, music->savedSongID, music->savedVariation, 0, VOL_LEVEL_FULL);
snd_ambient_resume(0, 250);
}
}
}
void bgm_push_battle_song(void) {
MusicSettings* musicSetting = gMusicSettings;
MusicControlData* music = gMusicControlData;
if (gGameStatusPtr->demoState == DEMO_STATE_NONE) {
if (!(gOverrideFlags & GLOBAL_OVERRIDES_DONT_RESUME_SONG_AFTER_BATTLE)) {
snd_ambient_pause(0, 250);
musicSetting->savedSongID = musicSetting->songID;
musicSetting->savedVariation = musicSetting->variation;
musicSetting->savedSongName = musicSetting->songName;
musicSetting->flags |= MUSIC_SETTINGS_FLAG_4;
bgm_set_song(0, musicSetting->battleSongID, musicSetting->battleVariation, 500, VOL_LEVEL_FULL);
music->savedSongID = music->requestedSongID;
music->savedVariation = music->variation;
music->savedSongName = music->songName;
music->flags |= MUSIC_FLAG_PUSHING;
bgm_set_song(0, music->battleSongID, music->battleVariation, 500, VOL_LEVEL_FULL);
}
}
}
void bgm_set_battle_song(s32 songID, s32 variation) {
MusicSettings* musicSetting = gMusicSettings;
MusicControlData* music = gMusicControlData;
musicSetting->battleSongID = songID;
musicSetting->battleVariation = variation;
music->battleSongID = songID;
music->battleVariation = variation;
}
void bgm_NOOP(void) {

View File

@ -132,7 +132,7 @@ BGMPlayer* au_bgm_get_player_with_song_name(s32 songString) {
return NULL;
}
AuResult au_bgm_dispatch_player_event(SongUpdateEventA* event) {
AuResult au_bgm_process_init_song(SongUpdateRequestA* request) {
BGMPlayer* player;
BGMFileInfo* fileInfo;
s32 songName;
@ -144,13 +144,14 @@ AuResult au_bgm_dispatch_player_event(SongUpdateEventA* event) {
u32 i;
status = AU_RESULT_OK;
songName = event->songName;
variation = event->variation;
songName = request->songName;
variation = request->variation;
if (songName != 0) {
player = au_bgm_get_player_with_song_name(songName);
if (player != NULL) {
fileInfo = &player->bgmFile->info;
duration = event->duration;
duration = request->duration;
if (duration != 0) {
if (duration > SND_MAX_DURATION) {
duration = SND_MAX_DURATION;
@ -158,14 +159,14 @@ AuResult au_bgm_dispatch_player_event(SongUpdateEventA* event) {
duration = SND_MIN_DURATION;
}
}
volume0 = event->startVolume;
volume0 = request->startVolume;
if (volume0 > AU_MAX_VOLUME_8) {
volume0 = AU_MAX_VOLUME_8;
}
if (volume0 != 0) {
volume0 = AU_VOL_8_TO_16(volume0);
}
volume1 = event->finalVolume;
volume1 = request->finalVolume;
if (volume1 > AU_MAX_VOLUME_8) {
volume1 = AU_MAX_VOLUME_8;
}
@ -203,6 +204,7 @@ AuResult au_bgm_dispatch_player_event(SongUpdateEventA* event) {
player->drumsInfo = NULL;
player->bgmDrumCount = 0;
}
if (fileInfo->instruments != 0) {
player->instrumentsInfo = AU_FILE_RELATIVE(player->bgmFile, fileInfo->instruments << 2);
player->bgmInstrumentCount = fileInfo->instrumentCount;
@ -210,6 +212,7 @@ AuResult au_bgm_dispatch_player_event(SongUpdateEventA* event) {
player->instrumentsInfo = NULL;
player->bgmInstrumentCount = 0;
}
player->songName = songName;
au_bgm_player_initialize(player);
} else {
@ -281,12 +284,12 @@ b32 au_bgm_player_is_active(BGMPlayer* player) {
}
}
AuResult func_8004DB4C(SongUpdateEventB* s) {
AuResult au_bgm_process_fade_out(SongUpdateRequestB* request) {
AuResult status;
BGMPlayer* player;
u32 songName = s->songName;
u32 duration = s->duration;
s16 volume = s->finalVolume;
u32 songName = request->songName;
u32 duration = request->duration;
s16 volume = request->finalVolume;
status = AU_RESULT_OK;
if (songName != 0) {
@ -295,12 +298,12 @@ AuResult func_8004DB4C(SongUpdateEventB* s) {
if (player != NULL) {
if (player->songName == songName) {
if (player->masterState != BGM_PLAY_STATE_IDLE) {
if (!player->unk_220) {
if (!player->paused) {
player->fadeInfo.baseTarget = volume;
player->fadeInfo.baseTicks = (duration * 1000) / AU_FRAME_USEC;
player->fadeInfo.baseStep = ((volume << 0x10) - player->fadeInfo.baseVolume) / player->fadeInfo.baseTicks;
player->fadeInfo.onCompleteCallback = s->callback;
if (s->unk_14 == 1) {
player->fadeInfo.onCompleteCallback = request->callback;
if (request->onPush == 1) {
player->fadeSongName = songName;
}
}
@ -319,19 +322,19 @@ AuResult func_8004DB4C(SongUpdateEventB* s) {
}
AuResult func_8004DC80(s32 songName) {
SongUpdateEventC s;
SongUpdateRequestC s;
s.songName = songName;
s.duration = 0;
s.startVolume = 0;
s.finalVolume = 0;
s.index = 0;
s.unk_14 = 0;
s.index = MUSIC_CROSS_FADE;
s.pauseMode = FALSE;
return func_8004DCB8(&s, 0);
return au_bgm_process_suspend(&s, 0);
}
AuResult func_8004DCB8(SongUpdateEventC* update, s32 clearChanged) {
AuResult au_bgm_process_suspend(SongUpdateRequestC* request, s32 clearChanged) {
AuResult status;
BGMPlayer* playerA;
BGMPlayer* playerB;
@ -340,29 +343,29 @@ AuResult func_8004DCB8(SongUpdateEventC* update, s32 clearChanged) {
u32 i;
u32 j;
songName = update->songName;
index = update->index;
songName = request->songName;
index = request->index;
status = AU_RESULT_OK;
if (songName != 0) {
playerA = au_bgm_get_player_with_song_name(songName);
if (playerA != NULL) {
if (update->unk_14 == 0) {
playerB = au_unk_80053F64(index);
if (!request->pauseMode) {
playerB = au_unk_get_temp_player_for_index(index);
if (playerB != NULL) {
if (songName == playerA->songName) {
if (!clearChanged) {
for (i = 0; i < ARRAY_COUNT(playerA->tracks); i++) {
BGMPlayerTrack* track = &playerA->tracks[i];
if (track->bgmReadPos != 0) {
if (track->bgmReadPos != NULL) {
for (j = track->firstVoice; j < track->lastVoice; j++) {
track->changed.all = 0;
}
}
}
}
playerA->globals->unk_globals_6C[index].unk_5 = playerA->priority;
playerA->globals->unk_globals_6C[index].unk_4 = 1;
playerA->globals->unk_globals_6C[index].priority = playerA->priority;
playerA->globals->unk_globals_6C[index].assigned = 1;
playerA->fadeSongName = 0;
au_copy_words(playerA, playerB, sizeof(*playerA));
if (clearChanged == 0) {
@ -375,7 +378,7 @@ AuResult func_8004DCB8(SongUpdateEventC* update, s32 clearChanged) {
} else {
if (songName == playerA->songName) {
if (playerA->masterState != BGM_PLAY_STATE_IDLE) {
playerA->unk_220 = TRUE;
playerA->paused = TRUE;
au_bgm_reset_all_voices(playerA);
}
}
@ -389,7 +392,7 @@ AuResult func_8004DCB8(SongUpdateEventC* update, s32 clearChanged) {
return status;
}
AuResult func_8004DE2C(SongUpdateEventE* update) {
AuResult au_bgm_process_resume(SongUpdateRequestE* request) {
AuResult status;
BGMPlayer* playerA;
BGMPlayer* playerB;
@ -399,19 +402,19 @@ AuResult func_8004DE2C(SongUpdateEventE* update) {
s32 volume1;
s32 duration;
songName = update->songName;
index = update->index;
songName = request->songName;
index = request->index;
status = AU_RESULT_OK;
if (songName != 0) {
if (update->unk_14 == 0) {
playerA = au_unk_80053F64(index);
if (playerA != NULL && playerA->globals->unk_globals_6C[index].unk_4 == 1) {
playerB = au_unk_80054248(playerA->globals->unk_globals_6C[index].unk_5);
if (!request->pauseMode) {
playerA = au_unk_get_temp_player_for_index(index);
if (playerA != NULL && playerA->globals->unk_globals_6C[index].assigned == 1) {
playerB = au_get_client_by_priority(playerA->globals->unk_globals_6C[index].priority);
if (playerB != NULL) {
if (!au_bgm_player_is_active(playerB)) {
status = au_unk_80053E58(playerA->songID, playerA->bgmFile);
duration = update->duration;
duration = request->duration;
if (duration != 0) {
if (duration > SND_MAX_DURATION) {
duration = SND_MAX_DURATION;
@ -419,14 +422,14 @@ AuResult func_8004DE2C(SongUpdateEventE* update) {
duration = SND_MIN_DURATION;
}
}
volume0 = update->startVolume;
volume0 = request->startVolume;
if (volume0 > AU_MAX_VOLUME_8) {
volume0 = AU_MAX_VOLUME_8;
}
if (volume0 != 0) {
volume0 = AU_VOL_8_TO_16(volume0);
}
volume1 = update->finalVolume;
volume1 = request->finalVolume;
if (volume1 > AU_MAX_VOLUME_8) {
volume1 = AU_MAX_VOLUME_8;
}
@ -455,8 +458,8 @@ AuResult func_8004DE2C(SongUpdateEventE* update) {
playerB = au_bgm_get_player_with_song_name(songName);
if (playerB != NULL) {
if (songName == playerB->songName) {
if (playerB->unk_220) {
playerB->unk_220 = FALSE;
if (playerB->paused) {
playerB->paused = FALSE;
}
}
}
@ -499,14 +502,14 @@ void func_8004DFD4(AuGlobals* globals) {
globals->unk_80 = 0;
}
AuResult au_bgm_adjust_volume(SongUpdateEventA* update) {
AuResult au_bgm_adjust_volume(SongUpdateRequestA* request) {
BGMPlayer* player;
AuResult status = AU_RESULT_OK;
if (update->songName != 0) {
player = au_bgm_get_player_with_song_name(update->songName);
if (request->songName != 0) {
player = au_bgm_get_player_with_song_name(request->songName);
if (player != NULL) {
au_unk_80053B04(&player->fadeInfo, update->duration, update->finalVolume);
au_fade_calc_envelope(&player->fadeInfo, request->duration, request->finalVolume);
}
else {
status = AU_ERROR_SONG_NOT_PLAYING;
@ -542,7 +545,7 @@ void au_bgm_player_init(BGMPlayer* player, s32 priority, s32 busID, AuGlobals* g
player->masterVolumeStep = 0;
player->masterPitchShift = 0;
player->detune = 0;
player->unk_220 = FALSE;
player->paused = FALSE;
player->trackVolsConfig = NULL;
player->bFadeConfigSetsVolume = FALSE;
player->masterState = BGM_PLAY_STATE_IDLE;
@ -591,7 +594,7 @@ void au_bgm_player_init(BGMPlayer* player, s32 priority, s32 busID, AuGlobals* g
note->pendingTick = FALSE;
}
au_fade_set_vol_scale(&player->fadeInfo, AU_MAX_VOLUME_16);
au_fade_set_envelope(&player->fadeInfo, AU_MAX_VOLUME_16);
snd_bgm_clear_legacy_commands(player);
}
@ -667,7 +670,7 @@ s32 au_bgm_player_audio_frame_update(BGMPlayer* player) {
hasMore = FALSE;
break;
case BGM_PLAY_STATE_ACTIVE:
if (!player->unk_220) {
if (!player->paused) {
au_bgm_player_update_playing(player);
if (player->masterState == BGM_PLAY_STATE_ACTIVE) {
hasMore = FALSE;
@ -789,7 +792,7 @@ void au_bgm_player_initialize(BGMPlayer* player) {
player->effectValues[i] = 0;
}
player->unk_220 = FALSE;
player->paused = FALSE;
player->songPlayingCounter = 0;
for (i = 0; i < ARRAY_COUNT(player->compLoopStartLabels); i++) {
player->compLoopStartLabels[i] = player->compReadPos;
@ -990,7 +993,7 @@ void au_bgm_load_phrase(BGMPlayer* player, u32 cmd) {
void au_bgm_player_update_stop(BGMPlayer* player) {
s32 i;
player->unk_220 = FALSE;
player->paused = FALSE;
player->songName = 0;
player->fadeSongName = 0;
player->unk_58 = FALSE;
@ -2053,7 +2056,7 @@ void au_bgm_reset_all_voices(BGMPlayer* player) {
}
}
AuResult au_bgm_set_linked_tracks(SongUpdateEventD* update) {
AuResult au_bgm_set_linked_tracks(SongUpdateRequestD* request) {
BGMPlayer* player;
BGMPlayerTrack* track;
BGMPlayerTrack* linkTrack;
@ -2062,8 +2065,8 @@ AuResult au_bgm_set_linked_tracks(SongUpdateEventD* update) {
s32 voiceIdx;
s8 oldVolume;
s32 songName = update->songName;
s32 linkIndex = update->mode;
s32 songName = request->songName;
s32 linkIndex = request->mode;
AuResult status = AU_RESULT_OK;
if (songName != 0) {

View File

@ -52,17 +52,17 @@ void au_fade_clear(Fade* fade);
void au_fade_update(Fade* fade);
void au_fade_set_volume(u8 arg0, u16 arg1, s32 arg2);
void au_fade_flush(Fade* fade);
void au_fade_set_vol_scale(Fade* fade, s16 value);
void au_unk_80053B04(Fade* fade, u32 arg1, s32 target);
void au_fade_set_envelope(Fade* fade, s16 value);
void au_fade_calc_envelope(Fade* fade, u32 arg1, s32 target);
void au_fade_update_envelope(Fade* fade);
Instrument* au_get_instrument(AuGlobals* globals, BankSetIndex bank, s32 patch, EnvelopeData* arg3);
void au_get_bgm_player_and_file(u32 playerIndex, BGMHeader** outCurrentTrackData, BGMPlayer** outPlayer);
void au_get_bgm_player(u32 playerIndex, BGMPlayer** outPlayer);
AuResult au_load_song_files(u32 arg0, BGMHeader* arg1, BGMPlayer* arg2);
AuResult au_unk_80053E58(s32 songID, BGMHeader* arg1);
BGMPlayer* au_unk_80053F64(s32 arg0);
BGMPlayer* au_unk_get_temp_player_for_index(s32 arg0);
AuResult au_ambient_load(u32 arg0);
BGMPlayer* au_unk_80054248(u8 arg0);
BGMPlayer* au_get_client_by_priority(u8 arg0);
void au_load_INIT(AuGlobals* arg0, s32 romAddr, ALHeap* heap);
AuResult au_fetch_SBN_file(u32 fileIdx, AuFileFormat format, SBNFileEntry* arg2);
void au_load_PER(AuGlobals* globals, s32 romAddr);

View File

@ -78,8 +78,8 @@ void au_engine_init(s32 outputRate) {
globals->audioThreadCallbacks[1] = NULL;
for (i = 0; i < ARRAY_COUNT(globals->unk_globals_6C); i++) {
globals->unk_globals_6C[i].unk_4 = 0;
globals->unk_globals_6C[i].unk_5 = 0;
globals->unk_globals_6C[i].assigned = 0;
globals->unk_globals_6C[i].priority = 0;
}
for (i = 0; i < ARRAY_COUNT(globals->effectChanges); i++) {
@ -460,14 +460,14 @@ void au_fade_flush(Fade* fade) {
}
}
void au_fade_set_vol_scale(Fade* fade, s16 value) {
void au_fade_set_envelope(Fade* fade, s16 value) {
fade->envelopeVolume = value << 16;
fade->envelopeTarget = value;
fade->envelopeTicks = 0;
fade->envelopeStep = 0;
}
void au_unk_80053B04(Fade* fade, u32 duration, s32 target) {
void au_fade_calc_envelope(Fade* fade, u32 duration, s32 target) {
s16 ticks;
s32 delta;
@ -619,23 +619,25 @@ AuResult au_unk_80053E58(s32 songID, BGMHeader* bgmFile) {
SBNFileEntry fileEntry;
SBNFileEntry sbnEntry;
SBNFileEntry* bkFileEntry;
AuGlobals* soundData;
AuGlobals* globals;
InitSongEntry* songInfo;
s32 i;
u16 bkFileIndex;
soundData = gSoundGlobals;
songInfo = &soundData->songList[songID];
status = au_fetch_SBN_file(songInfo[0].bgmFileIndex, AU_FMT_BGM, &sbnEntry);
globals = gSoundGlobals;
songInfo = &globals->songList[songID];
status = au_fetch_SBN_file(songInfo->bgmFileIndex, AU_FMT_BGM, &sbnEntry);
if (status == AU_RESULT_OK) {
// load BGM file
au_read_rom(sbnEntry.offset, bgmFile, sbnEntry.data & 0xFFFFFF);
// load any auxiliary banks required by this BGM
for (i = 0; i < ARRAY_COUNT(songInfo->bkFileIndex); i++) {
bkFileIndex = songInfo->bkFileIndex[i];
if (bkFileIndex != 0) {
bkFileEntry = &soundData->sbnFileList[bkFileIndex];
bkFileEntry = &globals->sbnFileList[bkFileIndex];
fileEntry.offset = (bkFileEntry->offset & 0xFFFFFF) + soundData->baseRomOffset;
fileEntry.offset = (bkFileEntry->offset & 0xFFFFFF) + globals->baseRomOffset;
fileEntry.data = bkFileEntry->data;
if ((fileEntry.data >> 0x18) == AU_FMT_BK) {
@ -650,9 +652,9 @@ AuResult au_unk_80053E58(s32 songID, BGMHeader* bgmFile) {
return status;
}
BGMPlayer* au_unk_80053F64(s32 variation) {
if (variation == 0) {
return gSoundGlobals->unk_globals_6C[0].bgmPlayer;
BGMPlayer* au_unk_get_temp_player_for_index(s32 index) {
if (index == MUSIC_CROSS_FADE) {
return gSoundGlobals->unk_globals_6C[MUSIC_CROSS_FADE].bgmPlayer;
}
return NULL;
}
@ -726,13 +728,13 @@ AuResult au_ambient_load(u32 ambSoundID) {
return AU_RESULT_OK;
}
BGMPlayer* au_unk_80054248(u8 arg0) {
switch (arg0) {
case 1:
BGMPlayer* au_get_client_by_priority(u8 priority) {
switch (priority) {
case AU_PRIORITY_BGM_PLAYER_MAIN:
return gBGMPlayerA;
case 2:
case AU_PRIORITY_BGM_PLAYER_AUX:
return gBGMPlayerB;
case 4:
case AU_PRIORITY_SFX_MANAGER:
return (BGMPlayer*)gSoundManager; // TODO: why return pointer to SoundManager?
default:
return NULL;

View File

@ -48,17 +48,17 @@ s16 au_sfx_manager_audio_frame_update(SoundManager* manager);
// ----------------------------------------------------------------------------------
void au_bgm_begin_video_frame(BGMPlayer* player);
BGMPlayer* au_bgm_get_player_with_song_name(s32 songString);
AuResult au_bgm_dispatch_player_event(SongUpdateEventA* event);
AuResult au_bgm_process_init_song(SongUpdateRequestA* event);
AuResult au_bgm_stop_song(s32 songName);
void au_bgm_stop_all(void);
AuResult au_bgm_is_song_playing(s32 songName);
b32 au_bgm_player_is_active(BGMPlayer* player);
AuResult func_8004DB4C(SongUpdateEventB* s);
AuResult au_bgm_process_fade_out(SongUpdateRequestB* s);
AuResult func_8004DC80(s32 songName);
AuResult func_8004DCB8(SongUpdateEventC* update, s32 clearChanged);
AuResult func_8004DE2C(SongUpdateEventE* update);
AuResult au_bgm_process_suspend(SongUpdateRequestC* update, s32 clearChanged);
AuResult au_bgm_process_resume(SongUpdateRequestE* update);
void func_8004DFD4(AuGlobals* globals);
AuResult au_bgm_adjust_volume(SongUpdateEventA* update);
AuResult au_bgm_adjust_volume(SongUpdateRequestA* update);
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_update_fade(BGMPlayer* player);
@ -107,7 +107,7 @@ void au_bgm_change_track_volume(BGMPlayer* player, s32 trackIdx, s16 arg2, u8 ar
void au_bgm_set_track_volumes(BGMPlayer* player, u8* arg1, s32 arg2);
void au_bgm_set_prox_mix_fade(BGMPlayer* player, BGMPlayerTrack* track, s32 target, s32 duration);
void au_bgm_reset_all_voices(BGMPlayer* player);
AuResult au_bgm_set_linked_tracks(SongUpdateEventD* arg0);
AuResult au_bgm_set_linked_tracks(SongUpdateRequestD* arg0);
// ----------------------------------------------------------------------------------
// snd_interface.c
@ -140,20 +140,20 @@ void snd_ambient_radio_setup(s32 arg0);
AuResult snd_ambient_radio_stop(s32 arg0);
AuResult snd_ambient_radio_select(s32 arg0);
AuResult snd_song_load(s32 songID, s32 playerIndex);
AuResult snd_song_start_default(s32 songName);
AuResult snd_song_start_variation(s32 songName, s32 variation);
AuResult snd_song_request_play_default(s32 songName);
AuResult snd_song_request_play(s32 songName, s32 variation);
AuResult snd_song_stop(s32 songName);
void snd_song_stop_all(void);
AuResult snd_song_is_playing(s32 songName);
AuResult snd_song_set_variation_fade(s32 songName, s32 variation, s32 fadeInTime, s32 startVolume, s32 endVolume);
AuResult snd_song_set_default_fade(s32 songName, s32 fadeInTime, s32 startVolume, s32 endVolume);
AuResult snd_song_set_variation_fade_time(s32 songName, s32 fadeTime, AuCallback callback);
AuResult func_80055AF0(s32 songName);
AuResult func_80055B28(s32 songName);
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_out(s32 songName, s32 fadeTime, AuCallback callback);
AuResult snd_song_UNK_push_stop(s32 songName);
AuResult snd_song_UNK_request_pop(s32 songName);
AuResult func_80055B80(s32 songName);
AuResult func_80055BB8(s32 songName, s32 fadeTime);
AuResult func_80055BF0(s32 songName);
AuResult func_80055C2C(s32 songName);
AuResult snd_song_UNK_request_push_fade_out(s32 songName, s32 fadeTime);
AuResult snd_song_request_pause(s32 songName);
AuResult snd_song_request_unpause(s32 songName);
AuResult snd_song_set_volume_quiet(s32 songName);
AuResult snd_song_set_volume_full(s32 songName);
AuResult snd_song_set_linked_mode(s32 songName, s32 mode);

View File

@ -31,21 +31,22 @@ AuResult snd_ambient_enable(s32 arg0);
void snd_ambient_radio_setup(s32 arg0);
AuResult snd_ambient_radio_stop(s32 arg0);
AuResult snd_ambient_radio_select(s32 arg0);
/// return value may be either an AuResult error code OR a valid songName
AuResult snd_song_load(s32 songID, s32 playerIndex);
AuResult snd_song_start_default(s32 songName);
AuResult snd_song_start_variation(s32 songName, s32 variation);
AuResult snd_song_request_play_default(s32 songName);
AuResult snd_song_request_play(s32 songName, s32 variation);
AuResult snd_song_stop(s32 songName);
void snd_song_stop_all(void);
AuResult snd_song_is_playing(s32 songName);
AuResult snd_song_set_variation_fade(s32 songName, s32 variation, s32 fadeInTime, s32 startVolume, s32 endVolume);
AuResult snd_song_set_default_fade(s32 songName, s32 fadeInTime, s32 startVolume, s32 endVolume);
AuResult snd_song_set_variation_fade_time(s32 songName, s32 fadeTime, AuCallback callback);
AuResult func_80055AF0(s32 songName);
AuResult func_80055B28(s32 songName);
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_out(s32 songName, s32 fadeTime, AuCallback callback);
AuResult snd_song_UNK_push_stop(s32 songName);
AuResult snd_song_UNK_request_pop(s32 songName);
AuResult func_80055B80(s32 songName);
AuResult func_80055BB8(s32 songName, s32 fadeTime);
AuResult func_80055BF0(s32 songName);
AuResult func_80055C2C(s32 songName);
AuResult snd_song_UNK_request_push_fade_out(s32 songName, s32 fadeTime);
AuResult snd_song_request_pause(s32 songName);
AuResult snd_song_request_unpause(s32 songName);
AuResult snd_song_set_volume_quiet(s32 songName);
AuResult snd_song_set_volume_full(s32 songName);
AuResult snd_song_set_linked_mode(s32 songName, s32 mode);
@ -89,9 +90,9 @@ s32 bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s1
void bgm_set_battle_song(s32, s32);
void bgm_push_battle_song(void);
s32 bgm_adjust_proximity(s32 playerIndex, s32 arg1, s16 arg2);
s32 bgm_fade_in_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeInTime, s16 arg4, s16 arg5);
b32 bgm_fade_in_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeInTime, s16 arg4, s16 arg5);
void bgm_update_music_settings(void);
void bgm_update_music_control(void);
b32 bgm_is_any_song_playing(void);
void bgm_reset_sequence_players(void);
void bgm_pop_song(void);

View File

@ -4,7 +4,11 @@
static u8* snd_song_get_track_volumes_set(MusicTrackVols arg0);
/// While TRUE, the audio thread skips BGM player updates.
/// Used by the game thread to lock out BGM updates while modifying player state,
/// to prevent race conditions.
s32 PreventBGMPlayerUpdate = FALSE;
u16 SoundEngineReady = 0;
u16 AmbienceRadioChannel = 0;
@ -126,7 +130,7 @@ void snd_legacy_sound_dispatch(u32 id) {
s32 filename = snd_song_load((id >> 4) & 0xFF, 0);
if (filename > ASCII_TO_U32('0', ' ', ' ', '\0')) {
snd_song_start_variation(filename, (id >> 0xC) & 3);
snd_song_request_play(filename, (id >> 0xC) & 3);
}
}
break;
@ -135,7 +139,7 @@ void snd_legacy_sound_dispatch(u32 id) {
}
/// Part of an unused system for inter-thread communication with a BGM player using commands.
/// Use functions in bgm_control to manipualte gMusicSettings instead.
/// Use functions in bgm_control to manipualte gMusicControlData instead.
void snd_bgm_clear_legacy_commands(BGMPlayer* player) {
s32 i;
@ -151,7 +155,7 @@ void snd_bgm_clear_legacy_commands(BGMPlayer* player) {
/// Unused
/// Part of an unused system for inter-thread communication with a BGM player using commands.
/// Use functions in bgm_control to manipualte gMusicSettings instead.
/// Use functions in bgm_control to manipualte gMusicControlData instead.
void snd_bgm_enqueue_legacy_command(u32 cmd) {
BGMPlayer* player = NULL;
u32 playerID = cmd & 0xF;
@ -454,26 +458,28 @@ AuResult snd_song_load(s32 songID, s32 playerIndex) {
}
}
AuResult snd_song_start_default(s32 songName) {
/// Unused -- snd_song_request_play but always uses BGM_VARIATION_0
AuResult snd_song_request_play_default(s32 songName) {
AuResult status;
SongUpdateEventA s;
SongUpdateRequestA s;
PreventBGMPlayerUpdate = TRUE;
s.songName = songName;
s.duration = 0;
s.startVolume = AU_MAX_VOLUME_8;
s.finalVolume = AU_MAX_VOLUME_8;
s.variation = 0;
s.variation = BGM_VARIATION_0;
s.unk_14 = 0;
status = au_bgm_dispatch_player_event(&s);
status = au_bgm_process_init_song(&s);
PreventBGMPlayerUpdate = FALSE;
return status;
}
AuResult snd_song_start_variation(s32 songName, s32 variation) {
/// Called from bgm_control to start playing a particular song + variation
AuResult snd_song_request_play(s32 songName, s32 variation) {
AuResult status;
SongUpdateEventA s;
SongUpdateRequestA s;
PreventBGMPlayerUpdate = TRUE;
s.songName = songName;
@ -482,7 +488,7 @@ AuResult snd_song_start_variation(s32 songName, s32 variation) {
s.finalVolume = AU_MAX_VOLUME_8;
s.variation = variation;
s.unk_14 = 0;
status = au_bgm_dispatch_player_event(&s);
status = au_bgm_process_init_song(&s);
PreventBGMPlayerUpdate = FALSE;
return status;
@ -500,9 +506,10 @@ AuResult snd_song_is_playing(s32 songName) {
return au_bgm_is_song_playing(songName);
}
AuResult snd_song_set_variation_fade(s32 songName, s32 variation, s32 fadeInTime, s32 startVolume, s32 endVolume) {
/// Called from bgm_control to fade in a particular song + variation
AuResult snd_song_request_fade_in(s32 songName, s32 variation, s32 fadeInTime, s32 startVolume, s32 endVolume) {
AuResult status;
SongUpdateEventA s;
SongUpdateRequestA s;
PreventBGMPlayerUpdate = TRUE;
s.songName = songName;
@ -511,15 +518,16 @@ AuResult snd_song_set_variation_fade(s32 songName, s32 variation, s32 fadeInTime
s.finalVolume = endVolume;
s.variation = variation;
s.unk_14 = 0;
status = au_bgm_dispatch_player_event(&s);
status = au_bgm_process_init_song(&s);
PreventBGMPlayerUpdate = FALSE;
return status;
}
AuResult snd_song_set_default_fade(s32 songName, s32 fadeInTime, s32 startVolume, s32 endVolume) {
/// Unused
AuResult snd_song_request_fade_in_default(s32 songName, s32 fadeInTime, s32 startVolume, s32 endVolume) {
AuResult status;
SongUpdateEventA s;
SongUpdateRequestA s;
PreventBGMPlayerUpdate = TRUE;
s.songName = songName;
@ -528,109 +536,109 @@ AuResult snd_song_set_default_fade(s32 songName, s32 fadeInTime, s32 startVolume
s.finalVolume = endVolume;
s.variation = 0;
s.unk_14 = 0;
status = au_bgm_dispatch_player_event(&s);
status = au_bgm_process_init_song(&s);
PreventBGMPlayerUpdate = FALSE;
return status;
}
AuResult snd_song_set_variation_fade_time(s32 songName, s32 fadeTime, AuCallback callback) {
SongUpdateEventB s;
AuResult snd_song_request_fade_out(s32 songName, s32 fadeTime, AuCallback callback) {
SongUpdateRequestB s;
s.songName = songName;
s.duration = fadeTime;
s.unk_08 = 0;
s.finalVolume = 0;
s.callback = callback;
s.unk_14 = 0;
s.onPush = 0;
return func_8004DB4C(&s);
return au_bgm_process_fade_out(&s);
}
AuResult func_80055AF0(s32 songName) {
SongUpdateEventC s;
AuResult snd_song_UNK_push_stop(s32 songName) {
SongUpdateRequestC s;
s.songName = songName;
s.duration = 0;
s.startVolume = 0;
s.finalVolume = 0;
s.index = 0;
s.unk_14 = 0;
s.index = MUSIC_CROSS_FADE;
s.pauseMode = FALSE;
return func_8004DCB8(&s, 0);
return au_bgm_process_suspend(&s, 0);
}
AuResult func_80055B28(s32 songName) {
AuResult snd_song_UNK_request_pop(s32 songName) {
AuResult status;
SongUpdateEventE s;
SongUpdateRequestE s;
PreventBGMPlayerUpdate = TRUE;
s.songName = songName;
s.duration = 2000;
s.startVolume = 1;
s.finalVolume = AU_MAX_VOLUME_8;
s.index = 0;
s.unk_14 = 0;
status = func_8004DE2C(&s);
s.index = MUSIC_CROSS_FADE;
s.pauseMode = FALSE;
status = au_bgm_process_resume(&s);
PreventBGMPlayerUpdate = FALSE;
return status;
}
AuResult func_80055B80(s32 songName) {
SongUpdateEventC s;
SongUpdateRequestC s;
s.songName = songName;
s.duration = 0;
s.startVolume = 0;
s.finalVolume = 0;
s.index = 0;
s.unk_14 = 0;
s.index = MUSIC_CROSS_FADE;
s.pauseMode = FALSE;
return func_8004DCB8(&s, 1);
return au_bgm_process_suspend(&s, 1);
}
AuResult func_80055BB8(s32 songName, s32 fadeTime) {
SongUpdateEventB s;
AuResult snd_song_UNK_request_push_fade_out(s32 songName, s32 fadeTime) {
SongUpdateRequestB s;
s.songName = songName;
s.duration = fadeTime;
s.unk_08 = 0;
s.finalVolume = 0;
s.callback = NULL;
s.unk_14 = 1;
s.onPush = 1;
return func_8004DB4C(&s);
return au_bgm_process_fade_out(&s);
}
AuResult func_80055BF0(s32 songName) {
SongUpdateEventC s;
AuResult snd_song_request_pause(s32 songName) {
SongUpdateRequestC s;
s.songName = songName;
s.duration = 0;
s.startVolume = 0;
s.finalVolume = 0;
s.index = 0;
s.unk_14 = 1;
s.index = MUSIC_CROSS_FADE;
s.pauseMode = TRUE;
return func_8004DCB8(&s, 0);
return au_bgm_process_suspend(&s, 0);
}
AuResult func_80055C2C(s32 songName) {
SongUpdateEventE s;
AuResult snd_song_request_unpause(s32 songName) {
SongUpdateRequestE s;
s.songName = songName;
s.duration = 0;
s.startVolume = 0;
s.finalVolume = 0;
s.index = 0;
s.unk_14 = 1;
s.index = MUSIC_CROSS_FADE;
s.pauseMode = TRUE;
return func_8004DE2C(&s);
return au_bgm_process_resume(&s);
}
AuResult snd_song_set_volume_quiet(s32 songName) {
SongUpdateEventA s;
SongUpdateRequestA s;
s.songName = songName;
s.duration = 500;
@ -640,7 +648,7 @@ AuResult snd_song_set_volume_quiet(s32 songName) {
}
AuResult snd_song_set_volume_full(s32 songName) {
SongUpdateEventA s;
SongUpdateRequestA s;
s.songName = songName;
s.duration = 500;
@ -650,7 +658,7 @@ AuResult snd_song_set_volume_full(s32 songName) {
}
AuResult snd_song_set_linked_mode(s32 songName, s32 mode) {
SongUpdateEventD s;
SongUpdateRequestD s;
s.songName = songName;
s.mode = mode;

View File

@ -16,7 +16,7 @@ typedef struct {
/* 0xC */ s32 unkC;
} AmbientSoundSettings;
BSS MusicSettings gMusicSettings[2];
BSS MusicControlData gMusicControlData[2];
BSS IMG_BIN D_80159B50[0x200];
BSS Window gWindows[64];
BSS CollisionStatus gCollisionStatus;

View File

@ -114,7 +114,7 @@ API_CALLABLE(EnableMusicProximityMix) {
Bytecode* args = script->ptrReadPos;
s32 playerIndex = evt_get_variable(script, *args++);
gMusicSettings[playerIndex].flags |= MUSIC_SETTINGS_FLAG_ENABLE_PROXIMITY_MIX;
gMusicControlData[playerIndex].flags |= MUSIC_FLAG_ENABLE_PROX_MIX;
return ApiStatus_DONE2;
}

View File

@ -90,7 +90,7 @@ void step_game_loop(void) {
step_current_game_mode();
update_entities();
func_80138198();
bgm_update_music_settings();
bgm_update_music_control();
update_ambient_sounds();
sfx_update_env_sound_params();
update_windows();

View File

@ -381,7 +381,7 @@ API_CALLABLE(N(SavePhonographUpdateScriptIDs)) {
data->updateScaleScriptID = evt_get_variable(NULL, MV_UpdateScaleScript);
data->updateCrankScriptID = evt_get_variable(NULL, MV_UpdateCrankScript);
data->updateRecordScriptID = evt_get_variable(NULL, MV_UpdateRecordScript);
data->songName = gMusicSettings->songName;
data->songName = gMusicControlData->songName;
return ApiStatus_DONE2;
}

View File

@ -309,7 +309,7 @@ sfx_clear_sounds = 0x8014E6C8;
sfx_update_env_sound_params = 0x8014E7E4;
sfx_stop_env_sounds = 0x8014E8E8;
bgm_reset_sequence_players = 0x8014F548;
bgm_update_music_settings = 0x8014F5F8;
bgm_update_music_control = 0x8014F5F8;
D_80164000 = 0x80164000;
heap_collisionHead = 0x80268000;
shim_create_audio_system_obfuscated = 0x802B2000;
@ -1999,7 +1999,7 @@ Entity_Signpost_RenderScript = 0x802E5F70; // rom:0x10C850
Entity_Signpost = 0x802E5F8C; // rom:0x10C86C
snd_song_stop = 0x80055674; // type:func rom:0x30A74
snd_song_load = 0x80055584; // type:func rom:0x30984
snd_song_set_variation_fade_time = 0x8005576C; // type:func rom:0x30B6C
snd_song_request_fade_out = 0x8005576C; // type:func rom:0x30B6C
func_80055B80 = 0x80055830; // type:func rom:0x30C30
snd_ambient_stop_slow = 0x80055198; // type:func rom:0x30598
world_action_sneaky_parasol_ROM_END = 0x00E343B0;
@ -2008,7 +2008,7 @@ load_asset_by_name = 0x8005A9A0; // type:func rom:0x35DA0
guRotateRPYF = 0x800642A0; // type:func rom:0x3F6A0
gCurrentDisplayContextIndex = 0x800741D4; // rom:0x4F5D4
func_800E06C0 = 0x800E06A0; // type:func rom:0x79B50
snd_song_set_variation_fade = 0x800556C8; // type:func rom:0x30AC8
snd_song_request_fade_in = 0x800556C8; // type:func rom:0x30AC8
gItemIconPaletteOffsets = 0x8008E91C; // rom:0x69D1C
snd_song_set_proximity_mix_near = 0x80055CF4; // type:func rom:0x310F4
gItemEntityScripts = 0x8008DDA4; // rom:0x691A4
@ -2039,24 +2039,24 @@ snd_ambient_pause = 0x800551EC; // type:func rom:0x305EC
general_heap_free = 0x8002AC38; // type:func rom:0x6038
CreateEntityVarArgBuffer = 0x80161750;
gCurrentModels = 0x8015632C;
snd_song_start_variation = 0x80055620; // type:func rom:0x30A20
snd_song_request_play = 0x80055620; // type:func rom:0x30A20
snd_song_set_track_volumes = 0x80055A8C; // type:func rom:0x30E8C
gWindows = 0x8015ECD0;
gPlayerStatusPtr = 0x800F7CC0; // rom:0x91170
guOrtho = 0x80063A10; // type:func rom:0x3EE10
guScale = 0x800676E0; // type:func rom:0x42AE0
snd_song_set_proximity_mix_far = 0x80055CD8; // type:func rom:0x310D8
func_80055BB8 = 0x80055868; // type:func rom:0x30C68
snd_song_UNK_request_push_fade_out = 0x80055868; // type:func rom:0x30C68
_heap_malloc = 0x8002902C; // type:func rom:0x442C
gItemIconRasterOffsets = 0x8008E3A8; // rom:0x697A8
func_80055B28 = 0x800557D8; // type:func rom:0x30BD8
snd_song_UNK_request_pop = 0x800557D8; // type:func rom:0x30BD8
snd_song_clear_track_volumes = 0x80055AF8; // type:func rom:0x30EF8
npc_raycast_down_around = 0x800DC758; // type:func rom:0x75C08
npc_test_move_simple_with_slipping = 0x800DDC24; // type:func rom:0x770D4
is_player_dismounted = 0x800DFCD4; // type:func rom:0x79184
heap_spriteHead = 0x8034F800;
general_heap_malloc = 0x8002ABE8; // type:func rom:0x5FE8
gMusicSettings = 0x8015EA70;
gMusicControlData = 0x8015EA70;
transform_point = 0x800295E0; // type:func rom:0x49E0
gCurrentModelTreeNodeInfo = 0x8009A5D4;
cosine = 0x80029394; // type:func rom:0x4794
@ -2066,7 +2066,7 @@ gMessageBoxFrameParts = 0x8008FEB0; // rom:0x6B2B0
copy_matrix = 0x800296E0; // type:func rom:0x4AE0
snd_start_sound_with_shift = 0x80054EF0; // type:func rom:0x302F0
suggest_player_anim_always_forward = 0x800DFF58; // type:func rom:0x79408
func_80055AF0 = 0x800557A0; // type:func rom:0x30BA0
snd_song_UNK_push_stop = 0x800557A0; // type:func rom:0x30BA0
get_current_partner_id = 0x800E505C; // type:func rom:0x7E50C
snd_set_sfx_reverb_type = 0x80055E94; // type:func rom:0x31294
dist3D = 0x80029EEC; // type:func rom:0x52EC
@ -2481,7 +2481,7 @@ sfx_adjust_env_sound_params = 0x8014EC94; // type:func rom:0xE3B24
sfx_play_sound_at_npc = 0x8014EDB8; // type:func rom:0xE3C48
sfx_compute_spatialized_sound_params_ignore_depth = 0x8014F008; // type:func rom:0xE3E98
sfx_compute_spatialized_sound_params_with_depth = 0x8014F264; // type:func rom:0xE40F4
BlankMusicSettings = 0x80154790; // rom:0xE9620
BlankMusicControlData = 0x80154790; // rom:0xE9620
SongsUsingVariationFlag = 0x801547C0; // rom:0xE9650
NextVolumeUpdateTimer = 0x801547D8; // rom:0xE9668
bgm_get_map_default_variation = 0x8014F4E0; // type:func rom:0xE4370

View File

@ -547,16 +547,16 @@ func_8004D484 = 0x8004D484; // type:func rom:0x28884
au_sfx_reset_players = 0x8004D4BC; // type:func rom:0x288BC
au_bgm_begin_video_frame = 0x8004D510; // type:func rom:0x28910
au_bgm_get_player_with_song_name = 0x8004D794; // type:func rom:0x28B94
au_bgm_dispatch_player_event = 0x8004D7E0; // type:func rom:0x28BE0
au_bgm_process_init_song = 0x8004D7E0; // type:func rom:0x28BE0
au_bgm_stop_song = 0x8004DA0C; // type:func rom:0x28E0C
au_bgm_stop_all = 0x8004DA74; // type:func rom:0x28E74
au_bgm_stop_player = 0x8004DAA8; // type:func rom:0x28EA8
au_bgm_is_song_playing = 0x8004DAE0; // type:func rom:0x28EE0
au_bgm_player_is_active = 0x8004DB28; // type:func rom:0x28F28
func_8004DB4C = 0x8004DB4C; // type:func rom:0x28F4C
au_bgm_process_fade_out = 0x8004DB4C; // type:func rom:0x28F4C
func_8004DC80 = 0x8004DC80; // type:func rom:0x29080
func_8004DCB8 = 0x8004DCB8; // type:func rom:0x290B8
func_8004DE2C = 0x8004DE2C; // type:func rom:0x2922C
au_bgm_process_suspend = 0x8004DCB8; // type:func rom:0x290B8
au_bgm_process_resume = 0x8004DE2C; // type:func rom:0x2922C
func_8004DFD4 = 0x8004DFD4; // type:func rom:0x293D4
au_bgm_adjust_volume = 0x8004E0F4; // type:func rom:0x294F4
au_bgm_player_init = 0x8004E158; // type:func rom:0x29558
@ -657,17 +657,17 @@ au_fade_clear = 0x80053A18; // type:func rom:0x2EE18
au_fade_update = 0x80053A28; // type:func rom:0x2EE28
au_fade_set_volume = 0x80053A98; // type:func rom:0x2EE98
au_fade_flush = 0x80053AC8; // type:func rom:0x2EEC8
au_fade_set_vol_scale = 0x80053AEC; // type:func rom:0x2EEEC
au_unk_80053B04 = 0x80053B04; // type:func rom:0x2EF04
au_fade_set_envelope = 0x80053AEC; // type:func rom:0x2EEEC
au_fade_calc_envelope = 0x80053B04; // type:func rom:0x2EF04
au_fade_update_envelope = 0x80053BA8; // type:func rom:0x2EFA8
au_get_instrument = 0x80053BE8; // type:func rom:0x2EFE8
au_get_bgm_player_and_file = 0x80053C58; // type:func rom:0x2F058
au_get_bgm_player = 0x80053CB4; // type:func rom:0x2F0B4
au_load_song_files = 0x80053CF8; // type:func rom:0x2F0F8
au_unk_80053E58 = 0x80053E58; // type:func rom:0x2F258
au_unk_80053F64 = 0x80053F64; // type:func rom:0x2F364
au_unk_get_temp_player_for_index = 0x80053F64; // type:func rom:0x2F364
au_ambient_load = 0x80053F80; // type:func rom:0x2F380
au_unk_80054248 = 0x80054248; // type:func rom:0x2F648
au_get_client_by_priority = 0x80054248; // type:func rom:0x2F648
au_load_INIT = 0x800542BC; // type:func rom:0x2F6BC
au_fetch_SBN_file = 0x8005447C; // type:func rom:0x2F87C
au_load_PER = 0x800544F8; // type:func rom:0x2F8F8
@ -713,20 +713,20 @@ snd_ambient_radio_setup = 0x80055760; // type:func rom:0x30B60
snd_ambient_radio_stop = 0x800557CC; // type:func rom:0x30BCC
snd_ambient_radio_select = 0x80055848; // type:func rom:0x30C48
snd_song_load = 0x800558D4; // type:func rom:0x30CD4
snd_song_start_default = 0x8005591C; // type:func rom:0x30D1C
snd_song_start_variation = 0x80055970; // type:func rom:0x30D70
snd_song_request_play_default = 0x8005591C; // type:func rom:0x30D1C
snd_song_request_play = 0x80055970; // type:func rom:0x30D70
snd_song_stop = 0x800559C4; // type:func rom:0x30DC4
snd_song_stop_all = 0x800559E0; // type:func rom:0x30DE0
snd_song_is_playing = 0x800559FC; // type:func rom:0x30DFC
snd_song_set_variation_fade = 0x80055A18; // type:func rom:0x30E18
snd_song_set_default_fade = 0x80055A6C; // type:func rom:0x30E6C
snd_song_set_variation_fade_time = 0x80055ABC; // type:func rom:0x30EBC
func_80055AF0 = 0x80055AF0; // type:func rom:0x30EF0
func_80055B28 = 0x80055B28; // type:func rom:0x30F28
snd_song_request_fade_in = 0x80055A18; // type:func rom:0x30E18
snd_song_request_fade_in_default = 0x80055A6C; // type:func rom:0x30E6C
snd_song_request_fade_out = 0x80055ABC; // type:func rom:0x30EBC
snd_song_UNK_push_stop = 0x80055AF0; // type:func rom:0x30EF0
snd_song_UNK_request_pop = 0x80055B28; // type:func rom:0x30F28
func_80055B80 = 0x80055B80; // type:func rom:0x30F80
func_80055BB8 = 0x80055BB8; // type:func rom:0x30FB8
func_80055BF0 = 0x80055BF0; // type:func rom:0x30FF0
func_80055C2C = 0x80055C2C; // type:func rom:0x3102C
snd_song_UNK_request_push_fade_out = 0x80055BB8; // type:func rom:0x30FB8
snd_song_request_pause = 0x80055BF0; // type:func rom:0x30FF0
snd_song_request_unpause = 0x80055C2C; // type:func rom:0x3102C
snd_song_set_volume_quiet = 0x80055C64; // type:func rom:0x31064
snd_song_set_volume_full = 0x80055C94; // type:func rom:0x31094
snd_song_set_linked_mode = 0x80055CC4; // type:func rom:0x310C4
@ -4426,7 +4426,7 @@ sfx_compute_spatialized_sound_params_with_depth = 0x8014A1B4; // type:func rom:0
bgm_get_map_default_variation = 0x8014A430; // type:func rom:0xE0B30
bgm_reset_sequence_players = 0x8014A498; // type:func rom:0xE0B98
bgm_reset_volume = 0x8014A52C; // type:func rom:0xE0C2C
bgm_update_music_settings = 0x8014A548; // type:func rom:0xE0C48
bgm_update_music_control = 0x8014A548; // type:func rom:0xE0C48
_bgm_set_song = 0x8014A7E0; // type:func rom:0xE0EE0
bgm_set_song = 0x8014A918; // type:func rom:0xE1018
bgm_fade_in_song = 0x8014A964; // type:func rom:0xE1064
@ -5189,7 +5189,7 @@ MusicTargetVolume = 0x80159AE2; // rom:0xF01E2
MusicMaxVolume = 0x80159AE4; // rom:0xF01E4
MusicCurrentVolume = 0x80159AE6; // rom:0xF01E6
D_80159AE8 = 0x80159AE8; // rom:0xF01E8
gMusicSettings = 0x80159AF0; // rom:0xF01F0
gMusicControlData = 0x80159AF0; // rom:0xF01F0
UseSettingsFrom = 0x802CB860; // type:func rom:0xF0210
D_80159B50 = 0x80159B50; // rom:0xF0250
LoadSettings = 0x802CB9F8; // type:func rom:0xF03A8