aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer
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.HLE/HOS/Services/Audio/AudioRenderer
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.HLE/HOS/Services/Audio/AudioRenderer')
-rw-r--r--Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AalHardwareDevice.cs98
-rw-r--r--Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioKernelEvent.cs2
-rw-r--r--Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioRenderer.cs2
3 files changed, 2 insertions, 100 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AalHardwareDevice.cs b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AalHardwareDevice.cs
deleted file mode 100644
index fdc23604..00000000
--- a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AalHardwareDevice.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using Ryujinx.Audio;
-using Ryujinx.Audio.Renderer;
-using Ryujinx.Audio.Renderer.Integration;
-using System;
-using System.Collections.Generic;
-using System.Threading;
-
-namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
-{
- public class AalHardwareDevice : HardwareDevice
- {
- private IAalOutput _output;
- private int _trackId;
- private int _bufferTag;
- private int _nextTag;
- private AutoResetEvent _releaseEvent;
-
- private uint _channelCount;
- private uint _sampleRate;
-
- private short[] _buffer;
-
- private Queue<long> _releasedTags;
-
- public AalHardwareDevice(int bufferTag, IAalOutput output, uint channelCount, uint sampleRate)
- {
- _bufferTag = bufferTag;
- _channelCount = channelCount;
- _sampleRate = sampleRate;
- _output = output;
- _releaseEvent = new AutoResetEvent(true);
- _trackId = _output.OpenTrack((int)sampleRate, (int)channelCount, AudioCallback);
- _releasedTags = new Queue<long>();
-
- _buffer = new short[RendererConstants.TargetSampleCount * channelCount];
-
- _output.Start(_trackId);
- }
-
- private void AudioCallback()
- {
- long[] released = _output.GetReleasedBuffers(_trackId, int.MaxValue);
-
- lock (_releasedTags)
- {
- foreach (long tag in released)
- {
- _releasedTags.Enqueue(tag);
- }
- }
- }
-
- private long GetReleasedTag()
- {
- lock (_releasedTags)
- {
- if (_releasedTags.Count > 0)
- {
- return _releasedTags.Dequeue();
- }
-
- return (_bufferTag << 16) | (_nextTag++);
- }
- }
-
- public void AppendBuffer(ReadOnlySpan<short> data, uint channelCount)
- {
- data.CopyTo(_buffer.AsSpan());
-
- _output.AppendBuffer(_trackId, GetReleasedTag(), _buffer);
- }
-
- public uint GetChannelCount()
- {
- return _channelCount;
- }
-
- public uint GetSampleRate()
- {
- return _sampleRate;
- }
-
- public void Dispose()
- {
- Dispose(true);
- }
-
- protected virtual void Dispose(bool disposing)
- {
- if (disposing)
- {
- _output.Stop(_trackId);
- _output.CloseTrack(_trackId);
- _releaseEvent.Dispose();
- }
- }
- }
-}
diff --git a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioKernelEvent.cs b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioKernelEvent.cs
index 1a132b91..55bf29ae 100644
--- a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioKernelEvent.cs
+++ b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioKernelEvent.cs
@@ -1,4 +1,4 @@
-using Ryujinx.Audio.Renderer.Integration;
+using Ryujinx.Audio.Integration;
using Ryujinx.HLE.HOS.Kernel.Threading;
namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
diff --git a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioRenderer.cs b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioRenderer.cs
index 702648dd..d69bde03 100644
--- a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioRenderer.cs
+++ b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioRenderer.cs
@@ -1,4 +1,4 @@
-using Ryujinx.Audio.Renderer.Integration;
+using Ryujinx.Audio.Integration;
using Ryujinx.Audio.Renderer.Server;
using Ryujinx.HLE.HOS.Kernel.Threading;
using System;