aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Audio/Renderer
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Audio/Renderer')
-rw-r--r--Ryujinx.Audio/Renderer/Dsp/AudioProcessor.cs31
-rw-r--r--Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs27
-rw-r--r--Ryujinx.Audio/Renderer/Utils/FileHardwareDevice.cs11
-rw-r--r--Ryujinx.Audio/Renderer/Utils/SplitterHardwareDevice.cs11
4 files changed, 72 insertions, 8 deletions
diff --git a/Ryujinx.Audio/Renderer/Dsp/AudioProcessor.cs b/Ryujinx.Audio/Renderer/Dsp/AudioProcessor.cs
index e15165b9..303de9bb 100644
--- a/Ryujinx.Audio/Renderer/Dsp/AudioProcessor.cs
+++ b/Ryujinx.Audio/Renderer/Dsp/AudioProcessor.cs
@@ -78,7 +78,7 @@ namespace Ryujinx.Audio.Renderer.Dsp
}
}
- public void Start(IHardwareDeviceDriver deviceDriver)
+ public void Start(IHardwareDeviceDriver deviceDriver, float volume)
{
OutputDevices = new IHardwareDevice[Constants.AudioRendererSessionCountMax];
@@ -89,7 +89,7 @@ namespace Ryujinx.Audio.Renderer.Dsp
for (int i = 0; i < OutputDevices.Length; i++)
{
// TODO: Don't hardcode sample rate.
- OutputDevices[i] = new HardwareDeviceImpl(deviceDriver, channelCount, Constants.TargetSampleRate);
+ OutputDevices[i] = new HardwareDeviceImpl(deviceDriver, channelCount, Constants.TargetSampleRate, volume);
}
_mailbox = new Mailbox<MailboxMessage>();
@@ -245,6 +245,33 @@ namespace Ryujinx.Audio.Renderer.Dsp
_mailbox.SendResponse(MailboxMessage.Stop);
}
+ public float GetVolume()
+ {
+ if (OutputDevices != null)
+ {
+ foreach (IHardwareDevice outputDevice in OutputDevices)
+ {
+ if (outputDevice != null)
+ {
+ return outputDevice.GetVolume();
+ }
+ }
+ }
+
+ return 0f;
+ }
+
+ public void SetVolume(float volume)
+ {
+ if (OutputDevices != null)
+ {
+ foreach (IHardwareDevice outputDevice in OutputDevices)
+ {
+ outputDevice?.SetVolume(volume);
+ }
+ }
+ }
+
public void Dispose()
{
Dispose(true);
diff --git a/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs b/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
index 7518c447..d20c3c03 100644
--- a/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
+++ b/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
@@ -186,12 +186,12 @@ namespace Ryujinx.Audio.Renderer.Server
/// <summary>
/// Start the <see cref="AudioProcessor"/> and worker thread.
/// </summary>
- private void StartLocked()
+ private void StartLocked(float volume)
{
_isRunning = true;
// TODO: virtual device mapping (IAudioDevice)
- Processor.Start(_deviceDriver);
+ Processor.Start(_deviceDriver, volume);
_workerThread = new Thread(SendCommands)
{
@@ -263,7 +263,7 @@ namespace Ryujinx.Audio.Renderer.Server
/// Register a new <see cref="AudioRenderSystem"/>.
/// </summary>
/// <param name="renderer">The <see cref="AudioRenderSystem"/> to register.</param>
- private void Register(AudioRenderSystem renderer)
+ private void Register(AudioRenderSystem renderer, float volume)
{
lock (_sessionLock)
{
@@ -274,7 +274,7 @@ namespace Ryujinx.Audio.Renderer.Server
{
if (!_isRunning)
{
- StartLocked();
+ StartLocked(volume);
}
}
}
@@ -314,7 +314,7 @@ namespace Ryujinx.Audio.Renderer.Server
/// <param name="workBufferSize">The guest work buffer size.</param>
/// <param name="processHandle">The process handle of the application.</param>
/// <returns>A <see cref="ResultCode"/> reporting an error or a success.</returns>
- public ResultCode OpenAudioRenderer(out AudioRenderSystem renderer, IVirtualMemoryManager memoryManager, ref AudioRendererConfiguration parameter, ulong appletResourceUserId, ulong workBufferAddress, ulong workBufferSize, uint processHandle)
+ public ResultCode OpenAudioRenderer(out AudioRenderSystem renderer, IVirtualMemoryManager memoryManager, ref AudioRendererConfiguration parameter, ulong appletResourceUserId, ulong workBufferAddress, ulong workBufferSize, uint processHandle, float volume)
{
int sessionId = AcquireSessionId();
@@ -326,7 +326,7 @@ namespace Ryujinx.Audio.Renderer.Server
{
renderer = audioRenderer;
- Register(renderer);
+ Register(renderer, volume);
}
else
{
@@ -338,6 +338,21 @@ namespace Ryujinx.Audio.Renderer.Server
return result;
}
+ public float GetVolume()
+ {
+ if (Processor != null)
+ {
+ return Processor.GetVolume();
+ }
+
+ return 0f;
+ }
+
+ public void SetVolume(float volume)
+ {
+ Processor?.SetVolume(volume);
+ }
+
public void Dispose()
{
if (Interlocked.CompareExchange(ref _disposeState, 1, 0) == 0)
diff --git a/Ryujinx.Audio/Renderer/Utils/FileHardwareDevice.cs b/Ryujinx.Audio/Renderer/Utils/FileHardwareDevice.cs
index 2008bafc..8d717f6a 100644
--- a/Ryujinx.Audio/Renderer/Utils/FileHardwareDevice.cs
+++ b/Ryujinx.Audio/Renderer/Utils/FileHardwareDevice.cs
@@ -76,6 +76,17 @@ namespace Ryujinx.Audio.Renderer.Utils
_stream.Flush();
}
+ public void SetVolume(float volume)
+ {
+ // Do nothing, volume is not used for FileHardwareDevice at the moment.
+ }
+
+ public float GetVolume()
+ {
+ // FileHardwareDevice does not incorporate volume.
+ return 0;
+ }
+
public uint GetChannelCount()
{
return _channelCount;
diff --git a/Ryujinx.Audio/Renderer/Utils/SplitterHardwareDevice.cs b/Ryujinx.Audio/Renderer/Utils/SplitterHardwareDevice.cs
index c5411ac0..e6be07c0 100644
--- a/Ryujinx.Audio/Renderer/Utils/SplitterHardwareDevice.cs
+++ b/Ryujinx.Audio/Renderer/Utils/SplitterHardwareDevice.cs
@@ -37,6 +37,17 @@ namespace Ryujinx.Audio.Renderer.Utils
_secondaryDevice?.AppendBuffer(data, channelCount);
}
+ public void SetVolume(float volume)
+ {
+ _baseDevice.SetVolume(volume);
+ _secondaryDevice.SetVolume(volume);
+ }
+
+ public float GetVolume()
+ {
+ return _baseDevice.GetVolume();
+ }
+
public uint GetChannelCount()
{
return _baseDevice.GetChannelCount();