Console exclusive stuffs

This commit is contained in:
gheskett
2021-08-03 02:55:48 -05:00
parent 578415b19e
commit be7418c907
3 changed files with 56 additions and 30 deletions

View File

@@ -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
}

View File

@@ -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

View File

@@ -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;