diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/ISampledDataStruct.cs b/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/ISampledDataStruct.cs index 312075bc4..5a6aab495 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/ISampledDataStruct.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/Common/ISampledDataStruct.cs @@ -50,7 +50,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common ulong value = BinaryPrimitives.ReadUInt64LittleEndian(byteSpan); - return value; + return value << 1; } private static int GetSamplingNumberFieldOffset(ref T sampledDataStruct) where T : unmanaged, ISampledDataStruct diff --git a/src/Ryujinx.Horizon/Audio/AudioUserIpcServer.cs b/src/Ryujinx.Horizon/Audio/AudioUserIpcServer.cs index 20c824e1e..1de123f7f 100644 --- a/src/Ryujinx.Horizon/Audio/AudioUserIpcServer.cs +++ b/src/Ryujinx.Horizon/Audio/AudioUserIpcServer.cs @@ -33,11 +33,13 @@ namespace Ryujinx.Horizon.Audio AudioOutManager audioOutManager = new(_managers.AudioOutputManager); AudioInManager audioInManager = new(_managers.AudioInputManager); FinalOutputRecorderManager finalOutputRecorderManager = new(); + AudioSnoopManager audioSnoopManager = new(); _serverManager.RegisterObjectForServer(audioRendererManager, ServiceName.Encode("audren:u"), MaxSessionsCount); _serverManager.RegisterObjectForServer(audioOutManager, ServiceName.Encode("audout:u"), MaxSessionsCount); _serverManager.RegisterObjectForServer(audioInManager, ServiceName.Encode("audin:u"), MaxSessionsCount); _serverManager.RegisterObjectForServer(finalOutputRecorderManager, ServiceName.Encode("audrec:u"), MaxSessionsCount); + _serverManager.RegisterObjectForServer(audioSnoopManager, ServiceName.Encode("auddev"), MaxSessionsCount); } public void ServiceRequests() diff --git a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioSnoopManager.cs b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioSnoopManager.cs index cf1fe3d1d..5eb31a14b 100644 --- a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioSnoopManager.cs +++ b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioSnoopManager.cs @@ -1,30 +1,64 @@ using Ryujinx.Horizon.Common; using Ryujinx.Horizon.Sdk.Sf; +using Ryujinx.Horizon.Sdk.Sf.Hipc; +using System; namespace Ryujinx.Horizon.Sdk.Audio.Detail { partial class AudioSnoopManager : IAudioSnoopManager { + private byte[] _dspStatisticsParameter; + // Note: The interface changed completely on firmware 17.0.0, this implementation is for older firmware. - [CmifCommand(0)] + [CmifCommand(0)] // [6.0.0-16.1.0] public Result EnableDspUsageMeasurement() { return Result.Success; } - [CmifCommand(1)] + [CmifCommand(1)] // [6.0.0-16.1.0] public Result DisableDspUsageMeasurement() { return Result.Success; } - - [CmifCommand(6)] + + [CmifCommand(6)] // [6.0.0-16.1.0] public Result GetDspUsage(out uint usage) { usage = 0; return Result.Success; } + + [CmifCommand(0)] // 17.0.0+ + public Result GetDspStatistics(out uint statistics) => GetDspUsage(out statistics); + + [CmifCommand(1)] // 20.0.0+ + public Result GetAppletStateSummaries([Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span summaries) + { + // Since we do not have any real applets, return empty state summaries. + summaries.Clear(); + + return Result.Success; + } + + [CmifCommand(2)] // 20.0.0+ + public Result SetDspStatisticsParameter([Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias)] ReadOnlySpan parameter) + { + _dspStatisticsParameter = null; + _dspStatisticsParameter = new byte[0x100]; + parameter.CopyTo(_dspStatisticsParameter); + + return Result.Success; + } + + [CmifCommand(3)] // 20.0.0+ + public Result GetDspStatisticsParameter([Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span parameter) + { + _dspStatisticsParameter.CopyTo(parameter); + + return Result.Success; + } } } diff --git a/src/Ryujinx.Horizon/Sdk/Audio/Detail/IAudioSnoopManager.cs b/src/Ryujinx.Horizon/Sdk/Audio/Detail/IAudioSnoopManager.cs index 72853886a..9a52beb30 100644 --- a/src/Ryujinx.Horizon/Sdk/Audio/Detail/IAudioSnoopManager.cs +++ b/src/Ryujinx.Horizon/Sdk/Audio/Detail/IAudioSnoopManager.cs @@ -1,5 +1,6 @@ using Ryujinx.Horizon.Common; using Ryujinx.Horizon.Sdk.Sf; +using System; namespace Ryujinx.Horizon.Sdk.Audio.Detail { @@ -8,5 +9,10 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail Result EnableDspUsageMeasurement(); Result DisableDspUsageMeasurement(); Result GetDspUsage(out uint usage); + + Result GetDspStatistics(out uint statistics); + Result GetAppletStateSummaries(Span summaries); + Result SetDspStatisticsParameter(ReadOnlySpan parameter); + Result GetDspStatisticsParameter(Span parameter); } }