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.
This commit is contained in:
Billy Laws 2021-07-06 18:49:51 +01:00 committed by GitHub
parent 94cc365b63
commit ddb8351375
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 1 deletions

View file

@ -1,4 +1,6 @@
using Ryujinx.Common;
using Ryujinx.HLE.HOS.Services.Audio.HardwareOpusDecoderManager; using Ryujinx.HLE.HOS.Services.Audio.HardwareOpusDecoderManager;
using Ryujinx.HLE.HOS.Services.Audio.Types;
namespace Ryujinx.HLE.HOS.Services.Audio namespace Ryujinx.HLE.HOS.Services.Audio
{ {
@ -26,7 +28,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio
// GetWorkBufferSize(bytes<8, 4>) -> u32 // GetWorkBufferSize(bytes<8, 4>) -> u32
public ResultCode GetWorkBufferSize(ServiceCtx context) 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 sampleRate = context.RequestData.ReadInt32();
int channelsCount = context.RequestData.ReadInt32(); int channelsCount = context.RequestData.ReadInt32();
@ -35,6 +37,33 @@ namespace Ryujinx.HLE.HOS.Services.Audio
return ResultCode.Success; 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) private static int GetOpusDecoderSize(int channelsCount)
{ {
const int silkDecoderSize = 0x2198; const int silkDecoderSize = 0x2198;

View file

@ -0,0 +1,11 @@
using System;
namespace Ryujinx.HLE.HOS.Services.Audio.Types
{
[Flags]
enum OpusDecoderFlags : uint
{
None,
LargeFrameSize = 1 << 0,
}
}

View file

@ -0,0 +1,15 @@
using Ryujinx.Common.Memory;
using System.Runtime.InteropServices;
namespace Ryujinx.HLE.HOS.Services.Audio.Types
{
[StructLayout(LayoutKind.Sequential, Size = 0x10)]
struct OpusParametersEx
{
public int SampleRate;
public int ChannelCount;
public OpusDecoderFlags UseLargeFrameSize;
Array4<byte> Padding1;
}
}