This commit is contained in:
Fazana
2021-09-11 17:57:32 +01:00
parent b9c43bb721
commit 3b1deb1941
8 changed files with 153 additions and 166 deletions

View File

@@ -56,69 +56,34 @@ struct AudioSessionSettingsEU gAudioSessionPresets[] = {
// - memory used for temporary sequences
// - memory used for temporary banks
#if defined(VERSION_JP) || defined(VERSION_US)
struct ReverbSettingsUS gReverbSettings[18] =
{
{1, 0x0C00, 0x2FFF},
{1, 0x0A00, 0x47FF},
{1, 0x1000, 0x2FFF},
{1, 0x0E00, 0x3FFF},
{1, 0x0C00, 0x4FFF},
{1, 0x0C00, 0x2FFF},
{1, 0x0A00, 0x47FF},
{1, 0x0800, 0x37FF},
{1, 0x0800, 0x2FFF},
{1, 0x0800, 0x3FFF},
{1, 0x1000, 0x3FFF},
{1, 0x1000, 0x2FFF},
{1, 0x0C00, 0x3FFF},
{1, 0x0800, 0x4FFF},
{1, 0x0800, 0x2FFF},
{1, 0x0800, 0x2FFF},
{1, 0x0800, 0x2FFF},
{1, 0x0800, 0x2FFF},
};
#ifdef EXPAND_AUDIO_HEAP
struct AudioSessionSettings gAudioSessionPresets[18] = {
#ifdef VERSION_JP
{ 32000, 32, 1, 0x0800, 0x2FFF, 0x7FFF, 0x7200, 0xC000, 0x8800, 0x5400 },
{ 32000, 32, 1, 0x0A00, 0x47FF, 0x7FFF, 0x7200, 0xC000, 0x8800, 0x5400 },
{ 32000, 32, 1, 0x1000, 0x2FFF, 0x7FFF, 0x7200, 0xC000, 0x8800, 0x5400 },
{ 32000, 32, 1, 0x0E00, 0x3FFF, 0x7FFF, 0x7200, 0xC000, 0x8800, 0x5400 },
{ 32000, 32, 1, 0x0C00, 0x4FFF, 0x7FFF, 0x7200, 0xC000, 0x8800, 0x5400 },
{ 32000, 32, 1, 0x0800, 0x2FFF, 0x7FFF, 0x7C00, 0xC400, 0x7E00, 0x5400 },
{ 32000, 32, 1, 0x0A00, 0x47FF, 0x7FFF, 0x7E00, 0xC400, 0x8800, 0x5500 },
{ 32000, 40, 1, 0x0800, 0x37FF, 0x7FFF, 0x6600, 0xAA00, 0x8000, 0x3600 },
#else
{ 32000, 32, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x7400, 0xDA00, 0x8800, 0x5400 },
{ 32000, 32, 1, 0x0A00, 0x47FF, 0x7FFF, 0x7400, 0xDA00, 0x8800, 0x5400 },
{ 32000, 32, 1, 0x1000, 0x2FFF, 0x7FFF, 0x7400, 0xDA00, 0x8800, 0x5400 },
{ 32000, 32, 1, 0x0E00, 0x3FFF, 0x7FFF, 0x7400, 0xDA00, 0x8800, 0x5400 },
{ 32000, 32, 1, 0x0C00, 0x4FFF, 0x7FFF, 0x7400, 0xDA00, 0x8800, 0x5400 },
{ 32000, 32, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x8000, 0xDC00, 0x7E00, 0x5400 },
{ 32000, 32, 1, 0x0A00, 0x47FF, 0x7FFF, 0x8200, 0xDC00, 0x8800, 0x5500 },
{ 32000, 40, 1, 0x0800, 0x37FF, 0x7FFF, 0x6980, 0xC500, 0x8000, 0x3600 },
#endif
{ 27000, 32, 1, 0x0800, 0x2FFF, 0x7FFF, 0x4A00, 0xAA00, 0xE800, 0x4800 },
{ 27000, 32, 1, 0x0800, 0x3FFF, 0x7FFF, 0x4A00, 0xAA00, 0xE800, 0x4800 },
{ 27000, 32, 1, 0x1000, 0x2FFF, 0x7FFF, 0x4A00, 0xAA00, 0xE800, 0x4800 },
{ 27000, 32, 1, 0x1000, 0x3FFF, 0x7FFF, 0x4A00, 0xAA00, 0xE800, 0x4800 },
{ 27000, 32, 1, 0x0C00, 0x4FFF, 0x7FFF, 0x4A00, 0xAA00, 0xE800, 0x4800 },
{ 32000, 28, 1, 0x0800, 0x2FFF, 0x7FFF, 0x4A00, 0xAA00, 0xE800, 0x4800 },
{ 32000, 24, 1, 0x0800, 0x2FFF, 0x7FFF, 0x4A00, 0xAA00, 0xE800, 0x4800 },
{ 32000, 20, 1, 0x0800, 0x2FFF, 0x7FFF, 0x4A00, 0xAA00, 0xE800, 0x4800 },
{ 32000, 16, 1, 0x0800, 0x2FFF, 0x7FFF, 0x4A00, 0xAA00, 0xE800, 0x4800 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
struct AudioSessionSettings gAudioSessionPresets[1] = {
{ 32000, 40, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x8000, 0xDC00, 0x8800, 0x5400 },
};
#else
struct AudioSessionSettings gAudioSessionPresets[18] = {
#ifdef VERSION_JP
{ 32000, 16, 1, 0x0800, 0x2FFF, 0x7FFF, 0x3900, 0x6000, 0x4400, 0x2A00 },
{ 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x3900, 0x6000, 0x4400, 0x2A00 },
{ 32000, 16, 1, 0x1000, 0x2FFF, 0x7FFF, 0x3900, 0x6000, 0x4400, 0x2A00 },
{ 32000, 16, 1, 0x0E00, 0x3FFF, 0x7FFF, 0x3900, 0x6000, 0x4400, 0x2A00 },
{ 32000, 16, 1, 0x0C00, 0x4FFF, 0x7FFF, 0x3900, 0x6000, 0x4400, 0x2A00 },
{ 32000, 16, 1, 0x0800, 0x2FFF, 0x7FFF, 0x3E00, 0x6200, 0x3F00, 0x2A00 },
{ 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x3F00, 0x6200, 0x4400, 0x2A80 },
{ 32000, 20, 1, 0x0800, 0x37FF, 0x7FFF, 0x3300, 0x5500, 0x4000, 0x1B00 },
#else
{ 32000, 16, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x3A00, 0x6D00, 0x4400, 0x2A00 },
{ 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x3A00, 0x6D00, 0x4400, 0x2A00 },
{ 32000, 16, 1, 0x1000, 0x2FFF, 0x7FFF, 0x3A00, 0x6D00, 0x4400, 0x2A00 },
{ 32000, 16, 1, 0x0E00, 0x3FFF, 0x7FFF, 0x3A00, 0x6D00, 0x4400, 0x2A00 },
{ 32000, 16, 1, 0x0C00, 0x4FFF, 0x7FFF, 0x3A00, 0x6D00, 0x4400, 0x2A00 },
{ 32000, 16, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x4000, 0x6E00, 0x3F00, 0x2A00 },
{ 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x4100, 0x6E00, 0x4400, 0x2A80 },
{ 32000, 20, 1, 0x0800, 0x37FF, 0x7FFF, 0x34C0, 0x6280, 0x4000, 0x1B00 },
#endif
{ 27000, 16, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 },
{ 27000, 16, 1, 0x0800, 0x3FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 },
{ 27000, 16, 1, 0x1000, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 },
{ 27000, 16, 1, 0x1000, 0x3FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 },
{ 27000, 16, 1, 0x0C00, 0x4FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 },
{ 32000, 14, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 },
{ 32000, 12, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 },
{ 32000, 10, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 },
{ 32000, 8, 1, 0x0800, 0x2FFF, 0x7FFF, 0x2500, 0x5500, 0x7400, 0x2400 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
struct AudioSessionSettings gAudioSessionPresets[1] = {
{ 32000, 20, 1, 0x0800, 0x2FFF, 0x7FFF, 0x4000, 0x6E00, 0x7400, 0x2A80 },
};
#endif
#endif

View File

@@ -18,7 +18,8 @@
extern struct AudioSessionSettingsEU gAudioSessionPresets[];
extern struct ReverbSettingsEU sReverbSettings[8];
#else
extern struct AudioSessionSettings gAudioSessionPresets[18];
extern struct AudioSessionSettings gAudioSessionPresets[1];
extern struct ReverbSettingsUS gReverbSettings[18];
#endif
extern u16 D_80332388[128]; // unused

View File

@@ -2682,7 +2682,7 @@ void sound_reset(u8 presetId) {
func_802ad74c(0xF2000000, 0);
#endif
#if defined(VERSION_JP) || defined(VERSION_US)
audio_reset_session(&gAudioSessionPresets[presetId]);
audio_reset_session(&gAudioSessionPresets[0], presetId);
#else
audio_reset_session_eu(presetId);
#endif

View File

@@ -1127,11 +1127,123 @@ void init_reverb_eu(void)
}
}
}
#else
void init_reverb_us(s32 presetId)
{
s32 reverbWindowSize;
s16 *mem;
s32 i;
#ifdef BETTER_REVERB
s8 reverbConsole;
#endif
reverbWindowSize = gReverbSettings[presetId].windowSize;
gReverbDownsampleRate = gReverbSettings[presetId].downsampleRate;
#if defined(BETTER_REVERB) && (defined(VERSION_US) || defined(VERSION_JP))
if (gIsConsole)
reverbConsole = betterReverbDownsampleConsole; // Console!
else
reverbConsole = betterReverbDownsampleEmulator; // Setting this to 1 is REALLY slow, please use sparingly!
if (reverbConsole <= 0) {
reverbConsole = 1;
toggleBetterReverb = FALSE;
}
else {
toggleBetterReverb = TRUE;
}
if (toggleBetterReverb && betterReverbWindowsSize >= 0)
reverbWindowSize = betterReverbWindowsSize;
if (gReverbDownsampleRate < (1 << (reverbConsole - 1)))
gReverbDownsampleRate = (1 << (reverbConsole - 1));
reverbWindowSize /= gReverbDownsampleRate;
if (reverbWindowSize < DEFAULT_LEN_2CH) // Minimum window size to not overflow
reverbWindowSize = DEFAULT_LEN_2CH;
#endif
switch (gReverbDownsampleRate) {
case 1:
sReverbDownsampleRateLog = 0;
break;
case 2:
sReverbDownsampleRateLog = 1;
break;
case 4:
sReverbDownsampleRateLog = 2;
break;
case 8:
sReverbDownsampleRateLog = 3;
break;
case 16:
sReverbDownsampleRateLog = 4;
break;
default:
sReverbDownsampleRateLog = 0;
}
if (reverbWindowSize == 0) {
gSynthesisReverb.useReverb = 0;
} else {
gSynthesisReverb.useReverb = 8;
if (!sAudioFirstBoot)
{
gSynthesisReverb.ringBuffer.left = soundAlloc(&gNotesAndBuffersPool, reverbWindowSize * 2);
gSynthesisReverb.ringBuffer.right = soundAlloc(&gNotesAndBuffersPool, reverbWindowSize * 2);
}
gSynthesisReverb.nextRingBufferPos = 0;
gSynthesisReverb.unkC = 0;
gSynthesisReverb.curFrame = 0;
gSynthesisReverb.bufSizePerChannel = reverbWindowSize;
gSynthesisReverb.reverbGain = gReverbSettings[presetId].gain;
gSynthesisReverb.framesLeftToIgnore = 2;
if (!sAudioFirstBoot)
{
if (gReverbDownsampleRate != 1) {
gSynthesisReverb.resampleFlags = A_INIT;
gSynthesisReverb.resampleRate = 0x8000 / gReverbDownsampleRate;
gSynthesisReverb.resampleStateLeft = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
gSynthesisReverb.resampleStateRight = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
gSynthesisReverb.unk24 = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
gSynthesisReverb.unk28 = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
for (i = 0; i < gAudioUpdatesPerFrame; i++) {
mem = soundAlloc(&gNotesAndBuffersPool, DEFAULT_LEN_2CH);
gSynthesisReverb.items[0][i].toDownsampleLeft = mem;
gSynthesisReverb.items[0][i].toDownsampleRight = mem + DEFAULT_LEN_1CH / sizeof(s16);
mem = soundAlloc(&gNotesAndBuffersPool, DEFAULT_LEN_2CH);
gSynthesisReverb.items[1][i].toDownsampleLeft = mem;
gSynthesisReverb.items[1][i].toDownsampleRight = mem + DEFAULT_LEN_1CH / sizeof(s16);
}
}
}
// This does not have to be reset after being initialized for the first time, which would speed up load times dramatically.
// However, reseting this allows for proper clearing of the reverb buffers, as well as dynamic customization of the delays array.
#if defined(BETTER_REVERB) && (defined(VERSION_US) || defined(VERSION_JP))
if (toggleBetterReverb) {
for (i = 0; i < NUM_ALLPASS; ++i) {
delaysL[i] = delaysBaselineL[i] / gReverbDownsampleRate;
delaysR[i] = delaysBaselineR[i] / gReverbDownsampleRate;
}
if (sAudioFirstBoot)
return;
delayBufsL = (s32**) soundAlloc(&gAudioSessionPool, NUM_ALLPASS * sizeof(s32*));
delayBufsR = (s32**) soundAlloc(&gAudioSessionPool, NUM_ALLPASS * sizeof(s32*));
for (i = 0; i < NUM_ALLPASS; ++i) {
delayBufsL[i] = (s32*) soundAlloc(&gAudioSessionPool, delaysL[i] * sizeof(s32));
delayBufsR[i] = (s32*) soundAlloc(&gAudioSessionPool, delaysR[i] * sizeof(s32));
}
}
#endif
}
}
#endif
#if defined(VERSION_JP) || defined(VERSION_US)
void audio_reset_session(struct AudioSessionSettings *preset) {
void audio_reset_session(struct AudioSessionSettings *preset, s32 presetId) {
if (sAudioFirstBoot)
{
gAudioSessionPool.cur = gAudioSessionPool.start;
@@ -1145,6 +1257,7 @@ void audio_reset_session(struct AudioSessionSettings *preset) {
temporary_pool_clear(&gBankLoadedPool.temporary);
temporary_pool_clear(&gUnusedLoadedPool.temporary);
init_reverb_us(presetId);
return;
}
#else
@@ -1170,9 +1283,7 @@ void audio_reset_session(void) {
#endif
#if defined(VERSION_JP) || defined(VERSION_US)
s8 updatesPerFrame;
s32 reverbWindowSize;
s32 k;
s16 *mem;
s32 i;
#endif
#ifdef PUPPYPRINT
@@ -1186,9 +1297,6 @@ void audio_reset_session(void) {
#if defined(VERSION_JP) || defined(VERSION_US)
s32 frames;
s32 remainingDmas;
#ifdef BETTER_REVERB
s8 reverbConsole;
#endif
#endif
#ifdef VERSION_EU
eu_stubbed_printf_1("Heap Reconstruct Start %x\n", gAudioResetPresetIdToLoad);
@@ -1294,54 +1402,9 @@ void audio_reset_session(void) {
gMaxAudioCmds = gMaxSimultaneousNotes * 0x10 * gAudioBufferParameters.updatesPerFrame + preset->numReverbs * 0x20 + 0x300;
#endif
#else
reverbWindowSize = preset->reverbWindowSize;
gAiFrequency = osAiSetFrequency(preset->frequency);
gMaxSimultaneousNotes = preset->maxSimultaneousNotes;
gSamplesPerFrameTarget = ALIGN16(gAiFrequency / 60);
gReverbDownsampleRate = preset->reverbDownsampleRate;
#if defined(BETTER_REVERB) && (defined(VERSION_US) || defined(VERSION_JP))
if (gIsConsole)
reverbConsole = betterReverbDownsampleConsole; // Console!
else
reverbConsole = betterReverbDownsampleEmulator; // Setting this to 1 is REALLY slow, please use sparingly!
if (reverbConsole <= 0) {
reverbConsole = 1;
toggleBetterReverb = FALSE;
}
else {
toggleBetterReverb = TRUE;
}
if (toggleBetterReverb && betterReverbWindowsSize >= 0)
reverbWindowSize = betterReverbWindowsSize;
if (gReverbDownsampleRate < (1 << (reverbConsole - 1)))
gReverbDownsampleRate = (1 << (reverbConsole - 1));
reverbWindowSize /= gReverbDownsampleRate;
if (reverbWindowSize < DEFAULT_LEN_2CH) // Minimum window size to not overflow
reverbWindowSize = DEFAULT_LEN_2CH;
#endif
switch (gReverbDownsampleRate) {
case 1:
sReverbDownsampleRateLog = 0;
break;
case 2:
sReverbDownsampleRateLog = 1;
break;
case 4:
sReverbDownsampleRateLog = 2;
break;
case 8:
sReverbDownsampleRateLog = 3;
break;
case 16:
sReverbDownsampleRateLog = 4;
break;
default:
sReverbDownsampleRateLog = 0;
}
gVolume = preset->volume;
gMinAiBufferLength = gSamplesPerFrameTarget - 0x10;
@@ -1416,56 +1479,8 @@ void audio_reset_session(void) {
}
init_reverb_eu();
#else
if (reverbWindowSize == 0) {
gSynthesisReverb.useReverb = 0;
} else {
gSynthesisReverb.useReverb = 8;
gSynthesisReverb.ringBuffer.left = soundAlloc(&gNotesAndBuffersPool, reverbWindowSize * 2);
gSynthesisReverb.ringBuffer.right = soundAlloc(&gNotesAndBuffersPool, reverbWindowSize * 2);
gSynthesisReverb.nextRingBufferPos = 0;
gSynthesisReverb.unkC = 0;
gSynthesisReverb.curFrame = 0;
gSynthesisReverb.bufSizePerChannel = reverbWindowSize;
gSynthesisReverb.reverbGain = preset->reverbGain;
gSynthesisReverb.framesLeftToIgnore = 2;
if (gReverbDownsampleRate != 1) {
gSynthesisReverb.resampleFlags = A_INIT;
gSynthesisReverb.resampleRate = 0x8000 / gReverbDownsampleRate;
gSynthesisReverb.resampleStateLeft = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
gSynthesisReverb.resampleStateRight = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
gSynthesisReverb.unk24 = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
gSynthesisReverb.unk28 = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
for (i = 0; i < gAudioUpdatesPerFrame; i++) {
mem = soundAlloc(&gNotesAndBuffersPool, DEFAULT_LEN_2CH);
gSynthesisReverb.items[0][i].toDownsampleLeft = mem;
gSynthesisReverb.items[0][i].toDownsampleRight = mem + DEFAULT_LEN_1CH / sizeof(s16);
mem = soundAlloc(&gNotesAndBuffersPool, DEFAULT_LEN_2CH);
gSynthesisReverb.items[1][i].toDownsampleLeft = mem;
gSynthesisReverb.items[1][i].toDownsampleRight = mem + DEFAULT_LEN_1CH / sizeof(s16);
}
}
// This does not have to be reset after being initialized for the first time, which would speed up load times dramatically.
// However, reseting this allows for proper clearing of the reverb buffers, as well as dynamic customization of the delays array.
#if defined(BETTER_REVERB) && (defined(VERSION_US) || defined(VERSION_JP))
if (toggleBetterReverb) {
for (i = 0; i < NUM_ALLPASS; ++i) {
delaysL[i] = delaysBaselineL[i] / gReverbDownsampleRate;
delaysR[i] = delaysBaselineR[i] / gReverbDownsampleRate;
}
delayBufsL = (s32**) soundAlloc(&gAudioSessionPool, NUM_ALLPASS * sizeof(s32*));
delayBufsR = (s32**) soundAlloc(&gAudioSessionPool, NUM_ALLPASS * sizeof(s32*));
for (i = 0; i < NUM_ALLPASS; ++i) {
delayBufsL[i] = (s32*) soundAlloc(&gAudioSessionPool, delaysL[i] * sizeof(s32));
delayBufsR[i] = (s32*) soundAlloc(&gAudioSessionPool, delaysR[i] * sizeof(s32));
}
}
#endif
}
#endif
init_reverb_us(presetId);
init_sample_dma_buffers(gMaxSimultaneousNotes);

View File

@@ -129,7 +129,7 @@ void *get_bank_or_seq(struct SoundMultiPool *arg0, s32 arg1, s32 id);
s32 audio_shut_down_and_reset_step(void);
void audio_reset_session(void);
#else
void audio_reset_session(struct AudioSessionSettings *preset);
void audio_reset_session(struct AudioSessionSettings *preset, s32 presetId);
#endif
void discard_bank(s32 bankId);

View File

@@ -758,6 +758,12 @@ struct ReverbSettingsEU
u16 gain;
};
#else
struct ReverbSettingsUS
{
u8 downsampleRate;
u16 windowSize;
u16 gain;
};
struct ReverbSettingsEU
{
u8 downsampleRate; // always 1

View File

@@ -1051,7 +1051,7 @@ void audio_init() {
gAudioResetStatus = 1;
audio_shut_down_and_reset_step();
#else
audio_reset_session(&gAudioSessionPresets[0]);
audio_reset_session(&gAudioSessionPresets[0], 0);
#endif
// Not sure about these prints

View File

@@ -795,8 +795,8 @@ void thread5_game_loop(UNUSED void *arg) {
if (gPlayer1Controller->buttonPressed & L_TRIG)
{
*(volatile int*) 0 = 0;
//set_background_music(SEQ_LEVEL_SLIDE, SEQUENCE_ARGS(0xFF, SEQ_LEVEL_SLIDE), 30);
//*(volatile int*) 0 = 0;
set_background_music(SEQ_MENU_FILE_SELECT, SEQUENCE_ARGS(0xFF, SEQ_MENU_FILE_SELECT), 30);
}
if (gPlayer1Controller->buttonPressed & R_TRIG)
{