Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
2e230_len_2190.c
Go to the documentation of this file.
1#include "audio.h"
2#include "ld_addrs.h"
3
11
12// data
13extern u16 D_80078530[9];
14extern u8 EnvelopePressDefault[];
15extern u8 EnvelopeReleaseDefault[];
16extern f32 AlTuneScaling[];
17
18void func_80052E30(u8 index) {
19 AuVoice* voice = &gSoundGlobals->voices[index];
20
21 voice->cmdPtr = NULL;
23}
24
25void au_engine_init(s32 outputRate) {
26 AuGlobals* globals;
27 ALHeap* alHeap;
28 SBNFileEntry fileEntry;
29 s32* dummyTrackData;
30 u8 effects[4];
31 u32 i;
32
33 alHeap = gSynDriverPtr->heap;
34 gSoundGlobals = alHeapAlloc(alHeap, 1, sizeof(*gSoundGlobals));
35
36 gBGMPlayerA = alHeapAlloc(alHeap, 1, sizeof(*gBGMPlayerA));
37 gBGMPlayerB = alHeapAlloc(alHeap, 1, sizeof(*gBGMPlayerB));
38 gBGMPlayerC = alHeapAlloc(alHeap, 1, sizeof(*gBGMPlayerC));
39 gSoundManager = alHeapAlloc(alHeap, 1, sizeof(*gSoundManager));
43
44 globals = gSoundGlobals;
45 dummyTrackData = alHeapAlloc(alHeap, 1, 0x8000);
46 globals->dataBGM[0] = (BGMHeader*) &dummyTrackData[0];
47 globals->dataBGM[1] = (BGMHeader*) &dummyTrackData[0x1400];
48 globals->dataMSEQ[0] = (MSEQHeader*) &dummyTrackData[0x1C00];
49 globals->dataMSEQ[1] = (MSEQHeader*) &dummyTrackData[0x1400];
50
51 for (i = 0; i < ARRAY_COUNT(globals->unk_globals_6C); i++) {
52 globals->unk_globals_6C[i].bgmPlayer = alHeapAlloc(alHeap, 1, sizeof(BGMPlayer));
53 }
54
55 globals->dataSEF = alHeapAlloc(alHeap, 1, 0x5200);
56 globals->defaultInstrument = alHeapAlloc(alHeap, 1, sizeof(Instrument));
57 globals->dataPER = alHeapAlloc(alHeap, 1, 6 * sizeof(PEREntry));
58 globals->dataPRG = alHeapAlloc(alHeap, 1, 64 * sizeof(BGMInstrumentInfo));
59 globals->musicEventQueue = alHeapAlloc(alHeap, 1, 16 * sizeof(MusicEventTrigger));
60 globals->outputRate = outputRate;
65
66 globals->audioThreadCallbacks[0] = NULL;
67 globals->audioThreadCallbacks[1] = NULL;
68
69 for (i = 0; i < ARRAY_COUNT(globals->unk_globals_6C); i++) {
70 globals->unk_globals_6C[i].unk_4 = 0;
71 globals->unk_globals_6C[i].unk_5 = 0;
72 }
73
74 for (i = 0; i < ARRAY_COUNT(globals->effectChanges); i++) {
75 globals->effectChanges[i].type = AU_FX_NONE;
76 globals->effectChanges[i].changed = FALSE;
77 }
78
79 for (i = 0; i < ARRAY_COUNT(globals->voices); i++) {
80 AuVoice* voice;
83 voice = &globals->voices[i];
84 voice->instrument = NULL;
85 voice->pitchRatio = 0;
86 voice->p_volume = -1;
87 voice->pan = 0xFF;
88 voice->reverb = 0xFF;
89 voice->busId = 0;
90 voice->stopPending = FALSE;
91 voice->syncFlags = 0;
94 }
95
96 au_load_INIT(globals, (s32)audio_ROM_START, alHeap);
97
98 for (i = 0; i < ARRAY_COUNT(globals->banks); i++) {
99 globals->banks[i] = alHeapAlloc(alHeap, 1, 0x840);
100 }
101
103 effects[0] = FX_BUS_BGMA_MAIN;
104 effects[1] = FX_BUS_BGMA_AUX;
105 effects[2] = -1;
106 effects[3] = -1;
108
110 effects[0] = FX_BUS_BGMB;
111 effects[1] = -1;
112 effects[2] = -1;
113 effects[3] = -1;
115
118 au_init_voices(globals);
119 au_load_BK_headers(globals, alHeap);
120 if (au_fetch_SBN_file(globals->mseqFileList[0], AU_FMT_SEF, &fileEntry) == AU_RESULT_OK) {
121 au_read_rom(fileEntry.offset, globals->dataSEF, fileEntry.data & 0xFFFFFF);
122 }
124 if (au_fetch_SBN_file(globals->mseqFileList[1], AU_FMT_PER, &fileEntry) == AU_RESULT_OK) {
125 au_load_PER(globals, fileEntry.offset);
126 }
127 if (au_fetch_SBN_file(globals->mseqFileList[2], AU_FMT_PRG, &fileEntry) == AU_RESULT_OK) {
128 au_load_PRG(globals, fileEntry.offset);
129 }
130
131 globals->instrumentGroups[0] = globals->instrumentGroup1;
132 globals->instrumentGroups[1] = globals->instrumentGroup2;
133 globals->instrumentGroups[2] = globals->instrumentGroupX;
134 globals->instrumentGroups[3] = globals->instrumentGroup3;
135 globals->instrumentGroups[4] = globals->instrumentGroup4;
136 globals->instrumentGroups[5] = globals->instrumentGroup5;
137 globals->instrumentGroups[6] = globals->instrumentGroup6;
138 globals->instrumentGroups[7] = globals->instrumentGroup1;
139 globals->channelDelaySide = 0;
140 globals->channelDelayTime = 0;
141 globals->channelDelayBusId = 0;
142 globals->channelDelayPending = 0;
143
145 func_80055050(alHeap);
146}
147
149 instrument->base = DummyInstrumentBase;
150 instrument->wavDataLength = sizeof(DummyInstrumentBase);
152 instrument->dc_bookSize = sizeof(DummyInstrumentPredictor);
153 instrument->keyBase = 4800; // middle C?
154 instrument->loopPredictor = NULL;
155 instrument->loopStart = 0;
156 instrument->loopEnd = 0;
157 instrument->loopCount = 0;
158 instrument->type = 0;
159 instrument->unk_25 = 0;
160 instrument->envelopes = &DummyInstrumentEnvelope;
161 instrument->unk_26 = 0;
162 instrument->unk_27 = 0;
163 instrument->unk_28 = 0;
164 instrument->unk_29 = 0;
165 instrument->unk_2A = 0;
166 instrument->unk_2B = 0;
167 instrument->pitchRatio = 0.5f;
168}
169
171 arg0->bankPatch = 0x2010;
172 arg0->keyBase = 4800; // middle C?
173 arg0->volume = 0x7F;
174 arg0->pan = 64;
175 arg0->reverb = 0;
176 arg0->randTune = 0;
177 arg0->randVolume = 0;
178 arg0->randPan = 0;
179 arg0->randReverb = 0;
180}
181
183 arg0->bankPatch = 0x2010;
184 arg0->volume = 0x7F;
185 arg0->pan = 64;
186 arg0->reverb = 0;
187 arg0->coarseTune = 0;
188 arg0->fineTune = 0;
189}
190
192 AuGlobals* globals = gSoundGlobals;
193 SoundManager* sfxManager = gSoundManager;
195 BGMPlayer* bgmPlayer;
196
197 au_syn_update(globals);
198
199 ambManager->nextUpdateCounter -= ambManager->nextUpdateStep;
200 if (ambManager->nextUpdateCounter <= 0) {
201 ambManager->nextUpdateCounter += ambManager->nextUpdateInterval;
202 au_amb_manager_update(ambManager);
203 }
204
205 if (sfxManager->fadeInfo.fadeTime != 0) {
206 au_fade_update(&sfxManager->fadeInfo);
207 au_fade_set_volume(sfxManager->busId, sfxManager->fadeInfo.curVolume.u16, sfxManager->busVolume);
208 }
209
210 sfxManager->nextUpdateCounter -= sfxManager->nextUpdateStep;
211 if (sfxManager->nextUpdateCounter <= 0) {
212 sfxManager->nextUpdateCounter += sfxManager->nextUpdateInterval;
213 sfxManager->unk_BA = au_sfx_manager_update(sfxManager);
214 }
215
216 // update gBGMPlayerB
218 bgmPlayer = gBGMPlayerB;
219 if (bgmPlayer->fadeInfo.fadeTime != 0) {
220 au_bgm_update_fade(bgmPlayer);
221 }
222 if (bgmPlayer->songName != 0) {
223 bgmPlayer->songPlayingCounter++;
224 }
225
226 bgmPlayer->nextUpdateCounter -= bgmPlayer->nextUpdateStep;
227 if (bgmPlayer->nextUpdateCounter <= 0) {
228 bgmPlayer->nextUpdateCounter += bgmPlayer->nextUpdateInterval;
229 bgmPlayer->unk_5C = au_bgm_player_update_main(bgmPlayer);
230 }
231 }
232
234 if (globals->unk_80 != 0) {
235 func_8004DFD4(globals);
236 }
237 bgmPlayer = gBGMPlayerA;
238 if (bgmPlayer->fadeInfo.volScaleTime != 0) {
239 func_80053BA8(&bgmPlayer->fadeInfo);
240 if (bgmPlayer->fadeInfo.fadeTime == 0) {
241 func_8004E444(bgmPlayer);
242 } else {
243 au_bgm_update_fade(bgmPlayer);
244 }
245 } else if (bgmPlayer->fadeInfo.fadeTime != 0) {
246 au_bgm_update_fade(bgmPlayer);
247 }
248 if (bgmPlayer->songName != 0) {
249 bgmPlayer->songPlayingCounter++;
250 }
251
252 bgmPlayer->nextUpdateCounter -= bgmPlayer->nextUpdateStep;
253 if (bgmPlayer->nextUpdateCounter <= 0) {
254 bgmPlayer->nextUpdateCounter += bgmPlayer->nextUpdateInterval;
255 bgmPlayer->unk_5C = au_bgm_player_update_main(bgmPlayer);
256 }
257 }
258 au_update_voices(globals);
259}
260
262 AuGlobals* globals = gSoundGlobals;
263 BGMPlayer* player = gBGMPlayerA;
264 SoundManager* manager = gSoundManager;
265
266 if (globals->flushMusicEventQueue) {
268 }
269
271 if (BeginSoundUpdateCallback != NULL) {
273 }
274
275 au_bgm_update_main(player);
276
277 player = gBGMPlayerB;
278 au_bgm_update_main(player);
279
280 au_sfx_update_main(manager);
281}
282
283void au_syn_update(AuGlobals* globals) {
284 u32 i;
285
286 if (globals->unk_130C == 2) {
287 globals->unk_130C = 1;
289 }
290
291 if (globals->channelDelayPending && (globals->unk_130C == 0)) {
292 switch (globals->channelDelaySide) {
293 case 1:
296 globals->channelDelayPending = FALSE;
297 break;
298 case 2:
301 globals->channelDelayPending = FALSE;
302 break;
303 default:
305 globals->channelDelayPending = FALSE;
306 break;
307 }
308 }
309
310 if (globals->effectChanges[FX_BUS_BGMA_MAIN].changed) {
312 globals->effectChanges[FX_BUS_BGMA_MAIN].changed = FALSE;
313 }
314 if (globals->effectChanges[FX_BUS_SOUND].changed) {
316 globals->effectChanges[FX_BUS_SOUND].changed = FALSE;
317
318 } if (globals->effectChanges[FX_BUS_BGMB].changed) {
320 globals->effectChanges[FX_BUS_BGMB].changed = FALSE;
321 }
322 if (globals->effectChanges[FX_BUS_BGMA_AUX].changed) {
324 globals->effectChanges[FX_BUS_BGMA_AUX].changed = FALSE;
325 }
326
327 for (i = 0; i < ARRAY_COUNT(globals->voices); i++) {
328 AuVoice* voice = &globals->voices[i];
329 u8 voiceUpdateFlags = voice->syncFlags;
330
331 if (voice->stopPending) {
333 voice->stopPending = FALSE;
334 voice->cmdPtr = NULL;
335 voice->priority = AU_PRIORITY_FREE;
336 }
337
338 if (voiceUpdateFlags & AU_VOICE_SYNC_FLAG_ALL) {
339 au_voice_start(voice, &voice->envelope);
340 au_syn_start_voice_params(i, voice->busId, voice->instrument, voice->pitchRatio, voice->p_volume, voice->pan, voice->reverb, voice->delta);
341 // priority may be AU_PRIORITY_FREE if this voice was stolen and reset
342 voice->priority = voice->clientPriority;
343 } else {
344 if (voiceUpdateFlags & AU_VOICE_SYNC_FLAG_PITCH) {
345 au_syn_set_pitch(i, voice->pitchRatio);
346 }
347
348 if (voiceUpdateFlags & AU_VOICE_SYNC_FLAG_PARAMS) {
349 au_syn_set_mixer_params(i, voice->p_volume, voice->delta, voice->pan, voice->reverb);
350 } else if (voiceUpdateFlags & AU_VOICE_SYNC_FLAG_PAN_FXMIX) {
351 au_syn_set_pan_fxmix(i, voice->pan, voice->reverb);
352 }
353 }
354 voice->syncFlags = 0;
355 }
356}
357
358void au_reset_nonfree_voice(AuVoice* voice, u8 index) {
359 if (voice->priority != AU_PRIORITY_FREE) {
360 voice->cmdPtr = NULL;
361 voice->stopPending = TRUE;
362 voice->syncFlags = 0;
364 }
365}
366
367// uncertain name
368void au_reset_voice(AuVoice* voice, u8 voiceIdx) {
369 voice->cmdPtr = NULL;
370 voice->stopPending = TRUE;
371 voice->syncFlags = 0;
373}
374
375// array offsets into AlTuneScaling
376#define TUNE_SCALING_ARR_AMPLIFY_FINE 0
377#define TUNE_SCALING_ARR_AMPLIFY_COARSE 128
378#define TUNE_SCALING_ARR_ATTENUATE_FINE 160
379#define TUNE_SCALING_ARR_ATTENUATE_COARSE 288
380
382 if (pitch >= 0) {
383 return AlTuneScaling[(pitch & 0x7F) + TUNE_SCALING_ARR_AMPLIFY_FINE]
384 * AlTuneScaling[((pitch & 0xF80) >> 7) + TUNE_SCALING_ARR_AMPLIFY_COARSE];
385 } else {
386 pitch = -pitch;
387 return AlTuneScaling[(pitch & 0x7F) + TUNE_SCALING_ARR_ATTENUATE_FINE]
388 * AlTuneScaling[((pitch & 0x3F80) >> 7) + TUNE_SCALING_ARR_ATTENUATE_COARSE];
389 }
390}
391
392void au_fade_init(Fade* fade, s32 time, s32 startValue, s32 endValue) {
393 fade->curVolume.s32 = startValue * 0x10000;
394 fade->targetVolume = endValue;
395
396 if (time != 0) {
397 fade->fadeTime = (time * 1000) / AU_5750;
398 fade->fadeStep = (endValue * 0x10000 - fade->curVolume.s32) / fade->fadeTime;
399 } else {
400 fade->fadeTime = 1;
401 fade->fadeStep = 0;
402 }
403
404 fade->onCompleteCallback = NULL;
405}
406
407void au_fade_clear(Fade* fade) {
408 fade->fadeTime = 0;
409 fade->fadeStep = 0;
410 fade->onCompleteCallback = NULL;
411}
412
413void au_fade_update(Fade* fade) {
414 fade->fadeTime--;
415
416 if ((fade->fadeTime << 0x10) != 0) {
417 fade->curVolume.s32 += fade->fadeStep;
418 } else {
419 fade->curVolume.s32 = fade->targetVolume << 0x10;
420 if (fade->onCompleteCallback != NULL) {
421 fade->onCompleteCallback();
422 fade->fadeStep = 0;
423 fade->onCompleteCallback = NULL;
424 }
425 }
426}
427
428void au_fade_set_volume(u8 busId, u16 volume, s32 busVolume) {
429 au_bus_set_volume(busId, (u32)(volume * busVolume) >> 15);
430}
431
432void func_80053AC8(Fade* fade) {
433 if (fade->fadeTime == 0) {
434 fade->fadeTime = 1;
435 fade->fadeStep = 0;
436 fade->targetVolume = fade->curVolume.u16;
437 }
438}
439
440void au_fade_set_vol_scale(Fade* fade, s16 value) {
441 fade->volScale.s32 = value << 16;
442 fade->targetVolScale = value;
443 fade->volScaleTime = 0;
444 fade->volScaleStep = 0;
445}
446
447void func_80053B04(Fade* fade, u32 arg1, s32 target) {
448 s16 time;
449 s32 delta;
450
451 if (arg1 >= 250 && arg1 <= 100000) {
452 time = (s32)(arg1 * 1000) / AU_5750;
453 delta = (target << 16) - fade->volScale.s32;
454
455 fade->targetVolScale = target;
456 fade->volScaleTime = time;
457 fade->volScaleStep = delta / time;
458 } else {
459 fade->volScaleTime = 0;
460 fade->volScaleStep = 0;
461 }
462}
463
464void func_80053BA8(Fade* fade) {
465 fade->volScaleTime--;
466
467 if (fade->volScaleTime != 0) {
468 fade->volScale.s32 += fade->volScaleStep;
469 } else {
470 fade->volScaleStep = 0;
471 fade->volScale.s32 = fade->targetVolScale << 16;
472 }
473}
474
475//TODO cleanup and documentation
476Instrument* au_get_instrument(AuGlobals* globals, u32 bank, u32 patch, EnvelopeData* envData) {
477 Instrument* instrument = (*globals->instrumentGroups[(bank & 0x70) >> 4])[patch];
478 EnvelopePreset* preset = instrument->envelopes;
479 u32 envelopeIdx = bank & 3;
480
481 if (envelopeIdx < preset->count) {
482 envData->cmdListPress = AU_FILE_RELATIVE(preset, preset->offsets[envelopeIdx].offsetPress);
483 envData->cmdListRelease = AU_FILE_RELATIVE(preset, preset->offsets[envelopeIdx].offsetRelease);
484 } else {
486 envData->cmdListRelease = &EnvelopePressDefault[4]; //EnvelopeReleaseDefault;
487 }
488 return instrument;
489}
490
491void au_get_bgm_player_and_file(u32 playerIndex, BGMHeader** outFile, BGMPlayer** outPlayer) {
492 AuGlobals* globals = gSoundGlobals;
493
494 switch (playerIndex) {
495 case 0:
496 *outFile = globals->dataBGM[0];
497 *outPlayer = gBGMPlayerA;
498 break;
499 case 1:
500 *outFile = globals->dataBGM[1];
501 *outPlayer = gBGMPlayerB;
502 break;
503 case 2:
504 *outFile = globals->dataBGM[0];
505 *outPlayer = gBGMPlayerA;
506 break;
507 default:
508 *outFile = NULL;
509 *outPlayer = NULL;
510 break;
511 }
512}
513
514void au_get_bgm_player(u32 playerIndex, BGMPlayer** outPlayer) {
515 switch (playerIndex) {
516 case 0:
517 *outPlayer = gBGMPlayerA;
518 break;
519 case 1:
520 *outPlayer = gBGMPlayerB;
521 break;
522 case 2:
523 *outPlayer = gBGMPlayerA;
524 break;
525 default:
526 *outPlayer = NULL;
527 break;
528 }
529}
530
531AuResult au_load_song_files(u32 songID, BGMHeader* bgmFile, BGMPlayer* player) {
532 AuResult status;
533 SBNFileEntry fileEntry;
534 SBNFileEntry fileEntry2;
535 SBNFileEntry* bkFileEntry;
536 AuGlobals* soundData;
537 InitSongEntry* songInfo;
538 s32 i;
539 u16 bkFileIndex;
540 s32 bgmFileIndex;
541 u32 data;
542 u32 offset;
543 BGMPlayer* arg2_copy ;
544 BGMHeader* arg1_copy;
545 s32 cond;
546
547 soundData = gSoundGlobals;
548
549 // needed to match
550 cond = songID < soundData->songListLength;
551 arg2_copy = player;
552 arg1_copy = bgmFile;
553
554 if (cond) {
555 songInfo = &soundData->songList[songID];
556 status = au_fetch_SBN_file(songInfo->bgmFileIndex, AU_FMT_BGM, &fileEntry);
557 if (status != AU_RESULT_OK) {
558 return status;
559 }
560
561 if (func_8004DB28(arg2_copy)) {
562 return AU_ERROR_201;
563 }
564
565 au_read_rom(fileEntry.offset, arg1_copy, fileEntry.data & 0xFFFFFF);
566
567 for (i = 0; i < ARRAY_COUNT(songInfo->bkFileIndex); i++) {
568 bkFileIndex = songInfo->bkFileIndex[i];
569 if (bkFileIndex != 0) {
570 bkFileEntry = &soundData->sbnFileList[bkFileIndex];
571
572 offset = (bkFileEntry->offset & 0xFFFFFF) + soundData->baseRomOffset;
573 fileEntry2.offset = offset;
574
575 data = bkFileEntry->data;
576 fileEntry2.data = data;
577
578 if ((data >> 0x18) == AU_FMT_BK) {
579 snd_load_BK(offset, i);
580 }
581 }
582 }
583 bgmFileIndex = songInfo->bgmFileIndex;
584 arg2_copy->songID = songID;
585 arg2_copy->bgmFile = bgmFile;
586 arg2_copy->bgmFileIndex = bgmFileIndex;
587 return arg1_copy->name;
588 } else {
589 return AU_ERROR_151;
590 }
591}
592
593AuResult func_80053E58(s32 songID, BGMHeader* bgmFile) {
594 AuResult status;
595 SBNFileEntry fileEntry;
596 SBNFileEntry sbnEntry;
597 SBNFileEntry* bkFileEntry;
598 AuGlobals* soundData;
599 InitSongEntry* songInfo;
600 s32 i;
601 u16 bkFileIndex;
602
603 soundData = gSoundGlobals;
604 songInfo = &soundData->songList[songID];
605 status = au_fetch_SBN_file(songInfo[0].bgmFileIndex, AU_FMT_BGM, &sbnEntry);
606 if (status == AU_RESULT_OK) {
607 au_read_rom(sbnEntry.offset, bgmFile, sbnEntry.data & 0xFFFFFF);
608
609 for (i = 0; i < ARRAY_COUNT(songInfo->bkFileIndex); i++) {
610 bkFileIndex = songInfo->bkFileIndex[i];
611 if (bkFileIndex != 0) {
612 bkFileEntry = &soundData->sbnFileList[bkFileIndex];
613
614 fileEntry.offset = (bkFileEntry->offset & 0xFFFFFF) + soundData->baseRomOffset;
615 fileEntry.data = bkFileEntry->data;
616
617 if ((fileEntry.data >> 0x18) == AU_FMT_BK) {
618 snd_load_BK(fileEntry.offset, i);
619 } else {
621 }
622 }
623 }
624 }
625
626 return status;
627}
628
630 if (arg0 == 0) {
632 }
633 return NULL;
634}
635
636#define SBN_LOOKUP(i,fmt,e) (au_fetch_SBN_file(globals->mseqFileList[AmbientSoundIDtoMSEQFileIndex[i]], fmt, &e))
637
638AuResult au_ambient_load(u32 ambSoundID) {
639 AmbienceManager* manager;
640 SBNFileEntry fileEntry;
641 AuGlobals* globals;
642 MSEQHeader* mseqFile;
643 u32 i;
644
645 globals = gSoundGlobals;
646 manager = gAuAmbienceManager;
647 if (ambSoundID < AMBIENT_RADIO) {
648 if (manager->players[0].mseqName == 0 && SBN_LOOKUP(ambSoundID, AU_FMT_MSEQ, fileEntry) == AU_RESULT_OK) {
649 au_read_rom(fileEntry.offset, globals->dataMSEQ[0], fileEntry.data & 0xFFFFFF);
650 manager->mseqFiles[0] = globals->dataMSEQ[0];
651 for (i = 1; i < ARRAY_COUNT(manager->mseqFiles); i++) {
652 manager->mseqFiles[i] = NULL;
653 }
654 manager->numActivePlayers = 1;
655 }
656 } else if (ambSoundID == AMBIENT_RADIO
657 && manager->players[0].mseqName == 0
658 && manager->players[1].mseqName == 0
659 && manager->players[2].mseqName == 0) {
660 manager->numActivePlayers = 0;
661 for (i = 0; i < ARRAY_COUNT(manager->mseqFiles); i++) {
662 manager->mseqFiles[i] = NULL;
663 }
664
665 mseqFile = globals->dataMSEQ[1];
666 if (SBN_LOOKUP(ambSoundID, AU_FMT_MSEQ, fileEntry) == AU_RESULT_OK) {
667 au_read_rom(fileEntry.offset, mseqFile, fileEntry.data & 0xFFFFFF);
668 manager->mseqFiles[0] = mseqFile;
669
670 mseqFile = AU_FILE_RELATIVE(mseqFile, (fileEntry.data + 0x40) & 0xFFFFFF);
671 if (SBN_LOOKUP(ambSoundID + 1, AU_FMT_MSEQ, fileEntry) == AU_RESULT_OK) {
672 au_read_rom(fileEntry.offset, mseqFile, fileEntry.data & 0xFFFFFF);
673 manager->mseqFiles[1] = mseqFile;
674
675 mseqFile = AU_FILE_RELATIVE(mseqFile, (fileEntry.data + 0x40) & 0xFFFFFF);
676 if (SBN_LOOKUP(ambSoundID + 2, AU_FMT_MSEQ, fileEntry) == AU_RESULT_OK) {
677 au_read_rom(fileEntry.offset, mseqFile, fileEntry.data & 0xFFFFFF);
678 manager->mseqFiles[2] = mseqFile;
679
680 mseqFile = AU_FILE_RELATIVE(mseqFile, (fileEntry.data + 0x40) & 0xFFFFFF);
681 if (SBN_LOOKUP(ambSoundID + 3, AU_FMT_MSEQ, fileEntry) == AU_RESULT_OK) {
682 au_read_rom(fileEntry.offset, mseqFile, fileEntry.data & 0xFFFFFF);
683 manager->mseqFiles[3] = mseqFile;
684
685 manager->numActivePlayers = 4;
686 if (SBN_LOOKUP(ambSoundID + 4, AU_FMT_BK, fileEntry) == AU_RESULT_OK) {
687 snd_load_BK(fileEntry.offset, 2);
688 }
689 }
690 }
691 }
692 }
693 }
694
695 return AU_RESULT_OK;
696}
697
699 switch (arg0) {
700 case 1:
701 return gBGMPlayerA;
702 case 2:
703 return gBGMPlayerB;
704 case 4:
705 return (BGMPlayer*)gSoundManager; // TODO: why return pointer to SoundManager?
706 default:
707 return NULL;
708 }
709}
710
711void au_load_INIT(AuGlobals* arg0, s32 romAddr, ALHeap* heap) {
712 SBNHeader sbnHeader;
713 INITHeader initHeader;
714 SBNFileEntry* entry;
715 s32 tableSize, initBase, size;
716 s32 tblAddr, shortsAddr;
717 s32* data;
718 s32 numEntries;
719 s32 tblOffset, shortsOffset;
720 s32* romPtr = &arg0->baseRomOffset;
721
722 au_read_rom(romAddr, &sbnHeader, sizeof(sbnHeader));
723 numEntries = sbnHeader.numEntries;
724 arg0->baseRomOffset = romAddr;
725 tableSize = numEntries * sizeof(SBNFileEntry);
726 arg0->fileListLength = sbnHeader.numEntries;
727 arg0->sbnFileList = alHeapAlloc(heap, 1, tableSize);
728 au_read_rom(arg0->baseRomOffset + sbnHeader.tableOffset, arg0->sbnFileList, tableSize);
729
730 entry = arg0->sbnFileList;
731 while (sbnHeader.numEntries--) {
732 if ((entry->offset & 0xFFFFFF) == 0) {
733 break;
734 }
735
736 size = entry->data;
737 entry->data = (size + 0xF) & ~0xF;
738 entry++;
739 }
740
741 if (sbnHeader.INIToffset != 0) {
742 initBase = *romPtr + sbnHeader.INIToffset;
743 au_read_rom(initBase, &initHeader, sizeof(initHeader));
744
745 tblOffset = initHeader.tblOffset;
746 size = (initHeader.tblSize + 0xF) & 0xFFF0;
747 tblAddr = initBase + tblOffset;
748 arg0->songList = alHeapAlloc(heap, 1, size);
749 au_read_rom(tblAddr, arg0->songList, size);
750
751 shortsOffset = initHeader.shortsOffset;
752 size = (initHeader.shortsSize + 0xF) & 0xFFF0;
753 shortsAddr = initBase + shortsOffset;
754 arg0->mseqFileList = alHeapAlloc(heap, 1, size);
755 au_read_rom(shortsAddr, arg0->mseqFileList, size);
756
757 arg0->bkFileListOffset = initBase + initHeader.entriesOffset;
758 arg0->bkListLength = (initHeader.entriesSize + 0xF) & 0xFFF0;
759 arg0->songListLength = initHeader.tblSize / sizeof(InitSongEntry) - 1;
760 }
761}
762
763AuResult au_fetch_SBN_file(u32 fileIdx, AuFileFormat format, SBNFileEntry* outEntry) {
764 SBNFileEntry fileEntry;
765 s32 status = AU_RESULT_OK;
766
767 if (fileIdx < gSoundGlobals->fileListLength) {
768 SBNFileEntry* entry = &gSoundGlobals->sbnFileList[fileIdx];
769 s32 offset = (entry->offset & 0xFFFFFF) + gSoundGlobals->baseRomOffset;
770
771 fileEntry.offset = offset;
772 fileEntry.data = entry->data;
773 if ((fileEntry.data >> 0x18) == format) {
774 outEntry->offset = offset;
775 outEntry->data = fileEntry.data;
776 } else {
778 }
779 } else {
781 }
782 return status;
783}
784
785void au_load_PER(AuGlobals* globals, s32 romAddr) {
786 PERHeader header;
787 u32 size;
788 s32 numItemsLeft;
789 s32 numItems;
790 void* end;
791
792 au_read_rom(romAddr, &header, sizeof(header));
793 size = header.mdata.size - sizeof(header);
794 au_read_rom(romAddr + sizeof(header), globals->dataPER, size);
795 numItems = size / sizeof(PEREntry);
796 numItemsLeft = 6 - numItems;
797 if (numItemsLeft > 0) {
798 end = &globals->dataPER[numItems];
799 au_copy_words(&globals->defaultDrumEntry, end, sizeof(BGMDrumInfo));
800 au_copy_words(end, end + sizeof(BGMDrumInfo), numItemsLeft * sizeof(PEREntry) - sizeof(BGMDrumInfo));
801 }
802}
803
804void au_load_PRG(AuGlobals* arg0, s32 romAddr) {
805 PERHeader header;
806 u32 size;
807 s32 numItemsLeft;
808 s32 numItems;
809 s32 dataRomAddr;
810 void* end;
811
812 au_read_rom(romAddr, &header, sizeof(header));
813 dataRomAddr = romAddr + sizeof(header);
814 size = header.mdata.size - sizeof(header);
815 if (size > 0x200) {
816 size = 0x200;
817 }
818 au_read_rom(dataRomAddr, arg0->dataPRG, size);
819 numItems = size / sizeof(BGMInstrumentInfo);
820 numItemsLeft = 0x40 - numItems;
821 if (numItemsLeft > 0) {
822 end = &arg0->dataPRG[numItems];
823 au_copy_words(&arg0->defaultPRGEntry, end, sizeof(BGMInstrumentInfo));
824 au_copy_words(end, end + sizeof(BGMInstrumentInfo), numItemsLeft * sizeof(BGMInstrumentInfo) - sizeof(BGMInstrumentInfo));
825 }
826}
827
828s32 snd_load_BGM(s32 arg0) {
829 AuGlobals* globals = gSoundGlobals;
830 InitSongEntry* song = globals->songList;
831 s32 ret = 0;
832 s32 i;
833
834 while (TRUE) {
835 if (song->bgmFileIndex == 0xFFFF) {
836 return ret;
837 }
838
839 if (song->bgmFileIndex == arg0) {
840 for (i = 0; i < ARRAY_COUNT(song->bkFileIndex); i++) {
841 u16 bkFileIndex = song->bkFileIndex[i];
842 if (bkFileIndex != 0) {
843 SBNFileEntry* bkFileEntry = &globals->sbnFileList[bkFileIndex];
844 SBNFileEntry fileEntry;
845
846 fileEntry.offset = (bkFileEntry->offset & 0xFFFFFF) + globals->baseRomOffset;
847 fileEntry.data = bkFileEntry->data;
848 if ((fileEntry.data >> 0x18) == 0x30) {
849 snd_load_BK(fileEntry.offset, i);
850 } else {
851 ret = 0x66;
852 }
853 }
854 }
855
856 return ret;
857 }
858 song++;
859 }
860}
861
862InstrumentGroup* au_get_BK_instruments(s32 bankGroup, u32 bankIndex) {
863 InstrumentGroup* ret = NULL;
864 AuGlobals* temp = gSoundGlobals;
865
866 // TODO fake match - this multiplying the bankIndex by 16 and then dividing it right after is dumb
867 bankIndex *= 16;
868
869 switch (bankGroup) {
870 case 1:
871 ret = &temp->instrumentGroup1[bankIndex / 16];
872 break;
873 case 2:
874 ret = &temp->instrumentGroup2[bankIndex / 16];
875 break;
876 case 4:
877 ret = &temp->instrumentGroup4[bankIndex / 16];
878 break;
879 case 5:
880 ret = &temp->instrumentGroup5[bankIndex / 16];
881 break;
882 case 6:
883 ret = &temp->instrumentGroup6[bankIndex / 16];
884 break;
885 case 3:
886 ret = &temp->instrumentGroup3[bankIndex / 16];
887 break;
888 }
889
890 return ret;
891}
892
905
906#define AL_HEADER_SIG_BK 0x424B
907#define AL_HEADER_SIG_CR 0x4352
908#define AL_HEADER_SIG_DR 0x4452
909#define AL_HEADER_SIG_SR 0x5352
910
911SoundBank* au_load_BK_to_bank(s32 bkFileOffset, SoundBank* bank, s32 bankIndex, s32 bankGroup) {
912 ALHeap* heap = gSynDriverPtr->heap;
913 BKHeader bkHeader;
914 BKHeader* header = &bkHeader;
915 u16 keepReading;
916 u16 readState;
917 InstrumentGroup* group;
918 Instrument** inst;
919 s32 instrumentCount;
920 s32 size;
921 u32 i;
922
923 au_read_rom(bkFileOffset, header, sizeof(*header));
924 readState = BK_READ_FETCH_HEADER;
925 keepReading = TRUE;
926
927 while (keepReading) {
928 switch (readState) {
929 case BK_READ_DONE:
930 keepReading = FALSE;
931 break;
933 if (header->signature != AL_HEADER_SIG_BK) {
934 keepReading = FALSE;
935 } else if (header->size == 0) {
936 keepReading = FALSE;
937 } else {
938 readState = BK_READ_FETCH_DATA;
939 }
940 break;
942 if (header->format == AL_HEADER_SIG_CR) {
943 readState = BK_READ_PROCESS_CR;
944 } else if (header->format == AL_HEADER_SIG_DR) {
945 readState = BK_READ_PROCESS_DR;
946 } else if (header->format == AL_HEADER_SIG_SR) {
947 readState = BK_READ_PROCESS_SR;
948 } else {
949 keepReading = FALSE;
950 }
951 break;
952
954 size = ALIGN16_(header->instrumetsSize)
955 + ALIGN16_(header->unkSizeA)
956 + ALIGN16_(header->predictorsSize)
957 + ALIGN16_(header->unkSizeB)
958 + sizeof(*header);
959 if (bank == NULL) {
960 bank = alHeapAlloc(heap, 1, size);
961 }
962 au_read_rom(bkFileOffset, bank, size);
963
964 group = au_get_BK_instruments(bankGroup, bankIndex);
965 inst = (*group);
966 instrumentCount = 0;
967
968 for (i = 0; i < ARRAY_COUNT(header->instruments); inst++, i++) {
969 u16 instOffset = header->instruments[i];
970 if (instOffset != 0) {
971 instrumentCount++;
972 *inst = AU_FILE_RELATIVE(bank, instOffset);
973 } else {
974 *inst = NULL;
975 }
976 }
977
978 if (instrumentCount != 0) {
979 readState = BK_READ_SWIZZLE_CR;
980 } else {
981 keepReading = FALSE;
982 }
983 break;
985 au_swizzle_BK_instruments(bkFileOffset, bank, *group, 16, 1);
986 readState = BK_READ_DONE;
987 break;
988
989 // inferred states
991 case BK_READ_UNK_DR:
993 case BK_READ_UNK_SR:
994 default:
995 keepReading = FALSE;
996 break;
997 }
998 }
999
1000 return bank;
1001}
1002
1003void au_swizzle_BK_instruments(s32 bkFileOffset, SoundBank* bank, InstrumentGroup instruments, u32 instrumentCount, u8 arg4) {
1004 Instrument* defaultInstrument = gSoundGlobals->defaultInstrument;
1005 SoundBank* sb = bank;
1006 f32 outputRate = gSoundGlobals->outputRate;
1007 s32 i;
1008
1009 if (sb->swizzled == 0) {
1010 for (i = 0; i < instrumentCount; i++) {
1011 Instrument* instrument = instruments[i];
1012
1013 if (instrument != NULL) {
1014 if (instrument->base != 0) {
1015 instrument->base += bkFileOffset;
1016 }
1017 if (instrument->loopPredictor != NULL) {
1018 instrument->loopPredictor = AU_FILE_RELATIVE(bank, instrument->loopPredictor);
1019 }
1020 if (instrument->predictor != NULL) {
1021 instrument->predictor = AU_FILE_RELATIVE(bank, instrument->predictor);
1022 }
1023 if (instrument->envelopes != NULL) {
1024 instrument->envelopes = AU_FILE_RELATIVE(bank, instrument->envelopes);
1025 }
1026 instrument->unk_25 = arg4;
1027 instrument->pitchRatio = instrument->outputRate / outputRate;
1028 } else {
1029 instruments[i] = defaultInstrument;
1030 }
1031 }
1032 sb->swizzled = 1;
1033 }
1034}
1035
1036s32* func_80054AA0(s32* bkFileOffset, void* vaddr, s32 bankIndex, s32 bankGroup) {
1037 ALHeap* heap = gSynDriverPtr->heap;
1038 BKHeader localHeader;
1039 void* fileData = vaddr;
1040 BKHeader* header = &localHeader;
1041 InstrumentGroup* group;
1042 Instrument* instruments;
1043 Instrument** inst;
1044 u32 instrCount;
1045 u32 readState;
1046 s32 keepReading;
1047
1048 u32 i;
1049 s32 swizzleArg;
1050 swizzleArg = 0;
1051 readState = BK_READ_FETCH_HEADER;
1052 keepReading = TRUE;
1053
1054 while (keepReading) {
1055 switch (readState) {
1056 case BK_READ_DONE:
1057 keepReading = FALSE;
1058 break;
1060 au_read_rom(*bkFileOffset, &localHeader, sizeof(localHeader));
1061 if (header->signature != AL_HEADER_SIG_BK) {
1062 keepReading = FALSE;
1063 } else if (header->size == 0) {
1064 keepReading = FALSE;
1065 } else if (header->format != AL_HEADER_SIG_CR) {
1066 keepReading = FALSE;
1067 } else {
1068 readState = BK_READ_FETCH_DATA;
1069 }
1070 break;
1071 case BK_READ_FETCH_DATA:
1072 if (fileData == NULL) {
1073 fileData = alHeapAlloc(heap, 1, header->size);
1074 }
1075 au_read_rom(*bkFileOffset, fileData, header->size);
1076
1077 instrCount = 0;
1078 group = au_get_BK_instruments(bankGroup, bankIndex);
1079 inst = (*group);
1080 for(i = 0; i < ARRAY_COUNT(header->instruments); inst++, i++) {
1081 u16 instOffset = header->instruments[i];
1082 if(instOffset != 0) {
1083 instrCount++;
1084 *inst = AU_FILE_RELATIVE(fileData, instOffset);
1085 } else {
1086 *inst = NULL;
1087 }
1088 }
1089
1090 if (instrCount != 0) {
1091 readState = BK_READ_SWIZZLE;
1092 } else {
1093 keepReading = FALSE;
1094 }
1095 break;
1096 case BK_READ_SWIZZLE:
1097 au_swizzle_BK_instruments((s32)fileData, fileData, *group, 0x10U, swizzleArg);
1098 readState = BK_READ_DONE;
1099 break;
1100 default:
1101 keepReading = FALSE;
1102 break;
1103 }
1104 }
1105 return fileData;
1106}
1107
1108s32 snd_load_BK(s32 bkFileOffset, s32 bankIndex) {
1109 au_load_BK_to_bank(bkFileOffset, gSoundGlobals->banks[bankIndex], bankIndex, 1);
1110 return 0;
1111}
1112
1113void func_80054C84(s32 bankIndex, s32 bankGroup) {
1114 u32 i;
1116 InstrumentGroup* group = au_get_BK_instruments(bankGroup, bankIndex);
1117 Instrument** ptr = *group;
1118 if (group != NULL) {
1119 for (i = 0; i < ARRAY_COUNT(*group); i++) {
1120 *ptr++ = instrument;
1121 }
1122 }
1123}
1124
1125void func_80054CE0(s32 arg0, u32 idx) {
1126 if (idx < ARRAY_COUNT(D_80078530)) {
1127 s32 temp_s0 = D_80078530[idx];
1128 if (arg0 & 1) {
1129 gBGMPlayerA->busVolume = temp_s0;
1131 gBGMPlayerB->busVolume = temp_s0;
1133 }
1134 if (arg0 & 0x10) {
1135 gSoundManager->busVolume = temp_s0;
1137 }
1138 }
1139}
1140
1141s32 func_80054D74(s32 arg0, s32 arg1) {
1142 if (arg0 & 0x10) {
1144 }
1145 return 0;
1146}
1147
1148void func_80054DA8(u32 bMonoSound) {
1149 if (bMonoSound % 2 == 1) {
1150 // mono sound
1151 if (gSoundGlobals->unk_130C == 0) {
1153 }
1154 } else {
1155 // stereo sound
1156 if (gSoundGlobals->unk_130C != 0) {
1159 }
1160 }
1161}
1162
1163// probable split
1164
1165void au_read_rom(s32 romAddr, void* buffer, u32 size) {
1166 s32 nchunks = size / 0x2000;
1167 s32 offset = 0;
1168
1169 if (nchunks != 0) {
1170 while (nchunks--) {
1171 nuPiReadRom(romAddr + offset, buffer + offset, 0x2000);
1172 offset += 0x2000;
1173 }
1174 }
1175
1176 size %= 0x2000;
1177 if (size != 0) {
1178 nuPiReadRom(romAddr + offset, buffer + offset, size);
1179 }
1180}
1181
1182void au_memset(void* dst, s32 size, u8 value) {
1183 s32 count;
1184 s32 intValue;
1185
1186 if (size == 0) {
1187 return;
1188 }
1189
1190 if (size < 1024) {
1191 while (size--) {
1192 *(u8*)dst++ = value;
1193 }
1194 } else {
1195 count = (u32)dst & 0x3;
1196 if (count != 0) {
1197 count = 4 - count;
1198 size -= count;
1199 while (count--) {
1200 *(u8*)dst++ = value;
1201 }
1202 }
1203
1204 count = size >> 2;
1205 intValue = (value << 8) + value;
1206 intValue = (intValue << 16) + intValue;
1207 while (count--) {
1208 *(u32*)dst = intValue;
1209 dst += 4;
1210 }
1211
1212 count = size & 3;
1213 if (count != 0) {
1214 while (count--) {
1215 *(u8*)dst++ = value;
1216 }
1217 }
1218 }
1219}
1220
1221void au_copy_bytes(s8* src, s8* dest, s32 size) {
1222 if (size > 0) {
1223 while (size-- != 0) {
1224 *dest++ = *src++;
1225 }
1226 }
1227}
1228
1229void au_copy_words(void* src, void* dst, s32 size) {
1230 size /= 4;
1231
1232 if (size > 0) {
1233 if (!(((s32) src | (s32) dst) & 3)) {
1234 s32* srcIt = src;
1235 s32* dstIt = dst;
1236
1237 size--;
1238 do {
1239 *dstIt++ = *srcIt++;
1240 } while (size-- != 0);
1241 }
1242 }
1243}
void func_8004DFD4(AuGlobals *globals)
void au_bgm_update_main(BGMPlayer *player)
void func_8004E444(BGMPlayer *arg0)
void au_bgm_set_effect_indices(BGMPlayer *player, u8 *list)
void au_bgm_update_fade(BGMPlayer *player)
s32 func_8004DB28(BGMPlayer *player)
s32 au_bgm_player_update_main(BGMPlayer *player)
void au_bgm_player_init(BGMPlayer *player, s32 priority, s32 busId, AuGlobals *globals)
void au_amb_manager_update(AmbienceManager *manager)
Definition 2BF90.c:255
void au_amb_manager_init(AmbienceManager *manager, s8 priority, s8 busId, AuGlobals *globals)
Definition 2BF90.c:39
void au_init_voices(AuGlobals *globals)
void au_update_voices(AuGlobals *globals)
void au_voice_start(AuVoice *voice, EnvelopeData *envData)
void func_80054CE0(s32 arg0, u32 idx)
u8 EnvelopeReleaseDefault[]
Definition sfx_player.c:304
u8 EnvelopePressDefault[]
Definition sfx_player.c:299
void au_reset_voice(AuVoice *voice, u8 voiceIdx)
#define AL_HEADER_SIG_BK
BGMPlayer * gBGMPlayerB
void au_copy_bytes(s8 *src, s8 *dest, s32 size)
void func_80054DA8(u32 bMonoSound)
void au_get_bgm_player_and_file(u32 playerIndex, BGMHeader **outFile, BGMPlayer **outPlayer)
Instrument * au_get_instrument(AuGlobals *globals, u32 bank, u32 patch, EnvelopeData *envData)
#define TUNE_SCALING_ARR_AMPLIFY_COARSE
void au_reset_instrument_entry(BGMInstrumentInfo *arg0)
#define TUNE_SCALING_ARR_ATTENUATE_COARSE
void func_80054C84(s32 bankIndex, s32 bankGroup)
#define TUNE_SCALING_ARR_ATTENUATE_FINE
void au_fade_update(Fade *fade)
SoundManager * gSoundManager
#define SBN_LOOKUP(i, fmt, e)
AuGlobals * gSoundGlobals
void au_engine_init(s32 outputRate)
void func_80053B04(Fade *fade, u32 arg1, s32 target)
s32 snd_load_BK(s32 bkFileOffset, s32 bankIndex)
void func_80052E30(u8 index)
void au_reset_instrument(Instrument *instrument)
void au_get_bgm_player(u32 playerIndex, BGMPlayer **outPlayer)
void au_syn_update(AuGlobals *globals)
SoundBank * au_load_BK_to_bank(s32 bkFileOffset, SoundBank *bank, s32 bankIndex, s32 bankGroup)
AuResult func_80053E58(s32 songID, BGMHeader *bgmFile)
void au_fade_set_volume(u8 busId, u16 volume, s32 busVolume)
void au_update_players_main(void)
void au_read_rom(s32 romAddr, void *buffer, u32 size)
AuResult au_load_song_files(u32 songID, BGMHeader *bgmFile, BGMPlayer *player)
void au_load_PRG(AuGlobals *arg0, s32 romAddr)
void au_reset_drum_entry(BGMDrumInfo *arg0)
f32 au_compute_pitch_ratio(s32 pitch)
BGMPlayer * func_80053F64(s32 arg0)
f32 AlTuneScaling[]
Definition sfx_player.c:360
AuResult au_fetch_SBN_file(u32 fileIdx, AuFileFormat format, SBNFileEntry *outEntry)
void func_80053BA8(Fade *fade)
BGMPlayer * gBGMPlayerA
void au_memset(void *dst, s32 size, u8 value)
AuResult au_ambient_load(u32 ambSoundID)
BGMPlayer * func_80054248(u8 arg0)
void au_fade_init(Fade *fade, s32 time, s32 startValue, s32 endValue)
#define TUNE_SCALING_ARR_AMPLIFY_FINE
BGMPlayer * gBGMPlayerC
AuCallback BeginSoundUpdateCallback
void au_load_INIT(AuGlobals *arg0, s32 romAddr, ALHeap *heap)
void au_load_PER(AuGlobals *globals, s32 romAddr)
s32 func_80054D74(s32 arg0, s32 arg1)
s32 * func_80054AA0(s32 *bkFileOffset, void *vaddr, s32 bankIndex, s32 bankGroup)
#define AL_HEADER_SIG_DR
void au_update_clients_2(void)
#define AL_HEADER_SIG_CR
BKParseState
@ BK_READ_SWIZZLE_CR
@ BK_READ_PROCESS_DR
@ BK_READ_FETCH_HEADER
@ BK_READ_UNK_DR
@ BK_READ_PROCESS_SR
@ BK_READ_FETCH_DATA
@ BK_READ_PROCESS_CR
@ BK_READ_SWIZZLE
@ BK_READ_DONE
@ BK_READ_UNK_SR
#define AL_HEADER_SIG_SR
u16 D_80078530[9]
Definition sfx_player.c:289
InstrumentGroup * au_get_BK_instruments(s32 bankGroup, u32 bankIndex)
void au_swizzle_BK_instruments(s32 bkFileOffset, SoundBank *bank, InstrumentGroup instruments, u32 instrumentCount, u8 arg4)
void au_copy_words(void *src, void *dst, s32 size)
s32 snd_load_BGM(s32 arg0)
void au_fade_clear(Fade *fade)
void au_fade_set_vol_scale(Fade *fade, s16 value)
void func_80053AC8(Fade *fade)
void au_reset_nonfree_voice(AuVoice *voice, u8 index)
AmbienceManager * gAuAmbienceManager
void au_load_BK_headers(AuGlobals *globals, ALHeap *heap)
void func_80055050(ALHeap *heap)
Definition 30450.c:103
void bgm_clear_music_events(void)
Definition 30450.c:821
void au_bus_set_volume(u8 index, u16 arg1)
Definition 31650.c:267
void au_syn_set_volume_delta(u8 voiceIdx, s16 vol, s32 delta)
Definition 31650.c:505
void au_disable_channel_delay(void)
Definition 31650.c:704
void au_delay_right_channel(u8 groupIdx)
Definition 31650.c:689
void au_pvoice_set_bus(u8 index, s8 busId)
Definition 31650.c:294
void au_syn_stop_voice(u8 voiceIdx)
Definition 31650.c:301
void au_syn_set_pitch(u8 voiceIdx, f32 pitch)
Definition 31650.c:436
void au_set_delay_time(s32 arg0)
Definition 31650.c:662
void * alHeapAlloc(ALHeap *heap, s32 count, s32 size)
Definition 31650.c:743
void au_delay_channel(s16 arg0)
Definition 31650.c:710
void au_bus_set_effect(u8 index, u8 effectType)
Definition 31650.c:279
void au_syn_set_pan_fxmix(u8 voiceIdx, u8 pan, u8 fxMix)
Definition 31650.c:475
void au_syn_start_voice_params(u8 voiceIdx, u8 busId, Instrument *instrument, f32 pitch, s16 vol, u8 pan, u8 fxMix, s32 delta)
Definition 31650.c:335
void au_delay_left_channel(u8 groupIdx)
Definition 31650.c:674
void au_syn_set_mixer_params(u8 voiceIdx, s16 volume, s32 delta, u8 pan, u8 fxMix)
Definition 31650.c:442
void au_syn_set_wavetable(u8 voiceIdx, Instrument *instrument)
Definition 31650.c:398
s8 unk_29
Definition audio.h:568
u16 format
Definition audio.h:852
f32 outputRate
Definition audio.h:890
u8 channelDelayPending
Definition audio.h:904
MSEQHeader * mseqFiles[4]
Definition audio.h:1164
struct BGMHeader * bgmFile
Definition audio.h:1024
u16 bkFileIndex[3]
Definition audio.h:867
s32 fadeStep
Definition audio.h:367
u8 * cmdListPress
Definition audio.h:533
u16 predictorsSize
Definition audio.h:860
VolumeField curVolume
Definition audio.h:366
u16 * predictor
Definition audio.h:556
u8 randVolume
Definition audio.h:770
s32 baseRomOffset
Definition audio.h:894
u16 shortsSize
Definition audio.h:821
SoundManager * soundManager
Definition audio.h:1004
AuVoice voices[24]
Definition audio.h:938
s32 songPlayingCounter
Definition audio.h:1009
s32 numEntries
Definition audio.h:795
@ AU_FX_NONE
Definition audio.h:87
s8 unk_2B
Definition audio.h:570
s32 volScaleStep
Definition audio.h:376
s32 nextUpdateInterval
Definition audio.h:1162
u8 * cmdListRelease
Definition audio.h:534
EnvelopeData envelope
Definition audio.h:721
s32 s32
Definition audio.h:361
InitSongEntry * songList
Definition audio.h:898
Instrument * defaultInstrument
Definition audio.h:891
InstrumentGroup instrumentGroup6[4]
Definition audio.h:932
s32 songName
Definition audio.h:1010
EnvelopePreset DummyInstrumentEnvelope
Definition sfx_player.c:294
s32 nextUpdateInterval
Definition audio.h:666
struct Fade fadeInfo
Definition audio.h:668
MusicEventTrigger * musicEventQueue
Definition audio.h:921
s16 keyBase
Definition audio.h:765
u16 signature
Definition audio.h:848
#define ALIGN16_(val)
Definition audio.h:39
s8 unk_27
Definition audio.h:566
s32 loopEnd
Definition audio.h:554
s32 nextUpdateInterval
Definition audio.h:1006
u16 shortsOffset
Definition audio.h:820
s32 songID
Definition audio.h:1013
struct MSEQHeader * dataMSEQ[2]
Definition audio.h:911
s32 flushMusicEventQueue
Definition audio.h:923
EnvelopeOffset offsets[1]
Definition audio.h:545
InstrumentGroup instrumentGroup3[16]
Definition audio.h:927
s32 nextUpdateStep
Definition audio.h:1161
AuCallback audioThreadCallbacks[2]
Definition audio.h:925
u16 offsetPress
Definition audio.h:538
s32 nextUpdateCounter
Definition audio.h:1007
u16 unkSizeA
Definition audio.h:858
#define AUDIO_SAMPLES
Definition audio.h:44
VolumeField volScale
Definition audio.h:375
#define AU_FILE_RELATIVE(base, offset)
Definition audio.h:40
s32 bkFileListOffset
Definition audio.h:900
f32 pitchRatio
Definition audio.h:714
s16 volScaleTime
Definition audio.h:378
InstrumentGroup instrumentGroup1[4]
Definition audio.h:928
s32 bkListLength
Definition audio.h:901
s8 unk_28
Definition audio.h:567
u32 wavDataLength
Definition audio.h:551
BGMInstrumentInfo * dataPRG
Definition audio.h:909
s32 loopCount
Definition audio.h:555
u16 instrumetsSize
Definition audio.h:856
u8 numActivePlayers
Definition audio.h:1165
SBNFileEntry * sbnFileList
Definition audio.h:895
u16 dc_bookSize
Definition audio.h:557
@ AU_VOICE_SYNC_FLAG_PARAMS
Definition audio.h:81
@ AU_VOICE_SYNC_FLAG_PAN_FXMIX
Definition audio.h:83
@ AU_VOICE_SYNC_FLAG_PITCH
Definition audio.h:82
@ AU_VOICE_SYNC_FLAG_ALL
Definition audio.h:80
u8 randPan
Definition audio.h:771
s32 busVolume
Definition audio.h:669
s32 name
Definition audio.h:758
u16 tblSize
Definition audio.h:819
s16 bankPatch
Definition audio.h:764
u8 * base
Definition audio.h:550
s32 fileListLength
Definition audio.h:896
s8 clientPriority
Definition audio.h:740
s32 nextUpdateStep
Definition audio.h:665
s32 nextUpdateStep
Definition audio.h:1005
s32 loopStart
Definition audio.h:553
s32 unk_80
Definition audio.h:916
s16 fadeTime
Definition audio.h:369
ALHeap * heap
Definition audio.h:516
@ FX_BUS_BGMA_MAIN
Definition audio.h:119
@ FX_BUS_BGMA_AUX
Definition audio.h:122
@ FX_BUS_SOUND
Definition audio.h:120
@ FX_BUS_BGMB
Definition audio.h:121
u16 bgmFileIndex
Definition audio.h:866
u8 pan
Definition audio.h:717
s16 targetVolScale
Definition audio.h:377
s8 unk_26
Definition audio.h:565
u16 DummyInstrumentPredictor[32]
Definition sfx_player.c:61
void(* AuCallback)(void)
Definition audio.h:260
u8 DummyInstrumentBase[190]
Definition sfx_player.c:68
s16 unk_5C
Definition audio.h:1021
s32 PreventBGMPlayerUpdate
Definition 30450.c:6
s32 INIToffset
Definition audio.h:799
u8 volume
Definition audio.h:766
u8 syncFlags
Definition audio.h:739
u8 unk_130C
Definition audio.h:934
InstrumentGroup instrumentGroup2[16]
Definition audio.h:929
AuSynDriver * gSynDriverPtr
Definition 31650.c:15
s32 tableOffset
Definition audio.h:794
s32 songListLength
Definition audio.h:899
u16 u16
Definition audio.h:360
s32 busVolume
Definition audio.h:1015
s32 nextUpdateCounter
Definition audio.h:1163
Fade fadeInfo
Definition audio.h:1014
s16 unk_BA
Definition audio.h:679
u8 channelDelayBusId
Definition audio.h:905
u8 channelDelaySide
Definition audio.h:907
SoundBank * banks[3]
Definition audio.h:936
UNK_PTR loopPredictor
Definition audio.h:552
AmbiencePlayer players[4]
Definition audio.h:1169
u8 stopPending
Definition audio.h:738
Instrument * instrument
Definition audio.h:713
struct BGMHeader * dataBGM[2]
Definition audio.h:910
EnvelopePreset * envelopes
Definition audio.h:571
PEREntry * dataPER
Definition audio.h:908
BGMInstrumentInfo defaultPRGEntry
Definition audio.h:893
struct BGMPlayer * bgmPlayer
Definition audio.h:883
s32 nextUpdateCounter
Definition audio.h:667
s8 reverb
Definition audio.h:768
u8 reverb
Definition audio.h:718
s32 offset
Definition audio.h:835
u16 keyBase
Definition audio.h:558
u16 offsetRelease
Definition audio.h:539
InstrumentGroup instrumentGroupX[1]
Definition audio.h:926
#define AU_5750
Definition audio.h:22
s16 p_volume
Definition audio.h:716
u8 randReverb
Definition audio.h:772
@ AU_PRIORITY_BGM_PLAYER_MAIN
Definition audio.h:66
@ AU_PRIORITY_MSEQ_MANAGER
Definition audio.h:69
@ AU_PRIORITY_FREE
Definition audio.h:65
@ AU_PRIORITY_SFX_MANAGER
Definition audio.h:68
@ AU_PRIORITY_BGM_PLAYER_AUX
Definition audio.h:67
s32 delta
Definition audio.h:715
u8 unk_25
Definition audio.h:564
SndGlobalsSub6C unk_globals_6C[1]
Definition audio.h:912
u8 randTune
Definition audio.h:769
InstrumentGroup * instrumentGroups[8]
Definition audio.h:933
AuEffectChange effectChanges[4]
Definition audio.h:903
s8 unk_2A
Definition audio.h:569
AuGlobals * globals
Definition audio.h:1160
u8 busId
Definition audio.h:719
u16 unkSizeB
Definition audio.h:862
s32 size
Definition audio.h:850
u8 swizzled
Definition audio.h:872
u16 instruments[16]
Definition audio.h:855
InstrumentGroup instrumentGroup4[16]
Definition audio.h:930
u16 * mseqFileList
Definition audio.h:902
u8 type
Definition audio.h:563
u8 priority
Definition audio.h:741
SEFHeader * dataSEF
Definition audio.h:924
AUFileMetadata mdata
Definition audio.h:826
Instrument * InstrumentGroup[16]
Definition audio.h:574
u8 * cmdPtr
Definition audio.h:722
InstrumentGroup instrumentGroup5[16]
Definition audio.h:931
s16 targetVolume
Definition audio.h:368
u16 entriesSize
Definition audio.h:817
s32 bgmFileIndex
Definition audio.h:1012
u8 channelDelayTime
Definition audio.h:906
u16 entriesOffset
Definition audio.h:816
u16 tblOffset
Definition audio.h:818
BGMDrumInfo defaultDrumEntry
Definition audio.h:892
Definition audio.h:365
u32 MusicEventTrigger
@ AMBIENT_RADIO
Definition enums.h:1895
AuFileFormat
Definition enums.h:1773
@ AU_FMT_PRG
Definition enums.h:1778
@ AU_FMT_PER
Definition enums.h:1777
@ AU_FMT_BGM
Definition enums.h:1774
@ AU_FMT_SEF
Definition enums.h:1775
@ AU_FMT_BK
Definition enums.h:1776
@ AU_FMT_MSEQ
Definition enums.h:1779
AuResult
Definition enums.h:1755
@ AU_ERROR_SBN_INDEX_OUT_OF_RANGE
Definition enums.h:1767
@ AU_ERROR_SBN_FORMAT_MISMATCH
Definition enums.h:1768
@ AU_ERROR_151
Definition enums.h:1769
@ AU_RESULT_OK
Definition enums.h:1756
@ AU_ERROR_201
Definition enums.h:1770
s16 au_sfx_manager_update(SoundManager *manager)
void au_sfx_update_main(SoundManager *manager)
Definition sfx_player.c:569
void au_sfx_load_groups_from_SEF(SoundManager *sndMgr)
Definition sfx_player.c:506
s32 au_sfx_set_reverb_type(SoundManager *manager, s32 arg1)
Definition sfx_player.c:664
void au_sfx_init(SoundManager *manager, u8 arg1, u8 arg2, AuGlobals *arg3, u8 arg4)
Definition sfx_player.c:423
#define ARRAY_COUNT(arr)
Definition macros.h:40