aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Audio.Renderer/Dsp/Effect
diff options
context:
space:
mode:
authorMary <me@thog.eu>2021-02-26 01:11:56 +0100
committerGitHub <noreply@github.com>2021-02-26 01:11:56 +0100
commitf556c80d0230056335632b60c71f1567e177239e (patch)
tree748aa6be62b93a8e941e25dbd83f39e1dbb37035 /Ryujinx.Audio.Renderer/Dsp/Effect
parent1c49089ff00fc87dc4872f135dc6a0d36169a970 (diff)
Haydn: Part 1 (#2007)
* Haydn: Part 1 Based on my reverse of audio 11.0.0. As always, core implementation under LGPLv3 for the same reasons as for Amadeus. This place the bases of a more flexible audio system while making audout & audin accurate. This have the following improvements: - Complete reimplementation of audout and audin. - Audin currently only have a dummy backend. - Dramatically reduce CPU usage by up to 50% in common cases (SoundIO and OpenAL). - Audio Renderer now can output to 5.1 devices when supported. - Audio Renderer init its backend on demand instead of keeping two up all the time. - All backends implementation are now in their own project. - Ryujinx.Audio.Renderer was renamed Ryujinx.Audio and was refactored because of this. As a note, games having issues with OpenAL haven't improved and will not because of OpenAL design (stopping when buffers finish playing causing possible audio "pops" when buffers are very small). * Update for latest hexkyz's edits on Switchbrew * audren: Rollback channel configuration changes * Address gdkchan's comments * Fix typo in OpenAL backend driver * Address last comments * Fix a nit * Address gdkchan's comments
Diffstat (limited to 'Ryujinx.Audio.Renderer/Dsp/Effect')
-rw-r--r--Ryujinx.Audio.Renderer/Dsp/Effect/DecayDelay.cs69
-rw-r--r--Ryujinx.Audio.Renderer/Dsp/Effect/DelayLine.cs95
-rw-r--r--Ryujinx.Audio.Renderer/Dsp/Effect/DelayLineReverb3d.cs93
-rw-r--r--Ryujinx.Audio.Renderer/Dsp/Effect/IDelayLine.cs53
4 files changed, 0 insertions, 310 deletions
diff --git a/Ryujinx.Audio.Renderer/Dsp/Effect/DecayDelay.cs b/Ryujinx.Audio.Renderer/Dsp/Effect/DecayDelay.cs
deleted file mode 100644
index 8a815c56..00000000
--- a/Ryujinx.Audio.Renderer/Dsp/Effect/DecayDelay.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-// Copyright (c) 2019-2021 Ryujinx
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with this program. If not, see <https://www.gnu.org/licenses/>.
-//
-
-namespace Ryujinx.Audio.Renderer.Dsp.Effect
-{
- public class DecayDelay : IDelayLine
- {
- private readonly IDelayLine _delayLine;
-
- public uint CurrentSampleCount => _delayLine.CurrentSampleCount;
-
- public uint SampleCountMax => _delayLine.SampleCountMax;
-
- private float _decayRate;
-
- public DecayDelay(IDelayLine delayLine)
- {
- _decayRate = 0.0f;
- _delayLine = delayLine;
- }
-
- public void SetDecayRate(float decayRate)
- {
- _decayRate = decayRate;
- }
-
- public float Update(float value)
- {
- float delayLineValue = _delayLine.Read();
- float processedValue = value - (_decayRate * delayLineValue);
-
- return _delayLine.Update(processedValue) + processedValue * _decayRate;
- }
-
- public void SetDelay(float delayTime)
- {
- _delayLine.SetDelay(delayTime);
- }
-
- public float Read()
- {
- return _delayLine.Read();
- }
-
- public float TapUnsafe(uint sampleIndex, int offset)
- {
- return _delayLine.TapUnsafe(sampleIndex, offset);
- }
-
- public float Tap(uint sampleIndex)
- {
- return _delayLine.Tap(sampleIndex);
- }
- }
-}
diff --git a/Ryujinx.Audio.Renderer/Dsp/Effect/DelayLine.cs b/Ryujinx.Audio.Renderer/Dsp/Effect/DelayLine.cs
deleted file mode 100644
index d178e699..00000000
--- a/Ryujinx.Audio.Renderer/Dsp/Effect/DelayLine.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Copyright (c) 2019-2021 Ryujinx
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with this program. If not, see <https://www.gnu.org/licenses/>.
-//
-
-using System;
-
-namespace Ryujinx.Audio.Renderer.Dsp.Effect
-{
- public class DelayLine : IDelayLine
- {
- private float[] _workBuffer;
- private uint _sampleRate;
- private uint _currentSampleIndex;
- private uint _lastSampleIndex;
-
- public uint CurrentSampleCount { get; private set; }
- public uint SampleCountMax { get; private set; }
-
- public DelayLine(uint sampleRate, float delayTimeMax)
- {
- _sampleRate = sampleRate;
- SampleCountMax = IDelayLine.GetSampleCount(_sampleRate, delayTimeMax);
- _workBuffer = new float[SampleCountMax];
-
- SetDelay(delayTimeMax);
- }
-
- private void ConfigureDelay(uint targetSampleCount)
- {
- CurrentSampleCount = Math.Min(SampleCountMax, targetSampleCount);
- _currentSampleIndex = 0;
-
- if (CurrentSampleCount == 0)
- {
- _lastSampleIndex = 0;
- }
- else
- {
- _lastSampleIndex = CurrentSampleCount - 1;
- }
- }
-
- public void SetDelay(float delayTime)
- {
- ConfigureDelay(IDelayLine.GetSampleCount(_sampleRate, delayTime));
- }
-
- public float Read()
- {
- return _workBuffer[_currentSampleIndex];
- }
-
- public float Update(float value)
- {
- float output = Read();
-
- _workBuffer[_currentSampleIndex++] = value;
-
- if (_currentSampleIndex >= _lastSampleIndex)
- {
- _currentSampleIndex = 0;
- }
-
- return output;
- }
-
- public float TapUnsafe(uint sampleIndex, int offset)
- {
- return IDelayLine.Tap(_workBuffer, (int)_currentSampleIndex, (int)sampleIndex + offset, (int)CurrentSampleCount);
- }
-
- public float Tap(uint sampleIndex)
- {
- if (sampleIndex >= CurrentSampleCount)
- {
- sampleIndex = CurrentSampleCount - 1;
- }
-
- return TapUnsafe(sampleIndex, -1);
- }
- }
-}
diff --git a/Ryujinx.Audio.Renderer/Dsp/Effect/DelayLineReverb3d.cs b/Ryujinx.Audio.Renderer/Dsp/Effect/DelayLineReverb3d.cs
deleted file mode 100644
index a30dcc63..00000000
--- a/Ryujinx.Audio.Renderer/Dsp/Effect/DelayLineReverb3d.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-// Copyright (c) 2019-2021 Ryujinx
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with this program. If not, see <https://www.gnu.org/licenses/>.
-//
-
-using System.Diagnostics;
-
-namespace Ryujinx.Audio.Renderer.Dsp.Effect
-{
- public class DelayLine3d : IDelayLine
- {
- private float[] _workBuffer;
- private uint _sampleRate;
- private uint _currentSampleIndex;
- private uint _lastSampleIndex;
-
- public uint CurrentSampleCount { get; private set; }
- public uint SampleCountMax { get; private set; }
-
- public DelayLine3d(uint sampleRate, float delayTimeMax)
- {
- _sampleRate = sampleRate;
- SampleCountMax = IDelayLine.GetSampleCount(_sampleRate, delayTimeMax);
- _workBuffer = new float[SampleCountMax + 1];
-
- SetDelay(delayTimeMax);
- }
-
- private void ConfigureDelay(uint targetSampleCount)
- {
- if (SampleCountMax >= targetSampleCount)
- {
- CurrentSampleCount = targetSampleCount;
- _lastSampleIndex = (_currentSampleIndex + targetSampleCount) % (SampleCountMax + 1);
- }
- }
-
- public void SetDelay(float delayTime)
- {
- ConfigureDelay(IDelayLine.GetSampleCount(_sampleRate, delayTime));
- }
-
- public float Read()
- {
- return _workBuffer[_currentSampleIndex];
- }
-
- public float Update(float value)
- {
- Debug.Assert(!float.IsNaN(value) && !float.IsInfinity(value));
-
- _workBuffer[_lastSampleIndex++] = value;
-
- float output = Read();
-
- _currentSampleIndex++;
-
- if (_currentSampleIndex >= SampleCountMax)
- {
- _currentSampleIndex = 0;
- }
-
- if (_lastSampleIndex >= SampleCountMax)
- {
- _lastSampleIndex = 0;
- }
-
- return output;
- }
-
- public float TapUnsafe(uint sampleIndex, int offset)
- {
- return IDelayLine.Tap(_workBuffer, (int)_lastSampleIndex, (int)sampleIndex + offset, (int)SampleCountMax + 1);
- }
-
- public float Tap(uint sampleIndex)
- {
- return TapUnsafe(sampleIndex, -1);
- }
- }
-}
diff --git a/Ryujinx.Audio.Renderer/Dsp/Effect/IDelayLine.cs b/Ryujinx.Audio.Renderer/Dsp/Effect/IDelayLine.cs
deleted file mode 100644
index ac59445e..00000000
--- a/Ryujinx.Audio.Renderer/Dsp/Effect/IDelayLine.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// Copyright (c) 2019-2021 Ryujinx
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with this program. If not, see <https://www.gnu.org/licenses/>.
-//
-
-using System;
-using System.Runtime.CompilerServices;
-
-namespace Ryujinx.Audio.Renderer.Dsp.Effect
-{
- public interface IDelayLine
- {
- uint CurrentSampleCount { get; }
- uint SampleCountMax { get; }
-
- void SetDelay(float delayTime);
- float Read();
- float Update(float value);
-
- float TapUnsafe(uint sampleIndex, int offset);
- float Tap(uint sampleIndex);
-
- public static float Tap(Span<float> workBuffer, int baseIndex, int sampleIndex, int delaySampleCount)
- {
- int targetIndex = baseIndex - sampleIndex;
-
- if (targetIndex < 0)
- {
- targetIndex += delaySampleCount;
- }
-
- return workBuffer[targetIndex];
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static uint GetSampleCount(uint sampleRate, float delayTime)
- {
- return (uint)MathF.Round(sampleRate * delayTime);
- }
- }
-}