aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Audio/Renderer/Dsp/Command
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-09-29 07:48:49 -0300
committerGitHub <noreply@github.com>2023-09-29 10:48:49 +0000
commit41b104d0fbf1e8cf280ab594f1316d815afdd1d6 (patch)
tree0cbcd43f4543b20a2b0f3064799140c32c3488c1 /src/Ryujinx.Audio/Renderer/Dsp/Command
parentbc44b85b0bdcaf8140a04130e4a895677a01111f (diff)
Fix audio renderer compressor effect (#5742)1.1.1036
* Delete DecibelToLinearExtended and fix Log10 function * Fix CopyBuffer and ClearBuffer * Change effect states from class to struct + formatting * Formatting * Make UpdateLowPassFilter readonly * More compressor fixes
Diffstat (limited to 'src/Ryujinx.Audio/Renderer/Dsp/Command')
-rw-r--r--src/Ryujinx.Audio/Renderer/Dsp/Command/AuxiliaryBufferCommand.cs15
-rw-r--r--src/Ryujinx.Audio/Renderer/Dsp/Command/BiquadFilterCommand.cs9
-rw-r--r--src/Ryujinx.Audio/Renderer/Dsp/Command/CommandList.cs4
-rw-r--r--src/Ryujinx.Audio/Renderer/Dsp/Command/CompressorCommand.cs12
-rw-r--r--src/Ryujinx.Audio/Renderer/Dsp/Command/DelayCommand.cs18
-rw-r--r--src/Ryujinx.Audio/Renderer/Dsp/Command/LimiterCommandVersion2.cs9
-rw-r--r--src/Ryujinx.Audio/Renderer/Dsp/Command/ReverbCommand.cs68
7 files changed, 81 insertions, 54 deletions
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/AuxiliaryBufferCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/AuxiliaryBufferCommand.cs
index 7ed32800..73d66dcf 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/AuxiliaryBufferCommand.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/AuxiliaryBufferCommand.cs
@@ -31,9 +31,18 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
public bool IsEffectEnabled { get; }
- public AuxiliaryBufferCommand(uint bufferOffset, byte inputBufferOffset, byte outputBufferOffset,
- ref AuxiliaryBufferAddresses sendBufferInfo, bool isEnabled, uint countMax,
- CpuAddress outputBuffer, CpuAddress inputBuffer, uint updateCount, uint writeOffset, int nodeId)
+ public AuxiliaryBufferCommand(
+ uint bufferOffset,
+ byte inputBufferOffset,
+ byte outputBufferOffset,
+ ref AuxiliaryBufferAddresses sendBufferInfo,
+ bool isEnabled,
+ uint countMax,
+ CpuAddress outputBuffer,
+ CpuAddress inputBuffer,
+ uint updateCount,
+ uint writeOffset,
+ int nodeId)
{
Enabled = true;
NodeId = nodeId;
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/BiquadFilterCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/BiquadFilterCommand.cs
index f56dd70e..ac1e581f 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/BiquadFilterCommand.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/BiquadFilterCommand.cs
@@ -21,7 +21,14 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
private BiquadFilterParameter _parameter;
- public BiquadFilterCommand(int baseIndex, ref BiquadFilterParameter filter, Memory<BiquadFilterState> biquadFilterStateMemory, int inputBufferOffset, int outputBufferOffset, bool needInitialization, int nodeId)
+ public BiquadFilterCommand(
+ int baseIndex,
+ ref BiquadFilterParameter filter,
+ Memory<BiquadFilterState> biquadFilterStateMemory,
+ int inputBufferOffset,
+ int outputBufferOffset,
+ bool needInitialization,
+ int nodeId)
{
_parameter = filter;
BiquadFilterState = biquadFilterStateMemory;
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandList.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandList.cs
index 19a9576f..3fe106dd 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandList.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandList.cs
@@ -77,7 +77,7 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public unsafe void ClearBuffer(int index)
{
- Unsafe.InitBlock((void*)GetBufferPointer(index), 0, SampleCount);
+ Unsafe.InitBlock((void*)GetBufferPointer(index), 0, SampleCount * sizeof(float));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -89,7 +89,7 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public unsafe void CopyBuffer(int outputBufferIndex, int inputBufferIndex)
{
- Unsafe.CopyBlock((void*)GetBufferPointer(outputBufferIndex), (void*)GetBufferPointer(inputBufferIndex), SampleCount);
+ Unsafe.CopyBlock((void*)GetBufferPointer(outputBufferIndex), (void*)GetBufferPointer(inputBufferIndex), SampleCount * sizeof(float));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/CompressorCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/CompressorCommand.cs
index 01291852..1d5917bb 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/CompressorCommand.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/CompressorCommand.cs
@@ -94,18 +94,18 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
float newMean = inputMovingAverage.Update(FloatingPointHelper.MeanSquare(channelInput), _parameter.InputGain);
float y = FloatingPointHelper.Log10(newMean) * 10.0f;
- float z = 0.0f;
+ float z = 1.0f;
- bool unknown10OutOfRange = false;
+ bool unknown10OutOfRange = y >= state.Unknown10;
if (newMean < 1.0e-10f)
{
- z = 1.0f;
+ y = -100.0f;
- unknown10OutOfRange = state.Unknown10 < -100.0f;
+ unknown10OutOfRange = state.Unknown10 <= -100.0f;
}
- if (y >= state.Unknown10 || unknown10OutOfRange)
+ if (unknown10OutOfRange)
{
float tmpGain;
@@ -118,7 +118,7 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
tmpGain = (y - state.Unknown10) * ((y - state.Unknown10) * -state.CompressorGainReduction);
}
- z = FloatingPointHelper.DecibelToLinearExtended(tmpGain);
+ z = FloatingPointHelper.DecibelToLinear(tmpGain);
}
float unknown4New = z;
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/DelayCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/DelayCommand.cs
index 003806cf..6fa3777f 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/DelayCommand.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/DelayCommand.cs
@@ -88,7 +88,7 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
float outGain = FixedPointHelper.ToFloat(Parameter.OutGain, FixedPointPrecision);
Matrix2x2 delayFeedback = new(delayFeedbackBaseGain, delayFeedbackCrossGain,
- delayFeedbackCrossGain, delayFeedbackBaseGain);
+ delayFeedbackCrossGain, delayFeedbackBaseGain);
for (int i = 0; i < sampleCount; i++)
{
@@ -125,9 +125,9 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
float outGain = FixedPointHelper.ToFloat(Parameter.OutGain, FixedPointPrecision);
Matrix4x4 delayFeedback = new(delayFeedbackBaseGain, delayFeedbackCrossGain, delayFeedbackCrossGain, 0.0f,
- delayFeedbackCrossGain, delayFeedbackBaseGain, 0.0f, delayFeedbackCrossGain,
- delayFeedbackCrossGain, 0.0f, delayFeedbackBaseGain, delayFeedbackCrossGain,
- 0.0f, delayFeedbackCrossGain, delayFeedbackCrossGain, delayFeedbackBaseGain);
+ delayFeedbackCrossGain, delayFeedbackBaseGain, 0.0f, delayFeedbackCrossGain,
+ delayFeedbackCrossGain, 0.0f, delayFeedbackBaseGain, delayFeedbackCrossGain,
+ 0.0f, delayFeedbackCrossGain, delayFeedbackCrossGain, delayFeedbackBaseGain);
for (int i = 0; i < sampleCount; i++)
@@ -172,11 +172,11 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
float outGain = FixedPointHelper.ToFloat(Parameter.OutGain, FixedPointPrecision);
Matrix6x6 delayFeedback = new(delayFeedbackBaseGain, 0.0f, delayFeedbackCrossGain, 0.0f, delayFeedbackCrossGain, 0.0f,
- 0.0f, delayFeedbackBaseGain, delayFeedbackCrossGain, 0.0f, 0.0f, delayFeedbackCrossGain,
- delayFeedbackCrossGain, delayFeedbackCrossGain, delayFeedbackBaseGain, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, feedbackGain, 0.0f, 0.0f,
- delayFeedbackCrossGain, 0.0f, 0.0f, 0.0f, delayFeedbackBaseGain, delayFeedbackCrossGain,
- 0.0f, delayFeedbackCrossGain, 0.0f, 0.0f, delayFeedbackCrossGain, delayFeedbackBaseGain);
+ 0.0f, delayFeedbackBaseGain, delayFeedbackCrossGain, 0.0f, 0.0f, delayFeedbackCrossGain,
+ delayFeedbackCrossGain, delayFeedbackCrossGain, delayFeedbackBaseGain, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, feedbackGain, 0.0f, 0.0f,
+ delayFeedbackCrossGain, 0.0f, 0.0f, 0.0f, delayFeedbackBaseGain, delayFeedbackCrossGain,
+ 0.0f, delayFeedbackCrossGain, 0.0f, 0.0f, delayFeedbackCrossGain, delayFeedbackBaseGain);
for (int i = 0; i < sampleCount; i++)
{
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/LimiterCommandVersion2.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/LimiterCommandVersion2.cs
index 68209867..f6e1654d 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/LimiterCommandVersion2.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/LimiterCommandVersion2.cs
@@ -28,7 +28,14 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
private LimiterParameter _parameter;
- public LimiterCommandVersion2(uint bufferOffset, LimiterParameter parameter, Memory<LimiterState> state, Memory<EffectResultState> resultState, bool isEnabled, ulong workBuffer, int nodeId)
+ public LimiterCommandVersion2(
+ uint bufferOffset,
+ LimiterParameter parameter,
+ Memory<LimiterState> state,
+ Memory<EffectResultState> resultState,
+ bool isEnabled,
+ ulong workBuffer,
+ int nodeId)
{
Enabled = true;
NodeId = nodeId;
diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/ReverbCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/ReverbCommand.cs
index f494b302..874eb8e8 100644
--- a/src/Ryujinx.Audio/Renderer/Dsp/Command/ReverbCommand.cs
+++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/ReverbCommand.cs
@@ -79,53 +79,57 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ProcessReverbMono(ref ReverbState state, ReadOnlySpan<IntPtr> outputBuffers, ReadOnlySpan<IntPtr> inputBuffers, uint sampleCount)
{
- ProcessReverbGeneric(ref state,
- outputBuffers,
- inputBuffers,
- sampleCount,
- _outputEarlyIndicesTableMono,
- _targetEarlyDelayLineIndicesTableMono,
- _targetOutputFeedbackIndicesTableMono,
- _outputIndicesTableMono);
+ ProcessReverbGeneric(
+ ref state,
+ outputBuffers,
+ inputBuffers,
+ sampleCount,
+ _outputEarlyIndicesTableMono,
+ _targetEarlyDelayLineIndicesTableMono,
+ _targetOutputFeedbackIndicesTableMono,
+ _outputIndicesTableMono);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ProcessReverbStereo(ref ReverbState state, ReadOnlySpan<IntPtr> outputBuffers, ReadOnlySpan<IntPtr> inputBuffers, uint sampleCount)
{
- ProcessReverbGeneric(ref state,
- outputBuffers,
- inputBuffers,
- sampleCount,
- _outputEarlyIndicesTableStereo,
- _targetEarlyDelayLineIndicesTableStereo,
- _targetOutputFeedbackIndicesTableStereo,
- _outputIndicesTableStereo);
+ ProcessReverbGeneric(
+ ref state,
+ outputBuffers,
+ inputBuffers,
+ sampleCount,
+ _outputEarlyIndicesTableStereo,
+ _targetEarlyDelayLineIndicesTableStereo,
+ _targetOutputFeedbackIndicesTableStereo,
+ _outputIndicesTableStereo);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ProcessReverbQuadraphonic(ref ReverbState state, ReadOnlySpan<IntPtr> outputBuffers, ReadOnlySpan<IntPtr> inputBuffers, uint sampleCount)
{
- ProcessReverbGeneric(ref state,
- outputBuffers,
- inputBuffers,
- sampleCount,
- _outputEarlyIndicesTableQuadraphonic,
- _targetEarlyDelayLineIndicesTableQuadraphonic,
- _targetOutputFeedbackIndicesTableQuadraphonic,
- _outputIndicesTableQuadraphonic);
+ ProcessReverbGeneric(
+ ref state,
+ outputBuffers,
+ inputBuffers,
+ sampleCount,
+ _outputEarlyIndicesTableQuadraphonic,
+ _targetEarlyDelayLineIndicesTableQuadraphonic,
+ _targetOutputFeedbackIndicesTableQuadraphonic,
+ _outputIndicesTableQuadraphonic);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ProcessReverbSurround(ref ReverbState state, ReadOnlySpan<IntPtr> outputBuffers, ReadOnlySpan<IntPtr> inputBuffers, uint sampleCount)
{
- ProcessReverbGeneric(ref state,
- outputBuffers,
- inputBuffers,
- sampleCount,
- _outputEarlyIndicesTableSurround,
- _targetEarlyDelayLineIndicesTableSurround,
- _targetOutputFeedbackIndicesTableSurround,
- _outputIndicesTableSurround);
+ ProcessReverbGeneric(
+ ref state,
+ outputBuffers,
+ inputBuffers,
+ sampleCount,
+ _outputEarlyIndicesTableSurround,
+ _targetEarlyDelayLineIndicesTableSurround,
+ _targetOutputFeedbackIndicesTableSurround,
+ _outputIndicesTableSurround);
}
private unsafe void ProcessReverbGeneric(ref ReverbState state, ReadOnlySpan<IntPtr> outputBuffers, ReadOnlySpan<IntPtr> inputBuffers, uint sampleCount, ReadOnlySpan<int> outputEarlyIndicesTable, ReadOnlySpan<int> targetEarlyDelayLineIndicesTable, ReadOnlySpan<int> targetOutputFeedbackIndicesTable, ReadOnlySpan<int> outputIndicesTable)