diff options
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; |
