Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
private.h File Reference

Go to the source code of this file.

Functions

void au_load_BK_headers (AuGlobals *arg0, ALHeap *)
 
void au_mseq_manager_init (AmbienceManager *arg0, s8 arg1, s8 reverbType, AuGlobals *arg3)
 
AuResult au_mseq_check_player_index (u32 arg0)
 
void au_mseq_load_tracks_fade (s32 arg0, s32 arg1)
 
void au_mseq_set_disabled (s32 arg0, s32 arg1)
 
AuResult au_mseq_start (s32 arg0, s32 arg1)
 
void au_mseq_fade_setup (AmbiencePlayer *arg0)
 
void au_mseq_pause (s32 arg0, s32 arg1)
 
void au_mseq_resume (s32 arg0, s32 arg1)
 
void au_mseq_stop_quick (s32 arg0)
 
void au_mseq_stop_slow (s32 arg0, s32 arg1)
 
void au_mseq_set_volume (s32 arg0, s32 arg1, s32 arg2)
 
AuResult au_mseq_check_stopped (s32 arg0)
 
void au_mseq_play_sequence (AmbienceManager *arg0, MSEQHeader *mseq, s32 index)
 
void au_mseq_manager_audio_frame_update (AmbienceManager *arg0)
 
void au_mseq_load_track_fade_info (AmbienceManager *manager, AmbiencePlayer *lambda)
 
void au_mseq_player_update (AmbienceManager *manager, AmbiencePlayer *lambda)
 
u8 au_mseq_read_next (AmbiencePlayer *arg0)
 
void au_mseq_player_stop (AmbienceManager *arg0, AmbiencePlayer *arg1)
 
void au_mseq_save_voices (AmbienceManager *arg0, AmbiencePlayer *lambda)
 
void au_mseq_restore_voices (AmbienceManager *manager, AmbiencePlayer *lambda)
 
void au_sfx_init (SoundManager *manager, u8 arg1, u8 arg2, AuGlobals *arg3, u8 arg4)
 
void au_sfx_load_groups_from_SEF (SoundManager *sndMgr)
 
void au_sfx_clear_queue (SoundManager *manager)
 
void au_sfx_enqueue_event (SoundManager *manager, u32 soundID, s16 volume, s16 pitchShift, u8 pan)
 
void au_sfx_begin_video_frame (SoundManager *manager)
 
s32 au_sfx_set_reverb_type (SoundManager *manager, s32 arg1)
 
void au_sfx_set_state (SoundManager *manager, s32 arg1)
 
void au_sfx_try_sound (SoundManager *manager, SoundRequest *request, SoundManagerCustomCmdList *)
 
s16 au_sfx_manager_audio_frame_update (SoundManager *manager)
 
void au_bgm_begin_video_frame (BGMPlayer *player)
 
BGMPlayerau_bgm_get_player_with_song_name (s32 songString)
 
AuResult au_bgm_process_init_song (SongStartRequest *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 au_bgm_process_fade_out (SongFadeOutRequest *s)
 
AuResult au_bgm_complete_push (s32 songName)
 
AuResult au_bgm_process_suspend (SongSuspendRequest *update, b32 skipStop)
 
AuResult au_bgm_process_resume (SongResumeRequest *update)
 
void au_bgm_restore_copied_player (AuGlobals *globals)
 
AuResult au_bgm_adjust_volume (SongStartRequest *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)
 
void au_bgm_update_bus_volumes (BGMPlayer *arg0)
 
s32 au_bgm_player_audio_frame_update (BGMPlayer *player)
 
void au_bgm_player_initialize (BGMPlayer *player)
 
void au_bgm_clear_custom_note_press (BGMPlayer *player, s32 arg1)
 
void au_bgm_set_tick_resolution (BGMPlayer *player, s32 sampleRate, u32 resolution)
 
void au_bgm_player_read_composition (BGMPlayer *player)
 
void au_bgm_end_composition_loop (BGMPlayer *player, u32 cmd)
 
void au_bgm_load_phrase (BGMPlayer *player, u32 cmd)
 
void au_bgm_player_update_stop (BGMPlayer *player)
 
void au_bgm_player_update_playing (BGMPlayer *player)
 play next tick
 
void au_BGMCmd_E0_MasterTempo (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E1_MasterVolume (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E2_MasterDetune (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E3 (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E6_MasterEffect (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E4_MasterTempoFade (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E5_MasterVolumeFade (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E8_TrackOverridePatch (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E9_InstrumentVolume (BGMPlayer *arg0, BGMPlayerTrack *track)
 
void au_BGMCmd_F6_InstrumentVolumeLerp (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_EA_InstrumentPan (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_EB_InstrumentReverb (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_EC_TrackVolume (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_ED_InstrumentCoarseTune (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_EE_InstrumentFineTune (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_EC_TrackDetune (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F0_TrackTremolo (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F1_TrackTremoloRate (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F2_TrackTremoloDepth (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F3_TrackTremoloStop (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F4_SubTrackRandomPan (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F5_UseInstrument (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F7_ReverbType (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_FD_EventTrigger (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_FE_Detour (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_FC_Branch (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_FF_Special (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_NOP (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_bgm_set_proximity_mix (s32 songName, u32 mix)
 
void au_bgm_set_playback_rate (BGMPlayer *player, f32 arg1)
 
void au_bgm_player_set_detune (BGMPlayer *player, s32 arg1)
 
void au_bgm_change_track_volume (BGMPlayer *player, s32 trackIdx, s16 arg2, u8 arg3)
 
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 (SongSwapLinkedRequest *arg0)
 
void snd_bgm_clear_legacy_commands (BGMPlayer *player)
 Part of an unused system for inter-thread communication with a BGM player using commands.
 
AuResult snd_song_get_playing_info (s32 songName, BGMHeader **outTrackData, BGMPlayer **outPlayer)
 
AuResult snd_song_set_detune (s32 songName, s32 arg1)
 
AuResult snd_song_set_track_volumes (s32 songName, MusicTrackVols arg1)
 
AuResult snd_song_clear_track_volumes (s32 songName, MusicTrackVols arg1)
 
AuResult snd_song_set_track_vol_mute (s32 arg0, s32 arg1)
 
AuResult snd_song_set_track_vol_quiet (s32 arg0, s32 arg1)
 
AuResult snd_song_set_track_vol_full (s32 arg0, s32 arg1)
 
void snd_song_set_proximity_mix_far (s32 songName, s32 mix)
 
void snd_song_set_proximity_mix_near (s32 songName, s32 mix)
 
void snd_song_set_proximity_mix_full (s32 songName, s32 mix)
 
SoundInstancesfx_get_env_sound_instance (s32 soundID)
 

Function Documentation

◆ au_load_BK_headers()

void au_load_BK_headers ( AuGlobals * arg0,
ALHeap * heap )

Definition at line 4 of file load_banks.c.

4 {
7 s32 i;
8
9 au_read_rom(globals->bkFileListOffset, &buffer, globals->bkListLength);
10
11 for (i = 0; i < ARRAY_COUNT(buffer); i++) {
12 if (buffer[i].fileIndex == 0xFFFF) {
13 break;
14 }
15
16 au_fetch_SBN_file(buffer[i].fileIndex, AU_FMT_BK, &fileEntry);
17 au_load_BK_to_bank(fileEntry.offset, NULL, buffer[i].bankIndex, buffer[i].bankSet);
18 }
19}
BSS s32 PopupMenu_SelectedIndex
#define INIT_BANK_BUFFER_SIZE
Definition audio.h:973
AuResult au_fetch_SBN_file(u32 fileIdx, AuFileFormat format, SBNFileEntry *arg2)
Definition engine.c:796
void au_read_rom(s32 romAddr, void *buffer, u32 size)
Definition engine.c:1209
BKFileBuffer * au_load_BK_to_bank(s32 bkFileOffset, BKFileBuffer *bkFile, s32 bankIndex, BankSet bankSet)
Loads an instrument bank file from ROM, allocates memory if needed, and sets up instrument pointers.
Definition engine.c:947
@ AU_FMT_BK
Definition enums.h:1781
#define ARRAY_COUNT(arr)
Definition macros.h:40

Referenced by au_engine_init().

◆ au_mseq_manager_init()

void au_mseq_manager_init ( AmbienceManager * arg0,
s8 arg1,
s8 reverbType,
AuGlobals * arg3 )

Definition at line 44 of file mseq_player.c.

44 {
45 AmbiencePlayer* player;
46 s32 i;
47
48 au_memset(manager, sizeof(*manager), 0);
49
50 for (i = 0; i < ARRAY_COUNT(manager->players); i++) {
51 player = &manager->players[i];
52 player->id.playerIndex = i;
53 player->delay = 1;
54 player->fadeVolume = AU_MAX_VOLUME_8 << 24;
55 }
56
57 manager->globals = globals;
58 manager->nextUpdateStep = 1;
59 manager->nextUpdateCounter = 2;
60 manager->nextUpdateInterval = 2;
61 manager->priority = priority;
62 manager->busID = busID;
63}
AmbVoiceStateInfo id
Definition audio.h:1342
#define AU_MAX_VOLUME_8
Definition audio.h:61
s8_24 fadeVolume
Definition audio.h:1357
void au_memset(void *dst, s32 size, u8 value)
Definition engine.c:1226

Referenced by au_engine_init().

◆ au_mseq_check_player_index()

AuResult au_mseq_check_player_index ( u32 arg0)

◆ au_mseq_load_tracks_fade()

void au_mseq_load_tracks_fade ( s32 arg0,
s32 arg1 )

Definition at line 73 of file mseq_player.c.

73 {
75}
u8 loadTracksFadeInfo
Definition audio.h:1373

Referenced by snd_ambient_fade_out().

◆ au_mseq_set_disabled()

void au_mseq_set_disabled ( s32 arg0,
s32 arg1 )

Definition at line 77 of file mseq_player.c.

77 {
79 AmbiencePlayer* player = &manager->players[index];
80
81 if (!disable) {
83 } else {
85 }
86}
@ MSEQ_PLAYER_PLAYING
Definition mseq_player.c:22
@ MSEQ_PLAYER_STOPPING
Definition mseq_player.c:24

Referenced by snd_ambient_disable(), and snd_ambient_enable().

◆ au_mseq_start()

AuResult au_mseq_start ( s32 arg0,
s32 arg1 )

Definition at line 88 of file mseq_player.c.

88 {
89 AmbiencePlayer* player = &gAuAmbienceManager->players[index];
91 AuResult status = AU_RESULT_OK;
92
93 if (mseq != NULL) {
94 if (player->mseqName == 0) {
96 if (time != 0) {
97 player->fadeSettingsTime = time;
98 player->fadeSettingsInitial = 0;
101 au_mseq_fade_setup(player);
102 }
103 } else {
105 }
106 } else {
108 }
109 return status;
110}
MSEQHeader * mseqFiles[4]
Definition audio.h:1371
u8 fadeSettingsType
Definition audio.h:1348
u8 fadeSettingsGoal
Definition audio.h:1352
u16 fadeSettingsTime
Definition audio.h:1350
AmbiencePlayer players[4]
Definition audio.h:1376
u8 fadeSettingsInitial
Definition audio.h:1351
AuResult
Definition enums.h:1758
@ AU_AMBIENCE_ERROR_MSEQ_NOT_FOUND
Definition enums.h:1765
@ AU_AMBIENCE_ERROR_PLAYER_BUSY
Definition enums.h:1763
void au_mseq_fade_setup(AmbiencePlayer *player)
@ MSEQ_FADE_IN
Definition mseq_player.c:16
void au_mseq_play_sequence(AmbienceManager *manager, MSEQHeader *mseqFile, s32 index)

Referenced by snd_ambient_play().

◆ au_mseq_fade_setup()

void au_mseq_fade_setup ( AmbiencePlayer * arg0)

Definition at line 112 of file mseq_player.c.

112 {
113 u16 time = player->fadeSettingsTime;
114
115 if (player->fadeSettingsInitial == 255) {
116 player->fadeSettingsInitial = player->fadeVolume >> 24;
117 }
118
119 if (time >= SND_MIN_DURATION && time <= SND_MAX_DURATION) {
120 player->fadeVolume = player->fadeSettingsInitial << 24;
121 player->fadeGoal = player->fadeSettingsGoal;
122
123 // converts a fade time in milliseconds to the number of player update ticks needed to complete the fade
124 // the ambience manager updates every other audio frame, so given outputRate = 32000 and frameSize = 184,
125 // update ticks needed = (32000 / 184) / 2, and then we divide by 1000 (since fade time has units of ms).
126 // this reduces to 16/184, which is exactly 1.6 times 10/115
127 // why this odd reduction was chosen unstead of 16/184 is unknown
128 player->fadeTime = (u32)(time * 10) / 115;
129 player->fadeStep = ((player->fadeSettingsGoal - player->fadeSettingsInitial) << 24) / ((s16)player->fadeTime & 0xFFFF);
130 }
131
132 player->fadeSettingsTime = 0;
133 player->fadeSettingsInitial = 0;
134 player->fadeSettingsGoal = 0;
135}
#define SND_MIN_DURATION
Definition audio.h:102
#define SND_MAX_DURATION
Definition audio.h:103

Referenced by au_mseq_manager_audio_frame_update(), and au_mseq_start().

◆ au_mseq_pause()

void au_mseq_pause ( s32 arg0,
s32 arg1 )

Definition at line 137 of file mseq_player.c.

137 {
138 AmbiencePlayer* player = &gAuAmbienceManager->players[index];
139
140 if (player->mseqReadStart != NULL && player->mseqReadPos != NULL) {
141 if (time != 0) {
142 player->fadeSettingsInitial = 255;
143 player->fadeSettingsTime = time;
144 player->fadeSettingsGoal = 0;
146 return;
147 }
148 player->mode = MSEQ_MODE_PAUSING;
149 }
150}
AuFilePos mseqReadPos
Definition audio.h:1340
AuFilePos mseqReadStart
Definition audio.h:1339
@ MSEQ_MODE_PAUSING
Definition mseq_player.c:12
@ MSEQ_FADE_OUT_PAUSING
Definition mseq_player.c:18

Referenced by snd_ambient_pause().

◆ au_mseq_resume()

void au_mseq_resume ( s32 arg0,
s32 arg1 )

Definition at line 152 of file mseq_player.c.

152 {
153 AmbiencePlayer* player = &gAuAmbienceManager->players[index];
154
155 if (player->mseqReadStart != NULL && player->mseqReadPos != NULL) {
156 player->mode = MSEQ_MODE_RESUMING;
157 if (time != 0) {
158 player->fadeSettingsTime = time;
159 } else {
161 }
162 player->fadeSettingsInitial = 0;
165 }
166}
@ MSEQ_MODE_RESUMING
Definition mseq_player.c:10

Referenced by snd_ambient_resume().

◆ au_mseq_stop_quick()

void au_mseq_stop_quick ( s32 arg0)

Definition at line 168 of file mseq_player.c.

168 {
169 AmbiencePlayer* player = &gAuAmbienceManager->players[index];
170
171 if (player->mseqReadStart != NULL && player->mseqReadPos != NULL) {
172 if (player->mode != MSEQ_MODE_PLAYING) {
173 player->mseqReadPos = NULL;
174 player->mseqName = 0;
175 player->mode = MSEQ_MODE_PLAYING;
176 return;
177 }
178 player->mseqReadPos = BlankMseqData;
179 player->delay = 1;
180 }
181}
@ MSEQ_MODE_PLAYING
Definition mseq_player.c:9
u8 BlankMseqData[]
Definition sfx_player.c:287

Referenced by snd_ambient_stop_quick().

◆ au_mseq_stop_slow()

void au_mseq_stop_slow ( s32 arg0,
s32 arg1 )

Definition at line 183 of file mseq_player.c.

183 {
184 AmbiencePlayer* player = &gAuAmbienceManager->players[index];
185
186 if (player->mseqReadStart != NULL && player->mseqReadPos != NULL) {
187 if (time != 0) {
188 player->fadeSettingsTime = time;
189 } else {
191 }
192 player->fadeSettingsInitial = 255;
193 player->fadeSettingsGoal = 0;
195 }
196}
@ MSEQ_FADE_OUT
Definition mseq_player.c:17

Referenced by snd_ambient_stop_slow().

◆ au_mseq_set_volume()

void au_mseq_set_volume ( s32 arg0,
s32 arg1,
s32 arg2 )

Definition at line 198 of file mseq_player.c.

198 {
199 AmbiencePlayer* player = &gAuAmbienceManager->players[index];
200 if ((player->mseqReadStart != 0) && (player->mseqReadPos != 0)) {
201 if (volume <= 0) {
202 volume = 1;
203 } else if (volume > AU_MAX_VOLUME_8) {
204 volume = AU_MAX_VOLUME_8;
205 }
206 if (time != 0) {
207 player->fadeSettingsTime = time;
208 } else {
210 }
211 player->fadeSettingsInitial = 255;
212 player->fadeSettingsGoal = volume;
214 }
215}

Referenced by snd_ambient_set_volume().

◆ au_mseq_check_stopped()

AuResult au_mseq_check_stopped ( s32 arg0)

Definition at line 217 of file mseq_player.c.

217 {
218 AmbiencePlayer* player = &gAuAmbienceManager->players[index];
219 AuResult status = AU_RESULT_OK;
220
221 if (player->mseqReadStart != NULL && player->mseqReadPos != NULL) {
223 if (player->mode != MSEQ_MODE_PLAYING) {
225 }
226 }
227 return status;
228}
@ AU_AMBIENCE_STOP_ERROR_1
Definition enums.h:1761
@ AU_AMBIENCE_STOP_ERROR_2
Definition enums.h:1762

Referenced by snd_ambient_is_stopped().

◆ au_mseq_play_sequence()

void au_mseq_play_sequence ( AmbienceManager * arg0,
MSEQHeader * mseq,
s32 index )

Definition at line 230 of file mseq_player.c.

230 {
231 AmbiencePlayer* player;
233 AuFilePos readPos;
234 s32 i;
235
236 player = &manager->players[index];
237 au_memset(player, sizeof(*player), 0);
238
239 player->mseqFile = mseqFile;
240 readPos = AU_FILE_RELATIVE(mseqFile->dataStart, mseqFile);
241 player->id.playerIndex = index;
242 player->mseqReadPos = readPos;
243 player->loopStartPos[1] = readPos;
244 player->loopStartPos[0] = readPos;
245 player->mseqReadStart = readPos;
246
247 player->delay = 1;
248 player->fadeVolume = AU_MAX_VOLUME_8 << 24;
249 player->fadeGoal = AU_MAX_VOLUME_8;
250
251 player->mseqName = player->mseqFile->name;
252 player->firstVoiceIdx = player->mseqFile->firstVoiceIdx;
253 player->lastVoiceIdx = player->firstVoiceIdx + 16;
254 if (player->lastVoiceIdx > 24) {
255 player->lastVoiceIdx = 24;
256 }
257 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
258 track = &player->tracks[i];
259 track->instrument = manager->globals->defaultInstrument;
260 track->volumeLerp.current = AU_MAX_VOLUME_32;
261 track->pan = 64;
262 }
263 player->resetRequired = TRUE;
264}
u32 firstVoiceIdx
Definition audio.h:1355
MSEQHeader * mseqFile
Definition audio.h:1338
Instrument * instrument
Definition audio.h:1293
AmbienceTrack tracks[10]
Definition audio.h:1362
#define AU_FILE_RELATIVE(base, offset)
Definition audio.h:43
s32 name
Definition audio.h:1284
AuFilePos loopStartPos[2]
Definition audio.h:1341
u8 firstVoiceIdx
Definition audio.h:1285
#define AU_MAX_VOLUME_32
Definition audio.h:63
u32 lastVoiceIdx
Definition audio.h:1356
u8 * AuFilePos
Definition audio.h:11

Referenced by au_mseq_start().

◆ au_mseq_manager_audio_frame_update()

void au_mseq_manager_audio_frame_update ( AmbienceManager * arg0)

Definition at line 266 of file mseq_player.c.

266 {
267 u32 i;
268 s32 j;
269
270 for (i = 0; i < ARRAY_COUNT(manager->voiceStates); i++) {
271 AmbienceVoiceState* voiceState = &manager->voiceStates[i];
272
273 // potential @bug, any voice which is not properly released via MSEQ_CMD_80_STOP_SOUND will eventaully
274 // end and set its priority to AU_PRIORITY_FREE, where another client can steal it and begin using it
275 // without it being considered 'free' by this AmbienceManager. this can be fixed by removing the check
276 // for released == TRUE from the conditional
277 if (voiceState->info.released == TRUE && manager->globals->voices[i].priority != manager->priority) {
278 voiceState->info.all = 0;
279 }
280 }
281
282 for (j = 0; j < ARRAY_COUNT(manager->players); j++) {
283 AmbiencePlayer* player = &manager->players[j];
284 s32 mode;
285
286 if (player->mseqReadPos != NULL) {
287 if (manager->loadTracksFadeInfo) {
289 }
290
291 mode = player->mode;
292 if (mode != MSEQ_MODE_PLAYING) {
293 if (mode == MSEQ_MODE_PAUSING) {
294 player->mode = MSEQ_MODE_STOPPED;
297 } else if (player->mode == MSEQ_MODE_RESUMING) {
298 player->mode = MSEQ_MODE_PLAYING;
299 if (player->fadeSettingsTime != 0) {
300 au_mseq_fade_setup(player);
301 }
303 }
304 } else {
305 // case MSEQ_MODE_PLAYING
306 if (player->fadeSettingsTime != 0) {
307 au_mseq_fade_setup(player);
308 }
309 if (player->playState == MSEQ_PLAYER_STOPPING) {
312 }
314 }
315 }
316 }
317
318 manager->loadTracksFadeInfo = FALSE;
319}
AmbVoiceStateInfo info
Definition audio.h:1331
void au_mseq_restore_voices(AmbienceManager *manager, AmbiencePlayer *player)
void au_mseq_player_update(AmbienceManager *manager, AmbiencePlayer *player)
@ MSEQ_PLAYER_STOPPED
Definition mseq_player.c:23
@ MSEQ_MODE_STOPPED
Definition mseq_player.c:11
void au_mseq_save_voices(AmbienceManager *manager, AmbiencePlayer *player)
void au_mseq_load_track_fade_info(AmbienceManager *manager, AmbiencePlayer *player)
void au_mseq_player_stop(AmbienceManager *manager, AmbiencePlayer *player)

Referenced by au_update_clients_for_audio_frame().

◆ au_mseq_load_track_fade_info()

void au_mseq_load_track_fade_info ( AmbienceManager * manager,
AmbiencePlayer * lambda )

Definition at line 321 of file mseq_player.c.

321 {
322 MSEQHeader* mseqFile;
325 s32 offset;
326 s32 count;
327
328 mseqFile = player->mseqFile;
329 count = mseqFile->trackSettingsCount;
330 if (count != 0 && mseqFile->trackSettingsOffset != 0) {
331 trackData = AU_FILE_RELATIVE(mseqFile->trackSettingsOffset, mseqFile);
332 while (count--) {
333 track = &player->tracks[trackData->trackIndex];
334 if (trackData->type == 0) {
335 track->tuneLerp.time = trackData->time;
336 track->tuneLerp.step = (trackData->delta << 16) / trackData->time;
337 track->tuneLerp.goal = trackData->goal;
338 } else if (trackData->type == 1) {
339 track->volumeLerp.time = trackData->time;
340 track->volumeLerp.step = (trackData->delta << 16) / trackData->time;
341 track->volumeLerp.goal = trackData->goal;
342 }
343 trackData++;
344 }
345 }
346}
u8 trackSettingsCount
Definition audio.h:1286
u16 trackSettingsOffset
Definition audio.h:1287

Referenced by au_mseq_manager_audio_frame_update().

◆ au_mseq_player_update()

void au_mseq_player_update ( AmbienceManager * manager,
AmbiencePlayer * lambda )

Definition at line 348 of file mseq_player.c.

348 {
350 u8 isPitchChanged[16];
351 AuGlobals* globals;
354 AuVoice* voice;
358 s32 i;
359 u16 bankPatch;
360 u32 count;
361 s32 loopID;
362 u8 op, arg1, arg2;
364
365 globals = manager->globals;
367 for (i = 0; i < 16U; i++) { // required to use unsigned literal
370 }
371
372 if (player->resetRequired == TRUE) {
374 player->resetRequired = FALSE;
375 }
376
377 if (player->fadeTime != 0) {
378 player->fadeVolume += player->fadeStep;
379 player->fadeTime--;
380 if (player->fadeTime == 0) {
381 player->fadeVolume = player->fadeGoal << 24;
382 if (player->fadeSettingsType == MSEQ_FADE_IN) {
383 // do nothing
384 } else if (player->fadeSettingsType == MSEQ_FADE_OUT) {
385 player->mseqReadPos = BlankMseqData;
386 player->delay = 1;
387 } else if (player->fadeSettingsType == MSEQ_FADE_OUT_PAUSING) {
388 player->mode = MSEQ_MODE_PAUSING;
389 }
390 }
392 }
393
394 // update pitch
395 for (trackIdx = 0; trackIdx < ARRAY_COUNT(player->tracks); trackIdx++) {
396 track = &player->tracks[trackIdx];
397 if (track->tuneLerp.time != 0) {
398 track->tuneLerp.time--;
399 if (track->tuneLerp.time != 0) {
400 track->tuneLerp.current += track->tuneLerp.step;
401 } else {
402 track->tuneLerp.current = track->tuneLerp.goal << 16;
403 }
404
405 voiceSelector = player->id.all + (trackIdx << 16);
406 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
407 voiceState = &manager->voiceStates[i - player->firstVoiceIdx];
408 // update all voices belonging to current track
409 if ((voiceState->info.all & 0xFFFF0000) == voiceSelector) {
410 voice = &globals->voices[i];
411 if (voice->priority == manager->priority && trackIdx != TRACK_ID_DRUM) {
412 voice->pitchRatio = au_compute_pitch_ratio(voiceState->pitch + (track->tuneLerp.current >> 16)) * track->instrument->pitchRatio;
413 voice->syncFlags |= AU_VOICE_SYNC_FLAG_PITCH;
414 isPitchChanged[i - player->firstVoiceIdx] = TRUE;
415 }
416 }
417 }
418 }
419 }
420
421 // update volume
422 for (trackIdx = 0; trackIdx < ARRAY_COUNT(player->tracks); trackIdx++) {
423 track = &player->tracks[trackIdx];
424 if (track->volumeLerp.time != 0) {
425 track->volumeLerp.time--;
426 if (track->volumeLerp.time != 0) {
427 track->volumeLerp.current += track->volumeLerp.step;
428 } else {
429 track->volumeLerp.current = track->volumeLerp.goal << 16;
430 }
431
432 voiceSelector = player->id.all + (trackIdx << 16);
433 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
434 voiceState = &manager->voiceStates[i - player->firstVoiceIdx];
435 // update all voices belonging to current track
436 if ((voiceState->info.all & 0xFFFF0000) == voiceSelector) {
437 voice = &globals->voices[i];
438 if (voice->priority == manager->priority) {
439 track = &player->tracks[voiceState->info.trackIndex];
440 voice->clientVolume = VOL_MULT_3(player->fadeVolume >> 24, track->volumeLerp.current >> 16, voiceState->volume);
441 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_VOL_CHANGED;
442 }
443 }
444 }
445 }
446 }
447
448 player->delay--;
449 if (player->delay <= 0) {
450 while (player->delay == 0) {
451 op = au_mseq_read_next(player);
452 if ((s8)op >= 0) {
453 if (op == 0) {
454 // stop
455 player->mseqReadPos = NULL;
456 player->mseqName = 0;
458 break;
459 }
460 if (op >= 0x78) {
461 // long delay
462 player->delay = ((op & 7) << 8) + au_mseq_read_next(player) + 0x78;
463 } else {
464 //short delay
465 player->delay = op;
466 }
467 continue;
468 }
469
470 // op >= 0x80
471 // op & 0xF0 : command
472 // op & 0xF : track index
473
474 arg1 = au_mseq_read_next(player);
475 trackIdx = op & 0xF;
476 track = &player->tracks[trackIdx];
477
478 switch (op & 0xF0) {
480 // arg1: sound index
481 if (player->playState == MSEQ_PLAYER_PLAYING) {
482 voiceSelector = player->id.all + (trackIdx << 16) + (arg1 << 8);
483 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
484 if (manager->voiceStates[i - player->firstVoiceIdx].info.all == voiceSelector) {
485 manager->voiceStates[i - player->firstVoiceIdx].info.released = TRUE;
486 voice = &globals->voices[i];
487 if (voice->priority == manager->priority) {
489 }
490 }
491 }
492 }
493 break;
495 // arg1: pitch or drum sound id
496 // arg2: volume
497 arg2 = au_mseq_read_next(player);
498 if (player->playState == MSEQ_PLAYER_PLAYING) {
499 // find free voice
500 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
501 voice = &globals->voices[i];
502 if (voice->priority == AU_PRIORITY_FREE) {
503 break;
504 }
505 }
506 if (i >= player->lastVoiceIdx) {
507 // try stealing a voice from the current player (or one with the same priority)
508 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
509 voice = &globals->voices[i];
510 if (voice->priority == manager->priority) {
512 break;
513 }
514 }
515 }
516 if (i >= player->lastVoiceIdx) {
517 // try stealing a voice from a different player with a lower priority
518 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
519 voice = &globals->voices[i];
520 if (voice->priority < manager->priority) {
522 break;
523 }
524 }
525 }
526 if (i < player->lastVoiceIdx) {
527 isVolumeChanged[i - player->firstVoiceIdx] = TRUE;
528 isPitchChanged[i - player->firstVoiceIdx] = TRUE;
529 voiceState = &manager->voiceStates[i - player->firstVoiceIdx];
530 // set playerIndex, trackIndex and tune
531 voiceState->info.all = player->id.all + (trackIdx << 16) + (arg1 << 8);
532 if (track->flags & MSEQ_TRACK_RESUMABLE) {
533 voiceState->isResumable = TRUE;
534 } else {
535 voiceState->isResumable = FALSE;
536 }
537 if (trackIdx != TRACK_ID_DRUM) {
538 if (track->flags & MSEQ_TRACK_RESUMABLE) {
539 voiceState->isResumable = TRUE;
540 } else {
541 voiceState->isResumable = FALSE;
542 }
543
544 voiceState->pitch = (arg1 & 0x7F) * 100 - track->instrument->keyBase;
545 voiceState->volume = arg2 & 0x7F;
546 voice->clientVolume = VOL_MULT_3(player->fadeVolume >> 24, track->volumeLerp.current >> 16, voiceState->volume);
547 voice->pitchRatio = au_compute_pitch_ratio(voiceState->pitch + (track->tuneLerp.current >> 16)) * track->instrument->pitchRatio;
548 voice->pan = track->pan;
549 voice->reverb = track->reverb;
550 voice->instrument = track->instrument;
551 voice->busID = manager->busID;
552 voice->envelope.cmdListPress = track->envelope.cmdListPress;
553 voice->envelope.cmdListRelease = track->envelope.cmdListRelease;
554 } else {
555 voiceState->isResumable = FALSE;
556 drum = &manager->globals->dataPER->drums[arg1 & 0x7F];
557 bankPatch = drum->bankPatch;
558 voice->instrument = au_get_instrument(manager->globals, bankPatch >> 8, bankPatch & 0xFF, &voice->envelope);
559 voiceState->pitch = drum->keyBase - voice->instrument->keyBase;
560 voiceState->volume = VOL_MULT_2(arg2 & 0x7F, drum->volume);
561 voice->clientVolume = VOL_MULT_3(player->fadeVolume >> 24, track->volumeLerp.current >> 16, voiceState->volume);
562 voice->pitchRatio = au_compute_pitch_ratio(voiceState->pitch) * voice->instrument->pitchRatio;
563 voice->pan = drum->pan;
564 voice->reverb = drum->reverb;
565 voice->busID = manager->busID;
566 }
567 voice->syncFlags = AU_VOICE_SYNC_FLAG_ALL;
568 voice->priority = manager->priority;
569 voice->clientPriority = voice->priority;
570 }
571 }
572 break;
574 // higher bit: set pan (1) or volume (0)
575 // lower 7 bits: value
576 if (arg1 & 0x80) {
577 track->pan = arg1 & 0x7F;
578 voiceSelector = player->id.all + (trackIdx << 16);
579 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
580 voiceState = &manager->voiceStates[i - player->firstVoiceIdx];
581 if ((voiceState->info.all & 0xFFFF0000) == voiceSelector) {
582 voice = &globals->voices[i];
583 if (voice->priority == manager->priority && trackIdx != TRACK_ID_DRUM) {
584 voice->pan = track->pan;
586 }
587 }
588 }
589 } else {
590 track->volumeLerp.current = arg1 << 24;
591 if (track->volumeLerp.current != 0) {
592 track->volumeLerp.current |= 0xFFFFFF;
593 }
594 voiceSelector = player->id.all + (trackIdx << 16);
595 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
596 voiceState = &manager->voiceStates[i - player->firstVoiceIdx];
597 if ((voiceState->info.all & 0xFFFF0000) == voiceSelector) {
598 voice = &globals->voices[i];
599 if (voice->priority == manager->priority) {
600 voice->clientVolume = VOL_MULT_3(player->fadeVolume >> 24, track->volumeLerp.current >> 16, voiceState->volume);
601 if (!isVolumeChanged[i - player->firstVoiceIdx]) {
602 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_VOL_CHANGED;
603 isVolumeChanged[i - player->firstVoiceIdx] = TRUE;
604 }
605 }
606 }
607 }
608 }
609 break;
611 // arg1: sub command
612 // arg2: depends on sub command
613 arg2 = au_mseq_read_next(player);
614 switch (arg1) {
616 // arg2: loop id
617 player->loopStartPos[arg2 & 1] = player->mseqReadPos;
618 break;
620 // arg2 lower bit: loop id
621 // (arg2 & 0x7C) >> 2: loop count
622 loopID = arg2 & 1;
623 count = (arg2 & 0x7C) >> 2;
624 if (count != 0) {
625 if (player->loopCount[loopID] != 0) {
626 player->loopCount[loopID]--;
627 // if it's the last iteration then don't jump to the loop start
628 if (player->loopCount[loopID] != 0) {
629 player->mseqReadPos = player->loopStartPos[loopID];
630 }
631 } else {
632 // first iteration, set loop counter
633 player->mseqReadPos = player->loopStartPos[loopID];
634 player->loopCount[loopID] = count;
635 }
636 } else {
637 // infinite loop
638 player->mseqReadPos = player->loopStartPos[loopID];
639 player->loopCount[loopID] = 0;
640 }
641 break;
643 track->reverb = arg2;
644 break;
646 if (arg2 == 1) {
647 track->flags |= MSEQ_TRACK_RESUMABLE;
648 }
649 break;
650 }
651 break;
653 // arg1: bank
654 // arg2: patch
655 arg2 = au_mseq_read_next(player);
656 if (trackIdx != TRACK_ID_DRUM) {
657 track->instrument = au_get_instrument(manager->globals, arg1, arg2, &track->envelope);
658 }
659 break;
661 // arg1: coarse tune
662 // arg2: fine tune
663 track->tuneLerp.current = (arg1 << 24) + (au_mseq_read_next(player) << 16);
664 voiceSelector = player->id.all + (trackIdx << 16);
665 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
666 voiceState = &manager->voiceStates[i - player->firstVoiceIdx];
667 if ((voiceState->info.all & 0xFFFF0000) == voiceSelector) {
668 voice = &globals->voices[i];
669 if (voice->priority == manager->priority && trackIdx != TRACK_ID_DRUM) {
670 voice->pitchRatio = au_compute_pitch_ratio(voiceState->pitch + (track->tuneLerp.current >> 16)) * track->instrument->pitchRatio;
671 voice->syncFlags |= AU_VOICE_SYNC_FLAG_PITCH;
672 isPitchChanged[i - player->firstVoiceIdx] = 1;
673 }
674 }
675 }
676 break;
677 case 0xF0: // required to match
678 break;
679 }
680 }
681 }
682 if (fadeVolChanged) {
683 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
684 voiceState = &manager->voiceStates[i - player->firstVoiceIdx];
685 // update all voices belonging to this player
686 if ((voiceState->info.all & 0xFF000000) == player->id.all) {
687 voice = &globals->voices[i];
688 if (voice->priority == manager->priority && !isVolumeChanged[i - player->firstVoiceIdx]) {
689 track = &player->tracks[voiceState->info.trackIndex];
690 voice->clientVolume = VOL_MULT_3(player->fadeVolume >> 24, track->volumeLerp.current >> 16, voiceState->volume);
691 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_VOL_CHANGED;
692 }
693 }
694 }
695 }
696}
AuVoice voices[24]
Definition audio.h:1075
#define VOL_MULT_3(a, b, c)
Definition audio.h:125
#define VOL_MULT_2(a, b)
Definition audio.h:122
f32 pitchRatio
Definition audio.h:838
@ AU_VOICE_SYNC_FLAG_PAN_FXMIX
Definition audio.h:151
@ AU_VOICE_SYNC_FLAG_PITCH
Definition audio.h:150
@ AU_VOICE_SYNC_FLAG_ALL
Definition audio.h:148
s16 clientVolume
Definition audio.h:861
u8 pan
Definition audio.h:841
u8 envelopeFlags
Definition audio.h:858
@ AU_PRIORITY_FREE
Definition audio.h:133
@ AU_VOICE_ENV_FLAG_KEY_RELEASED
Definition audio.h:143
@ AU_VOICE_ENV_FLAG_VOL_CHANGED
Definition audio.h:144
void au_reset_voice(AuVoice *voice, u8 voiceIdx)
Definition engine.c:393
f32 au_compute_pitch_ratio(s32 tuning)
Converts a linear pitch value (in cents) into a frequency ratio suitable for adjusting playback speed...
Definition engine.c:406
Instrument * au_get_instrument(AuGlobals *globals, BankSetIndex bank, s32 patch, EnvelopeData *arg3)
Note that bank is supplied as BankSetIndex and not BankSet, which means it will be used to perform a ...
Definition engine.c:502
#define TRACK_ID_DRUM
Definition mseq_player.c:6
@ MSEQ_TRACK_RESUMABLE
Definition mseq_player.c:28
@ MSEQ_CMD_C0_SET_INSTRUMENT
Definition mseq_player.c:36
@ MSEQ_CMD_SUB_68_SET_REVERB
Definition mseq_player.c:40
@ MSEQ_CMD_SUB_67_END_LOOP
Definition mseq_player.c:39
@ MSEQ_CMD_SUB_69_SET_RESUMABLE
Definition mseq_player.c:41
@ MSEQ_CMD_90_PLAY_SOUND
Definition mseq_player.c:33
@ MSEQ_CMD_B0_MULTI
Definition mseq_player.c:35
@ MSEQ_CMD_SUB_66_START_LOOP
Definition mseq_player.c:38
@ MSEQ_CMD_A0_SET_VOLUME_PAN
Definition mseq_player.c:34
@ MSEQ_CMD_80_STOP_SOUND
Definition mseq_player.c:32
@ MSEQ_CMD_E0_TUNING
Definition mseq_player.c:37
u8 au_mseq_read_next(AmbiencePlayer *state)

Referenced by au_mseq_manager_audio_frame_update().

◆ au_mseq_read_next()

u8 au_mseq_read_next ( AmbiencePlayer * arg0)

Definition at line 698 of file mseq_player.c.

698 {
699 u8 value = *state->mseqReadPos++;
700 return value;
701}

Referenced by au_mseq_player_update().

◆ au_mseq_player_stop()

void au_mseq_player_stop ( AmbienceManager * arg0,
AmbiencePlayer * arg1 )

Definition at line 703 of file mseq_player.c.

703 {
704 AuVoice* voice;
706 s32 i;
707
708 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
709 voiceState = &manager->voiceStates[i - player->firstVoiceIdx];
710 if (voiceState->info.playerIndex == player->id.playerIndex) {
711 voice = &manager->globals->voices[i];
712 if (voice->priority == manager->priority) {
714 }
715 voiceState->info.all = 0;
716 }
717 }
718}

Referenced by au_mseq_manager_audio_frame_update(), and au_mseq_player_update().

◆ au_mseq_save_voices()

void au_mseq_save_voices ( AmbienceManager * arg0,
AmbiencePlayer * lambda )

Definition at line 720 of file mseq_player.c.

720 {
721 AmbienceSavedVoice* savedVoice = player->savedVoices;
722 u32 numSaved = 0;
723 s32 i;
724
725 for (i = player->firstVoiceIdx; i < player->lastVoiceIdx; i++) {
726 AmbienceVoiceState* voiceState = &manager->voiceStates[i - player->firstVoiceIdx];
727
728 if (!voiceState->isResumable) {
729 continue;
730 }
731
732 savedVoice->trackIndex = voiceState->info.trackIndex;
733 savedVoice->tune = voiceState->info.tune;
734 savedVoice->volume = voiceState->volume;
735
736 savedVoice++;
737 numSaved++;
738 if (numSaved >= ARRAY_COUNT(player->savedVoices)) {
739 break;
740 }
741 }
742}

Referenced by au_mseq_manager_audio_frame_update().

◆ au_mseq_restore_voices()

void au_mseq_restore_voices ( AmbienceManager * manager,
AmbiencePlayer * lambda )

Definition at line 744 of file mseq_player.c.

744 {
745 AuGlobals* globals;
746 AuVoice* voice;
750 u32 i, j;
751
752 globals = manager->globals;
753 if (player->playState == MSEQ_PLAYER_PLAYING) {
754 for (i = 0; i < ARRAY_COUNT(player->savedVoices); i++) {
755 savedVoice = &player->savedVoices[i];
756 if (savedVoice->tune != 0) {
757 track = &player->tracks[savedVoice->trackIndex];
758
759 // find first free voice
760 for (j = player->firstVoiceIdx; j < player->lastVoiceIdx; j++) {
761 voice = &globals->voices[j];
762 if (voice->priority == AU_PRIORITY_FREE) {
763 break;
764 }
765 }
766
767 // try stealing a voice with lower priority
768 if (j >= player->lastVoiceIdx) {
769 for (j = player->firstVoiceIdx; j < player->lastVoiceIdx; j++) {
770 voice = &globals->voices[j];
771 if (voice->priority < manager->priority) {
773 break;
774 }
775 }
776 }
777
778 if (j < player->lastVoiceIdx) {
779 voiceState = &manager->voiceStates[j - player->firstVoiceIdx];
780 voiceState->info.all = player->id.all + (savedVoice->trackIndex << 16) + (savedVoice->tune << 8);
781 voiceState->pitch = (savedVoice->tune & 0x7F) * 100 - track->instrument->keyBase;
782 voiceState->volume = savedVoice->volume & 0x7F;
783 voice->clientVolume = VOL_MULT_3(player->fadeVolume >> 24, track->volumeLerp.current >> 16, voiceState->volume);
784 voice->pitchRatio = au_compute_pitch_ratio(voiceState->pitch + (track->tuneLerp.current >> 16)) * track->instrument->pitchRatio;
785 voice->pan = track->pan;
786 voice->reverb = track->reverb;
787 voice->instrument = track->instrument;
788 voice->busID = manager->busID;
789 voice->envelope.cmdListPress = track->envelope.cmdListPress;
790 voice->envelope.cmdListRelease = track->envelope.cmdListRelease;
791 voice->syncFlags = AU_VOICE_SYNC_FLAG_ALL;
792 voice->priority = manager->priority;
793 voice->clientPriority = voice->priority;
794 }
795 }
796 savedVoice->trackIndex = 0;
797 savedVoice->tune = 0;
798 savedVoice->volume = 0;
799 }
800 }
801}

Referenced by au_mseq_manager_audio_frame_update().

◆ au_sfx_init()

void au_sfx_init ( SoundManager * manager,
u8 arg1,
u8 arg2,
AuGlobals * arg3,
u8 arg4 )

Definition at line 466 of file sfx_player.c.

466 {
467 // odd choice of parameters, perhaps chosen for a very large LCM (67934687500)?
468 // gives a pseudo-random sfx update pattern
469 s32 c = 434782;
470 u32 i;
471
472 manager->globals = globals;
473 manager->nextUpdateStep = 312500;
474 manager->nextUpdateCounter = c;
475 manager->nextUpdateInterval = c;
476 manager->priority = priority;
477 manager->busID = busID;
478
479 if (minVoiceIdx > 16) {
480 manager->firstVoice = 16;
481 } else {
482 manager->firstVoice = minVoiceIdx;
483 }
484
485 manager->busVolume = AU_MAX_BUS_VOLUME;
486 manager->baseVolume = AU_MAX_BUS_VOLUME;
487 manager->frameCounter = 0;
488 manager->randomValue = 0;
489
490 for (i = 0; i < ARRAY_COUNT(manager->players); i++) {
491 SoundPlayer* player = &manager->players[i];
492
493 player->sefDataReadPos = NULL;
494 player->sfxVolume = 0;
495 player->delay = 0;
496 player->playLength = 0;
497 player->coarseTune = 0;
498 player->fineTune = 0;
499 player->sfxPan = 0;
500 player->reverb = 0;
501 player->instrumentIndex = 0;
502 player->envelopePreset = 0;
503 player->playVelocity = 0;
504 player->exclusiveID = 0;
505 player->cmdListOneShot[0] = 0; // will be set to bank
506 player->cmdListOneShot[1] = 0; // will be set to patch
507 player->cmdListOneShot[2] = 0; // will be set to volume
508 player->cmdListOneShot[3] = AU_PAN_MID; // default pan
509 player->cmdListOneShot[4] = 0; // reverb
510 player->cmdListOneShot[5] = 0x80 + (DEFAULT_KEYBASE / 100); // default tune, higher bit is meaningless
511 player->cmdListOneShot[6] = 0; // random pitch
512 player->cmdListOneShot[7] = 0; // unused
513 }
514
515 for (i = 0; i < ARRAY_COUNT(manager->bgmSounds); i++) {
516 manager->bgmSounds[i].raw = 0;
517 }
518
519 for (i = 0; i < ARRAY_COUNT(manager->customCmdList); i++) {
520 manager->customCmdList[i].data[0] = 0;
521 }
522
523 manager->resetPending = FALSE;
527 au_fade_set_volume(manager->busID, manager->fadeInfo.baseVolume >> 16, manager->busVolume);
528 manager->lastCustomEffectIdx = 0xFF;
529
530 manager->customReverbParams[0] = CUSTOM_SMALL_ROOM_PARAMS;
531 manager->customReverbParams[1] = CUSTOM_ECHO_PARAMS_1;
532 manager->customReverbParams[2] = CUSTOM_ECHO_PARAMS_2;
533 manager->customReverbParams[3] = CUSTOM_ECHO_PARAMS_3;
534 manager->customReverbParams[4] = CUSTOM_ECHO_PARAMS_3;
535 manager->customReverbParams[5] = CUSTOM_ECHO_PARAMS_3;
536 manager->customReverbParams[6] = CUSTOM_ECHO_PARAMS_3;
537 manager->customReverbParams[7] = CUSTOM_ECHO_PARAMS_3;
538
539 manager->customReverbAmounts[0] = 0x10;
540 manager->customReverbAmounts[1] = 0x20;
541 manager->customReverbAmounts[2] = 0x20;
542 manager->customReverbAmounts[3] = 0x20;
543 manager->customReverbAmounts[4] = 0x20;
544 manager->customReverbAmounts[5] = 0x30;
545 manager->customReverbAmounts[6] = 0x40;
546 manager->customReverbAmounts[7] = 0x50;
547
549}
u8 cmdListOneShot[8]
Definition audio.h:734
@ SND_MANAGER_STATE_ENABLED
Definition audio.h:364
u8 instrumentIndex
Definition audio.h:753
u16 playLength
Definition audio.h:743
AuFilePos sefDataReadPos
Definition audio.h:721
s16 coarseTune
Definition audio.h:744
u8 reverb
Definition audio.h:752
u8 envelopePreset
Definition audio.h:754
#define AU_PAN_MID
Definition audio.h:66
u8 exclusiveID
Definition audio.h:749
#define DEFAULT_KEYBASE
Definition audio.h:59
s16 sfxVolume
Definition audio.h:730
s8 fineTune
Definition audio.h:745
u16 delay
Definition audio.h:742
#define AU_MAX_VOLUME_16
Definition audio.h:62
#define AU_MAX_BUS_VOLUME
Definition audio.h:40
u8 playVelocity
Definition audio.h:755
u8 sfxPan
Definition audio.h:751
void au_fade_init(Fade *fade, s32 time, s32 startValue, s32 endValue)
Definition engine.c:417
void au_fade_set_volume(u8 arg0, u16 arg1, s32 arg2)
Definition engine.c:453
s32 CUSTOM_ECHO_PARAMS_1[]
Definition sfx_player.c:103
s32 CUSTOM_SMALL_ROOM_PARAMS[]
Definition sfx_player.c:92
void au_sfx_set_state(SoundManager *manager, s32 state)
Definition sfx_player.c:739
s32 CUSTOM_ECHO_PARAMS_3[]
Definition sfx_player.c:121
s32 CUSTOM_ECHO_PARAMS_2[]
Definition sfx_player.c:112
void au_sfx_clear_queue(SoundManager *manager)
Definition sfx_player.c:571
s32 au_sfx_set_reverb_type(SoundManager *manager, s32 arg1)
Definition sfx_player.c:719

Referenced by au_engine_init().

◆ au_sfx_load_groups_from_SEF()

void au_sfx_load_groups_from_SEF ( SoundManager * sndMgr)

Definition at line 551 of file sfx_player.c.

551 {
552 SEFHeader* sefData = manager->globals->dataSEF;
553 s32 sections = ARRAY_COUNT(sefData->sections);
554 u32 i;
555
556 manager->sefData = (u8*)sefData;
557
558 for (i = 0; i < sections; i++) {
559 if (sefData->sections[i] != 0) {
560 manager->normalSounds[i] = AU_FILE_RELATIVE(sefData, sefData->sections[i]);
561 }
562 }
563
564 if (sefData->hasExtraSection == 1) {
565 if (sefData->section2000 != 0) {
566 manager->extraSounds = AU_FILE_RELATIVE(sefData, sefData->section2000);
567 }
568 }
569}
u16 sections[8]
Definition audio.h:947
u16 section2000
Definition audio.h:948
u8 hasExtraSection
Definition audio.h:945

Referenced by au_engine_init().

◆ au_sfx_clear_queue()

void au_sfx_clear_queue ( SoundManager * manager)

Definition at line 571 of file sfx_player.c.

571 {
572 s32 i;
573
574 for (i = 0; i < SFX_QUEUE_SIZE; i++) {
575 manager->soundQueue[i].soundID = SOUND_NONE;
576 manager->soundQueue[i].toReplaceID = SOUND_NONE;
577 manager->soundQueue[i].volume = 0;
578 manager->soundQueue[i].pitchShift = 0;
579 manager->soundQueue[i].pan = 0;
580 }
581
582 manager->unused_165 = 0;
583 manager->sfxQueueWritePos = 0;
584 manager->sfxQueueReadPos = 0;
585 manager->unused_162 = 0;
586}
#define SFX_QUEUE_SIZE
Definition audio.h:108
@ SOUND_NONE
Definition enums.h:550

Referenced by au_sfx_init().

◆ au_sfx_enqueue_event()

void au_sfx_enqueue_event ( SoundManager * manager,
u32 soundID,
s16 volume,
s16 pitchShift,
u8 pan )

Definition at line 590 of file sfx_player.c.

590 {
591 // Determine the number of pending sound effects in the queue
592 s32 pending = manager->sfxQueueWritePos - manager->sfxQueueReadPos;
593 if (pending < 0) {
595 }
596
597 // Only enqueue if there's room in the buffer
598 if (pending < SFX_QUEUE_SIZE) {
599 u32 nextPos = manager->sfxQueueWritePos;
600
601 manager->soundQueue[nextPos].soundID = soundID & (SOUND_ID_LOWER | SOUND_ID_STOP | SOUND_ID_ADJUST | SOUND_ID_TRIGGER_MASK);
602 manager->soundQueue[nextPos].toReplaceID = (soundID & SOUND_ID_UPPER_MASK) >> 0x10;
603 manager->soundQueue[nextPos].volume = volume;
604 manager->soundQueue[nextPos].pitchShift = pitchShift;
605 manager->soundQueue[nextPos].pan = pan;
606
607 nextPos++;
608 if (nextPos >= SFX_QUEUE_SIZE) {
609 nextPos = 0;
610 }
611
612 manager->sfxQueueWritePos = nextPos;
613 }
614}
@ SOUND_ID_UPPER_MASK
Definition enums.h:537
@ SOUND_ID_ADJUST
Definition enums.h:529
@ SOUND_ID_TRIGGER_MASK
Definition enums.h:530
@ SOUND_ID_STOP
Definition enums.h:526
@ SOUND_ID_LOWER
Definition enums.h:527

Referenced by snd_adjust_sound(), snd_adjust_sound_with_shift(), snd_start_sound(), snd_start_sound_raw(), snd_start_sound_with_shift(), and snd_stop_sound().

◆ au_sfx_begin_video_frame()

void au_sfx_begin_video_frame ( SoundManager * manager)

Definition at line 618 of file sfx_player.c.

618 {
621 u32 i, j, k;
622 s32 pending;
623
624 manager->frameCounter++;
625 if (manager->resetPending) {
626 au_sfx_reset_players(manager);
627 manager->resetPending = FALSE;
628 }
629
630 // Process sound effects triggered by music via BGM_SPECIAL_TRIGGER_SOUND
631 for (i = 0; i < ARRAY_COUNT(manager->bgmSounds); i++) {
632 k = manager->bgmSounds[i].index;
633 if (k == 0) {
634 // do nothing
635 } else if (k <= ARRAY_COUNT(MusicSounds)) {
637 u16 prereq = triggered->prereq;
638 if (prereq != 0) {
639 // try playing sound ONLY IF prereq sound is already playing
640 for (j = 0; j < ARRAY_COUNT(manager->players); j++) {
641 if (manager->players[j].curSoundID == prereq) {
642 newRequest.soundID = triggered->sound;
643 newRequest.toReplaceID = SOUND_NONE;
644 newRequest.pitchShift = 0;
645 if ((triggered->flags & 1) && (manager->bgmSounds[i].volume != 0)) {
646 newRequest.volume = (manager->bgmSounds[i].volume << 8) + 0xFF;
647 } else {
648 newRequest.volume = 0;
649 }
650 newRequest.pan = 0;
652 break;
653 }
654 }
655 } else {
656 // no prereq defined, unconditionally play the sound
657 newRequest.soundID = triggered->sound;
658 newRequest.toReplaceID = SOUND_NONE;
659 newRequest.volume = 0;
660 newRequest.pitchShift = 0;
661 newRequest.pan = 0;
663 }
664 }
665 // clear the event
666 manager->bgmSounds[i].raw = 0;
667 }
668
669 // Process sound effects triggered by SEF command 17
670 for (i = 0; i < ARRAY_COUNT(manager->customCmdList); i++) {
671 if (manager->customCmdList[i].data[0] != 0) {
672 newRequest.soundID = 1;
673 newRequest.toReplaceID = SOUND_NONE;
674 newRequest.volume = 0;
675 newRequest.pitchShift = 0;
676 newRequest.pan = 0;
677 au_sfx_try_sound(manager, &newRequest, &manager->customCmdList[i]);
678 }
679 manager->customCmdList[i].data[0] = 0;
680 }
681
682 // Determine the number of pending sound effects in the queue
683 pending = manager->sfxQueueWritePos - manager->sfxQueueReadPos;
684 if (pending < 0) {
686 }
687
688 // Process each pending sound effect in the queue
689 j = manager->sfxQueueReadPos;
690 if (pending > 0 && pending < SFX_QUEUE_SIZE) {
691 for (i = 0; i < pending; i++) {
692 request = &manager->soundQueue[j];
693 if (request->soundID & SOUND_ID_LOWER) {
694 if (request->soundID & SOUND_ID_STOP) {
695 au_sfx_stop_by_id(manager, request->soundID);
696 } else if (!(request->soundID & (SOUND_ID_ADJUST | SOUND_ID_TRIGGER_MASK))) {
698 } else {
699 if (request->soundID & SOUND_ID_TRIGGER_MASK) {
700 au_sfx_set_triggers(manager, request->soundID);
701 }
702 if (request->soundID & SOUND_ID_ADJUST) {
703 au_sfx_set_modifiers(manager, request);
704 }
705 }
706 }
707 request->soundID = SOUND_NONE;
708
709 j++;
710 if (j >= SFX_QUEUE_SIZE) {
711 j = 0;
712 }
713 }
714 manager->sfxQueueReadPos = manager->sfxQueueWritePos;
715 }
716}
MusicTriggeredSound MusicSounds[]
Definition sfx_player.c:129
void au_sfx_try_sound(SoundManager *manager, SoundRequest *request, SoundManagerCustomCmdList *customSEF)
Definition sfx_player.c:747

Referenced by au_update_clients_for_video_frame().

◆ au_sfx_set_reverb_type()

s32 au_sfx_set_reverb_type ( SoundManager * manager,
s32 arg1 )

Definition at line 719 of file sfx_player.c.

719 {
720 s32 customIdx = (u8) arg1;
721
722 if (customIdx != 0xF0) {
723 if (customIdx < ARRAY_COUNT(manager->customReverbParams)) {
724 if (manager->lastCustomEffectIdx != customIdx) {
725 manager->lastCustomEffectIdx = customIdx;
726 manager->globals->effectChanges[FX_BUS_SOUND].type = AU_FX_CUSTOM_0;
727 manager->globals->effectChanges[FX_BUS_SOUND].changed = TRUE;
728 AU_FX_CUSTOM_PARAMS[0] = manager->customReverbParams[customIdx];
729 }
730 manager->defaultReverbAmt = manager->customReverbAmounts[customIdx];
731 } else {
732 manager->lastCustomEffectIdx = 0xFF;
733 manager->defaultReverbAmt = 0;
734 }
735 }
736 return manager->lastCustomEffectIdx;
737}
@ AU_FX_CUSTOM_0
Definition audio.h:161
@ FX_BUS_SOUND
Definition audio.h:235
s32 * AU_FX_CUSTOM_PARAMS[0]
Definition reverb.c:106

Referenced by au_set_reverb_type(), and au_sfx_init().

◆ au_sfx_set_state()

void au_sfx_set_state ( SoundManager * manager,
s32 arg1 )

Definition at line 739 of file sfx_player.c.

739 {
740 if (state == SND_MANAGER_STATE_ENABLED) {
741 manager->state = state;
742 } else if (state == SND_MANAGER_STATE_DISABLED) {
743 manager->state = state;
744 }
745}
@ SND_MANAGER_STATE_DISABLED
Definition audio.h:365

Referenced by au_sfx_init(), snd_disable_sfx(), and snd_enable_sfx().

◆ au_sfx_try_sound()

void au_sfx_try_sound ( SoundManager * manager,
SoundRequest * request,
SoundManagerCustomCmdList * customSEF )

Definition at line 747 of file sfx_player.c.

747 {
748 SoundPlayer* player;
749 s32 playerIndex;
750 u16* cmdList;
753 u32 exclusiveID;
757 s32 v1;
758 s32* normalSounds;
759
760 #define NEXT_POLY_TRACK trackCount--; if (trackCount <= 0 ) { break; } cmdList += 2;
761
762 u32 soundIndex = (request->soundID - 1) & 0xFF;
764 u16 soundID = request->soundID;
765
766 if (soundID & SOUND_ID_UNK) {
767 // sound from extra section
768 soundIndex = (request->soundID - 1) & SOUND_ID_UNK_INDEX_MASK;
769 if (soundIndex < 0x140) {
770 cmdList = (u16*)&manager->extraSounds[soundIndex];
771 if (*cmdList != 0) {
772 // check if any player is playing this sound
773 for (playerIndex = 7; playerIndex >= 0; playerIndex--) {
774 player = &manager->players[playerIndex];
775 if (player->curSoundID == soundIDLower) {
777 break;
778 }
779 }
780
781 if (!foundPlayer) {
782 //find free player
783 for (playerIndex = 7; playerIndex >= 0; playerIndex--) {
784 player = &manager->players[playerIndex];
785 if (player->sefDataReadPos == NULL) {
787 break;
788 }
789 }
790 }
791
792 if (foundPlayer) {
793 au_sfx_play_sound(manager, player, (s8*)cmdList, request, 0, 0);
794 }
795 }
796 }
797 } else {
798 if (soundIndex >= 0xC0) {
799 if (customSEF != NULL) {
800 cmdList = (u16*)customSEF;
801 } else {
802 sectionIndex = ((soundIDLower - 1) >> 8) + 4;
803 normalSounds = manager->normalSounds[sectionIndex];
804 v1 = soundIndex - 0xC0;
805 cmdList = (u16*)&manager->normalSounds[sectionIndex][v1];
806 }
807
808 if (*cmdList != 0) {
809 // check if any player is playing this sound
810 for (playerIndex = 7; playerIndex >= 0; playerIndex--) {
811 player = &manager->players[playerIndex];
812 if (player->curSoundID == soundIDLower) {
814 break;
815 }
816 }
817
818 if (!foundPlayer) {
819 //find free player
820 for (playerIndex = 7; playerIndex >= 0; playerIndex--) {
821 player = &manager->players[playerIndex];
822 if (player->sefDataReadPos == NULL) {
824 break;
825 }
826 }
827 }
828
829 if (foundPlayer) {
830 au_sfx_play_sound(manager, player, (u8*)cmdList, request, 0, 0);
831 }
832 }
833 } else {
834 if (customSEF != NULL) {
835 cmdList = (u16*)customSEF;
836 } else {
837 sectionIndex = ((soundID) >> 8) & 3;
838 cmdList = (u16*)&manager->normalSounds[sectionIndex][soundIndex];
839 }
840
841 if (*cmdList != 0) {
842 // read sound info chunk
843 soundInfo = cmdList[1];
844
845 priority = (soundInfo & 0x300) >> 8; // bits 8, 9
846 polyphonyMode = (soundInfo & 0x60) >> 5; // bits 5, 6,
848 useSpecificPlayerMode = (useSpecificPlayerMode & 0x80) >> 7; // bit 7
849
850 if (polyphonyMode == 0) {
851 if (request->toReplaceID != SOUND_NONE) {
852 for (playerIndex = 0; playerIndex < 8; playerIndex++) {
853 player = &manager->players[playerIndex];
854 if (player->curSoundID == request->toReplaceID) {
856 break;
857 }
858 }
859 }
860
861 if (useSpecificPlayerMode == 0) {
862 if (!foundPlayer) {
863 playerIndex = soundInfo & 0x7;
864 player = &manager->players[playerIndex];
865 if (player->sefDataReadPos == NULL || priority >= player->priority) {
866 au_sfx_play_sound(manager, player, AU_FILE_RELATIVE(manager->sefData, *cmdList), request, priority, 0);
867 }
868 return;
869 }
870 }
871
872 if (!foundPlayer) {
873 // lower 4 bits of soundInfo: max playerIndex
874 // check if any player is playing this sound
875 for (playerIndex = soundInfo & 0x7; playerIndex >= 0; playerIndex--) {
876 player = &manager->players[playerIndex];
877 if (player->curSoundID == soundIDLower) {
879 break;
880 }
881 }
882 }
883
884 if (!foundPlayer) {
885 // find free player
886 for (playerIndex = soundInfo & 0x7; playerIndex >= 0; playerIndex--) {
887 player = &manager->players[playerIndex];
888 if (player->sefDataReadPos == NULL) {
890 break;
891 }
892 }
893 }
894
895 if (!foundPlayer) {
896 // if there is no free player try stealing one with lower priority
897 for (playerIndex = soundInfo & 0x7; playerIndex >= 0; playerIndex--) {
898 player = &manager->players[playerIndex];
899 if (player->priority < priority) {
901 break;
902 }
903 }
904 }
905
906 if (!foundPlayer) {
907 playerIndex = soundInfo & 0x7;
908 player = &manager->players[playerIndex];
909 if (player->priority <= priority) {
911 }
912 }
913
914 if (foundPlayer) {
915 au_sfx_play_sound(manager, player, AU_FILE_RELATIVE(manager->sefData, *cmdList), request, priority, 0);
916 }
917 } else {
918 cmdList = AU_FILE_RELATIVE(manager->sefData, *cmdList);
919 exclusiveID = (soundInfo & 0x1800) >> 11; // bits 11, 12
920 if (exclusiveID != 0) {
921 au_sfx_stop_by_exlusive_id(manager, exclusiveID);
922 } else {
923 au_sfx_stop_by_id(manager, request->soundID);
924 }
925
926 trackCount = 2 << (polyphonyMode - 1); // 2 or 4 or 8
927
928 if (useSpecificPlayerMode != 0) {
929 for (playerIndex = 7; playerIndex >= 0; playerIndex--) {
930 if (*cmdList != 0) {
931 // first check the players that were stopped just now
932 player = &manager->players[playerIndex];
933 if (player->sefDataReadPos == BlankSEFData) {
934 au_sfx_play_sound(manager, player, AU_FILE_RELATIVE(manager->sefData, *cmdList), request, priority, exclusiveID);
936 }
937 } else {
939 }
940
941 }
942
943 if (trackCount != 0) {
944 for (playerIndex = 7; playerIndex >= 0;){
945 if (*cmdList != 0) {
946 // then check any free players
947 player = &manager->players[playerIndex];
948 if (player->sefDataReadPos == NULL) {
949 au_sfx_play_sound(manager, player, AU_FILE_RELATIVE(manager->sefData, *cmdList), request, priority, exclusiveID);
951 }
952 playerIndex--;
953 } else {
955 }
956 }
957 }
958
959 if (trackCount != 0) {
960 for (playerIndex = 7; playerIndex >= 0; playerIndex--) {
961 if (*cmdList != 0) {
962 // then try to steal
963 player = &manager->players[playerIndex];
964 if (exclusiveID > player->exclusiveID && priority >= player->priority) {
965 au_sfx_play_sound(manager, player, AU_FILE_RELATIVE(manager->sefData, *cmdList), request, priority, exclusiveID);
967 }
968 } else {
970 }
971 }
972 }
973 } else {
974 s32 i;
975 for (i = 0; i < trackCount; i++) {
976 if (*cmdList != 0) {
977 soundInfo = cmdList[1];
978 playerIndex = soundInfo & 7;
979 player = &manager->players[playerIndex];
980 priority = (soundInfo & 0x300) >> 8; // bits 8, 9
981 if (player->sefDataReadPos == NULL || priority >= player->priority) {
982 au_sfx_play_sound(manager, player, AU_FILE_RELATIVE(manager->sefData, *cmdList), request, priority, exclusiveID);
983 }
984 cmdList += 2;
985 }
986 }
987 }
988 }
989 }
990 }
991 }
992 #undef NEXT_POLY_TRACK
993}
u8 priority
Definition audio.h:748
u16 curSoundID
Definition audio.h:747
@ SOUND_ID_UNK_INDEX_MASK
Definition enums.h:535
@ SOUND_ID_UNK
Definition enums.h:528
#define NEXT_POLY_TRACK
u8 BlankSEFData[]
Definition sfx_player.c:228

Referenced by au_sfx_begin_video_frame().

◆ au_sfx_manager_audio_frame_update()

s16 au_sfx_manager_audio_frame_update ( SoundManager * manager)

Definition at line 1139 of file sfx_player.c.

1139 {
1140 SoundPlayer* player;
1141 AuVoice* voice;
1143 u8 end;
1144 u8 i;
1145
1146 // update pseudorandom number with fast 'good enough' method
1147 manager->randomValue = (u16)manager->randomValue + (u16)manager->frameCounter;
1148
1149 startVoice = manager->firstVoice;
1150 for (i = startVoice, end = startVoice + ARRAY_COUNT(manager->players); i < end; i++) {
1151 player = &manager->players[i - manager->firstVoice];
1152 if (player->sefDataReadPos != NULL) {
1153 voice = &manager->globals->voices[i];
1154 manager->curVoice = voice;
1155 if (voice->priority <= manager->priority) {
1156 manager->curVoiceIndex = i;
1157 switch (player->sfxParamsFlags & SFX_PARAM_MODE_MASK) {
1159 au_sfx_update_basic(manager, player, voice, i);
1160 break;
1162 au_sfx_update_sequence(manager, player, voice, i);
1163 break;
1165 break;
1166 }
1167 } else {
1168 player->sefDataReadPos = NULL;
1169 player->curSoundID = SOUND_NONE;
1170 player->priority = 0;
1171 }
1172 }
1173 }
1174 return 0;
1175}
u8 sfxParamsFlags
Definition audio.h:750
@ SFX_PARAM_MODE_COMPACT
Definition sfx_player.c:60
@ SFX_PARAM_MODE_SEQUENCE
Definition sfx_player.c:58
@ SFX_PARAM_MODE_MASK
Definition sfx_player.c:61
@ SFX_PARAM_MODE_BASIC
Definition sfx_player.c:56

Referenced by au_update_clients_for_audio_frame().

◆ au_bgm_begin_video_frame()

void au_bgm_begin_video_frame ( BGMPlayer * player)

Definition at line 23 of file bgm_player.c.

23 {
24 BGMHeader* bgmFile;
27 u32 compID;
28 s32 compOffset;
29 u32 value;
31 u8 var_a1;
32 u8 pos;
33 u32 i;
34
35 compID = 0;
36 unkType = -1;
37 player->frameCounter++;
38
39 if (player->cmdBufPending != 0) {
40 if (player->cmdBufPending < ARRAY_COUNT(player->cmdBufData)) {
41 pos = player->cmdBufReadPos;
42 for (var_a1 = 0; var_a1 < player->cmdBufPending; var_a1++) {
43 value = player->cmdBufData[pos];
44 if (value != 0) {
45 if (value < 16) {
46 unkType = value & 3;
47 compID = value >> 2;
48 }
49 pos++;
50 if (pos >= ARRAY_COUNT(player->cmdBufData)) {
51 pos = 0;
52 }
53 }
54 }
55 consumed = player->cmdBufWritePos - player->cmdBufReadPos;
56 if (consumed < 0) {
58 }
59 player->cmdBufPending -= consumed;
60 player->cmdBufReadPos = player->cmdBufWritePos;
61 } else {
62 player->cmdBufPending = 0;
63 }
64
65 if (unkType != -1) {
66 if (unkType != 0) {
67 if (unkType != player->unk_58) {
68 player->unk_58 = unkType & 0xFF;
69 player->unk_5A = unkType & 0xFF;
72 if (unkType == 2) {
73 bgmFile = player->globals->dataBGM[1];
74 } else {
75 bgmFile = player->globals->dataBGM[0];
76 }
77 player->bgmFile = bgmFile;
78 bgmData = &bgmFile->info;
80
81 compOffset = bgmData->compositions[compID];
82 if (compOffset == 0) {
83 compOffset = bgmData->compositions[0];
84 }
85 player->compStartPos = AU_FILE_RELATIVE(bgmFile, compOffset << 2);
86 player->compReadPos = AU_FILE_RELATIVE(bgmFile, compOffset << 2);
87
88 if (bgmData->drums != 0) {
89 player->drumsInfo = AU_FILE_RELATIVE(player->bgmFile, bgmData->drums << 2);
90 player->bgmDrumCount = bgmData->drumCount;
91 for (i = 0; i < player->bgmDrumCount; i++) {
92 BGMDrumInfo* drum = &player->drumsInfo[i];
93 player->drums[i] = drum;
94 }
95 for (; i < ARRAY_COUNT(player->drums); i++) {
96 player->drums[i] = player->drums[0];
97 }
98 } else {
99 player->drumsInfo = NULL;
100 player->bgmDrumCount = 0;
101 }
102
103 if (bgmData->instruments != 0) {
104 player->instrumentsInfo = AU_FILE_RELATIVE(player->bgmFile, bgmData->instruments << 2);
105 player->bgmInstrumentCount = bgmData->instrumentCount;
106 return;
107 }
108 player->instrumentsInfo = NULL;
109 player->bgmInstrumentCount = 0;
110 }
111 } else {
112 if (player->unk_58 != 0) {
114 player->nextUpdateCounter = 1;
115 player->nextUpdateStep = 1;
116 } else {
117 au_bgm_stop_player(player);
118 }
119 }
120 }
121 }
122}
BGMInstrumentInfo * instrumentsInfo
Definition audio.h:1166
u16 unk_5A
Definition audio.h:1156
struct BGMHeader * bgmFile
Definition audio.h:1160
u8 cmdBufPending
Buffer for an unused (legacy) system for controlling the BGMPlayer from the main thread.
Definition audio.h:1213
u8 * tickRatePtr
Definition audio.h:1164
u16 unk_58
Definition audio.h:1155
SegData * compReadPos
Definition audio.h:1161
s32 frameCounter
current update counter value
Definition audio.h:1144
BGMDrumInfo * drumsInfo
Definition audio.h:1165
AuGlobals * globals
Definition audio.h:1139
u8 bgmDrumCount
Definition audio.h:1196
s32 nextUpdateCounter
update counter threshold for a single tick
Definition audio.h:1143
BGMFileInfo info
Definition audio.h:884
BGMDrumInfo * drums[12]
Definition audio.h:1167
SegData * compStartPos
Definition audio.h:1162
@ BGM_PLAY_STATE_STOP
Definition audio.h:211
@ BGM_PLAY_STATE_INIT
Definition audio.h:210
s32 nextUpdateStep
Definition audio.h:1141
u8 bgmInstrumentCount
Definition audio.h:1197
#define BGM_DEFAULT_UPDATE_STEP
Definition audio.h:97
s32 cmdBufData[8]
Definition audio.h:1212
u8 cmdBufWritePos
Definition audio.h:1215
struct BGMHeader * dataBGM[2]
Definition audio.h:1047
u8 cmdBufReadPos
Definition audio.h:1214
u8 masterState
Definition audio.h:1201
u8 BgmTicksRates[8]
Definition sfx_player.c:279
void au_bgm_set_tick_resolution(BGMPlayer *player, s32 mBeatsPerMinute, u32 ticksPerBeat)
Definition bgm_player.c:827
Vec3s pos
Definition demo_api.c:17

Referenced by au_update_clients_for_video_frame().

◆ au_bgm_get_player_with_song_name()

BGMPlayer * au_bgm_get_player_with_song_name ( s32 songString)

Definition at line 124 of file bgm_player.c.

124 {
127 return gBGMPlayerB;
128 }
129 } else {
130 return gBGMPlayerA;
131 }
132 return NULL;
133}
BGMPlayer * gBGMPlayerB
Definition engine.c:7
s32 name
Definition audio.h:882
BGMPlayer * gBGMPlayerA
Definition engine.c:6

Referenced by au_bgm_adjust_volume(), au_bgm_is_song_playing(), au_bgm_process_fade_out(), au_bgm_process_init_song(), au_bgm_process_resume(), au_bgm_process_suspend(), au_bgm_set_linked_tracks(), au_bgm_set_proximity_mix(), and au_bgm_stop_song().

◆ au_bgm_process_init_song()

AuResult au_bgm_process_init_song ( SongStartRequest * event)

Definition at line 135 of file bgm_player.c.

135 {
136 BGMPlayer* player;
138 s32 songName;
139 s32 variation;
140 s32 duration;
141 s32 volume0;
142 s32 volume1;
143 AuResult status;
144 u32 i;
145
146 status = AU_RESULT_OK;
147 songName = request->songName;
148 variation = request->variation;
149
150 if (songName != 0) {
151 player = au_bgm_get_player_with_song_name(songName);
152 if (player != NULL) {
153 fileInfo = &player->bgmFile->info;
154 duration = request->duration;
155 if (duration != 0) {
156 if (duration > SND_MAX_DURATION) {
157 duration = SND_MAX_DURATION;
158 } else if (duration < SND_MIN_DURATION) {
159 duration = SND_MIN_DURATION;
160 }
161 }
162 volume0 = request->startVolume;
163 if (volume0 > AU_MAX_VOLUME_8) {
165 }
166 if (volume0 != 0) {
168 }
169 volume1 = request->finalVolume;
170 if (volume1 > AU_MAX_VOLUME_8) {
172 }
173 if (volume1 != 0) {
175 } else {
177 }
178
179 au_fade_init(&player->fadeInfo, duration, volume0, volume1);
181 player->fadeInfo.envelopeTicks = 1;
183
184 if (variation < BGM_VARIATION_0 || variation > BGM_VARIATION_3 || fileInfo->compositions[variation] == 0) {
185 variation = BGM_VARIATION_0;
186 }
187 player->curVariation = variation;
188
189 player->compStartPos = AU_FILE_RELATIVE(player->bgmFile, fileInfo->compositions[variation] << 2);
190 player->compReadPos = player->compStartPos;
191
192 if (fileInfo->drums != 0) {
193 player->drumsInfo = AU_FILE_RELATIVE(player->bgmFile, fileInfo->drums << 2);
194 player->bgmDrumCount = fileInfo->drumCount;
195
196 for (i = 0; i < player->bgmDrumCount; i++) {
197 BGMDrumInfo* drum = &player->drumsInfo[i];
198 player->drums[i] = drum;
199 }
200 for (; i < ARRAY_COUNT(player->drums); i++) {
201 player->drums[i] = player->drums[0];
202 }
203 } else {
204 player->drumsInfo = NULL;
205 player->bgmDrumCount = 0;
206 }
207
208 if (fileInfo->instruments != 0) {
209 player->instrumentsInfo = AU_FILE_RELATIVE(player->bgmFile, fileInfo->instruments << 2);
210 player->bgmInstrumentCount = fileInfo->instrumentCount;
211 } else {
212 player->instrumentsInfo = NULL;
213 player->bgmInstrumentCount = 0;
214 }
215
216 player->songName = songName;
218 } else {
220 }
221 } else {
223 }
224 return status;
225}
s32 songName
Definition audio.h:1146
s16 envelopeTarget
Definition audio.h:512
s16 envelopeTicks
Definition audio.h:513
Fade fadeInfo
Definition audio.h:1150
#define AU_VOL_8_TO_16(vol)
Definition audio.h:70
s32 curVariation
Definition audio.h:1159
BGMPlayer * au_bgm_get_player_with_song_name(s32 songString)
Definition bgm_player.c:124
void au_bgm_player_initialize(BGMPlayer *player)
Definition bgm_player.c:702
@ BGM_VARIATION_0
Definition enums.h:1805
@ BGM_VARIATION_3
Definition enums.h:1808
@ AU_ERROR_NULL_SONG_NAME
Definition enums.h:1766
@ AU_ERROR_SONG_NOT_PLAYING
Definition enums.h:1764

Referenced by snd_song_request_fade_in(), snd_song_request_fade_in_default(), snd_song_request_play(), and snd_song_request_play_default().

◆ au_bgm_stop_song()

AuResult au_bgm_stop_song ( s32 songName)

Definition at line 227 of file bgm_player.c.

227 {
228 BGMPlayer* player;
229 AuResult status = AU_RESULT_OK;
230
231 if (songName != 0) {
232 player = au_bgm_get_player_with_song_name(songName);
233 if (player != NULL) {
234 if (songName == player->songName) {
235 au_bgm_stop_player(player);
236 }
237 } else {
239 }
240 } else {
242 }
243
244 return status;
245}

Referenced by snd_song_stop().

◆ au_bgm_stop_all()

void au_bgm_stop_all ( void )

Definition at line 247 of file bgm_player.c.

247 {
248 au_bgm_stop_player(gBGMPlayerA);
249 au_bgm_stop_player(gBGMPlayerB);
250}

Referenced by snd_song_stop_all().

◆ au_bgm_is_song_playing()

AuResult au_bgm_is_song_playing ( s32 songName)

Definition at line 261 of file bgm_player.c.

261 {
262 BGMPlayer* player;
263 AuResult result = AU_RESULT_OK;
264
265 if (songName != 0) {
266 player = au_bgm_get_player_with_song_name(songName);
267 if (player != NULL) {
268 result = (songName == player->songName);
269 } else {
271 }
272 } else {
274 }
275
276 return result;
277}

Referenced by snd_song_is_playing().

◆ au_bgm_player_is_active()

b32 au_bgm_player_is_active ( BGMPlayer * player)

Definition at line 279 of file bgm_player.c.

279 {
280 if (player->songName != 0 && player->masterState != 0) {
281 return TRUE;
282 } else {
283 return FALSE;
284 }
285}

Referenced by au_bgm_process_resume(), and au_load_song_files().

◆ au_bgm_process_fade_out()

AuResult au_bgm_process_fade_out ( SongFadeOutRequest * s)

Definition at line 287 of file bgm_player.c.

287 {
288 AuResult status;
289 BGMPlayer* player;
290 u32 songName = request->songName;
291 u32 duration = request->duration;
292 s16 volume = request->finalVolume;
293
294 status = AU_RESULT_OK;
295 if (songName != 0) {
296 if (duration >= SND_MIN_DURATION && duration <= SND_MAX_DURATION) {
297 player = au_bgm_get_player_with_song_name(songName);
298 if (player != NULL) {
299 if (player->songName == songName) {
300 if (player->masterState != BGM_PLAY_STATE_IDLE) {
301 if (!player->paused) {
302 player->fadeInfo.baseTarget = volume;
303 player->fadeInfo.baseTicks = (duration * 1000) / AU_FRAME_USEC;
304 player->fadeInfo.baseStep = ((volume << 0x10) - player->fadeInfo.baseVolume) / player->fadeInfo.baseTicks;
305 player->fadeInfo.onCompleteCallback = request->doneCallback;
306 if (request->onPush == 1) {
307 player->pushSongName = songName;
308 }
309 }
310 }
311 }
312 } else {
314 }
315 } else {
317 }
318 } else {
320 }
321 return status;
322}
s16 baseTicks
Definition audio.h:508
AuCallback onCompleteCallback
Definition audio.h:509
s32 baseStep
Definition audio.h:506
u8 paused
Definition audio.h:1200
s16 baseTarget
Definition audio.h:507
@ BGM_PLAY_STATE_IDLE
Definition audio.h:207
s32 pushSongName
Definition audio.h:1147
#define AU_FRAME_USEC
Definition audio.h:27
s16_16 baseVolume
Definition audio.h:505
@ AU_ERROR_INVALID_SONG_DURATION
Definition enums.h:1768

Referenced by snd_song_request_fade_out(), and snd_song_request_push_fade_out().

◆ au_bgm_complete_push()

AuResult au_bgm_complete_push ( s32 songName)

Definition at line 324 of file bgm_player.c.

324 {
326
327 s.songName = songName;
328 s.duration = 0;
329 s.startVolume = 0;
330 s.finalVolume = 0;
332 s.pauseMode = FALSE;
333
334 return au_bgm_process_suspend(&s, 0); // force stop
335}
@ BGM_SNAPSHOT_0
Definition audio.h:192
AuResult au_bgm_process_suspend(SongSuspendRequest *request, b32 skipStop)
Definition bgm_player.c:337

Referenced by au_bgm_update_fade().

◆ au_bgm_process_suspend()

AuResult au_bgm_process_suspend ( SongSuspendRequest * update,
b32 skipStop )

Definition at line 337 of file bgm_player.c.

337 {
338 AuResult status;
339 BGMPlayer* player;
341 s32 songName;
342 s32 index;
343 u32 i;
344 u32 j;
345
346 songName = request->songName;
347 index = request->index;
348 status = AU_RESULT_OK;
349
350 if (songName != 0) {
351 player = au_bgm_get_player_with_song_name(songName);
352 if (player != NULL) {
353 if (!request->pauseMode) {
355 if (snapshot != NULL) {
356 if (songName == player->songName) {
357 if (!skipStop) {
358 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
359 BGMPlayerTrack* track = &player->tracks[i];
360 if (track->bgmReadPos != NULL) {
361 for (j = track->firstVoice; j < track->lastVoice; j++) {
362 track->changed.all = 0;
363 }
364 }
365 }
366 }
367 player->globals->snapshots[index].priority = player->priority;
368 player->globals->snapshots[index].assigned = 1;
369 player->pushSongName = 0;
370 au_copy_words(player, snapshot, sizeof(*player));
371 if (!skipStop) {
372 au_bgm_stop_player(player);
373 }
374 }
375 } else {
377 }
378 } else {
379 if (songName == player->songName) {
380 if (player->masterState != BGM_PLAY_STATE_IDLE) {
381 player->paused = TRUE;
383 }
384 }
385 }
386 } else {
388 }
389 } else {
391 }
392 return status;
393}
SoundPlayChange changed
Definition audio.h:1097
BGMPlayerSnapshot snapshots[1]
Definition audio.h:1049
u8 priority
Used to mute any linked tracks after the first one encountered.
Definition audio.h:1209
BGMPlayerTrack tracks[16]
Definition audio.h:1217
void au_bgm_reset_all_voices(BGMPlayer *player)
BGMPlayer * au_get_snapshot_by_index(s32 index)
Definition engine.c:656
void au_copy_words(void *src, void *dst, s32 size)
Definition engine.c:1273

Referenced by au_bgm_complete_push(), snd_song_push_stop(), snd_song_request_pause(), and snd_song_request_snapshot().

◆ au_bgm_process_resume()

AuResult au_bgm_process_resume ( SongResumeRequest * update)

Definition at line 395 of file bgm_player.c.

395 {
396 AuResult status;
397 BGMPlayer* player;
399 s32 index;
400 s32 songName;
401 s32 volume0;
402 s32 volume1;
403 s32 duration;
404
405 songName = request->songName;
406 index = request->index;
407 status = AU_RESULT_OK;
408
409 if (songName != 0) {
410 if (!request->pauseMode) {
412 if (snapshot != NULL && snapshot->globals->snapshots[index].assigned == 1) {
413 player = au_get_client_by_priority(snapshot->globals->snapshots[index].priority);
414 if (player != NULL) {
415 if (!au_bgm_player_is_active(player)) {
416 status = au_reload_song_files(snapshot->songID, snapshot->bgmFile);
417 duration = request->duration;
418 if (duration != 0) {
419 if (duration > SND_MAX_DURATION) {
420 duration = SND_MAX_DURATION;
421 } else if (duration < SND_MIN_DURATION) {
422 duration = SND_MIN_DURATION;
423 }
424 }
425 volume0 = request->startVolume;
426 if (volume0 > AU_MAX_VOLUME_8) {
428 }
429 if (volume0 != 0) {
431 }
432 volume1 = request->finalVolume;
433 if (volume1 > AU_MAX_VOLUME_8) {
435 }
436 if (volume1 != 0) {
438 } else {
440 }
441 player->globals->resumeCopyTo = player;
443 player->globals->resumeSongName = songName;
444 player->globals->resumeFadeTime = duration;
446 player->globals->resumeFadeEnd = volume1;
447 player->globals->resumeRequested = TRUE;
448 } else {
449 status = AU_ERROR_7;
450 }
451 } else {
452 status = AU_ERROR_6;
453 }
454 } else {
456 }
457 } else {
458 player = au_bgm_get_player_with_song_name(songName);
459 if (player != NULL) {
460 if (songName == player->songName) {
461 if (player->paused) {
462 player->paused = FALSE;
463 }
464 }
465 }
466 }
467 } else {
469 }
470 return status;
471}
struct BGMPlayer * resumeCopyTo
Definition audio.h:1050
struct BGMPlayer * resumeCopyFrom
Definition audio.h:1051
s32 resumeFadeEnd
Definition audio.h:1056
s32 resumeFadeStart
Definition audio.h:1055
s32 resumeSongName
Definition audio.h:1052
s32 resumeFadeTime
Definition audio.h:1054
b32 resumeRequested
Definition audio.h:1053
b32 au_bgm_player_is_active(BGMPlayer *player)
Definition bgm_player.c:279
AuResult au_reload_song_files(s32 songID, BGMHeader *arg1)
Definition engine.c:618
BGMPlayer * au_get_client_by_priority(u8 arg0)
Definition engine.c:732
@ AU_ERROR_7
Definition enums.h:1770
@ AU_ERROR_6
Definition enums.h:1769

Referenced by snd_song_request_pop(), and snd_song_request_unpause().

◆ au_bgm_restore_copied_player()

void au_bgm_restore_copied_player ( AuGlobals * globals)

Definition at line 473 of file bgm_player.c.

473 {
474 BGMPlayer* player;
476 SeqNote* note;
477 u32 i;
478 u32 j;
479 s32 k;
480
481 player = globals->resumeCopyTo;
482 au_copy_words(globals->resumeCopyFrom, globals->resumeCopyTo, sizeof(*player));
483 if (globals->resumeSongName == player->songName) {
484 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
485 track = &player->tracks[i];
486 if (track->bgmReadPos != NULL) {
487 for (j = track->firstVoice; j < track->lastVoice; j++) {
488 note = &player->notes[j];
489 note->length = 0;
490 }
491 }
492 }
493 for (k = 0; k < ARRAY_COUNT(player->effectIndices); k++) {
494 if (player->effectIndices[k] != 0xFF) {
495 player->seqCmdArgs.MasterEffect.index = player->effectIndices[k];
496 player->seqCmdArgs.MasterEffect.value = player->effectValues[k];
498 }
499 }
500 au_fade_init(&player->fadeInfo, globals->resumeFadeTime, globals->resumeFadeStart, globals->resumeFadeEnd);
501 }
502 globals->resumeRequested = FALSE;
503}
SeqNote notes[24]
Definition audio.h:1218
u8 effectIndices[4]
Definition audio.h:1152
SeqArgs seqCmdArgs
Definition audio.h:1177
u8 effectValues[4]
No means to modify value is implemented.
Definition audio.h:1204
struct SeqArgs::@63 MasterEffect
s32 length
Definition audio.h:1129
void au_BGMCmd_E6_MasterEffect(BGMPlayer *player, BGMPlayerTrack *track)

Referenced by au_update_clients_for_audio_frame().

◆ au_bgm_adjust_volume()

AuResult au_bgm_adjust_volume ( SongStartRequest * update)

Definition at line 505 of file bgm_player.c.

505 {
506 BGMPlayer* player;
507 AuResult status = AU_RESULT_OK;
508
509 if (request->songName != 0) {
510 player = au_bgm_get_player_with_song_name(request->songName);
511 if (player != NULL) {
512 au_fade_calc_envelope(&player->fadeInfo, request->duration, request->finalVolume);
513 }
514 else {
516 }
517 } else {
519 }
520 return status;
521}
void au_fade_calc_envelope(Fade *fade, u32 arg1, s32 target)
Definition engine.c:472

Referenced by snd_song_set_volume_full(), and snd_song_set_volume_quiet().

◆ au_bgm_player_init()

void au_bgm_player_init ( BGMPlayer * player,
s32 arg1,
s32 arg2,
AuGlobals * arg3 )

Definition at line 523 of file bgm_player.c.

523 {
524 s16 i;
525
526 player->globals = globals;
530 player->masterVolume = AU_MAX_VOLUME_8 << 24;
531 player->frameCounter = 0;
532 player->songPlayingCounter = 0;
533 player->songName = 0;
534 player->pushSongName = 0;
535 player->unk_58 = 0;
536 player->unk_5A = 0;
537 player->compReadPos = NULL;
538 player->compStartPos = NULL;
539 player->phraseStartPos = 0;
540 player->masterTempoTicks = 0;
541 player->masterTempoTarget = 0;
542 player->masterTempoStep = 0;
543 player->masterVolumeTicks = 0;
544 player->masterVolumeTarget = 0;
545 player->masterVolumeStep = 0;
546 player->masterPitchShift = 0;
547 player->detune = 0;
548 player->paused = FALSE;
549 player->trackVolsConfig = NULL;
552 player->priority = priority;
553 player->busID = busID;
554 *(s32*)player->compLoopCounters = 0;
555 player->unused_222 = 0;
556 player->conditionalLoopFlags = 0;
557 player->playbackRate = 1.0f;
558 player->polyphonyCounts[BGM_POLYPHONY_0] = 0;
559 player->polyphonyCounts[BGM_POLYPHONY_1] = 1;
563 player->polyphonyCounts[BGM_POLYPHONY_2] = 2;
564 player->polyphonyCounts[BGM_POLYPHONY_3] = 3;
565 player->polyphonyCounts[BGM_POLYPHONY_4] = 4;
566
567 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
568 BGMPlayerTrack* track = &player->tracks[i];
569
570 track->insVolume = 0;
571 track->delayTime = 0;
572 track->insCoarseDetune = 0;
573 track->insFineDetune = 0;
574 track->insPan = 0;
575 track->insReverb = 0;
576 track->patch = 0;
577 track->isDrumTrack = FALSE;
578 track->volume = AU_MAX_VOLUME_8;
579 track->pressOverride = 0;
580
581 if (i < ARRAY_COUNT(player->cmdBufData)) {
582 player->cmdBufData[i] = 0;
583 }
584 }
585
586 for (i = 0; i < ARRAY_COUNT(player->notes); i++) {
587 SeqNote* note = &player->notes[i];
588
589 note->volume = 0;
590 note->detune = 0;
591 note->length = 0;
592 note->randDetune = 0;
593 note->velocity = 0;
594 note->pendingTick = FALSE;
595 }
596
599}
s32 songPlayingCounter
video frames (60 fps)
Definition audio.h:1145
#define BGM_DEFAULT_TICKS_PER_BEAT
Definition audio.h:77
s32 masterVolumeTicks
Definition audio.h:1175
#define BGM_DEFAULT_TEMPO
Definition audio.h:91
s32 masterVolumeTarget
Definition audio.h:1174
u8 busID
Definition audio.h:1210
s32 masterTempo
Definition audio.h:1168
s8_24 masterVolume
Definition audio.h:1172
u8 unused_222
Definition audio.h:1202
s8_24 insVolume
Definition audio.h:1084
s32 masterTempoStep
Definition audio.h:1169
s32 masterTempoTarget
Definition audio.h:1170
SegData * phraseStartPos
Definition audio.h:1163
u8 * trackVolsConfig
Dynamically customizable press envelopes.
Definition audio.h:1186
s16 volume
Definition audio.h:1127
u16 masterPitchShift
Definition audio.h:1189
s32 busVolume
Definition audio.h:1151
u8 bFadeConfigSetsVolume
Definition audio.h:1207
u8 conditionalLoopFlags
Definition audio.h:1203
s32 masterTempoTicks
Definition audio.h:1171
s32 masterVolumeStep
Definition audio.h:1173
@ BGM_POLYPHONY_UNUSED_A
Definition audio.h:198
@ BGM_POLYPHONY_4
Definition audio.h:203
@ BGM_POLYPHONY_UNUSED_C
Definition audio.h:200
@ BGM_POLYPHONY_2
Definition audio.h:201
@ BGM_POLYPHONY_1
Definition audio.h:197
@ BGM_POLYPHONY_0
Definition audio.h:196
@ BGM_POLYPHONY_UNUSED_B
Definition audio.h:199
@ BGM_POLYPHONY_3
Definition audio.h:202
f32 playbackRate
Definition audio.h:1176
u8 compLoopCounters[4]
Definition audio.h:1180
u8 polyphonyCounts[8]
Definition audio.h:1206
s16 detune
Definition audio.h:1190
void au_fade_set_envelope(Fade *fade, s16 value)
Definition engine.c:465
void snd_bgm_clear_legacy_commands(BGMPlayer *player)
Part of an unused system for inter-thread communication with a BGM player using commands.

Referenced by au_engine_init().

◆ au_bgm_set_effect_indices()

void au_bgm_set_effect_indices ( BGMPlayer * player,
u8 * list )

Definition at line 601 of file bgm_player.c.

601 {
602 s32 i;
604
605 for (i = 0; i < ARRAY_COUNT(player->effectIndices); i++) {
606 s8 idx = *list++;
607
608 if (idx < 0) {
609 break;
610 }
611 player->effectIndices[i] = idx;
612 }
613
614 remaining = ARRAY_COUNT(player->effectIndices) - i;
615 if (remaining > 0) {
616 while (remaining-- != 0) {
617 player->effectIndices[i++] = -1;
618 }
619 }
620}

Referenced by au_engine_init().

◆ au_bgm_update_fade()

void au_bgm_update_fade ( BGMPlayer * player)

Definition at line 622 of file bgm_player.c.

622 {
623 player->fadeInfo.baseTicks--;
624
625 if (player->fadeInfo.baseTicks != 0) {
626 player->fadeInfo.baseVolume += player->fadeInfo.baseStep;
627 } else {
628 player->fadeInfo.baseVolume = player->fadeInfo.baseTarget << 16;
629
630 if (player->fadeInfo.onCompleteCallback != NULL) {
632 }
633
634 // Was this fade tagged as a push?
635 if (player->pushSongName != 0) {
637 } else if (player->fadeInfo.baseVolume == 0) {
638 au_bgm_stop_player(player);
639 }
640 }
642}
void au_bgm_update_bus_volumes(BGMPlayer *player)
Definition bgm_player.c:644
AuResult au_bgm_complete_push(s32 songName)
Definition bgm_player.c:324

Referenced by au_update_clients_for_audio_frame().

◆ au_bgm_update_bus_volumes()

void au_bgm_update_bus_volumes ( BGMPlayer * arg0)

Definition at line 644 of file bgm_player.c.

644 {
645 u16 volume = (
646 ((u32)player->fadeInfo.baseVolume >> 16) *
647 ((u32)player->fadeInfo.envelopeVolume >> 16)
648 ) >> 15;
649 s32 i;
650
651 for (i = 0; i < ARRAY_COUNT(player->effectIndices); i++) {
652 s8 busID = player->effectIndices[i];
653
654 if (busID < 0) {
655 return;
656 }
657 au_fade_set_volume(busID, volume, player->busVolume);
658 }
659}

Referenced by au_bgm_update_fade(), and au_update_clients_for_audio_frame().

◆ au_bgm_player_audio_frame_update()

s32 au_bgm_player_audio_frame_update ( BGMPlayer * player)

Definition at line 661 of file bgm_player.c.

661 {
662 u16 hasMore = TRUE;
663 s32 retVal = FALSE;
664
665 // update pseudorandom numbers with fast 'good enough' method
666 player->randomValue1 = (player->randomValue1 & 0xFFFF) + (player->songPlayingCounter & 0xFFFF) + (player->frameCounter & 0xFFFF);
667 player->randomValue2 = (player->randomValue2 & 0xFFFF) + ((player->songPlayingCounter << 4) & 0xFFFF) + ((player->frameCounter >> 4) & 0xFFFF);
668 do {
669 switch (player->masterState) {
671 hasMore = FALSE;
672 break;
674 if (!player->paused) {
676 if (player->masterState == BGM_PLAY_STATE_ACTIVE) {
677 hasMore = FALSE;
678 }
679 } else {
680 hasMore = FALSE;
681 }
682 break;
685 break;
688 hasMore = FALSE;
689 break;
692 break;
693 default:
694 retVal = TRUE;
695 hasMore = FALSE;
696 break;
697 }
698 } while (hasMore);
699 return retVal;
700}
s32 randomValue2
Definition audio.h:1154
s32 randomValue1
Definition audio.h:1153
@ BGM_PLAY_STATE_FETCH
Definition audio.h:209
@ BGM_PLAY_STATE_ACTIVE
Definition audio.h:208
void au_bgm_player_update_stop(BGMPlayer *player)
void au_bgm_player_read_composition(BGMPlayer *player)
Definition bgm_player.c:859
void au_bgm_player_update_playing(BGMPlayer *player)
play next tick

Referenced by au_update_clients_for_audio_frame().

◆ au_bgm_player_initialize()

void au_bgm_player_initialize ( BGMPlayer * player)

Definition at line 702 of file bgm_player.c.

702 {
703 s32* buf;
704 s32 cmd;
706 s32 i;
707
708 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
709 BGMPlayerTrack* track = &player->tracks[i];
711 track->insVolume = AU_MAX_VOLUME_16 << 16; // @bug? incorrect format for 8.24 fixed, should be (AU_MAX_VOLUME_8 << 24)
712 track->insPan = 0x40;
713 track->insReverb = 0;
714 track->patch = 0;
715 track->insCoarseDetune = 0;
716 track->insFineDetune = 0;
717 track->volume = AU_MAX_VOLUME_8;
718 track->pressOverride = 0;
719 track->proxVolume = AU_MAX_VOLUME_16 << 16;
720 track->savedPos = NULL;
721 track->prevReadPos = NULL;
722 track->detourLength = 0;
723 track->detune = 0;
724 track->tremoloDepth = 0;
725 track->tremoloDelay = 0;
726 track->tremoloRate = 0;
727 track->insVolumeStep = 0;
728 track->insVolumeTarget = 0;
729 track->insVolumeTicks = 0;
730 track->proxVolumeStep = 0;
731 track->proxVolumeTarget = 0;
732 track->proxVolumeTicks = 0;
733 track->proxMixSetChanged = FALSE;
734 track->proxMixValChanged = FALSE;
735 track->proxVol1 = 0;
736 track->proxVol2 = 0;
737 track->polyVoiceCount = 0;
738 track->polyphonicIdx = 0;
739 track->randomPanAmount = 0;
740 track->isDrumTrack = FALSE;
741 track->linkedTrackID = 0;
742 track->muted = FALSE;
743 track->busID = player->busID;
744 track->index = i;
745 }
746
747 for (i = 0; i < ARRAY_COUNT(player->notes); i++) {
748 SeqNote* note = &player->notes[i];
750 note->pitchRatio = 2.0f;
751 note->randDetune = 0;
752 note->velocity = 0;
753 note->length = 0;
754 note->tremoloDepth = 0;
755 }
756
758 player->playbackRate = 128.0f; // set to 1.0 later om...
761 player->unused_21E = 0x80;
762 player->masterVolume = AU_MAX_VOLUME_8 << 24;
763 player->pushSongName = 0;
764 player->tickRatePtr = NULL;
765 player->masterTempoTarget = 0;
766 player->masterPitchShift = 0;
767 player->detune = 0;
768 player->masterVolumeTicks = 0;
769 player->masterVolumeTarget = 0;
770 player->masterVolumeStep = 0;
771 player->proxMixValue = 0;
772 player->proxMixID = 0;
773 player->proxMixVolume = 0;
774 player->compActiveLoopEndPos[3] = NULL;
775 player->compActiveLoopEndPos[2] = NULL;
776 player->compActiveLoopEndPos[1] = NULL;
777 player->compActiveLoopEndPos[0] = NULL;
778 *(s32*)player->compLoopCounters = 0;
779 player->compLoopDepth = 0;
780 player->unused_222 = 0;
781 player->conditionalLoopFlags = 0;
782 player->trackVolsConfig = NULL;
784 player->initLinkMute = TRUE;
785 player->writingCustomEnvelope = 0;
786 player->playbackRate = 1.0f;
787
788 for (i = 0; i < ARRAY_COUNT(player->customEnvelopeWritePos); i++) {
790 }
791
792 for (i = 0; i < ARRAY_COUNT(player->effectValues); i++) {
793 player->effectValues[i] = 0;
794 }
795
796 player->paused = FALSE;
797 player->songPlayingCounter = 0;
798 for (i = 0; i < ARRAY_COUNT(player->compLoopStartLabels); i++) {
799 player->compLoopStartLabels[i] = player->compReadPos;
800 }
801
802 // find labels
803 buf = player->compReadPos;
805 while (keepReading) {
806 cmd = *buf++;
807 if (cmd == 0) {
809 } else if ((cmd & 0xF0000000) == BGM_COMP_START_LOOP << 28) {
810 player->compLoopStartLabels[cmd & 0x1F] = buf;
811 }
812 }
813
815}
u8 initLinkMute
Definition audio.h:1208
#define NO_INSTRUMENT
Definition audio.h:14
u8 unused_21E
Definition audio.h:1198
u8 proxMixID
Definition audio.h:1182
u16 masterTempoBPM
Definition audio.h:1187
#define BGM_DEFAULT_BPM
Definition audio.h:89
u8 customEnvelopeWritePos[8]
Currently active (for writing) custom envelope.
Definition audio.h:1193
@ BGM_COMP_START_LOOP
Definition audio.h:217
u8 writingCustomEnvelope
Definition audio.h:1192
SegData * compActiveLoopEndPos[4]
Definition audio.h:1179
SegData * compLoopStartLabels[32]
Definition audio.h:1178
Instrument * ins
Definition audio.h:1125
u8 compLoopDepth
Definition audio.h:1191
Instrument * instrument
Definition audio.h:1082
s32 proxMixValue
Definition audio.h:1181
u8 proxMixVolume
Definition audio.h:1183
void au_bgm_clear_custom_note_press(BGMPlayer *player, s32 index)
Definition bgm_player.c:817

Referenced by au_bgm_player_audio_frame_update(), and au_bgm_process_init_song().

◆ au_bgm_clear_custom_note_press()

void au_bgm_clear_custom_note_press ( BGMPlayer * player,
s32 arg1 )

Definition at line 817 of file bgm_player.c.

817 {
818 s32 i;
819 u16* pos = player->customPressEnvelopes[index];
820 player->customEnvelopeWritePos[index] = 0;
821
822 for (i = 0; i < 9; i++) {
823 *pos++ = 0xFF00;
824 }
825}
s16 customPressEnvelopes[8][9]
Definition audio.h:1185

Referenced by au_bgm_player_initialize(), and au_BGMCmd_FF_Special().

◆ au_bgm_set_tick_resolution()

void au_bgm_set_tick_resolution ( BGMPlayer * player,
s32 sampleRate,
u32 resolution )

Definition at line 827 of file bgm_player.c.

827 {
828 // compute how many audio frames before the next tick
830
831 // Clamp samples per tick to stay in a valid range
832 if (mFramesPerTick > 500000) {
833 mFramesPerTick = 500000;
834 } else if (mFramesPerTick < 80000) {
835 mFramesPerTick = 80000;
836 }
837
838 // Clamp to sample rate
841 }
842
843 // breakdown of units:
844 //
845 // tickUpdateInterval / nextUpdateStep = framesPerTick
846 //
847 // 1000 x frames beat min frames
848 // ------------- x ------ x --------------- = ------
849 // min tick 1000 x beat tick
850
854
856}
#define BGM_MFRAMES_PER_MINUTE
Definition audio.h:86
u16 maxTempo
Definition audio.h:1188
s32 tickUpdateInterval
update counter amount to add per audio frame
Definition audio.h:1142
#define BGM_UPDATE_SCALE
Definition audio.h:81

Referenced by au_bgm_begin_video_frame(), au_bgm_player_init(), and au_bgm_process_init_song().

◆ au_bgm_player_read_composition()

void au_bgm_player_read_composition ( BGMPlayer * player)

Definition at line 859 of file bgm_player.c.

859 {
861 u32 cmd;
862
863 player->masterTempoStep = 0;
864 player->masterTempoTicks = 0;
865
866 while (continueReading) {
867 cmd = *player->compReadPos++;
868 if (cmd == BGM_COMP_END) {
871 } else {
872 switch (cmd >> 12) {
873 case BGM_COMP_PLAY_PHRASE << 16:
874 au_bgm_load_phrase(player, cmd);
877 break;
878 case BGM_COMP_START_LOOP << 16:
879 break;
880 case BGM_COMP_WAIT << 16:
882 break;
883 case BGM_COMP_END_LOOP << 16:
885 break;
887 if (!(player->conditionalLoopFlags & 1)) {
889 }
890 break;
892 if (player->conditionalLoopFlags & 1) {
894 }
895 break;
896 default:
898 break;
899 }
900 }
901 }
902}
@ BGM_COMP_PLAY_PHRASE
Definition audio.h:216
@ BGM_COMP_END
Definition audio.h:215
@ BGM_COMP_END_COND_LOOP_FALSE
Definition audio.h:220
@ BGM_COMP_END_COND_LOOP_TRUE
Definition audio.h:221
@ BGM_COMP_WAIT
Definition audio.h:218
@ BGM_COMP_END_LOOP
Definition audio.h:219
void au_bgm_load_phrase(BGMPlayer *player, u32 cmd)
Definition bgm_player.c:939
void au_bgm_end_composition_loop(BGMPlayer *player, u32 cmd)
Definition bgm_player.c:904

Referenced by au_bgm_player_audio_frame_update().

◆ au_bgm_end_composition_loop()

void au_bgm_end_composition_loop ( BGMPlayer * player,
u32 cmd )

Definition at line 904 of file bgm_player.c.

904 {
905 s32 labelIndex = cmd & 0x1F; // 01F (bits 0-4)
906 s32 iterCount = (cmd >> 5) & 0x7F; // FE0 (bits 5-11)
907 u32 depth;
908
909 depth = player->compLoopDepth;
910 if (player->compActiveLoopEndPos[depth] != NULL) {
911 if (player->compActiveLoopEndPos[depth] == player->compReadPos) {
912 if (player->compLoopCounters[depth] != 0) {
913 player->compLoopCounters[depth]--;
914 if ((player->compLoopCounters[depth]) == 0) {
915 player->compActiveLoopEndPos[depth] = NULL;
916 if (depth > 0) {
917 depth--;
918 }
919 } else {
920 player->compReadPos = player->compLoopStartLabels[labelIndex];
921 }
922 } else {
923 player->compReadPos = player->compLoopStartLabels[labelIndex];
924 }
925 } else if (depth < 4) {
926 depth++;
927 player->compActiveLoopEndPos[depth] = player->compReadPos;
928 player->compLoopCounters[depth] = iterCount;
929 player->compReadPos = player->compLoopStartLabels[labelIndex];
930 }
931 } else {
932 player->compActiveLoopEndPos[depth] = player->compReadPos;
933 player->compLoopCounters[depth] = iterCount;
934 player->compReadPos = player->compLoopStartLabels[labelIndex];
935 }
936 player->compLoopDepth = depth;
937}

Referenced by au_bgm_player_read_composition().

◆ au_bgm_load_phrase()

void au_bgm_load_phrase ( BGMPlayer * player,
u32 cmd )

Definition at line 939 of file bgm_player.c.

939 {
942 s32* trackList;
944 s32 count;
945 s32 curVoice;
947 s32 i;
948
949 curVoice = 0;
951 player->phraseStartPos = AU_FILE_RELATIVE(player->compStartPos, (cmd & 0xFFFF) << 2);
952 trackList = player->phraseStartPos;
953 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
954 track = &player->tracks[i];
955 trackInfo = *trackList++;
956 track->bgmReadPos = (AuFilePos) (trackInfo >> 0x10);
957 if (track->bgmReadPos != NULL) {
958 if ((trackInfo & 0x100) == 0) {
959 track->polyphonicIdx = (trackInfo & (0x7 << 0xD)) >> 0xD;
960 track->isDrumTrack = (trackInfo >> 7) & 1;
961 linkedID = (trackInfo & (0xF << 9)) >> 9;
962 track->linkedTrackID = 0;
963 if (linkedID != 0) {
964 BGMPlayerTrack* linkedTrack = &player->tracks[linkedID - 1];
965 if ((linkedID - 1) < i) {
966 track->polyVoiceCount = linkedTrack->polyVoiceCount;
967 track->firstVoice = linkedTrack->firstVoice;
968 track->lastVoice = linkedTrack->lastVoice;
969
970 track->bgmReadPos = (track->bgmReadPos + (s32)player->phraseStartPos);
971 track->delayTime = 1;
972
973 track->linkedTrackID = linkedID;
974 if (player->initLinkMute) {
975 track->muted = TRUE;
976 }
978 } else {
979 track->bgmReadPos = NULL;
980 }
981 } else {
982 count = player->polyphonyCounts[track->polyphonicIdx];
983 track->polyVoiceCount = count;
984 track->firstVoice = curVoice;
985 curVoice += count;
986 track->lastVoice = curVoice;
987
988 track->bgmReadPos = (track->bgmReadPos + (s32)player->phraseStartPos);
989 track->delayTime = 1;
990 }
991 } else {
992 track->bgmReadPos = NULL;
993 }
994 }
995 }
996 player->totalVoices = curVoice;
997 if (bFoundLinkedTrack) {
998 player->initLinkMute = FALSE;
999 }
1000}
u8 polyVoiceCount
Definition audio.h:1109
AuFilePos bgmReadPos
Definition audio.h:1079
u8 totalVoices
Definition audio.h:1195

Referenced by au_bgm_player_read_composition().

◆ au_bgm_player_update_stop()

void au_bgm_player_update_stop ( BGMPlayer * player)

Definition at line 1002 of file bgm_player.c.

1002 {
1003 s32 i;
1004
1005 player->paused = FALSE;
1006 player->songName = 0;
1007 player->pushSongName = 0;
1008 player->unk_58 = 0;
1009 player->unk_5A = 0;
1010 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
1011 player->tracks[i].bgmReadPos = NULL;
1012 }
1016}

Referenced by au_bgm_player_audio_frame_update().

◆ au_bgm_player_update_playing()

void au_bgm_player_update_playing ( BGMPlayer * player)

play next tick

Definition at line 1027 of file bgm_player.c.

1027 {
1029 u8 sp1F;
1030 s16 notePitch;
1031 u8 bFinished;
1032
1033 AuVoice* voice;
1036 SeqNote* note;
1037 s32 var_a0;
1038 s32 temp;
1041 u8 opcode;
1044 u32 i;
1045 u8 voiceIdx;
1046 s32 temp2;
1048 bFinished = FALSE;
1049
1050 if (player->masterTempoTicks != 0) {
1051 player->masterTempoTicks--;
1052 if (player->masterTempoTicks == 0) {
1053 player->masterTempo = player->masterTempoTarget;
1054 player->masterTempoTarget = 0;
1055 player->masterTempoStep = 0;
1056 } else {
1057 player->masterTempo += player->masterTempoStep;
1058 }
1060 }
1061 if (player->masterVolumeTicks != 0) {
1062 player->masterVolumeTicks--;
1063 if (player->masterVolumeTicks == 0) {
1064 player->masterVolume = player->masterVolumeTarget;
1065 player->masterVolumeTarget = 0;
1066 player->masterVolumeStep = 0;
1067 } else {
1068 player->masterVolume += player->masterVolumeStep;
1069 }
1071 }
1072 player->volumeChanged = FALSE;
1073 if (player->trackVolsConfig != NULL) {
1074 if (player->bFadeConfigSetsVolume) {
1075 // setting track volumes
1076 s32 lenLimit = 16;
1077 while (lenLimit-- != 0) {
1078 i = *player->trackVolsConfig++;
1079 if (i == 0) {
1080 break;
1081 }
1082 track = &player->tracks[i - 1];
1083 player->seqCmdArgs.TrackVolumeFade.time = 48;
1084 player->seqCmdArgs.TrackVolumeFade.value = *(player->trackVolsConfig++);
1085 if (track->bgmReadPos != 0) {
1087 }
1088 }
1089 }
1090 else {
1091 // clearing track volumes
1092 s32 lenLimit = 16;
1093 while (lenLimit-- != 0) {
1094 i = *player->trackVolsConfig++;
1095 if (i == 0) {
1096 break;
1097 }
1098 track = &player->tracks[i - 1];
1099 player->seqCmdArgs.TrackVolumeFade.time = 48;
1100 player->trackVolsConfig++; // ignore arg
1101 player->seqCmdArgs.TrackVolumeFade.value = 0;
1102 if (track->bgmReadPos != 0) {
1104 }
1105 }
1106 }
1107 player->trackVolsConfig = NULL;
1108 player->bFadeConfigSetsVolume = FALSE;
1109 }
1110 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
1111 track = &player->tracks[i];
1112 if (track->bgmReadPos != NULL) {
1113 track->changed.all = 0;
1114 if (bVolumeFading || player->volumeChanged) {
1115 track->changed.volume = TRUE;
1116 } else {
1117 track->changed.volume = FALSE;
1118 }
1119 if (track->insVolumeTicks != 0) {
1120 track->insVolumeTicks--;
1121 if (track->insVolumeTicks == 0) {
1122 track->insVolume = track->insVolumeTarget;
1123 } else {
1124 track->insVolume += track->insVolumeStep;
1125 }
1126 track->changed.volume = TRUE;
1127 }
1128 if (track->proxVolumeTicks != 0) {
1129 track->proxVolumeTicks--;
1130 if (track->proxVolumeTicks == 0) {
1131 track->proxVolume = track->proxVolumeTarget << 16;
1132 } else {
1133 track->proxVolume += track->proxVolumeStep;
1134 }
1135 track->changed.volume = TRUE;
1136 }
1137 track->delayTime--;
1138 if (track->delayTime <= 0) {
1139 sp1F = track->firstVoice;
1140 while (track->delayTime == 0) {
1141 opcode = *(track->bgmReadPos++);
1142 POST_BGM_READ();
1143
1144 if (opcode < 0x80) {
1145 if (opcode == 0) {
1146 if (track->prevReadPos != 0) {
1147 track->bgmReadPos = track->prevReadPos;
1148 track->prevReadPos = 0;
1149 } else {
1150 bFinished = TRUE;
1151 break;
1152 }
1153 } else {
1154 if (opcode >= 0x78) {
1155 // long delay
1156 track->delayTime = (((opcode & 7) << 8) + *(track->bgmReadPos++)) + 0x78;
1157 POST_BGM_READ();
1158
1159 } else {
1160 // delay
1161 track->delayTime = opcode;
1162 }
1163 }
1164 } else {
1165 // note
1166 if (opcode < 0xD4) {
1167 notePitch = (opcode & 0x7F);
1168 noteVelocity = *(track->bgmReadPos++);
1169 POST_BGM_READ();
1170 noteLength = *(track->bgmReadPos++);
1171 POST_BGM_READ();
1172 if (!(noteLength < 0xC0)) {
1173 noteLength = (((u8)noteLength & ~0xC0) << 8) + *(track->bgmReadPos++) + 0xC0;
1174 POST_BGM_READ();
1175 }
1177 if (!track->muted) {
1178 // find first free voice
1179 for (voiceIdx = sp1F; voiceIdx < track->lastVoice; voiceIdx++) {
1180 voice = &player->globals->voices[voiceIdx];
1181 sp1F++;
1182 if (voice->priority == AU_PRIORITY_FREE) {
1184 break;
1185 }
1186 }
1187
1188 if (!bAcquiredVoiceIdx) {
1189 if (track->polyphonicIdx >= BGM_POLYPHONY_2) {
1190 // try stealing a voice with lower priority
1191 for (voiceIdx = track->firstVoice; voiceIdx < track->lastVoice; voiceIdx++) {
1192 voice = &player->globals->voices[voiceIdx];
1193 if (voice->priority < player->priority) {
1196 break;
1197 }
1198 }
1199 // try stealing a voice with equal priority and zero note length
1200 if (!bAcquiredVoiceIdx) {
1201 for (voiceIdx = track->firstVoice; voiceIdx < track->lastVoice; voiceIdx++) {
1202 voice = &player->globals->voices[voiceIdx];
1203 if (voice->priority == player->priority) {
1204 note = &player->notes[voiceIdx];
1205 if (note->length == 0) {
1208 break;
1209 }
1210 }
1211 }
1212 }
1213 // try stealing a voice with equal priority and lowest note length
1214 if (!bAcquiredVoiceIdx) {
1215 s32 shortestLength = 0xFFFF;
1216 u8 voice_it;
1217 AuVoice* curVoice;
1219 for (voice_it = track->firstVoice; voice_it < track->lastVoice; voice_it++) {
1220 curVoice = &player->globals->voices[voice_it];
1221 if (curVoice->priority == player->priority) {
1222 curNote = &player->notes[voice_it];
1223 if (!curNote->pendingTick && curNote->length < shortestLength) {
1225 voice = curVoice;
1226 note = curNote;
1229 }
1230 }
1231 }
1232 if (bAcquiredVoiceIdx) {
1233 note->length = 0;
1235 }
1236 }
1237
1238 } else {
1239 voiceIdx = track->firstVoice;
1240 voice = &player->globals->voices[voiceIdx];
1241 note = &player->notes[voiceIdx];
1242 note->length = 0;
1243 if (voice->priority <= player->priority) {
1246 }
1247 }
1248 }
1249 }
1250 if (bAcquiredVoiceIdx) {
1251 note = &player->notes[voiceIdx];
1252 note->tremoloDepth = 0;
1253 if (noteVelocity > 0) {
1254 note->velocity = noteVelocity + 1;
1255 } else {
1256 note->velocity = 0;
1257 }
1258 note->length = noteLength;
1259 if (track->isDrumTrack) {
1260 if (notePitch < 72) { // = 6 * 12
1261 drumInfo = &player->globals->dataPER->drums[notePitch];
1262 } else {
1263 drumInfo = player->drums[notePitch - 72]; // = 6 * 12
1264 }
1265 note->ins = au_get_instrument(player->globals, drumInfo->bankPatch >> 8, drumInfo->bankPatch & 0xFF, &voice->envelope);
1266 if (drumInfo->randVolume != 0) {
1267 note->volume = note->velocity * au_bgm_get_random_vol(player->randomValue1, drumInfo->volume, drumInfo->randVolume);
1268 } else {
1269 note->volume = note->velocity * drumInfo->volume;
1270 }
1271 // combining formats: 7.24 * 7.24 * 15.16 * 7.0 * 15.0 --> 16.16
1272 // first step, shifting fractional factors by 21:
1273 // 7.24 * 7.24 * 15.16 --> 7.3 * 7.3 * 10.0 --> 24.6
1274 // shifting this down by 20 transforms 24.6 --> 10.0
1275 // now for the second step with whole:
1276 // 10.0 * 7.0 * 15.0 --> 32.0
1277 // and a final shift by 16 transforms 32.0 --> 16.16
1278 voice->clientVolume = ((
1279 ((player->masterVolume >> 21) // 7.24 --> 7.3
1280 * (track->insVolume >> 21) // 7.24 --> 7.3
1281 * (track->proxVolume >> 21)) >> 20) // 15.16 --> 10.0 (fractional part truncated?)
1282 * (track->volume * note->volume)) >> 16;
1283 note->detune =
1284 drumInfo->keyBase
1285 + track->insCoarseDetune
1286 + track->insFineDetune
1287 - note->ins->keyBase;
1288 temp = (note->detune + track->detune) + player->detune;
1289 if (drumInfo->randTune != 0) {
1290 note->randDetune = au_bgm_get_random_pitch(player->randomValue1, temp, drumInfo->randTune);
1291 temp = note->randDetune;
1292 }
1293 note->pitchRatio = au_compute_pitch_ratio(temp) * note->ins->pitchRatio;
1294 if (drumInfo->randPan != 0) {
1295 voice->pan = au_bgm_get_random_pan(player, drumInfo->pan, drumInfo->randPan);
1296 } else {
1297 voice->pan = drumInfo->pan;
1298 }
1299 if (drumInfo->randReverb != 0) {
1300 voice->reverb = au_bgm_get_random_reverb(player->randomValue1, drumInfo->reverb, drumInfo->randReverb);
1301 } else {
1302 voice->reverb = drumInfo->reverb;
1303 }
1304 } else {
1305 // combining formats: 7.24 * 7.24 * 15.16 * 7.0 * 15.0 --> 16.16
1306 // first step, shifting fractional factors by 21:
1307 // 7.24 * 7.24 * 15.16 --> 7.3 * 7.3 * 10.0 --> 24.6
1308 // shifting this down by 20 transforms 24.6 --> 10.0
1309 // now for the second step with whole:
1310 // 10.0 * 7.0 * 7.0 --> 24.0
1311 // and a final shift by 9 transforms 24.0 --> 15.16
1312 voice->clientVolume = note->volume = ((
1313 ((player->masterVolume >> 21) // 7.24 --> 7.3
1314 * (track->insVolume >> 21) // 7.24 --> 7.3
1315 * (track->proxVolume >> 21)) >> 20) // 15.16 --> 10.0 (fractional part truncated?)
1316 * (track->volume * note->velocity)) >> 9;
1317 note->ins = track->instrument;
1318 note->detune =
1319 (notePitch * 100)
1320 + track->insCoarseDetune
1321 + player->masterPitchShift
1322 + track->insFineDetune
1323 - note->ins->keyBase;
1324 note->pitchRatio = au_compute_pitch_ratio(
1325 note->detune
1326 + track->detune
1327 + player->detune)
1328 * track->instrument->pitchRatio;
1329
1330 if (track->randomPanAmount != 0) {
1331 voice->pan = au_bgm_get_random_pan(player, track->insPan, track->randomPanAmount);
1332 } else {
1333 voice->pan = track->insPan;
1334 }
1335 voice->reverb = track->insReverb;
1336
1337 if (track->pressOverride != 0) {
1338 voice->envelope.cmdListPress = (u8*) player->customPressEnvelopes[track->pressOverride - 1];
1339 } else {
1340 voice->envelope.cmdListPress = track->envelope.cmdListPress;
1341 }
1342 voice->envelope.cmdListRelease = track->envelope.cmdListRelease;
1343 }
1344 voice->instrument = note->ins;
1345 voice->pitchRatio = note->pitchRatio;
1346 voice->busID = track->busID;
1347 if (note->length > 1) {
1348 note->pendingTick = TRUE;
1349 note->tremoloDepth = track->tremoloDepth;
1350 note->tremoloPhase = 0;
1351 note->tremoloDelay = track->tremoloDelay;
1352 voice->syncFlags = AU_VOICE_SYNC_FLAG_ALL;
1353 voice->priority = player->priority;
1354 voice->clientPriority = voice->priority;
1355 }
1356 }
1357 } else {
1358 //TODO variable is nargs, but reusing temp is required to match
1359 temp = SeqCmdArgCounts[opcode - 0xE0];
1360 if (temp != 0) {
1361 player->seqCmdArgs.raw[0] = *(track->bgmReadPos++);
1362 POST_BGM_READ();
1363 } else {
1364 goto bgm_args_done;
1365 }
1366 if (temp > 1) {
1367 player->seqCmdArgs.raw[1] = *(track->bgmReadPos++);
1368 POST_BGM_READ();
1369 } else {
1370 goto bgm_args_done;
1371 }
1372 if (temp > 2) {
1373 player->seqCmdArgs.raw[2] = *(track->bgmReadPos++);
1374 POST_BGM_READ();
1375 } else {
1376 goto bgm_args_done;
1377 }
1378 if (temp > 3) {
1379 player->seqCmdArgs.raw[3] = *(track->bgmReadPos++);
1380 POST_BGM_READ();
1381 }
1384 CurrentSeqCmdHandler(player, track);
1385 }
1386 }
1387 } // end while
1388 }
1389
1390 for (voiceIdx = track->firstVoice; voiceIdx < track->lastVoice; voiceIdx++) {
1391 if (!track->muted) {
1392 voice = &player->globals->voices[voiceIdx];
1393 if (voice->priority == player->priority) {
1394 note = &player->notes[voiceIdx];
1395 if (!note->pendingTick) {
1396 if (note->length > 0) {
1397 note->length--;
1398 if (note->length == 0) {
1399 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_KEY_RELEASED;
1400 }
1401 }
1402 if (track->isDrumTrack) {
1403 if (track->changed.tune || (player->detune != 0)) {
1404 note->pitchRatio = au_compute_pitch_ratio(((note->detune + note->randDetune) + track->detune) + player->detune) * note->ins->pitchRatio;
1405 if (voice->pitchRatio != note->pitchRatio) {
1406 voice->pitchRatio = note->pitchRatio;
1407 voice->syncFlags |= AU_VOICE_SYNC_FLAG_PITCH;
1408 }
1409 }
1410 if (track->changed.volume) {
1411 // combining formats: 7.24 * 7.24 * 15.16 * 7.0 * 15.0 --> 16.16
1412 // first step, shifting fractional factors by 21:
1413 // 7.24 * 7.24 * 15.16 --> 7.3 * 7.3 * 10.0 --> 24.6
1414 // shifting this down by 20 transforms 24.6 --> 10.0
1415 // now for the second step with whole:
1416 // 10.0 * 7.0 * 15.0 --> 32.0
1417 // and a final shift by 16 transforms 32.0 --> 16.16
1418 voice->clientVolume = (
1419 ((((player->masterVolume >> 21) // 7.24 --> 7.3
1420 * (track->insVolume >> 21)) // 7.24 --> 7.3
1421 * (track->proxVolume >> 21)) >> 20) // 15.16 --> 10.0 (fractional part truncated?)
1422 * (track->volume * note->volume)) >> 16;
1423 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_VOL_CHANGED;
1424 }
1425 } else {
1426 // Modulate pitch using a triange wave for tremolo effect
1427 if (note->tremoloDepth != 0) {
1428 if (note->tremoloDelay != 0) {
1429 note->tremoloDelay--;
1430 } else {
1431 u8 quadrant;
1432 note->tremoloPhase += track->tremoloRate;
1433 opcode = (note->tremoloPhase << 2) + 3; // +3 just to fill lower 2 bits
1434
1435 // Determine what part of the triangle wave we are in (using top 2 bits of u8)
1436 quadrant = note->tremoloPhase >> 6;
1437
1438 // Invert the triangle for quadrants 1 and 3 (ugly code required to match)
1439 /* visualized: //// --> /\/\ */
1440 if ((quadrant == 1) || (quadrant == 3)) {
1441 u8 temp2 = ~opcode;
1442 tremoloDetune = temp2 + 1;
1443 } else {
1445 }
1446
1447 // Scale by depth
1448 tremoloDetune = (tremoloDetune * track->tremoloDepth) >> 8;
1449
1450 // Invert sign for the second half of triangle wave
1451 if ((quadrant == 2) || (quadrant == 3)) {
1453 }
1454
1455 // Apply pitch detune from tremolo
1456 note->pitchRatio = au_compute_pitch_ratio(tremoloDetune + ((note->detune + track->detune) + player->detune)) * note->ins->pitchRatio;
1457 if (voice->pitchRatio != note->pitchRatio) {
1458 voice->pitchRatio = note->pitchRatio;
1459 voice->syncFlags |= AU_VOICE_SYNC_FLAG_PITCH;
1460 }
1461 }
1462 } else if (track->changed.tune || (player->detune != 0)) {
1463
1464 note->pitchRatio = au_compute_pitch_ratio((note->detune + track->detune) + player->detune) * note->ins->pitchRatio;
1465 if (voice->pitchRatio != note->pitchRatio) {
1466 voice->pitchRatio = note->pitchRatio;
1467 voice->syncFlags |= AU_VOICE_SYNC_FLAG_PITCH;
1468 }
1469 }
1470 if (track->changed.volume) {
1471 // combining formats: 7.24 * 7.24 * 15.16 * 7.0 * 15.0 --> 16.16
1472 // first step, shifting fractional factors by 21:
1473 // 7.24 * 7.24 * 15.16 --> 7.3 * 7.3 * 10.0 --> 24.6
1474 // shifting this down by 20 transforms 24.6 --> 10.0
1475 // now for the second step with whole:
1476 // 10.0 * 7.0 * 7.0 --> 24.0
1477 // and a final shift by 9 transforms 24.0 --> 15.16
1478 note->volume = ((
1479 (player->masterVolume >> 21) // 7.24 --> 7.3
1480 * (track->insVolume >> 21) // 7.24 --> 7.3
1481 * (track->proxVolume >> 21)) >> 20)
1482 * (track->volume * note->velocity) >> 9;
1483 voice->clientVolume = note->volume;
1484 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_VOL_CHANGED;
1485 voice->pan = track->insPan;
1486 voice->reverb = track->insReverb;
1487 } else if (track->changed.pan || track->changed.reverb) {
1488 voice->pan = track->insPan;
1489 voice->reverb = track->insReverb;
1490 voice->syncFlags |= AU_VOICE_SYNC_FLAG_PAN_FXMIX;
1491 }
1492 }
1493 }
1494 note->pendingTick = FALSE;
1495 }
1496 }
1497 }
1498 }
1499 }
1500
1501 if (bFinished) {
1503 }
1504}
#define BGM_TEMPO_TO_UPDATE_UNITS(tempo)
Definition audio.h:100
s8 volumeChanged
Current write position for each custom envelope.
Definition audio.h:1194
u8 raw[4]
Definition audio.h:407
BGMDrumInfo drums[12]
Definition audio.h:981
struct SeqArgs::@77 TrackVolumeFade
u8 tremoloDepth
Definition audio.h:1131
PEREntry * dataPER
Definition audio.h:1045
u8 priority
Definition audio.h:865
u8 SeqCmdArgCounts[]
Definition sfx_player.c:272
#define POST_BGM_READ()
BSS void(* CurrentSeqCmdHandler)(BGMPlayer *, BGMPlayerTrack *)
Definition bgm_player.c:4
void(* SeqCmdHandlers[])(BGMPlayer *, BGMPlayerTrack *)
Definition sfx_player.c:237
void au_BGMCmd_F6_InstrumentVolumeLerp(BGMPlayer *player, BGMPlayerTrack *track)

Referenced by au_bgm_player_audio_frame_update().

◆ au_BGMCmd_E0_MasterTempo()

void au_BGMCmd_E0_MasterTempo ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1508 of file bgm_player.c.

1508 {
1509 u32 bpm = player->seqCmdArgs.MasterTempo.value;
1510 s32 tempo;
1511
1512 player->masterTempoBPM = bpm;
1513 tempo = au_bgm_bpm_to_tempo(player, bpm);
1514 player->masterTempo = tempo;
1516 player->masterTempoTicks = 0;
1517 player->masterTempoTarget = 0;
1518 player->masterTempoStep = 0;
1519}
struct SeqArgs::@57 MasterTempo

◆ au_BGMCmd_E1_MasterVolume()

void au_BGMCmd_E1_MasterVolume ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1536 of file bgm_player.c.

1536 {
1537 s8_24 volume = player->seqCmdArgs.MasterVolume.value & 0x7F;
1538
1539 if (volume != 0) {
1540 volume = volume << 24;
1541 }
1542
1543 player->masterVolume = volume;
1544 player->masterVolumeTicks = 0;
1545 player->masterVolumeTarget = 0;
1546 player->masterVolumeStep = 0;
1547 player->volumeChanged = TRUE;
1548 track->changed.volume = TRUE;
1549}
struct SeqArgs::@58 MasterVolume
s32 s8_24
Definition audio.h:8

◆ au_BGMCmd_E2_MasterDetune()

void au_BGMCmd_E2_MasterDetune ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1551 of file bgm_player.c.

1551 {
1552 player->masterPitchShift = (s8)player->seqCmdArgs.MasterPitchShift.cent * 100;
1553}
struct SeqArgs::@59 MasterPitchShift

◆ au_BGMCmd_E3()

void au_BGMCmd_E3 ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1555 of file bgm_player.c.

1555 {
1556 player->globals->effectChanges[player->busID].type = player->seqCmdArgs.UnkCmdE3.effectType;
1557 player->globals->effectChanges[player->busID].changed = TRUE;
1558}
struct SeqArgs::@60 UnkCmdE3
AuEffectChange effectChanges[4]
copied from INIT to the audio heap, seems to exist only to find SEF, PER, and PRG
Definition audio.h:1040

◆ au_BGMCmd_E6_MasterEffect()

void au_BGMCmd_E6_MasterEffect ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1560 of file bgm_player.c.

1560 {
1561 u8 index = player->seqCmdArgs.MasterEffect.index;
1562 u32 busID = player->effectIndices[index];
1563
1564 if ((index < 4) && (busID < 0x80)) {
1565 if (player->globals->effectChanges[busID].type != player->seqCmdArgs.MasterEffect.value) {
1566 player->globals->effectChanges[busID].type = player->seqCmdArgs.MasterEffect.value;
1567 player->globals->effectChanges[busID].changed = TRUE;
1568 }
1569 player->effectValues[index] = player->seqCmdArgs.MasterEffect.value;
1570 }
1571}

Referenced by au_bgm_restore_copied_player().

◆ au_BGMCmd_E4_MasterTempoFade()

void au_BGMCmd_E4_MasterTempoFade ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1573 of file bgm_player.c.

1573 {
1574 s32 time = player->seqCmdArgs.MasterTempoFade.time;
1575 s32 tempo = au_bgm_bpm_to_tempo(player, player->seqCmdArgs.MasterTempoFade.value);
1576
1577 if (time <= 0) {
1578 time = 1;
1579 }
1580
1581 player->masterTempoTicks = time;
1582 player->masterTempoTarget = tempo;
1583 player->masterTempoStep = (tempo - player->masterTempo) / time;
1584}
struct SeqArgs::@61 MasterTempoFade

◆ au_BGMCmd_E5_MasterVolumeFade()

void au_BGMCmd_E5_MasterVolumeFade ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1586 of file bgm_player.c.

1586 {
1587 s32 time = player->seqCmdArgs.MasterVolumeFade.time;
1588 s8_24 volume = player->seqCmdArgs.MasterVolumeFade.value & 0x7F;
1589
1590 if (volume != 0) {
1591 volume = volume << 24;
1592 }
1593
1594 if (time <= 0) {
1595 time = 1;
1596 }
1597
1598 player->masterVolumeTicks = time;
1599 player->masterVolumeTarget = volume;
1600 player->masterVolumeStep = (volume - player->masterVolume) / time;
1601}
struct SeqArgs::@62 MasterVolumeFade

◆ au_BGMCmd_E8_TrackOverridePatch()

void au_BGMCmd_E8_TrackOverridePatch ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1603 of file bgm_player.c.

1603 {
1604 track->patch = player->seqCmdArgs.OverridePatch.patch;
1605 track->instrument = au_get_instrument(player->globals, player->seqCmdArgs.OverridePatch.bank, track->patch, &track->envelope);
1606}
struct SeqArgs::@64 OverridePatch

◆ au_BGMCmd_E9_InstrumentVolume()

void au_BGMCmd_E9_InstrumentVolume ( BGMPlayer * arg0,
BGMPlayerTrack * track )

Definition at line 1608 of file bgm_player.c.

1608 {
1609 s8_24 volume = arg0->seqCmdArgs.InstrumentVolume.value & 0x7F;
1610
1611 if (volume != 0) {
1612 volume = volume << 24;
1613 }
1614
1615 track->insVolume = volume;
1616 track->changed.volume = TRUE;
1617}

Referenced by au_bgm_set_linked_tracks().

◆ au_BGMCmd_F6_InstrumentVolumeLerp()

void au_BGMCmd_F6_InstrumentVolumeLerp ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1619 of file bgm_player.c.

1619 {
1620 s32 time = player->seqCmdArgs.TrackVolumeFade.time;
1621 s8_24 volume = player->seqCmdArgs.TrackVolumeFade.value & 0x7F;
1622
1623 if (volume != 0) {
1624 volume = volume << 24;
1625 }
1626
1627 if (volume != track->insVolume) {
1628 if (time <= 0) {
1629 time = 1;
1630 }
1631
1632 track->insVolumeTicks = time;
1633 track->insVolumeTarget = volume;
1634 track->insVolumeStep = (volume - track->insVolume) / time;
1635 }
1636}

Referenced by au_bgm_change_track_volume(), au_bgm_player_update_playing(), and au_bgm_set_linked_tracks().

◆ au_BGMCmd_EA_InstrumentPan()

void au_BGMCmd_EA_InstrumentPan ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1638 of file bgm_player.c.

1638 {
1639 track->insPan = player->seqCmdArgs.InstrumentPan.value & 0x7F;
1640 track->randomPanAmount = 0;
1641 track->changed.pan = TRUE;
1642}
struct SeqArgs::@66 InstrumentPan

◆ au_BGMCmd_EB_InstrumentReverb()

void au_BGMCmd_EB_InstrumentReverb ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1644 of file bgm_player.c.

1644 {
1645 track->insReverb = player->seqCmdArgs.InstrumentReverb.value & 0x7F;
1646 track->changed.reverb = TRUE;
1647}
struct SeqArgs::@67 InstrumentReverb

◆ au_BGMCmd_EC_TrackVolume()

void au_BGMCmd_EC_TrackVolume ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1649 of file bgm_player.c.

1649 {
1650 track->volume = player->seqCmdArgs.TrackVolume.value & 0x7F;
1651 track->changed.volume = TRUE;
1652}
struct SeqArgs::@68 TrackVolume

◆ au_BGMCmd_ED_InstrumentCoarseTune()

void au_BGMCmd_ED_InstrumentCoarseTune ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1654 of file bgm_player.c.

1654 {
1655 track->insCoarseDetune = player->seqCmdArgs.InstrumentCoarseTune.semitone * AU_SEMITONE_CENTS;
1656}
#define AU_SEMITONE_CENTS
Definition audio.h:111
struct SeqArgs::@69 InstrumentCoarseTune

◆ au_BGMCmd_EE_InstrumentFineTune()

void au_BGMCmd_EE_InstrumentFineTune ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1658 of file bgm_player.c.

1658 {
1659 track->insFineDetune = player->seqCmdArgs.InstrumentFineTune.cent;
1660}
struct SeqArgs::@70 InstrumentFineTune

◆ au_BGMCmd_EC_TrackDetune()

void au_BGMCmd_EC_TrackDetune ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1662 of file bgm_player.c.

1662 {
1663 track->detune = player->seqCmdArgs.TrackDetune.cents;
1664 track->changed.tune = TRUE;
1665}
struct SeqArgs::@71 TrackDetune

◆ au_BGMCmd_F0_TrackTremolo()

void au_BGMCmd_F0_TrackTremolo ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1667 of file bgm_player.c.

1667 {
1668 track->tremoloDelay = player->seqCmdArgs.TrackTremolo.delay;
1669 track->tremoloRate = player->seqCmdArgs.TrackTremolo.speed;
1670 track->tremoloDepth = player->seqCmdArgs.TrackTremolo.depth;
1671}
struct SeqArgs::@72 TrackTremolo

◆ au_BGMCmd_F1_TrackTremoloRate()

void au_BGMCmd_F1_TrackTremoloRate ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1673 of file bgm_player.c.

1673 {
1674 track->tremoloRate = player->seqCmdArgs.TrackTremoloRate.value;
1675}
struct SeqArgs::@73 TrackTremoloRate

◆ au_BGMCmd_F2_TrackTremoloDepth()

void au_BGMCmd_F2_TrackTremoloDepth ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1677 of file bgm_player.c.

1677 {
1678 track->tremoloDepth = player->seqCmdArgs.TrackTremoloDepth.value;
1679}
struct SeqArgs::@74 TrackTremoloDepth

◆ au_BGMCmd_F3_TrackTremoloStop()

void au_BGMCmd_F3_TrackTremoloStop ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1681 of file bgm_player.c.

1681 {
1682 track->tremoloDepth = 0;
1683}

◆ au_BGMCmd_F4_SubTrackRandomPan()

void au_BGMCmd_F4_SubTrackRandomPan ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1685 of file bgm_player.c.

1685 {
1686 track->insPan = player->seqCmdArgs.RandomPan.pan0 & 0x7F;
1687 track->randomPanAmount = player->seqCmdArgs.RandomPan.pan1 & 0x7F;
1688}
struct SeqArgs::@75 RandomPan

◆ au_BGMCmd_F5_UseInstrument()

void au_BGMCmd_F5_UseInstrument ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1690 of file bgm_player.c.

1690 {
1691 BGMInstrumentInfo* instrument;
1692 s32 volume;
1693 u32 insIndex;
1694 u32 patch;
1695 u32 bank;
1696
1697 insIndex = player->seqCmdArgs.UseInstrument.index;
1699 if (insIndex < player->bgmInstrumentCount) {
1700 instrument = &player->instrumentsInfo[insIndex];
1701 } else {
1702 instrument = &player->globals->defaultPRGEntry;
1703 }
1704 } else {
1706 if (insIndex < PRG_MAX_COUNT) {
1707 instrument = &player->globals->dataPRG[insIndex];
1708 } else {
1709 instrument = &player->globals->defaultPRGEntry;
1710 }
1711 }
1712 bank = instrument->bankPatch >> 8;
1713 patch = (u8)instrument->bankPatch;
1714 volume = instrument->volume & 0x7F;
1715 track->patch = patch;
1716 track->instrument = au_get_instrument(player->globals, bank, patch, &track->envelope);
1717 if (volume != 0) {
1718 volume <<= 24;
1719 }
1720 track->insVolume = volume;
1721 track->insPan = instrument->pan & 0x7F;
1722 track->insReverb = instrument->reverb & 0x7F;
1723 track->insCoarseDetune = instrument->coarseTune * AU_SEMITONE_CENTS;
1724 track->insFineDetune = instrument->fineTune;
1725 track->changed.all |= 0x10101; // volume, pan, and reverb
1726}
BGMInstrumentInfo * dataPRG
Definition audio.h:1046
#define PRG_MAX_COUNT
Definition audio.h:119
BGMInstrumentInfo defaultPRGEntry
Definition audio.h:1030
struct SeqArgs::@76 UseInstrument
#define BGM_MAX_INSTRUMNETS
Definition audio.h:75

◆ au_BGMCmd_F7_ReverbType()

void au_BGMCmd_F7_ReverbType ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1728 of file bgm_player.c.

1728 {
1729 u8 index = player->seqCmdArgs.ReverbType.index;
1730 s8 busID = player->effectIndices[index];
1731
1732 if ((index < ARRAY_COUNT(player->effectIndices)) && (busID >= 0)) {
1733 track->busID = busID;
1734 } else {
1735 track->busID = player->busID;
1736 }
1737}
struct SeqArgs::@78 ReverbType

◆ au_BGMCmd_FD_EventTrigger()

void au_BGMCmd_FD_EventTrigger ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1739 of file bgm_player.c.

1739 {
1740 snd_song_trigger_music_event(player->priority, track->index, player->seqCmdArgs.EventTrigger.eventInfo >> 8);
1741}
struct SeqArgs::@80 EventTrigger
void snd_song_trigger_music_event(s32 playerID, s32 trackIndex, s32 eventInfo)

◆ au_BGMCmd_FE_Detour()

void au_BGMCmd_FE_Detour ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1744 of file bgm_player.c.

1744 {
1745 AuFilePos readPos = AU_FILE_RELATIVE(player->bgmFile, player->seqCmdArgs.Detour.offset);
1746
1747 track->detourLength = player->seqCmdArgs.Detour.length;
1748 track->savedPos = track->bgmReadPos;
1749 track->bgmReadPos = readPos;
1750}
struct SeqArgs::@81 Detour

◆ au_BGMCmd_FC_Branch()

void au_BGMCmd_FC_Branch ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1753 of file bgm_player.c.

1753 {
1754 AuFilePos args;
1755 u32 i;
1756
1757 // get jump table
1758 args = AU_FILE_RELATIVE(player->bgmFile, player->seqCmdArgs.Branch.offset);
1759 if (player->proxMixID < player->seqCmdArgs.Branch.tableCount) {
1760 args += player->proxMixID * 3;
1761 }
1762 // read new position from jump table
1763 track->prevReadPos = track->bgmReadPos;
1764 track->bgmReadPos = AU_FILE_RELATIVE(player->bgmFile, (args[0] << 8) + args[1]);
1765 track->isDrumTrack = args[2];
1766
1767 if (track->proxMixSetChanged) {
1768 track->proxMixSetChanged = FALSE;
1769 track->proxVolume = 0;
1770 for (i = track->firstVoice; i < track->lastVoice; i++) {
1771 AuVoice* voice = &player->globals->voices[i];
1772 if ((voice->priority == player->priority) && (voice->cmdPtr != NULL)) {
1774 }
1775 }
1776 }
1777 if (track->proxMixValChanged) {
1778 track->proxMixValChanged = FALSE;
1779 au_bgm_set_prox_mix_fade(player, track, player->proxMixVolume, 144);
1780 }
1781 // reset an odd subset of parameters
1782 track->insCoarseDetune = 0;
1783 track->insFineDetune = 0;
1784 track->pressOverride = 0;
1785 track->detune = 0;
1786 track->tremoloDepth = 0;
1787 track->insVolumeTicks = 0;
1788 track->randomPanAmount = 0;
1789 track->busID = player->busID;
1790}
struct SeqArgs::@79 Branch
void au_bgm_set_prox_mix_fade(BGMPlayer *player, BGMPlayerTrack *track, s32 target, s32 duration)

◆ au_BGMCmd_FF_Special()

void au_BGMCmd_FF_Special ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1792 of file bgm_player.c.

1792 {
1793 u32 writePos;
1794 u8 delaySide;
1795 u8 delayTime;
1796 u32 i;
1797
1798 u32 type = player->seqCmdArgs.Special.type;
1799 u32 arg1 = player->seqCmdArgs.Special.arg1;
1800 u32 arg2 = player->seqCmdArgs.Special.arg2;
1801
1802 switch (type) {
1804 if ((arg1 < ARRAY_COUNT(player->effectIndices)) && ((s8)player->effectIndices[arg1] >= 0)) {
1805 player->globals->channelDelayBusID = player->effectIndices[arg1];
1806 if (arg2 != 0) {
1807 delayTime = arg2 & 0xF;
1808 delaySide = ((arg2 >> 4) & 1) + 1;
1809 if ((player->globals->channelDelayTime != delayTime) || (player->globals->channelDelaySide != delaySide)) {
1810 player->globals->channelDelayTime = delayTime;
1812 player->globals->channelDelayPending = TRUE;
1813 }
1814 } else {
1817 player->globals->channelDelayPending = TRUE;
1818 }
1819 }
1820 }
1821 break;
1823 if (arg1 - 1 < ARRAY_COUNT(player->customPressEnvelopes)) {
1824 player->writingCustomEnvelope = arg1;
1825 au_bgm_clear_custom_note_press(player, arg1 - 1);
1826 } else {
1827 player->writingCustomEnvelope = 0;
1828 }
1829 break;
1831 i = player->writingCustomEnvelope;
1832 if (i - 1 < ARRAY_COUNT(player->customPressEnvelopes)) {
1833 i--; // convert ID --> array index, needed to match
1834 writePos = player->customEnvelopeWritePos[i];
1835 if (writePos < ARRAY_COUNT(player->customPressEnvelopes[i]) - 1) {
1836 if (arg1 >= ARRAY_COUNT(BgmCustomEnvLookup)) {
1837 player->customPressEnvelopes[i][writePos] = (arg1 << 8) + arg2;
1838 } else {
1839 player->customPressEnvelopes[i][writePos] = (BgmCustomEnvLookup[arg1] << 8) + arg2;
1840 }
1841 player->customEnvelopeWritePos[i] = writePos + 1;
1842 }
1843 }
1844 break;
1846 if (arg1 <= ARRAY_COUNT(player->customPressEnvelopes)) {
1847 track->pressOverride = arg1;
1848 } else {
1849 track->pressOverride = 0;
1850 }
1851 break;
1853 if (player->soundManager != NULL) {
1854 for (i = 0; i < ARRAY_COUNT(player->soundManager->bgmSounds); i++) {
1855 if ((player->soundManager->bgmSounds[i].index) == 0) {
1856 player->soundManager->bgmSounds[i].index = arg1;
1857 player->soundManager->bgmSounds[i].volume =
1858 ((s32)(
1859 ((u32)player->fadeInfo.baseVolume >> 16) *
1860 ((u32)player->fadeInfo.envelopeVolume >> 16)
1861 ) + AU_MAX_VOLUME_16) >> 0x17;
1862 break;
1863 }
1864 }
1865 }
1866 break;
1868 if (arg1 == 0) {
1869 if (track->proxMixValChanged) {
1870 track->proxMixValChanged = FALSE;
1871 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
1872 BGMPlayerTrack* otherTrack = &player->tracks[i];
1873 if (player->proxMixVolume == AU_MAX_VOLUME_8) {
1874 if (otherTrack->proxVol1 != 0) {
1876 au_bgm_set_prox_mix_fade(player, otherTrack, otherTrack->proxVol1, 72);
1877 }
1878 } else {
1879 if (otherTrack->proxVol2 != 0) {
1880 otherTrack->proxMixValChanged = FALSE;
1881 au_bgm_set_prox_mix_fade(player, otherTrack, otherTrack->proxVol2, 72);
1882 }
1883 }
1884 }
1885 }
1886 } else {
1887 track->proxVol1 = arg1;
1888 track->proxVol2 = arg2;
1889 }
1890 break;
1891 }
1892}
u8 channelDelayPending
Definition audio.h:1041
SoundManagerMusicEvent bgmSounds[4]
Definition audio.h:800
s16_16 envelopeVolume
Definition audio.h:510
SoundManager * soundManager
Definition audio.h:1140
u8 proxMixValChanged
Definition audio.h:1106
@ AU_DELAY_CHANNEL_NONE
Definition audio.h:241
u8 channelDelayBusID
Definition audio.h:1042
@ BGM_SPECIAL_PROX_MIX_OVERRIDE
Definition audio.h:230
@ BGM_SPECIAL_SEEK_CUSTOM_ENV
Definition audio.h:226
@ BGM_SPECIAL_USE_CUSTOM_ENV
Definition audio.h:228
@ BGM_SPECIAL_WRITE_CUSTOM_ENV
Definition audio.h:227
@ BGM_SPECIAL_TRIGGER_SOUND
Definition audio.h:229
@ BGM_SPECIAL_SET_STEREO_DELAY
Definition audio.h:225
struct SeqArgs::@82 Special
u8 channelDelaySide
Definition audio.h:1044
u8 channelDelayTime
Definition audio.h:1043
u8 BgmCustomEnvLookup[40]
Definition sfx_player.c:335

◆ au_BGMCmd_NOP()

void au_BGMCmd_NOP ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1894 of file bgm_player.c.

1894 {
1895}

◆ au_bgm_set_proximity_mix()

void au_bgm_set_proximity_mix ( s32 songName,
u32 mix )

Definition at line 1974 of file bgm_player.c.

1974 {
1975 BGMPlayer* player;
1977 s32 changed = FALSE;
1978 u8 mixID = mix & 0xFF;
1979 s32 i;
1980
1981 if (songName != 0) {
1982 player = au_bgm_get_player_with_song_name(songName);
1983 if ((player != NULL) && (player->proxMixValue != mix)) {
1984 player->proxMixValue = mix;
1985 if (player->proxMixID != mixID) {
1986 player->proxMixID = mixID;
1987 changed = TRUE;
1988 }
1989 player->proxMixVolume = (mix >> 0x18) & 0x7F;
1990 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
1991 track = &player->tracks[i];
1992 if (changed) {
1994 }
1995 track->proxMixValChanged = TRUE;
1996 }
1997 }
1998 }
1999}
u8 proxMixSetChanged
Definition audio.h:1105

Referenced by snd_song_set_proximity_mix_far(), snd_song_set_proximity_mix_full(), and snd_song_set_proximity_mix_near().

◆ au_bgm_set_playback_rate()

void au_bgm_set_playback_rate ( BGMPlayer * player,
f32 arg1 )

Definition at line 2001 of file bgm_player.c.

2001 {
2002 if (rate > 2.0) {
2003 rate = 2.0f;
2004 } else if (rate < 0.25) {
2005 rate = 0.25f;
2006 }
2007
2008 player->playbackRate = rate;
2009 player->masterTempo = au_bgm_bpm_to_tempo(player, player->masterTempoBPM);
2011 player->masterTempoTicks = 0;
2012 player->masterTempoTarget = 0;
2013 player->masterTempoStep = 0;
2014}

Referenced by snd_song_set_playback_rate().

◆ au_bgm_player_set_detune()

void au_bgm_player_set_detune ( BGMPlayer * player,
s32 arg1 )

Definition at line 2016 of file bgm_player.c.

2016 {
2017 if (detune > AU_OCTAVE_CENTS) {
2018 detune = AU_OCTAVE_CENTS;
2019 } else if (detune < -2 * AU_OCTAVE_CENTS) {
2020 detune = -2 * AU_OCTAVE_CENTS;
2021 }
2022
2023 player->detune = detune;
2024}
#define AU_OCTAVE_CENTS
Definition audio.h:114

Referenced by snd_song_set_detune().

◆ au_bgm_change_track_volume()

void au_bgm_change_track_volume ( BGMPlayer * player,
s32 trackIdx,
s16 arg2,
u8 arg3 )

Definition at line 2026 of file bgm_player.c.

2026 {
2027 BGMPlayerTrack* track = &player->tracks[trackIdx];
2028
2029 if (track->bgmReadPos != 0) {
2030 player->seqCmdArgs.TrackVolumeFade.time = time;
2031 player->seqCmdArgs.TrackVolumeFade.value = volume;
2033 }
2034}

◆ au_bgm_set_track_volumes()

void au_bgm_set_track_volumes ( BGMPlayer * player,
u8 * arg1,
s32 arg2 )

Definition at line 2036 of file bgm_player.c.

2036 {
2037 player->trackVolsConfig = trackVols;
2038 player->bFadeConfigSetsVolume = mode;
2039}

Referenced by snd_song_clear_track_volumes(), and snd_song_set_track_volumes().

◆ au_bgm_set_prox_mix_fade()

void au_bgm_set_prox_mix_fade ( BGMPlayer * player,
BGMPlayerTrack * track,
s32 target,
s32 duration )

Definition at line 2041 of file bgm_player.c.

2041 {
2042 if (target != 0) {
2044 }
2045 if (duration <= 0) {
2046 duration = 1;
2047 } else if (duration > 1000) {
2048 duration = 1000;
2049 }
2050 if (target == track->proxVolume) {
2051 track->proxVolumeTicks = 0;
2052 return;
2053 }
2054 track->proxVolumeTicks = duration;
2055 track->proxVolumeTarget = target;
2056 track->proxVolumeStep = ((target << 0x10) - track->proxVolume) / duration;
2057}

Referenced by au_BGMCmd_FC_Branch(), and au_BGMCmd_FF_Special().

◆ au_bgm_reset_all_voices()

void au_bgm_reset_all_voices ( BGMPlayer * player)

Definition at line 2059 of file bgm_player.c.

2059 {
2060 u8 i;
2061
2062 for (i = 0; i < ARRAY_COUNT(player->globals->voices); i++) {
2063 AuVoice* voice = &player->globals->voices[i];
2064 if (voice->priority == player->priority) {
2066 }
2067 }
2068}

Referenced by au_bgm_player_initialize(), au_bgm_player_update_stop(), and au_bgm_process_suspend().

◆ au_bgm_set_linked_tracks()

AuResult au_bgm_set_linked_tracks ( SongSwapLinkedRequest * arg0)

Definition at line 2070 of file bgm_player.c.

2070 {
2071 BGMPlayer* player;
2074 AuVoice* voice;
2075 s32 trackIdx;
2076 s32 voiceIdx;
2077 s8 oldVolume;
2078
2079 s32 songName = request->songName;
2080 b32 enabled = request->enabled;
2081 AuResult status = AU_RESULT_OK;
2082
2083 if (songName != 0) {
2084 player = au_bgm_get_player_with_song_name(songName);
2085 if (player != NULL) {
2086 for (trackIdx = 0; trackIdx < ARRAY_COUNT(player->tracks); trackIdx++) {
2087 track = &player->tracks[trackIdx];
2088 if (track->bgmReadPos != NULL) {
2089 if (track->linkedTrackID != 0) {
2090 linkTrack = &player->tracks[track->linkedTrackID - 1];
2091 if (enabled) {
2092 if (track->muted) {
2093 track->muted = FALSE;
2094 linkTrack->muted = TRUE;
2095 // release all voices for linked track
2096 for (voiceIdx = linkTrack->firstVoice; voiceIdx < linkTrack->lastVoice; voiceIdx++) {
2097 voice = &player->globals->voices[voiceIdx];
2098 if (voice->priority == player->priority) {
2100 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_KEY_RELEASED;
2101 }
2102 }
2103 // fade in main track
2104 oldVolume = track->insVolume >> 24;
2106 player->seqCmdArgs.raw[0] = 0;
2107 player->seqCmdArgs.TrackVolumeFade.time = 96;
2108 player->seqCmdArgs.TrackVolumeFade.value = oldVolume;
2110 }
2111 } else {
2112 if (!track->muted) {
2113 track->muted = TRUE;
2114 linkTrack->muted = FALSE;
2115 // release all voices for main track
2116 for (voiceIdx = track->firstVoice; voiceIdx < track->lastVoice; voiceIdx++) {
2117 voice = &player->globals->voices[voiceIdx];
2118 if (voice->priority == player->priority) {
2120 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_KEY_RELEASED;
2121 }
2122 }
2123 // fade in linked track
2124 oldVolume = linkTrack->insVolume >> 24;
2126 player->seqCmdArgs.raw[0] = 0;
2127 player->seqCmdArgs.TrackVolumeFade.time = 96;
2128 player->seqCmdArgs.TrackVolumeFade.value = oldVolume;
2130 }
2131 }
2132 }
2133 }
2134 }
2135 } else {
2137 }
2138 } else {
2139 status = AU_ERROR_NULL_SONG_NAME;
2140 }
2141
2142 return status;
2143}
u8 * cmdListRelease
Definition audio.h:659
EnvelopeData envelope
Definition audio.h:845
u8 EnvelopeReleaseDefaultFast[]
Definition sfx_player.c:327
void au_BGMCmd_E9_InstrumentVolume(BGMPlayer *arg0, BGMPlayerTrack *track)
s32 b32

Referenced by snd_song_set_linked_mode().

◆ snd_bgm_clear_legacy_commands()

void snd_bgm_clear_legacy_commands ( BGMPlayer * player)

Part of an unused system for inter-thread communication with a BGM player using commands.

Use functions in bgm_control to manipualte gMusicControlData instead.

Definition at line 143 of file snd_interface.c.

143 {
144 s32 i;
145
146 for (i = 0; i < ARRAY_COUNT(player->cmdBufData); i++) {
147 player->cmdBufData[i] = 0;
148 }
149
150 player->cmdBufOverflows = 0;
151 player->cmdBufWritePos = 0;
152 player->cmdBufReadPos = 0;
153 player->cmdBufPending = 0;
154}
u8 cmdBufOverflows
Definition audio.h:1216

Referenced by au_bgm_player_init().

◆ snd_song_get_playing_info()

AuResult snd_song_get_playing_info ( s32 songName,
BGMHeader ** outTrackData,
BGMPlayer ** outPlayer )

Definition at line 669 of file snd_interface.c.

669 {
670 AuResult status = AU_RESULT_OK;
671 BGMHeader* bgmFile;
672
673 bgmFile = gSoundGlobals->dataBGM[0];
674 if (songName == bgmFile->name) {
676 *outFile = bgmFile;
677 } else {
678 bgmFile = gSoundGlobals->dataBGM[1];
679 if (songName == bgmFile->name) {
681 *outFile = bgmFile;
682 } else {
683 status = AU_ERROR_1;
684 }
685 }
686 return status;
687}
AuGlobals * gSoundGlobals
Definition engine.c:10
@ AU_ERROR_1
Definition enums.h:1760

Referenced by snd_song_clear_track_volumes(), snd_song_set_detune(), snd_song_set_playback_rate(), and snd_song_set_track_volumes().

◆ snd_song_set_detune()

AuResult snd_song_set_detune ( s32 songName,
s32 arg1 )

Definition at line 703 of file snd_interface.c.

703 {
704 BGMPlayer* bgmPlayer;
705 BGMHeader* bgmFile;
706 AuResult status;
707
708 status = snd_song_get_playing_info(songName, &bgmFile, &bgmPlayer);
709
710 if (status == AU_RESULT_OK) {
711 au_bgm_player_set_detune(bgmPlayer, detune);
712 }
713
714 return status;
715}
void au_bgm_player_set_detune(BGMPlayer *player, s32 detune)
AuResult snd_song_get_playing_info(s32 songName, BGMHeader **outFile, BGMPlayer **outPlayer)

◆ snd_song_set_track_volumes()

AuResult snd_song_set_track_volumes ( s32 songName,
MusicTrackVols arg1 )

Definition at line 717 of file snd_interface.c.

717 {
718 BGMPlayer* bgmPlayer;
719 BGMHeader* bgmFile;
720 AuResult status;
721
722 status = snd_song_get_playing_info(songName, &bgmFile, &bgmPlayer);
723
724 if (status == AU_RESULT_OK) {
725 u8* trackVols = snd_song_get_track_volumes_set(trackVolSet);
726
727 if (trackVols != NULL) {
729 } else {
730 status = AU_ERROR_11;
731 }
732 }
733
734 return status;
735}
void au_bgm_set_track_volumes(BGMPlayer *player, u8 *trackVols, s32 mode)
@ AU_ERROR_11
Definition enums.h:1771

Referenced by bgm_set_track_volumes().

◆ snd_song_clear_track_volumes()

AuResult snd_song_clear_track_volumes ( s32 songName,
MusicTrackVols arg1 )

Definition at line 737 of file snd_interface.c.

737 {
738 BGMPlayer* bgmPlayer;
739 BGMHeader* bgmFile;
740 AuResult status;
741
742 status = snd_song_get_playing_info(songName, &bgmFile, &bgmPlayer);
743
744 if (status == AU_RESULT_OK) {
745 u8* trackVols = snd_song_get_track_volumes_set(trackVolSet);
746
747 if (trackVols != NULL) {
749 } else {
750 status = AU_ERROR_11;
751 }
752 }
753
754 return status;
755}

Referenced by bgm_clear_track_volumes().

◆ snd_song_set_track_vol_mute()

AuResult snd_song_set_track_vol_mute ( s32 arg0,
s32 arg1 )

Definition at line 808 of file snd_interface.c.

808 {
809 return snd_song_change_track_volume(songName, trackIdx, 0);
810}

◆ snd_song_set_track_vol_quiet()

AuResult snd_song_set_track_vol_quiet ( s32 arg0,
s32 arg1 )

Definition at line 812 of file snd_interface.c.

812 {
813 return snd_song_change_track_volume(songName, trackIdx, AU_MAX_VOLUME_8 / 2);
814}

◆ snd_song_set_track_vol_full()

AuResult snd_song_set_track_vol_full ( s32 arg0,
s32 arg1 )

Definition at line 816 of file snd_interface.c.

816 {
817 return snd_song_change_track_volume(songName, trackIdx, AU_MAX_VOLUME_8);
818}

◆ snd_song_set_proximity_mix_far()

void snd_song_set_proximity_mix_far ( s32 songName,
s32 mix )

Definition at line 820 of file snd_interface.c.

820 {
821 au_bgm_set_proximity_mix(songName, (u8)mix);
822}
void au_bgm_set_proximity_mix(s32 songName, u32 mix)

Referenced by bgm_adjust_proximity().

◆ snd_song_set_proximity_mix_near()

void snd_song_set_proximity_mix_near ( s32 songName,
s32 mix )

Definition at line 824 of file snd_interface.c.

824 {
825 au_bgm_set_proximity_mix(songName, (u8)mix | ((s32)(0.69f * AU_MAX_VOLUME_8) << 24));
826}

Referenced by bgm_adjust_proximity().

◆ snd_song_set_proximity_mix_full()

void snd_song_set_proximity_mix_full ( s32 songName,
s32 mix )

Definition at line 828 of file snd_interface.c.

828 {
829 au_bgm_set_proximity_mix(songName, (u8)mix | (AU_MAX_VOLUME_8 << 24));
830}

Referenced by bgm_adjust_proximity().

◆ sfx_get_env_sound_instance()

SoundInstance * sfx_get_env_sound_instance ( s32 soundID)

Definition at line 379 of file sfx_control.c.

379 {
381 s32 i;
382
383 for (i = 0; i < MAX_SOUND_INSTANCES; i++, sound++) {
384 if (sound->flags & SOUND_INSTANCE_FLAG_ACTIVE && sound->soundID == soundID) {
385 return sound;
386 }
387 }
388
389 return NULL;
390}
@ SOUND_INSTANCE_FLAG_ACTIVE
Definition audio.h:369
s32 soundID
Definition audio.h:822
#define MAX_SOUND_INSTANCES
Definition sfx_control.c:4
BSS SoundInstance * gCurrentEnvSounds

Referenced by sfx_adjust_env_sound_params(), sfx_adjust_env_sound_pos(), and sfx_stop_tracking_env_sound_pos().