From 1de4b9144b83cae16bd6261372157fe194092b8f Mon Sep 17 00:00:00 2001 From: Gregory Heskett Date: Sun, 4 Feb 2024 02:29:38 -0500 Subject: [PATCH] Fix floating point crash with pitch bend table + various audio optimizations (#746) * Move audio TTLs to improve dcache Saves over 100us even when audio is idle * Improve additional audio runtime by reducing some unnecessary float math * Pause channel/layer processing on sfx channels when idle * Fix possible floating point UB/crash with gPitchBendFrequencyScale --- include/seq_macros.inc | 16 +++--- sound/sequences/00_sound_player.s | 38 +++++-------- src/audio/data.c | 63 ++++++++++----------- src/audio/data.h | 4 -- src/audio/effects.c | 39 ++++++------- src/audio/external.c | 1 + src/audio/heap.c | 2 +- src/audio/load.c | 91 +++++++++---------------------- src/audio/load.h | 2 +- src/audio/load_sh.c | 2 +- src/audio/seqplayer.c | 26 ++++----- src/audio/synthesis.c | 6 +- 12 files changed, 113 insertions(+), 177 deletions(-) diff --git a/include/seq_macros.inc b/include/seq_macros.inc index 1d12e1ab..a551cc73 100644 --- a/include/seq_macros.inc +++ b/include/seq_macros.inc @@ -475,8 +475,8 @@ .byte \a .endm -.macro chan_testlayerfinished a - .byte 0x80 + \a +.macro chan_testlayersfinished + .byte 0x80 .endm .macro chan_setlayer a, b @@ -488,14 +488,14 @@ .byte 0x60 + \a .endm -.macro chan_freelayer a - .byte 0x90 + \a +.macro chan_freelayers + .byte 0x90 .endm #else -.macro chan_testlayerfinished a - .byte 0x0 + \a +.macro chan_testlayersfinished + .byte 0x00 .endm .macro chan_ioreadval a @@ -507,8 +507,8 @@ .byte (\b - sequence_start) >> 8, (\b - sequence_start) & 0xff .endm -.macro chan_freelayer a - .byte 0xa0 + \a +.macro chan_freelayers + .byte 0xa0 .endm #ifdef VERSION_EU diff --git a/sound/sequences/00_sound_player.s b/sound/sequences/00_sound_player.s index 1a711161..464bc0d6 100644 --- a/sound/sequences/00_sound_player.s +++ b/sound/sequences/00_sound_player.s @@ -73,13 +73,11 @@ chan_jump .main_loop_023589 // Main loop for standard, non-continuous sound effects .main_loop_023589: -chan_delay1 +chan_hang chan_ioreadval 0 chan_bltz .main_loop_023589 .start_playing_023589: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 +chan_freelayers chan_setval 0 chan_iowriteval 5 chan_ioreadval 4 @@ -93,13 +91,11 @@ chan_bltz .skip_023589 // if we have a signal: chan_beqz .force_stop_023589 // told to stop chan_jump .start_playing_023589 // told to play something else .skip_023589: -chan_testlayerfinished 0 -chan_beqz .poll_023589 // if layer 0 hasn't finished, keep polling +chan_testlayersfinished +chan_beqz .poll_023589 // if all layers haven't finished, keep polling chan_jump .main_loop_023589 // otherwise go back to the main loop .force_stop_023589: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 +chan_freelayers chan_jump .main_loop_023589 .channel1: @@ -140,13 +136,11 @@ chan_jump .main_loop_146 // Main loop for moving, env and air sound effects, which play continuously .main_loop_146: -chan_delay1 +chan_hang chan_ioreadval 0 chan_bltz .main_loop_146 .start_playing_146: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 +chan_freelayers chan_setvolscale 127 chan_setval 0 chan_iowriteval 5 @@ -161,9 +155,7 @@ chan_bltz .poll_146 chan_beqz .force_stop_146 chan_jump .start_playing_146 .force_stop_146: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 +chan_freelayers chan_jump .main_loop_146 .channel7: @@ -177,13 +169,11 @@ chan_setdyntable .channel7_table // Loop for menu sound effects .main_loop_7: -chan_delay1 +chan_hang chan_ioreadval 0 chan_bltz .main_loop_7 .start_playing_7: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 +chan_freelayers chan_setval 0 chan_iowriteval 5 chan_setreverb 0 @@ -201,14 +191,12 @@ chan_bltz .skip_7 // if we have a signal: chan_unreservenotes chan_jump .start_playing_7 // told to play something else .skip_7: -chan_testlayerfinished 0 -chan_beqz .poll_7 // if layer 0 hasn't finished, keep polling +chan_testlayersfinished +chan_beqz .poll_7 // if all layers haven't finished, keep polling chan_unreservenotes chan_jump .main_loop_7 // otherwise go back to the main loop .force_stop_7: -chan_freelayer 0 -chan_freelayer 1 -chan_freelayer 2 +chan_freelayers chan_unreservenotes chan_jump .main_loop_7 diff --git a/src/audio/data.c b/src/audio/data.c index 2c16194b..28332c84 100644 --- a/src/audio/data.c +++ b/src/audio/data.c @@ -244,41 +244,36 @@ u16 gAudioCosineTable[128] = { // between -1 and +1 octave. // gPitchBendFrequencyScale[k] = (0.5 * 2^(k/127)) #ifndef VERSION_SH -#if defined(VERSION_EU) f32 gPitchBendFrequencyScale[256] = { - 0.5f, -#else -f32 gPitchBendFrequencyScale[255] = { -#endif - 0.500000f, 0.502736f, 0.505488f, 0.508254f, 0.511036f, 0.513833f, 0.516645f, 0.519472f, 0.522315f, - 0.525174f, 0.528048f, 0.530938f, 0.533843f, 0.536765f, 0.539702f, 0.542656f, 0.545626f, 0.548612f, - 0.551614f, 0.554633f, 0.557669f, 0.560721f, 0.563789f, 0.566875f, 0.569977f, 0.573097f, 0.576233f, - 0.579387f, 0.582558f, 0.585746f, 0.588951f, 0.592175f, 0.595415f, 0.598674f, 0.601950f, 0.605245f, - 0.608557f, 0.611888f, 0.615236f, 0.618603f, 0.621989f, 0.625393f, 0.628815f, 0.632257f, 0.635717f, - 0.639196f, 0.642694f, 0.646212f, 0.649748f, 0.653304f, 0.656880f, 0.660475f, 0.664089f, 0.667724f, - 0.671378f, 0.675052f, 0.678747f, 0.682461f, 0.686196f, 0.689952f, 0.693727f, 0.697524f, 0.701341f, - 0.705180f, 0.709039f, 0.712919f, 0.716821f, 0.720744f, 0.724689f, 0.728655f, 0.732642f, 0.736652f, - 0.740684f, 0.744737f, 0.748813f, 0.752911f, 0.757031f, 0.761175f, 0.765340f, 0.769529f, 0.773740f, - 0.777975f, 0.782232f, 0.786513f, 0.790818f, 0.795146f, 0.799497f, 0.803873f, 0.808272f, 0.812696f, - 0.817144f, 0.821616f, 0.826112f, 0.830633f, 0.835179f, 0.839750f, 0.844346f, 0.848966f, 0.853613f, - 0.858284f, 0.862982f, 0.867704f, 0.872453f, 0.877228f, 0.882029f, 0.886856f, 0.891709f, 0.896590f, - 0.901496f, 0.906430f, 0.911391f, 0.916379f, 0.921394f, 0.926436f, 0.931507f, 0.936604f, 0.941730f, - 0.946884f, 0.952066f, 0.957277f, 0.962516f, 0.967783f, 0.973080f, 0.978405f, 0.983760f, 0.989144f, - 0.994557f, 1.000000f, 1.005473f, 1.010975f, 1.016508f, 1.022071f, 1.027665f, 1.033289f, 1.038944f, - 1.044630f, 1.050347f, 1.056095f, 1.061875f, 1.067687f, 1.073530f, 1.079405f, 1.085312f, 1.091252f, - 1.097224f, 1.103229f, 1.109267f, 1.115337f, 1.121441f, 1.127579f, 1.133750f, 1.139955f, 1.146193f, - 1.152466f, 1.158773f, 1.165115f, 1.171491f, 1.177903f, 1.184349f, 1.190831f, 1.197348f, 1.203901f, - 1.210489f, 1.217114f, 1.223775f, 1.230473f, 1.237207f, 1.243978f, 1.250786f, 1.257631f, 1.264514f, - 1.271434f, 1.278392f, 1.285389f, 1.292423f, 1.299497f, 1.306608f, 1.313759f, 1.320949f, 1.328178f, - 1.335447f, 1.342756f, 1.350104f, 1.357493f, 1.364922f, 1.372392f, 1.379903f, 1.387455f, 1.395048f, - 1.402683f, 1.410360f, 1.418078f, 1.425839f, 1.433642f, 1.441488f, 1.449377f, 1.457309f, 1.465285f, - 1.473304f, 1.481367f, 1.489474f, 1.497626f, 1.505822f, 1.514063f, 1.522349f, 1.530681f, 1.539058f, - 1.547481f, 1.555950f, 1.564465f, 1.573027f, 1.581636f, 1.590292f, 1.598995f, 1.607746f, 1.616545f, - 1.625392f, 1.634287f, 1.643231f, 1.652224f, 1.661266f, 1.670358f, 1.679500f, 1.688691f, 1.697933f, - 1.707225f, 1.716569f, 1.725963f, 1.735409f, 1.744906f, 1.754456f, 1.764058f, 1.773712f, 1.783419f, - 1.793179f, 1.802993f, 1.812860f, 1.822782f, 1.832757f, 1.842788f, 1.852873f, 1.863013f, 1.873209f, - 1.883461f, 1.893768f, 1.904132f, 1.914553f, 1.925031f, 1.935567f, 1.946159f, 1.956810f, 1.967520f, - 1.978287f, 1.989114f, 2.000000f + 0.500000f, 0.500000f, 0.502736f, 0.505488f, 0.508254f, 0.511036f, 0.513833f, 0.516645f, 0.519472f, + 0.522315f, 0.525174f, 0.528048f, 0.530938f, 0.533843f, 0.536765f, 0.539702f, 0.542656f, 0.545626f, + 0.548612f, 0.551614f, 0.554633f, 0.557669f, 0.560721f, 0.563789f, 0.566875f, 0.569977f, 0.573097f, + 0.576233f, 0.579387f, 0.582558f, 0.585746f, 0.588951f, 0.592175f, 0.595415f, 0.598674f, 0.601950f, + 0.605245f, 0.608557f, 0.611888f, 0.615236f, 0.618603f, 0.621989f, 0.625393f, 0.628815f, 0.632257f, + 0.635717f, 0.639196f, 0.642694f, 0.646212f, 0.649748f, 0.653304f, 0.656880f, 0.660475f, 0.664089f, + 0.667724f, 0.671378f, 0.675052f, 0.678747f, 0.682461f, 0.686196f, 0.689952f, 0.693727f, 0.697524f, + 0.701341f, 0.705180f, 0.709039f, 0.712919f, 0.716821f, 0.720744f, 0.724689f, 0.728655f, 0.732642f, + 0.736652f, 0.740684f, 0.744737f, 0.748813f, 0.752911f, 0.757031f, 0.761175f, 0.765340f, 0.769529f, + 0.773740f, 0.777975f, 0.782232f, 0.786513f, 0.790818f, 0.795146f, 0.799497f, 0.803873f, 0.808272f, + 0.812696f, 0.817144f, 0.821616f, 0.826112f, 0.830633f, 0.835179f, 0.839750f, 0.844346f, 0.848966f, + 0.853613f, 0.858284f, 0.862982f, 0.867704f, 0.872453f, 0.877228f, 0.882029f, 0.886856f, 0.891709f, + 0.896590f, 0.901496f, 0.906430f, 0.911391f, 0.916379f, 0.921394f, 0.926436f, 0.931507f, 0.936604f, + 0.941730f, 0.946884f, 0.952066f, 0.957277f, 0.962516f, 0.967783f, 0.973080f, 0.978405f, 0.983760f, + 0.989144f, 0.994557f, 1.000000f, 1.005473f, 1.010975f, 1.016508f, 1.022071f, 1.027665f, 1.033289f, + 1.038944f, 1.044630f, 1.050347f, 1.056095f, 1.061875f, 1.067687f, 1.073530f, 1.079405f, 1.085312f, + 1.091252f, 1.097224f, 1.103229f, 1.109267f, 1.115337f, 1.121441f, 1.127579f, 1.133750f, 1.139955f, + 1.146193f, 1.152466f, 1.158773f, 1.165115f, 1.171491f, 1.177903f, 1.184349f, 1.190831f, 1.197348f, + 1.203901f, 1.210489f, 1.217114f, 1.223775f, 1.230473f, 1.237207f, 1.243978f, 1.250786f, 1.257631f, + 1.264514f, 1.271434f, 1.278392f, 1.285389f, 1.292423f, 1.299497f, 1.306608f, 1.313759f, 1.320949f, + 1.328178f, 1.335447f, 1.342756f, 1.350104f, 1.357493f, 1.364922f, 1.372392f, 1.379903f, 1.387455f, + 1.395048f, 1.402683f, 1.410360f, 1.418078f, 1.425839f, 1.433642f, 1.441488f, 1.449377f, 1.457309f, + 1.465285f, 1.473304f, 1.481367f, 1.489474f, 1.497626f, 1.505822f, 1.514063f, 1.522349f, 1.530681f, + 1.539058f, 1.547481f, 1.555950f, 1.564465f, 1.573027f, 1.581636f, 1.590292f, 1.598995f, 1.607746f, + 1.616545f, 1.625392f, 1.634287f, 1.643231f, 1.652224f, 1.661266f, 1.670358f, 1.679500f, 1.688691f, + 1.697933f, 1.707225f, 1.716569f, 1.725963f, 1.735409f, 1.744906f, 1.754456f, 1.764058f, 1.773712f, + 1.783419f, 1.793179f, 1.802993f, 1.812860f, 1.822782f, 1.832757f, 1.842788f, 1.852873f, 1.863013f, + 1.873209f, 1.883461f, 1.893768f, 1.904132f, 1.914553f, 1.925031f, 1.935567f, 1.946159f, 1.956810f, + 1.967520f, 1.978287f, 1.989114f, 2.000000f }; // Frequencies for notes using the standard twelve-tone equal temperament scale. diff --git a/src/audio/data.h b/src/audio/data.h index acca1371..b4706868 100644 --- a/src/audio/data.h +++ b/src/audio/data.h @@ -65,11 +65,7 @@ extern u8 gReverbMultsArrCount; #endif // PUPPYPRINT_DEBUG #endif // BETTER_REVERB -#if defined(VERSION_EU) || defined(VERSION_SH) extern f32 gPitchBendFrequencyScale[256]; -#else -extern f32 gPitchBendFrequencyScale[255]; -#endif extern f32 gNoteFrequencies[128]; extern u8 gDefaultShortNoteVelocityTable[16]; diff --git a/src/audio/effects.c b/src/audio/effects.c index ec2abc25..4fd6dc15 100644 --- a/src/audio/effects.c +++ b/src/audio/effects.c @@ -55,19 +55,26 @@ void sequence_channel_process_sound(struct SequenceChannel *seqChannel, s32 reca } #else static void sequence_channel_process_sound(struct SequenceChannel *seqChannel) { - s32 i; + s32 hasProcessedChannel = FALSE; + f32 channelVolume; + f32 panFromChannel; + f32 panLayerWeight; - f32 channelVolume = seqChannel->volume * seqChannel->volumeScale * seqChannel->seqPlayer->fadeVolume; - if (seqChannel->seqPlayer->muted && (seqChannel->muteBehavior & MUTE_BEHAVIOR_SOFTEN) != 0) { - channelVolume *= seqChannel->seqPlayer->muteVolumeScale; - } - - f32 panFromChannel = seqChannel->pan * seqChannel->panChannelWeight; - f32 panLayerWeight = 1.0f - seqChannel->panChannelWeight; - - for (i = 0; i < 4; i++) { + for (s32 i = 0; i < LAYERS_MAX; i++) { struct SequenceChannelLayer *layer = seqChannel->layers[i]; if (layer != NULL && layer->enabled && layer->note != NULL) { + if (!hasProcessedChannel) { + hasProcessedChannel = TRUE; + + channelVolume = seqChannel->volume * seqChannel->volumeScale * seqChannel->seqPlayer->fadeVolume; + if (seqChannel->seqPlayer->muted && (seqChannel->muteBehavior & MUTE_BEHAVIOR_SOFTEN) != 0) { + channelVolume *= seqChannel->seqPlayer->muteVolumeScale; + } + + panFromChannel = seqChannel->pan * seqChannel->panChannelWeight; + panLayerWeight = 1.0f - seqChannel->panChannelWeight; + } + layer->noteFreqScale = layer->freqScale * seqChannel->freqScale; layer->noteVelocity = layer->velocitySquare * channelVolume; layer->notePan = (layer->pan * panLayerWeight) + panFromChannel; @@ -143,19 +150,11 @@ f32 get_portamento_freq_scale(struct Portamento *p) { p->cur += p->speed; u32 v0 = (u32) p->cur; -#if defined(VERSION_EU) || defined(VERSION_SH) if (v0 > 127) { -#else - if (v0 >= 127) { -#endif v0 = 127; } -#if defined(VERSION_EU) || defined(VERSION_SH) return (1.0f + (p->extent * (gPitchBendFrequencyScale[v0 + 128] - 1.0f))); -#else - return (1.0f + (p->extent * (gPitchBendFrequencyScale[v0 + 127] - 1.0f))); -#endif } s32 get_vibrato_pitch_change(struct VibratoState *vib) { @@ -242,11 +241,7 @@ f32 get_vibrato_freq_scale(struct VibratoState *vib) { s32 pitchChange = get_vibrato_pitch_change(vib); f32 extent = (f32) vib->extent / 4096.0f; -#if defined(VERSION_EU) || defined(VERSION_SH) return 1.0f + extent * (gPitchBendFrequencyScale[pitchChange + 128] - 1.0f); -#else - return 1.0f + extent * (gPitchBendFrequencyScale[pitchChange + 127] - 1.0f); -#endif } void note_vibrato_update(struct Note *note) { diff --git a/src/audio/external.c b/src/audio/external.c index bed409f6..ddf28c31 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -1236,6 +1236,7 @@ static void update_game_sound(void) { // Begin playing the sound gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->soundScriptIO[4] = soundId; gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->soundScriptIO[0] = 1; + gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->stopScript = FALSE; switch (bank) { case SOUND_BANK_MOVING: diff --git a/src/audio/heap.c b/src/audio/heap.c index c19f61f4..c9ec78c5 100644 --- a/src/audio/heap.c +++ b/src/audio/heap.c @@ -1431,7 +1431,7 @@ void audio_reset_session(void) { init_reverb_us(reverbPresetId); #endif - init_sample_dma_buffers(gMaxSimultaneousNotes); + init_sample_dma_buffers(); #if defined(VERSION_EU) build_vol_rampings_table(0, gAudioBufferParameters.samplesPerUpdate); diff --git a/src/audio/load.c b/src/audio/load.c index 295490e9..c663d93c 100644 --- a/src/audio/load.c +++ b/src/audio/load.c @@ -12,11 +12,9 @@ struct SharedDma { /*0x0*/ u8 *buffer; // target, points to pre-allocated buffer /*0x4*/ uintptr_t source; // device address - /*0x8*/ u16 sizeUnused; // set to bufSize, never read - /*0xA*/ u16 bufSize; // size of buffer - /*0xC*/ u8 unused2; // set to 0, never read - /*0xD*/ u8 reuseIndex; // position in sSampleDmaReuseQueue1/2, if ttl == 0 - /*0xE*/ u8 ttl; // duration after which the DMA can be discarded + /*0x8*/ u32 bufSize; // size of buffer (converted from u16 for intentional padding to size 0x10) + /*0xC*/ u8 reuseIndex; // position in sSampleDmaReuseQueue1/2, if ttl == 0 + /* */ // u8 pad[3]; }; // size = 0x10 // EU only @@ -43,6 +41,7 @@ OSMesg gAudioDmaMesg; OSIoMesg gAudioDmaIoMesg; struct SharedDma sSampleDmas[MAX_SIMULTANEOUS_NOTES * 4]; +u8 sSampleTTLs[MAX_SIMULTANEOUS_NOTES * 4]; u32 gSampleDmaNumListItems; // sh: 0x803503D4 u32 sSampleDmaListSize1; // sh: 0x803503D8 @@ -71,7 +70,6 @@ struct AudioBufferParametersEU gAudioBufferParameters; s32 gAiFrequency; #endif -u32 sDmaBufSize; s32 gMaxAudioCmds; s32 gMaxSimultaneousNotes; @@ -158,30 +156,20 @@ void decrease_sample_dma_ttls() { u32 i; for (i = 0; i < sSampleDmaListSize1; i++) { -#if defined(VERSION_EU) - struct SharedDma *temp = &sSampleDmas[i]; -#else - struct SharedDma *temp = sSampleDmas + i; -#endif - if (temp->ttl != 0) { - temp->ttl--; - if (temp->ttl == 0) { - temp->reuseIndex = sSampleDmaReuseQueueHead1; + if (sSampleTTLs[i] != 0) { + sSampleTTLs[i]--; + if (sSampleTTLs[i] == 0) { + sSampleDmas[i].reuseIndex = sSampleDmaReuseQueueHead1; sSampleDmaReuseQueue1[sSampleDmaReuseQueueHead1++] = (u8) i; } } } for (i = sSampleDmaListSize1; i < gSampleDmaNumListItems; i++) { -#if defined(VERSION_EU) - struct SharedDma *temp = &sSampleDmas[i]; -#else - struct SharedDma *temp = sSampleDmas + i; -#endif - if (temp->ttl != 0) { - temp->ttl--; - if (temp->ttl == 0) { - temp->reuseIndex = sSampleDmaReuseQueueHead2; + if (sSampleTTLs[i] != 0) { + sSampleTTLs[i]--; + if (sSampleTTLs[i] == 0) { + sSampleDmas[i].reuseIndex = sSampleDmaReuseQueueHead2; sSampleDmaReuseQueue2[sSampleDmaReuseQueueHead2++] = (u8) i; } } @@ -203,7 +191,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) { bufferPos = devAddr - dma->source; if (0 <= bufferPos && (size_t) bufferPos <= dma->bufSize - size) { // We already have a DMA request for this memory range. - if (dma->ttl == 0 && sSampleDmaReuseQueueTail2 != sSampleDmaReuseQueueHead2) { + if (sSampleTTLs[i] == 0 && sSampleDmaReuseQueueTail2 != sSampleDmaReuseQueueHead2) { // Move the DMA out of the reuse queue, by swapping it with the // tail, and then incrementing the tail. if (dma->reuseIndex != sSampleDmaReuseQueueTail2) { @@ -214,7 +202,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) { } sSampleDmaReuseQueueTail2++; } - dma->ttl = 60; + sSampleTTLs[i] = 60; *dmaIndexRef = (u8) i; return (devAddr - dma->source) + dma->buffer; } @@ -226,6 +214,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) { dmaIndex = sSampleDmaReuseQueue2[sSampleDmaReuseQueueTail2]; sSampleDmaReuseQueueTail2++; dma = sSampleDmas + dmaIndex; + sSampleTTLs[dmaIndex] = 2; hasDma = TRUE; } } else { @@ -233,7 +222,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) { bufferPos = devAddr - dma->source; if (0 <= bufferPos && (size_t) bufferPos <= dma->bufSize - size) { // We already have DMA for this memory range. - if (dma->ttl == 0) { + if (sSampleTTLs[*dmaIndexRef] == 0) { // Move the DMA out of the reuse queue, by swapping it with the // tail, and then incrementing the tail. if (dma->reuseIndex != sSampleDmaReuseQueueTail1) { @@ -244,7 +233,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) { } sSampleDmaReuseQueueTail1++; } - dma->ttl = 2; + sSampleTTLs[*dmaIndexRef] = 2; return dma->buffer + (devAddr - dma->source); } } @@ -254,14 +243,13 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) { // be empty, since TTL 2 is so small. dmaIndex = sSampleDmaReuseQueue1[sSampleDmaReuseQueueTail1++]; dma = sSampleDmas + dmaIndex; + sSampleTTLs[dmaIndex] = 2; hasDma = TRUE; } transfer = dma->bufSize; dmaDevAddr = devAddr & ~0xF; - dma->ttl = 2; dma->source = dmaDevAddr; - dma->sizeUnused = transfer; #ifdef VERSION_US // TODO: Is there a reason this only exists in US? osInvalDCache(dma->buffer, transfer); #endif @@ -272,14 +260,10 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) { } -void init_sample_dma_buffers(UNUSED s32 arg0) { +void init_sample_dma_buffers() { s32 i; -#if defined(VERSION_EU) -#define j i -#else - s32 j; -#endif - + s32 sDmaBufSize; + sDmaBufSize = DMA_BUF_SIZE_0; #if defined(VERSION_EU) @@ -289,30 +273,21 @@ void init_sample_dma_buffers(UNUSED s32 arg0) { #endif sSampleDmas[gSampleDmaNumListItems].buffer = soundAlloc(&gNotesAndBuffersPool, sDmaBufSize); if (sSampleDmas[gSampleDmaNumListItems].buffer == NULL) { -#if defined(VERSION_EU) break; -#else - goto out1; -#endif } sSampleDmas[gSampleDmaNumListItems].bufSize = sDmaBufSize; sSampleDmas[gSampleDmaNumListItems].source = 0; - sSampleDmas[gSampleDmaNumListItems].sizeUnused = 0; - sSampleDmas[gSampleDmaNumListItems].unused2 = 0; - sSampleDmas[gSampleDmaNumListItems].ttl = 0; + sSampleTTLs[gSampleDmaNumListItems] = 0; gSampleDmaNumListItems++; } -#if defined(VERSION_JP) || defined(VERSION_US) -out1: -#endif for (i = 0; (u32) i < gSampleDmaNumListItems; i++) { sSampleDmaReuseQueue1[i] = (u8) i; sSampleDmas[i].reuseIndex = (u8) i; } - for (j = gSampleDmaNumListItems; j < 0x100; j++) { - sSampleDmaReuseQueue1[j] = 0; + for (i = gSampleDmaNumListItems; i < ARRAY_COUNT(sSampleDmaReuseQueue1); i++) { + sSampleDmaReuseQueue1[i] = 0; } sSampleDmaReuseQueueTail1 = 0; @@ -324,22 +299,13 @@ out1: for (i = 0; i < gMaxSimultaneousNotes; i++) { sSampleDmas[gSampleDmaNumListItems].buffer = soundAlloc(&gNotesAndBuffersPool, sDmaBufSize); if (sSampleDmas[gSampleDmaNumListItems].buffer == NULL) { -#if defined(VERSION_EU) break; -#else - goto out2; -#endif } sSampleDmas[gSampleDmaNumListItems].bufSize = sDmaBufSize; sSampleDmas[gSampleDmaNumListItems].source = 0; - sSampleDmas[gSampleDmaNumListItems].sizeUnused = 0; - sSampleDmas[gSampleDmaNumListItems].unused2 = 0; - sSampleDmas[gSampleDmaNumListItems].ttl = 0; + sSampleTTLs[gSampleDmaNumListItems] = 0; gSampleDmaNumListItems++; } -#if defined(VERSION_JP) || defined(VERSION_US) -out2: -#endif for (i = sSampleDmaListSize1; (u32) i < gSampleDmaNumListItems; i++) { sSampleDmaReuseQueue2[i - sSampleDmaListSize1] = (u8) i; @@ -348,15 +314,12 @@ out2: // This probably meant to touch the range size1..size2 as well... but it // doesn't matter, since these values are never read anyway. - for (j = gSampleDmaNumListItems; j < 0x100; j++) { - sSampleDmaReuseQueue2[j] = sSampleDmaListSize1; + for (i = gSampleDmaNumListItems; i < ARRAY_COUNT(sSampleDmaReuseQueue2); i++) { + sSampleDmaReuseQueue2[i] = sSampleDmaListSize1; } sSampleDmaReuseQueueTail2 = 0; sSampleDmaReuseQueueHead2 = gSampleDmaNumListItems - sSampleDmaListSize1; -#if defined(VERSION_EU) -#undef j -#endif } #if defined(VERSION_JP) || defined(VERSION_US) diff --git a/src/audio/load.h b/src/audio/load.h index 12b6ed6c..1c69c688 100644 --- a/src/audio/load.h +++ b/src/audio/load.h @@ -87,7 +87,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef, s3 #else void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef); #endif -void init_sample_dma_buffers(s32 arg0); +void init_sample_dma_buffers(); #if defined(VERSION_SH) void patch_audio_bank(s32 bankId, struct AudioBank *mem, struct PatchStruct *patchInfo); #else diff --git a/src/audio/load_sh.c b/src/audio/load_sh.c index bc24891b..ac6097a5 100644 --- a/src/audio/load_sh.c +++ b/src/audio/load_sh.c @@ -237,7 +237,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef, s3 return (devAddr - dmaDevAddr) + dma->buffer; } -void init_sample_dma_buffers(UNUSED s32 arg0) { +void init_sample_dma_buffers() { s32 i; sDmaBufSize = 0x2D0; diff --git a/src/audio/seqplayer.c b/src/audio/seqplayer.c index 65a948be..373ad968 100644 --- a/src/audio/seqplayer.c +++ b/src/audio/seqplayer.c @@ -6,6 +6,7 @@ #include "heap.h" #include "load.h" #include "seqplayer.h" +#include "game/debug.h" #include "game/main.h" #ifdef VERSION_SH @@ -1693,11 +1694,7 @@ void sequence_channel_process_script(struct SequenceChannel *seqChannel) { case 0xd3: // chan_pitchbend; pitch bend by <= 1 octave in either direction (-127..127) // (m64_read_u8(state) is really s8 here) -#ifdef VERSION_SH cmd = m64_read_u8(state) + 128; -#else - cmd = m64_read_u8(state) + 127; -#endif seqChannel->freqScale = gPitchBendFrequencyScale[cmd] * gConfig.audioFrequency; #if defined(VERSION_EU) || defined(VERSION_SH) seqChannel->changes.as_bitfields.freqScale = TRUE; @@ -2075,15 +2072,14 @@ void sequence_channel_process_script(struct SequenceChannel *seqChannel) { } break; #else - case 0x00: // chan_testlayerfinished - if (seqChannel->layers[loBits] != NULL) { - value = seqChannel->layers[loBits]->finished; + case 0x00: // chan_testlayersfinished (NOTE: does not use loBits) + value = TRUE; + for (i = 0; i < LAYERS_MAX; i++) { + if (seqChannel->layers[i] != NULL && !seqChannel->layers[i]->finished) { + value = FALSE; + break; + } } -#ifdef VERSION_EU - else { - value = -1; - } -#endif break; #endif @@ -2123,8 +2119,10 @@ void sequence_channel_process_script(struct SequenceChannel *seqChannel) { } break; - case 0xa0: // chan_freelayer - seq_channel_layer_free(seqChannel, loBits); + case 0xa0: // chan_freelayers (NOTE: does not use loBits) + for (i = 0; i < LAYERS_MAX; i++) { + seq_channel_layer_free(seqChannel, i); + } break; case 0xb0: // chan_dynsetlayer diff --git a/src/audio/synthesis.c b/src/audio/synthesis.c index ade7b431..feec8785 100644 --- a/src/audio/synthesis.c +++ b/src/audio/synthesis.c @@ -712,7 +712,7 @@ u64 *synthesis_process_notes(s16 *aiBuf, u32 bufLen, u64 *cmd) { aClearBuffer(cmd++, DMEM_ADDR_UNCOMPRESSED_NOTE + s5, (samplesLenAdjusted - nAdpcmSamplesProcessed) * 2); note->samplePosInt = 0; - note->finished = 1; + note->finished = TRUE; ((struct vNote *)note)->enabled = 0; break; } @@ -737,7 +737,7 @@ u64 *synthesis_process_notes(s16 *aiBuf, u32 bufLen, u64 *cmd) { aResample(cmd++, A_INIT, 0xff60, VIRTUAL_TO_PHYSICAL2(note->synthesisBuffers->dummyResampleState)); resampledTempLen = samplesLenAdjusted + 4; noteSamplesDmemAddrBeforeResampling = DMEM_ADDR_RESAMPLED + 4; - if (note->finished != FALSE) { + if (note->finished) { aClearBuffer(cmd++, DMEM_ADDR_RESAMPLED + resampledTempLen, samplesLenAdjusted + 16); } break; @@ -756,7 +756,7 @@ u64 *synthesis_process_notes(s16 *aiBuf, u32 bufLen, u64 *cmd) { } } - if (note->finished != FALSE) { + if (note->finished) { break; } }