From 8a35918dba7e9ef1d12048546bc65c054f85ff85 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 18 May 2026 00:04:52 -0400 Subject: [PATCH] =?UTF-8?q?not=20entirely=20sure=20what=20i=20did,=20but?= =?UTF-8?q?=20i=20fixed=20it=20=F0=9F=91=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Ryujinx.Input.SDL3/NpadHdRumble.cs | 33 +++++++++++++++++++----- src/Ryujinx.Input.SDL3/SDL3JoyConPair.cs | 8 ++++++ src/Ryujinx.Input.SDL3/SDL3Keyboard.cs | 6 +++++ src/Ryujinx.Input.SDL3/SDL3Mouse.cs | 6 +++++ src/Ryujinx.Input/IGamepad.cs | 5 +--- src/Ryujinx/Input/AvaloniaKeyboard.cs | 16 ++++++++++-- src/Ryujinx/Input/AvaloniaMouse.cs | 6 +++++ 7 files changed, 68 insertions(+), 12 deletions(-) diff --git a/src/Ryujinx.Input.SDL3/NpadHdRumble.cs b/src/Ryujinx.Input.SDL3/NpadHdRumble.cs index e367f6a9c..c022df74a 100644 --- a/src/Ryujinx.Input.SDL3/NpadHdRumble.cs +++ b/src/Ryujinx.Input.SDL3/NpadHdRumble.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Hid; using SDL; using static SDL.SDL3; @@ -28,7 +29,7 @@ namespace Ryujinx.Input.SDL3 } ushort product = SDL_GetGamepadProduct(gamepadHandle); - if (product != 0x2006 && product != 0x2007 && product != 0x2009 && product != 0x200e) + if (Enum.IsDefined(typeof(HDRumbleSupported), product)) { return null; } @@ -37,7 +38,7 @@ namespace Ryujinx.Input.SDL3 } // Some of the code was translated from https://github.com/MIZUSHIKI/JoyShockLibrary-plus-HDRumble - private void WriteHdRumble( + private bool WriteHdRumble( int encLeftLowFreq, int encLeftLowAmp, int encLeftHighFreq, int encLeftHighAmp, int encRightLowFreq, int encRightLowAmp, @@ -58,15 +59,22 @@ namespace Ryujinx.Input.SDL3 buf[8] = (byte)(encRightLowFreq + ((encRightLowAmp >> 8) & 0xFF)); buf[9] = (byte)(encRightLowAmp & 0xFF); - if (_globalCount > 0xF) + if (_globalCount > 0x5) { _globalCount = 0x0; } fixed (byte* ptr = buf) { - SDL_hid_write(_hidHandle, ptr, (nuint)buf.Length); + if (SDL_hid_write(_hidHandle, ptr, (nuint)buf.Length) == -1) + { + Logger.Error?.PrintMsg(LogClass.Hid, SDL_GetError()); + SDL_ClearError(); + return false; + } } + + return true; } @@ -132,7 +140,7 @@ namespace Ryujinx.Input.SDL3 public bool HdRumble(VibrationValue left, VibrationValue right) { - WriteHdRumble(EncodeLowFreq(left.FrequencyLow), + return WriteHdRumble(EncodeLowFreq(left.FrequencyLow), EncodeLowAmp(left.AmplitudeLow), EncodeHighFreq(left.FrequencyHigh), EncodeHighAmp(left.AmplitudeHigh), @@ -140,7 +148,6 @@ namespace Ryujinx.Input.SDL3 EncodeLowAmp(right.AmplitudeLow), EncodeHighFreq(right.FrequencyHigh), EncodeHighAmp(right.AmplitudeHigh)); - return true; } public void Dispose() @@ -148,4 +155,18 @@ namespace Ryujinx.Input.SDL3 SDL_hid_close(_hidHandle); } } + + public enum HDRumbleSupported : ushort + { + JoyConLeft = 0x2006, + JoyConRight = 0x2007, + JoyconPair = 0x2008, + ProController = 0x2009, + JoyconGrip = 0x200e, + Joycon2Right = 0x2066, + Joycon2Left = 0x2067, + Joycon2Pair = 0x2068, + Switch2ProController = 0x2069, + GamecubeController = 0x2073 + } } diff --git a/src/Ryujinx.Input.SDL3/SDL3JoyConPair.cs b/src/Ryujinx.Input.SDL3/SDL3JoyConPair.cs index 14352e5a4..82f120cc2 100644 --- a/src/Ryujinx.Input.SDL3/SDL3JoyConPair.cs +++ b/src/Ryujinx.Input.SDL3/SDL3JoyConPair.cs @@ -1,4 +1,5 @@ using Ryujinx.Common.Configuration.Hid; +using Ryujinx.HLE.HOS.Services.Hid; using System.Collections.Generic; using System.Linq; using System.Numerics; @@ -61,6 +62,13 @@ namespace Ryujinx.Input.SDL3 return left.IsPressed(inputId) || right.IsPressed(inputId); } + public bool HDRumble(VibrationValue left, VibrationValue right) + { + // return _hdRumble?.HdRumble(left, right) ?? false; + // TODO: Track rumble and motion on both controllers + return false; + } + public void Rumble(float lowFrequency, float highFrequency, uint durationMs) { if (lowFrequency != 0) diff --git a/src/Ryujinx.Input.SDL3/SDL3Keyboard.cs b/src/Ryujinx.Input.SDL3/SDL3Keyboard.cs index f5da11a19..834c372bb 100644 --- a/src/Ryujinx.Input.SDL3/SDL3Keyboard.cs +++ b/src/Ryujinx.Input.SDL3/SDL3Keyboard.cs @@ -1,6 +1,7 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Services.Hid; using System; using System.Collections.Generic; using System.Numerics; @@ -396,6 +397,11 @@ namespace Ryujinx.Input.SDL3 // No operations } + public bool HDRumble(VibrationValue left, VibrationValue right) + { + return false; + } + public void Rumble(float lowFrequency, float highFrequency, uint durationMs) { // No operations diff --git a/src/Ryujinx.Input.SDL3/SDL3Mouse.cs b/src/Ryujinx.Input.SDL3/SDL3Mouse.cs index 9fdeb36ab..810ddb64e 100644 --- a/src/Ryujinx.Input.SDL3/SDL3Mouse.cs +++ b/src/Ryujinx.Input.SDL3/SDL3Mouse.cs @@ -1,5 +1,6 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Services.Hid; using System; using System.Drawing; using System.Numerics; @@ -67,6 +68,11 @@ namespace Ryujinx.Input.SDL3 throw new NotImplementedException(); } + public bool HDRumble(VibrationValue left, VibrationValue right) + { + throw new NotImplementedException(); + } + public void Rumble(float lowFrequency, float highFrequency, uint durationMs) { throw new NotImplementedException(); diff --git a/src/Ryujinx.Input/IGamepad.cs b/src/Ryujinx.Input/IGamepad.cs index d45ac0444..fdc148b41 100644 --- a/src/Ryujinx.Input/IGamepad.cs +++ b/src/Ryujinx.Input/IGamepad.cs @@ -80,10 +80,7 @@ namespace Ryujinx.Input /// /// The vibration data for the left side /// The vibration data for the right side - bool HDRumble(VibrationValue left, VibrationValue right) - { - return false; - } + bool HDRumble(VibrationValue left, VibrationValue right); /// /// Starts a rumble effect on the gamepad. diff --git a/src/Ryujinx/Input/AvaloniaKeyboard.cs b/src/Ryujinx/Input/AvaloniaKeyboard.cs index 031d8b033..ff7250fa5 100644 --- a/src/Ryujinx/Input/AvaloniaKeyboard.cs +++ b/src/Ryujinx/Input/AvaloniaKeyboard.cs @@ -1,6 +1,7 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Services.Hid; using Ryujinx.Input; using System; using System.Collections.Generic; @@ -149,9 +150,20 @@ namespace Ryujinx.Ava.Input Logger.Info?.Print(LogClass.UI, "SetLed called on an AvaloniaKeyboard"); } - public void SetTriggerThreshold(float triggerThreshold) { } + public void SetTriggerThreshold(float triggerThreshold) + { + // No operations. + } - public void Rumble(float lowFrequency, float highFrequency, uint durationMs) { } + public bool HDRumble(VibrationValue left, VibrationValue right) + { + return false; + } + + public void Rumble(float lowFrequency, float highFrequency, uint durationMs) + { + // No operations. + } public Vector3 GetMotionData(MotionInputId inputId) => Vector3.Zero; diff --git a/src/Ryujinx/Input/AvaloniaMouse.cs b/src/Ryujinx/Input/AvaloniaMouse.cs index 52a341a01..3b91526b5 100644 --- a/src/Ryujinx/Input/AvaloniaMouse.cs +++ b/src/Ryujinx/Input/AvaloniaMouse.cs @@ -1,5 +1,6 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Services.Hid; using Ryujinx.Input; using System; using System.Drawing; @@ -64,6 +65,11 @@ namespace Ryujinx.Ava.Input { throw new NotImplementedException(); } + + public bool HDRumble(VibrationValue left, VibrationValue right) + { + throw new NotImplementedException(); + } public void Rumble(float lowFrequency, float highFrequency, uint durationMs) {