diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp index 57032a774e..cb34c2532d 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp @@ -405,7 +405,7 @@ void CUCode_AX::ProcessPBList(u32 pb_addr) { ApplyUpdatesForMs(pb, curr_ms); - Process1ms(pb, buffers, ConvertMixerControl(pb.mixer_control)); + ProcessVoice(pb, buffers, ConvertMixerControl(pb.mixer_control)); // Forward the buffers for (u32 i = 0; i < sizeof (buffers.ptrs) / sizeof (buffers.ptrs[0]); ++i) diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp index 8aec99d700..1b1097c7fe 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp @@ -212,8 +212,6 @@ AXMixControl CUCode_AXWii::ConvertMixerControl(u32 mixer_control) void CUCode_AXWii::ProcessPBList(u32 pb_addr) { - const u32 spms = 32; - AXPBWii pb; while (pb_addr) @@ -236,14 +234,7 @@ void CUCode_AXWii::ProcessPBList(u32 pb_addr) if (!ReadPB(pb_addr, pb)) break; - for (int curr_ms = 0; curr_ms < 3; ++curr_ms) - { - Process1ms(pb, buffers, ConvertMixerControl(HILO_TO_32(pb.mixer_control))); - - // Forward the buffers - for (u32 i = 0; i < sizeof (buffers.ptrs) / sizeof (buffers.ptrs[0]); ++i) - buffers.ptrs[i] += spms; - } + ProcessVoice(pb, buffers, ConvertMixerControl(HILO_TO_32(pb.mixer_control))); WritePB(pb_addr, pb); pb_addr = HILO_TO_32(pb.next_pb); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX_Voice.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX_Voice.h index 15261b6184..578330ba34 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX_Voice.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX_Voice.h @@ -32,8 +32,12 @@ #ifdef AX_GC # define PB_TYPE AXPB +# define MS_PER_FRAME 1 +# define SAMPLES_PER_FRAME 32 #else # define PB_TYPE AXPBWii +# define MS_PER_FRAME 3 +# define SAMPLES_PER_FRAME 96 #endif // Put all of that in an anonymous namespace to avoid stupid compilers merging @@ -232,7 +236,8 @@ u16 AcceleratorGetSample() return ret; } -// Read 32 input samples from ARAM, decoding and converting rate if required. +// Read SAMPLES_PER_FRAME input samples from ARAM, decoding and converting rate +// if required. void GetInputSamples(PB_TYPE& pb, s16* samples) { u32 cur_addr = HILO_TO_32(pb.audio_addr.cur_addr); @@ -260,7 +265,7 @@ void GetInputSamples(PB_TYPE& pb, s16* samples) s16 curr0 = pb.src.last_samples[2]; s16 curr1 = pb.src.last_samples[3]; - for (u32 i = 0; i < 32; ++i) + for (u32 i = 0; i < SAMPLES_PER_FRAME; ++i) { // Get our current fractional position, used to know how much of // curr0 and how much of curr1 the output sample should be. @@ -290,12 +295,12 @@ void GetInputSamples(PB_TYPE& pb, s16* samples) } else // SRCTYPE_NEAREST { - // No sample rate conversion here: simply read 32 samples from the + // No sample rate conversion here: simply read samples from the // accelerator to the output buffer. - for (u32 i = 0; i < 32; ++i) + for (u32 i = 0; i < SAMPLES_PER_FRAME; ++i) samples[i] = AcceleratorGetSample(); - memcpy(pb.src.last_samples, samples + 28, 4 * sizeof (u16)); + memcpy(pb.src.last_samples, samples + SAMPLES_PER_FRAME - 4, 4 * sizeof (u16)); } // Update current position in the PB. @@ -315,7 +320,7 @@ void MixAdd(int* out, const s16* input, u16* pvol, s16* dpop, bool ramp) if (!ramp) volume_delta = 0; - for (u32 i = 0; i < 32; ++i) + for (u32 i = 0; i < SAMPLES_PER_FRAME; ++i) { s64 sample = input[i]; sample *= volume; @@ -328,19 +333,20 @@ void MixAdd(int* out, const s16* input, u16* pvol, s16* dpop, bool ramp) } } -// Process 1ms of audio (32 samples) from a PB and mix it to the buffers. -void Process1ms(PB_TYPE& pb, const AXBuffers& buffers, AXMixControl mctrl) +// Process 1ms of audio (for AX GC) or 3ms of audio (for AX Wii) from a PB and +// mix it to the output buffers. +void ProcessVoice(PB_TYPE& pb, const AXBuffers& buffers, AXMixControl mctrl) { // If the voice is not running, nothing to do. if (!pb.running) return; // Read input samples, performing sample rate conversion if needed. - s16 samples[32]; + s16 samples[SAMPLES_PER_FRAME]; GetInputSamples(pb, samples); // Apply a global volume ramp using the volume envelope parameters. - for (u32 i = 0; i < 32; ++i) + for (u32 i = 0; i < SAMPLES_PER_FRAME; ++i) { s64 sample = 2 * (s16)samples[i] * (s16)pb.vol_env.cur_volume; samples[i] = (s16)(sample >> 16);