From e17eb7bfafdd95084baea8e9f3dc77ee3f755347 Mon Sep 17 00:00:00 2001 From: Mary Date: Sun, 19 Sep 2021 12:29:19 +0200 Subject: amadeus: Update to REV10 (#2654) * amadeus: Update to REV10 This implements all the changes made with REV10 on 13.0.0. * Address Ack's comment * Address gdkchan's comment --- .../Audio/AudioRenderer/AudioDeviceServer.cs | 62 +++++++++++++++++----- 1 file changed, 48 insertions(+), 14 deletions(-) (limited to 'Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioDeviceServer.cs') diff --git a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioDeviceServer.cs b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioDeviceServer.cs index 87ec2f6a..1ef97ecc 100644 --- a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioDeviceServer.cs +++ b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioDeviceServer.cs @@ -38,8 +38,6 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer if ((position - basePosition) + (ulong)buffer.Length > size) { - Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!"); - break; } @@ -158,8 +156,6 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer if ((position - basePosition) + (ulong)buffer.Length > size) { - Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!"); - break; } @@ -264,23 +260,61 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer return ResultCode.Success; } - [CommandHipc(13)] - // GetAudioSystemMasterVolumeSetting(buffer name) -> f32 - public ResultCode GetAudioSystemMasterVolumeSetting(ServiceCtx context) + [CommandHipc(13)] // 13.0.0+ + // GetActiveAudioOutputDeviceName() -> buffer + public ResultCode GetActiveAudioOutputDeviceName(ServiceCtx context) { - ulong position = context.Request.SendBuff[0].Position; - ulong size = context.Request.SendBuff[0].Size; + string name = _impl.GetActiveAudioOutputDeviceName(); - string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, (long)size); + ulong position = context.Request.ReceiveBuff[0].Position; + ulong size = context.Request.ReceiveBuff[0].Size; - ResultCode result = _impl.GetAudioSystemMasterVolumeSetting(deviceName, out float systemMasterVolume); + byte[] deviceNameBuffer = Encoding.ASCII.GetBytes(name + "\0"); - if (result == ResultCode.Success) + if ((ulong)deviceNameBuffer.Length <= size) + { + context.Memory.Write(position, deviceNameBuffer); + } + else { - context.ResponseData.Write(systemMasterVolume); + Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!"); } - return result; + return ResultCode.Success; + } + + [CommandHipc(14)] // 13.0.0+ + // ListAudioOutputDeviceName() -> (u32, buffer) + public ResultCode ListAudioOutputDeviceName(ServiceCtx context) + { + string[] deviceNames = _impl.ListAudioOutputDeviceName(); + + ulong position = context.Request.ReceiveBuff[0].Position; + ulong size = context.Request.ReceiveBuff[0].Size; + + ulong basePosition = position; + + int count = 0; + + foreach (string name in deviceNames) + { + byte[] buffer = Encoding.ASCII.GetBytes(name); + + if ((position - basePosition) + (ulong)buffer.Length > size) + { + break; + } + + context.Memory.Write(position, buffer); + MemoryHelper.FillWithZeros(context.Memory, position + (ulong)buffer.Length, AudioDeviceNameSize - buffer.Length); + + position += AudioDeviceNameSize; + count++; + } + + context.ResponseData.Write(count); + + return ResultCode.Success; } } } -- cgit v1.2.3