diff options
| author | jduncanator <1518948+jduncanator@users.noreply.github.com> | 2019-04-20 12:23:13 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-04-20 12:23:13 +1000 |
| commit | 9e923b1473ca565df2012de10d319e336eab67f4 (patch) | |
| tree | dea7d90b6f2aa66dfebf0271b119f0720b044ff3 /Ryujinx.HLE/HOS/Services | |
| parent | bea73895f543f444e5c307321659088a051ce47c (diff) | |
Implement IIrSensorServer GetIrsensorSharedMemoryHandle (#664)
* Implement IIrSensorServer GetIrsensorSharedMemoryHandle
Resolves #620
* Set _irsSharedMem
Diffstat (limited to 'Ryujinx.HLE/HOS/Services')
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/Irs/IIrSensorServer.cs | 30 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/ServiceFactory.cs | 2 |
2 files changed, 27 insertions, 5 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Irs/IIrSensorServer.cs b/Ryujinx.HLE/HOS/Services/Irs/IIrSensorServer.cs index b63f99c8..500d5f10 100644 --- a/Ryujinx.HLE/HOS/Services/Irs/IIrSensorServer.cs +++ b/Ryujinx.HLE/HOS/Services/Irs/IIrSensorServer.cs @@ -1,6 +1,8 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.Exceptions; using Ryujinx.HLE.HOS.Ipc; +using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.HLE.HOS.Kernel.Memory; using System; using System.Collections.Generic; @@ -12,14 +14,19 @@ namespace Ryujinx.HLE.HOS.Services.Irs public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; - public IIrSensorServer() + private KSharedMemory _irsSharedMem; + + public IIrSensorServer(KSharedMemory irsSharedMem) { _commands = new Dictionary<int, ServiceProcessRequest> { - { 302, ActivateIrsensor }, - { 303, DeactivateIrsensor }, - { 311, GetNpadIrCameraHandle } + { 302, ActivateIrsensor }, + { 303, DeactivateIrsensor }, + { 304, GetIrsensorSharedMemoryHandle }, + { 311, GetNpadIrCameraHandle } }; + + _irsSharedMem = irsSharedMem; } // ActivateIrsensor(nn::applet::AppletResourceUserId, pid) @@ -42,6 +49,21 @@ namespace Ryujinx.HLE.HOS.Services.Irs return 0; } + // GetIrsensorSharedMemoryHandle(nn::applet::AppletResourceUserId, pid) -> handle<copy> + public long GetIrsensorSharedMemoryHandle(ServiceCtx context) + { + var handleTable = context.Process.HandleTable; + + if (handleTable.GenerateHandle(_irsSharedMem, out int handle) != KernelResult.Success) + { + throw new InvalidOperationException("Out of handles!"); + } + + context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle); + + return 0; + } + // GetNpadIrCameraHandle(u32) -> nn::irsensor::IrCameraHandle public long GetNpadIrCameraHandle(ServiceCtx context) { diff --git a/Ryujinx.HLE/HOS/Services/ServiceFactory.cs b/Ryujinx.HLE/HOS/Services/ServiceFactory.cs index 113bbe51..3bde7b87 100644 --- a/Ryujinx.HLE/HOS/Services/ServiceFactory.cs +++ b/Ryujinx.HLE/HOS/Services/ServiceFactory.cs @@ -112,7 +112,7 @@ namespace Ryujinx.HLE.HOS.Services return new IHidServer(system); case "irs": - return new IIrSensorServer(); + return new IIrSensorServer(system.IirsSharedMem); case "ldr:ro": return new IRoInterface(); |
