aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Audio/IAudioRendererManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Audio/IAudioRendererManager.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Audio/IAudioRendererManager.cs151
1 files changed, 11 insertions, 140 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Audio/IAudioRendererManager.cs b/Ryujinx.HLE/HOS/Services/Audio/IAudioRendererManager.cs
index 7e770a78..642e2525 100644
--- a/Ryujinx.HLE/HOS/Services/Audio/IAudioRendererManager.cs
+++ b/Ryujinx.HLE/HOS/Services/Audio/IAudioRendererManager.cs
@@ -1,148 +1,19 @@
-using Ryujinx.Audio;
-using Ryujinx.Common;
-using Ryujinx.Common.Logging;
-using Ryujinx.HLE.HOS.Services.Audio.AudioRendererManager;
+using Ryujinx.Audio.Renderer.Parameter;
+using Ryujinx.HLE.HOS.Kernel.Memory;
+using Ryujinx.HLE.HOS.Services.Audio.AudioRenderer;
namespace Ryujinx.HLE.HOS.Services.Audio
{
- [Service("audren:u")]
- class IAudioRendererManager : IpcService
+ interface IAudioRendererManager
{
- public IAudioRendererManager(ServiceCtx context) { }
+ // TODO: Remove ServiceCtx argument
+ // BODY: This is only needed by the legacy backend. Refactor this when removing the legacy backend.
+ ResultCode GetAudioDeviceServiceWithRevisionInfo(ServiceCtx context, out IAudioDevice outObject, int revision, ulong appletResourceUserId);
- [Command(0)]
- // OpenAudioRenderer(nn::audio::detail::AudioRendererParameterInternal, u64, nn::applet::AppletResourceUserId, pid, handle<copy>, handle<copy>)
- // -> object<nn::audio::detail::IAudioRenderer>
- public ResultCode OpenAudioRenderer(ServiceCtx context)
- {
- IAalOutput audioOut = context.Device.AudioOut;
+ // TODO: Remove ServiceCtx argument
+ // BODY: This is only needed by the legacy backend. Refactor this when removing the legacy backend.
+ ResultCode OpenAudioRenderer(ServiceCtx context, out IAudioRenderer obj, ref AudioRendererConfiguration parameter, ulong workBufferSize, ulong appletResourceUserId, KTransferMemory workBufferTransferMemory, uint processHandle);
- AudioRendererParameter Params = GetAudioRendererParameter(context);
-
- MakeObject(context, new IAudioRenderer(
- context.Device.System,
- context.Memory,
- audioOut,
- Params));
-
- return ResultCode.Success;
- }
-
- [Command(1)]
- // GetWorkBufferSize(nn::audio::detail::AudioRendererParameterInternal) -> u64
- public ResultCode GetAudioRendererWorkBufferSize(ServiceCtx context)
- {
- AudioRendererParameter parameters = GetAudioRendererParameter(context);
-
- if (AudioRendererCommon.CheckValidRevision(parameters))
- {
- BehaviorInfo behaviorInfo = new BehaviorInfo();
-
- behaviorInfo.SetUserLibRevision(parameters.Revision);
-
- long size;
-
- int totalMixCount = parameters.SubMixCount + 1;
-
- size = BitUtils.AlignUp(parameters.MixBufferCount * 4, AudioRendererConsts.BufferAlignment) +
- parameters.SubMixCount * 0x400 +
- totalMixCount * 0x940 +
- parameters.VoiceCount * 0x3F0 +
- BitUtils.AlignUp(totalMixCount * 8, 16) +
- BitUtils.AlignUp(parameters.VoiceCount * 8, 16) +
- BitUtils.AlignUp(((parameters.SinkCount + parameters.SubMixCount) * 0x3C0 + parameters.SampleCount * 4) *
- (parameters.MixBufferCount + 6), AudioRendererConsts.BufferAlignment) +
- (parameters.SinkCount + parameters.SubMixCount) * 0x2C0 +
- (parameters.EffectCount + parameters.VoiceCount * 4) * 0x30 +
- 0x50;
-
- if (behaviorInfo.IsSplitterSupported())
- {
- size += BitUtils.AlignUp(NodeStates.GetWorkBufferSize(totalMixCount) + EdgeMatrix.GetWorkBufferSize(totalMixCount), 16);
- }
-
- size = parameters.SinkCount * 0x170 +
- (parameters.SinkCount + parameters.SubMixCount) * 0x280 +
- parameters.EffectCount * 0x4C0 +
- ((size + SplitterContext.CalcWorkBufferSize(behaviorInfo, parameters) + 0x30 * parameters.EffectCount + (4 * parameters.VoiceCount) + 0x8F) & ~0x3FL) +
- ((parameters.VoiceCount << 8) | 0x40);
-
- if (parameters.PerformanceManagerCount >= 1)
- {
- size += (PerformanceManager.GetRequiredBufferSizeForPerformanceMetricsPerFrame(behaviorInfo, parameters) *
- (parameters.PerformanceManagerCount + 1) + 0xFF) & ~0x3FL;
- }
-
- if (behaviorInfo.IsVariadicCommandBufferSizeSupported())
- {
- size += CommandGenerator.CalculateCommandBufferSize(parameters) + 0x7E;
- }
- else
- {
- size += 0x1807E;
- }
-
- size = BitUtils.AlignUp(size, 0x1000);
-
- context.ResponseData.Write(size);
-
- Logger.Debug?.Print(LogClass.ServiceAudio, $"WorkBufferSize is 0x{size:x16}.");
-
- return ResultCode.Success;
- }
- else
- {
- context.ResponseData.Write(0L);
-
- Logger.Warning?.Print(LogClass.ServiceAudio, $"Library Revision REV{AudioRendererCommon.GetRevisionVersion(parameters.Revision)} is not supported!");
-
- return ResultCode.UnsupportedRevision;
- }
- }
-
- private AudioRendererParameter GetAudioRendererParameter(ServiceCtx context)
- {
- AudioRendererParameter Params = new AudioRendererParameter
- {
- SampleRate = context.RequestData.ReadInt32(),
- SampleCount = context.RequestData.ReadInt32(),
- MixBufferCount = context.RequestData.ReadInt32(),
- SubMixCount = context.RequestData.ReadInt32(),
- VoiceCount = context.RequestData.ReadInt32(),
- SinkCount = context.RequestData.ReadInt32(),
- EffectCount = context.RequestData.ReadInt32(),
- PerformanceManagerCount = context.RequestData.ReadInt32(),
- VoiceDropEnable = context.RequestData.ReadInt32(),
- SplitterCount = context.RequestData.ReadInt32(),
- SplitterDestinationDataCount = context.RequestData.ReadInt32(),
- Unknown2C = context.RequestData.ReadInt32(),
- Revision = context.RequestData.ReadInt32()
- };
-
- return Params;
- }
-
- [Command(2)]
- // GetAudioDeviceService(nn::applet::AppletResourceUserId) -> object<nn::audio::detail::IAudioDevice>
- public ResultCode GetAudioDeviceService(ServiceCtx context)
- {
- long appletResourceUserId = context.RequestData.ReadInt64();
-
- MakeObject(context, new IAudioDevice(context.Device.System));
-
- return ResultCode.Success;
- }
-
- [Command(4)] // 4.0.0+
- // GetAudioDeviceServiceWithRevisionInfo(u32 revision_info, nn::applet::AppletResourceUserId) -> object<nn::audio::detail::IAudioDevice>
- public ResultCode GetAudioDeviceServiceWithRevisionInfo(ServiceCtx context)
- {
- int revisionInfo = context.RequestData.ReadInt32();
- long appletResourceUserId = context.RequestData.ReadInt64();
-
- Logger.Stub?.PrintStub(LogClass.ServiceAudio, new { appletResourceUserId, revisionInfo });
-
- return GetAudioDeviceService(context);
- }
+ ulong GetWorkBufferSize(ref AudioRendererConfiguration parameter);
}
}