From be7418c907f003a3e4b22905c964e072fb3f1de4 Mon Sep 17 00:00:00 2001 From: gheskett Date: Tue, 3 Aug 2021 02:55:48 -0500 Subject: [PATCH] Console exclusive stuffs --- src/audio/heap.c | 31 ++++++++++++++++++--------- src/audio/synthesis.c | 50 +++++++++++++++++++++++++++---------------- src/audio/synthesis.h | 5 ++++- 3 files changed, 56 insertions(+), 30 deletions(-) diff --git a/src/audio/heap.c b/src/audio/heap.c index 1dea272c..cd67754b 100644 --- a/src/audio/heap.c +++ b/src/audio/heap.c @@ -6,6 +6,7 @@ #include "synthesis.h" #include "seqplayer.h" #include "effects.h" +#include "game/game_init.h" #define ALIGN16(val) (((val) + 0xF) & ~0xF) @@ -1231,10 +1232,18 @@ void audio_reset_session(void) { gSamplesPerFrameTarget = ALIGN16(gAiFrequency / 60); gReverbDownsampleRate = preset->reverbDownsampleRate; #ifdef BETTER_REVERB - if (IO_READ(DPC_PIPEBUSY_REG) != 0) - reverbConsole = 3; // Is a console user; change to 4 if still too slow + if (gIsConsole) + reverbConsole = betterReverbConsoleDownsample; else reverbConsole = 2; + + if (reverbConsole <= 0) { + reverbConsole = 1; + consoleBetterReverb = FALSE; + } + else { + consoleBetterReverb = TRUE; + } if (gReverbDownsampleRate < reverbConsole) gReverbDownsampleRate = reverbConsole; @@ -1432,15 +1441,17 @@ void audio_reset_session(void) { } } #ifdef BETTER_REVERB - for (i = 0; i < NUM_ALLPASS; ++i) - delays[i] = delaysBaseline[i] / (1 << (gReverbDownsampleRate - 1)); + if (consoleBetterReverb) { + for (i = 0; i < NUM_ALLPASS; ++i) + delays[i] = delaysBaseline[i] / (1 << (gReverbDownsampleRate - 1)); - delayBufs = (s32***) soundAlloc(&gAudioSessionPool, 2 * sizeof(s32**)); - delayBufs[0] = (s32**) soundAlloc(&gAudioSessionPool, NUM_ALLPASS * sizeof(s32*)); - delayBufs[1] = (s32**) soundAlloc(&gAudioSessionPool, NUM_ALLPASS * sizeof(s32*)); - for (i = 0; i < NUM_ALLPASS; ++i) { - delayBufs[0][i] = (s32*) soundAlloc(&gAudioSessionPool, delays[i] * sizeof(s32)); - delayBufs[1][i] = (s32*) soundAlloc(&gAudioSessionPool, delays[i] * sizeof(s32)); + delayBufs = (s32***) soundAlloc(&gAudioSessionPool, 2 * sizeof(s32**)); + delayBufs[0] = (s32**) soundAlloc(&gAudioSessionPool, NUM_ALLPASS * sizeof(s32*)); + delayBufs[1] = (s32**) soundAlloc(&gAudioSessionPool, NUM_ALLPASS * sizeof(s32*)); + for (i = 0; i < NUM_ALLPASS; ++i) { + delayBufs[0][i] = (s32*) soundAlloc(&gAudioSessionPool, delays[i] * sizeof(s32)); + delayBufs[1][i] = (s32*) soundAlloc(&gAudioSessionPool, delays[i] * sizeof(s32)); + } } #endif } diff --git a/src/audio/synthesis.c b/src/audio/synthesis.c index 708206b0..029b1ad7 100644 --- a/src/audio/synthesis.c +++ b/src/audio/synthesis.c @@ -44,27 +44,29 @@ struct VolumeChange { u16 targetRight; }; +/* ----------------------------------------------------------REVERB PARAMETERS----------------------------------------------------------------- */ + s16 *lastSamplePtrL; s16 *lastSamplePtrR; -s32 gReverbRevIndex = 0x9A; -s32 gReverbGainIndex = 0xA6; -s32 gReverbWetSignal = 0xF3; -s32 gReverbDrySignal = 0x26; +s32 gReverbRevIndex = 0x9A; // Affects decay time mostly; can be messed with +s32 gReverbGainIndex = 0xA6; // Affects signal retransmitted back into buffers; can be messed with +s32 gReverbWetSignal = 0xF3; // Amount of reverb specific output in final signal; can be messed with +s32 gReverbDrySignal = 0x26; // Amount of original input in final signal (large values can cause terrible feedback!); can be messed with -const u32 delaysBaseline[NUM_ALLPASS] = { +u32 delays[NUM_ALLPASS] = { // These values affect reverb delays, bigger values result in fatter echo (and more memory); can be messed with, but must be cumulatively smaller than BETTER_REVERB_SIZE/8 1080, 1352, 1200, 1384, 1048, 1352, 1200, 1232, 1432, 928, 1504, 1512 }; -u32 delays[NUM_ALLPASS] = { +const u32 delaysBaseline[NUM_ALLPASS] = { // Like delays variable, but represent max values that never change (also probably somewhat redundant) 1080, 1352, 1200, 1384, 1048, 1352, 1200, 1232, 1432, 928, 1504, 1512 }; -const s32 reverbMults[2][NUM_ALLPASS / 3] = { +const s32 reverbMults[2][NUM_ALLPASS / 3] = { // These values affect reverb decay depending on the filter index; can be messed with {0xD2, 0x6E, 0x36, 0x1F}, {0x38, 0x26, 0xCF, 0x71} }; @@ -75,6 +77,11 @@ u32 allpassIdx[2][NUM_ALLPASS] = { s32 tmpBuf[NUM_ALLPASS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; s32 ***delayBufs; +u8 consoleBetterReverb = TRUE; +s8 betterReverbConsoleDownsample = 3; // Set this to 4 if game is running too slow; set this to -1 to vanilla reverb on console only + +/* --------------------------------------------------------END REVERB PARAMETERS--------------------------------------------------------------- */ + u64 *synthesis_do_one_audio_update(s16 *aiBuf, s32 bufLen, u64 *cmd, s32 updateIndex); #ifdef VERSION_EU u64 *synthesis_process_note(struct Note *note, struct NoteSubEu *noteSubEu, struct NoteSynthesisState *synthesisState, s16 *aiBuf, s32 bufLen, u64 *cmd); @@ -268,8 +275,11 @@ void prepare_reverb_ring_buffer(s32 chunkLen, u32 updateIndex) { s32 numSamplesAfterDownsampling; s32 excessiveSamples; -#ifndef BETTER_REVERB +#ifdef BETTER_REVERB + if (!consoleBetterReverb && gReverbDownsampleRate != 1) { +#else if (gReverbDownsampleRate != 1) { +#endif if (gSynthesisReverb.framesLeftToIgnore == 0) { // Now that the RSP has finished, downsample the samples produced two frames ago by skipping // samples. @@ -291,17 +301,19 @@ void prepare_reverb_ring_buffer(s32 chunkLen, u32 updateIndex) { } } } -#else - item = &gSynthesisReverb.items[gSynthesisReverb.curFrame][updateIndex]; - if (gReverbDownsampleRate != 1) { - for (srcPos = 0, dstPos = 0; dstPos < item->lengthA / 2; - srcPos += gReverbDownsampleRate, dstPos++) { - gSynthesisReverb.ringBuffer.left[dstPos + item->startPos] = reverb_sample_left(item->toDownsampleLeft[srcPos]); - gSynthesisReverb.ringBuffer.right[dstPos + item->startPos] = reverb_sample_right(item->toDownsampleRight[srcPos]); - } - for (dstPos = 0; dstPos < item->lengthB / 2; srcPos += gReverbDownsampleRate, dstPos++) { - gSynthesisReverb.ringBuffer.left[dstPos] = reverb_sample_left(item->toDownsampleLeft[srcPos]); - gSynthesisReverb.ringBuffer.right[dstPos] = reverb_sample_right(item->toDownsampleRight[srcPos]); +#ifdef BETTER_REVERB + if (consoleBetterReverb) { + item = &gSynthesisReverb.items[gSynthesisReverb.curFrame][updateIndex]; + if (gReverbDownsampleRate != 1) { + for (srcPos = 0, dstPos = item->startPos; dstPos < item->lengthA / 2 + item->startPos; + srcPos += gReverbDownsampleRate, dstPos++) { + gSynthesisReverb.ringBuffer.left[dstPos] = reverb_sample_left(item->toDownsampleLeft[srcPos]); + gSynthesisReverb.ringBuffer.right[dstPos] = reverb_sample_right(item->toDownsampleRight[srcPos]); + } + for (dstPos = 0; dstPos < item->lengthB / 2; srcPos += gReverbDownsampleRate, dstPos++) { + gSynthesisReverb.ringBuffer.left[dstPos] = reverb_sample_left(item->toDownsampleLeft[srcPos]); + gSynthesisReverb.ringBuffer.right[dstPos] = reverb_sample_right(item->toDownsampleRight[srcPos]); + } } } #endif diff --git a/src/audio/synthesis.h b/src/audio/synthesis.h index 48b9857e..f924d438 100644 --- a/src/audio/synthesis.h +++ b/src/audio/synthesis.h @@ -18,7 +18,7 @@ #endif #ifdef BETTER_REVERB -#define BETTER_REVERB_SIZE 0xF000 // Size of ~all delay values * 8 +#define BETTER_REVERB_SIZE 0xF000 // Size of all delaysBaseline values * 8 (plus array pointers) #else #define BETTER_REVERB_SIZE 0 #endif @@ -29,6 +29,9 @@ extern const u32 delaysBaseline[NUM_ALLPASS]; extern u32 delays[NUM_ALLPASS]; extern s32 ***delayBufs; +extern u8 consoleBetterReverb; +extern s8 betterReverbConsoleDownsample; + struct ReverbRingBufferItem { s16 numSamplesAfterDownsampling;