aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Input/HLE/NpadController.cs
diff options
context:
space:
mode:
authormpnico <mpnico@gmail.com>2021-08-05 00:39:40 +0200
committerGitHub <noreply@github.com>2021-08-05 00:39:40 +0200
commit70f79e689bc947313aab11c41e59928ce43be517 (patch)
treedb4aecd13e2895c650a6cf2cd84966ab06b44648 /Ryujinx.Input/HLE/NpadController.cs
parent46ffc81d90bd3a8f2d24c2997166d22f12ecbbb6 (diff)
Implement vibrations (#2468)
* First working vibration implementation * Fix Infinite Rumble in SDL2Mouse * Stop ignoring one vibValues every 2 * Remove RumbleInfinity as suggested * Reworked all the vibration handle / calculation * Revert HidVibrationDevicePosition changes * Add UI to enable and tune rumble * Remove some stub logs * Add PlayerIndex in rumble debug log * Fix all requested changes * Implements hid::GetVibrationDeviceInfo * Better implements HidVibrationValue.Equals/GetHashCode * Added requested changes from code review * Last fixes from review * Update configuration file version for rebase
Diffstat (limited to 'Ryujinx.Input/HLE/NpadController.cs')
-rw-r--r--Ryujinx.Input/HLE/NpadController.cs27
1 files changed, 27 insertions, 0 deletions
diff --git a/Ryujinx.Input/HLE/NpadController.cs b/Ryujinx.Input/HLE/NpadController.cs
index 3559b015..79c18ecf 100644
--- a/Ryujinx.Input/HLE/NpadController.cs
+++ b/Ryujinx.Input/HLE/NpadController.cs
@@ -2,8 +2,11 @@
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Controller;
using Ryujinx.Common.Configuration.Hid.Controller.Motion;
+using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Services.Hid;
using System;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
using System.Numerics;
using System.Runtime.CompilerServices;
@@ -534,5 +537,29 @@ namespace Ryujinx.Input.HLE
{
Dispose(true);
}
+
+ public void UpdateRumble(ConcurrentQueue<(HidVibrationValue, HidVibrationValue)> queue)
+ {
+ if (queue.TryDequeue(out (HidVibrationValue, HidVibrationValue) dualVibrationValue))
+ {
+ if (_config is StandardControllerInputConfig controllerConfig && controllerConfig.Rumble.EnableRumble)
+ {
+ HidVibrationValue leftVibrationValue = dualVibrationValue.Item1;
+ HidVibrationValue rightVibrationValue = dualVibrationValue.Item2;
+
+ float low = Math.Min(1f, (float)((rightVibrationValue.AmplitudeLow * 0.85 + rightVibrationValue.AmplitudeHigh * 0.15) * controllerConfig.Rumble.StrongRumble));
+ float high = Math.Min(1f, (float)((leftVibrationValue.AmplitudeLow * 0.15 + leftVibrationValue.AmplitudeHigh * 0.85) * controllerConfig.Rumble.WeakRumble));
+
+ _gamepad.Rumble(low, high, uint.MaxValue);
+
+ Logger.Debug?.Print(LogClass.Hid, $"Effect for {controllerConfig.PlayerIndex} " +
+ $"L.low.amp={leftVibrationValue.AmplitudeLow}, " +
+ $"L.high.amp={leftVibrationValue.AmplitudeHigh}, " +
+ $"R.low.amp={rightVibrationValue.AmplitudeLow}, " +
+ $"R.high.amp={rightVibrationValue.AmplitudeHigh} " +
+ $"--> ({low}, {high})");
+ }
+ }
+ }
}
}