diff options
author | Billy Laws <blaws05@gmail.com> | 2021-07-06 18:49:51 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-06 19:49:51 +0200 |
commit | ddb8351375fe58e37072a9577e1341a2e7f437d2 (patch) | |
tree | 6440c6aea5b689e65e85b37c94fdbcace75ee548 /Ryujinx.HLE/HOS/Services/Audio/IHardwareOpusDecoderManager.cs | |
parent | 94cc365b635b0c42f6443af724ff0cdcb7ab00a3 (diff) |
Implement 12.0.0 hwopus functions (#2410)
Based off of my RE of 12.0.2 audio services, the newly added parameter can be safely ignored due to ryu not using fixed-size I/O buffers.
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Audio/IHardwareOpusDecoderManager.cs')
-rw-r--r-- | Ryujinx.HLE/HOS/Services/Audio/IHardwareOpusDecoderManager.cs | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Audio/IHardwareOpusDecoderManager.cs b/Ryujinx.HLE/HOS/Services/Audio/IHardwareOpusDecoderManager.cs index b341f087..d8e4f75d 100644 --- a/Ryujinx.HLE/HOS/Services/Audio/IHardwareOpusDecoderManager.cs +++ b/Ryujinx.HLE/HOS/Services/Audio/IHardwareOpusDecoderManager.cs @@ -1,4 +1,6 @@ +using Ryujinx.Common; using Ryujinx.HLE.HOS.Services.Audio.HardwareOpusDecoderManager; +using Ryujinx.HLE.HOS.Services.Audio.Types; namespace Ryujinx.HLE.HOS.Services.Audio { @@ -26,7 +28,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio // GetWorkBufferSize(bytes<8, 4>) -> u32 public ResultCode GetWorkBufferSize(ServiceCtx context) { - // Note: The sample rate is ignored because it is fixed to 48KHz. + // NOTE: The sample rate is ignored because it is fixed to 48KHz. int sampleRate = context.RequestData.ReadInt32(); int channelsCount = context.RequestData.ReadInt32(); @@ -35,6 +37,33 @@ namespace Ryujinx.HLE.HOS.Services.Audio return ResultCode.Success; } + [CommandHipc(4)] // 12.0.0+ + // InitializeEx(OpusParametersEx, u32, handle<copy>) -> object<nn::codec::detail::IHardwareOpusDecoder> + public ResultCode InitializeEx(ServiceCtx context) + { + OpusParametersEx parameters = context.RequestData.ReadStruct<OpusParametersEx>(); + + // UseLargeFrameSize can be ignored due to not relying on fixed size buffers for storing the decoded result. + MakeObject(context, new IHardwareOpusDecoder(parameters.SampleRate, parameters.ChannelCount)); + + // Close transfer memory immediately as we don't use it. + context.Device.System.KernelContext.Syscall.CloseHandle(context.Request.HandleDesc.ToCopy[0]); + + return ResultCode.Success; + } + + [CommandHipc(5)] // 12.0.0+ + // GetWorkBufferSizeEx(OpusParametersEx) -> u32 + public ResultCode GetWorkBufferSizeEx(ServiceCtx context) + { + OpusParametersEx parameters = context.RequestData.ReadStruct<OpusParametersEx>(); + + // NOTE: The sample rate is ignored because it is fixed to 48KHz. + context.ResponseData.Write(GetOpusDecoderSize(parameters.ChannelCount)); + + return ResultCode.Success; + } + private static int GetOpusDecoderSize(int channelsCount) { const int silkDecoderSize = 0x2198; |