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)
{