Rémi Bernon : xinput1_3: Use the implicit Stop waveform ordinal to stop the effects.

Alexandre Julliard julliard at winehq.org
Tue Feb 15 16:07:20 CST 2022


Module: wine
Branch: master
Commit: a4f7ef298c127fbff3b2d004a9b6ab1d358b9187
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a4f7ef298c127fbff3b2d004a9b6ab1d358b9187

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Tue Feb 15 09:03:37 2022 +0100

xinput1_3: Use the implicit Stop waveform ordinal to stop the effects.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/xinput1_3/main.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/dlls/xinput1_3/main.c b/dlls/xinput1_3/main.c
index e669fa0af71..2179da1db72 100644
--- a/dlls/xinput1_3/main.c
+++ b/dlls/xinput1_3/main.c
@@ -81,6 +81,8 @@ struct xinput_controller
         char *feature_report_buf;
 
         BYTE haptics_report;
+        BYTE haptics_none_ordinal;
+        BYTE haptics_stop_ordinal;
         BYTE haptics_rumble_ordinal;
         BYTE haptics_buzz_ordinal;
     } hid;
@@ -244,6 +246,8 @@ static BOOL controller_check_caps(struct xinput_controller *controller, HANDLE d
         return TRUE;
     }
 
+    controller->hid.haptics_none_ordinal = 1; /* implicit None waveform ordinal, from the HID spec */
+    controller->hid.haptics_stop_ordinal = 2; /* implicit Stop waveform ordinal, from the HID spec */
     controller->hid.haptics_buzz_ordinal = 0;
     controller->hid.haptics_rumble_ordinal = 0;
     for (i = 3; status == HIDP_STATUS_SUCCESS; ++i)
@@ -291,6 +295,22 @@ static DWORD HID_set_state(struct xinput_controller *controller, XINPUT_VIBRATIO
 
     if (!controller->enabled) return ERROR_SUCCESS;
 
+    if (!state->wLeftMotorSpeed && !state->wRightMotorSpeed)
+    {
+        status = HidP_InitializeReportForID(HidP_Output, report_id, preparsed, report_buf, report_len);
+        if (status != HIDP_STATUS_SUCCESS) WARN("HidP_InitializeReportForID returned %#lx\n", status);
+        status = HidP_SetUsageValue(HidP_Output, HID_USAGE_PAGE_HAPTICS, 0, HID_USAGE_HAPTICS_MANUAL_TRIGGER,
+                                    controller->hid.haptics_stop_ordinal, preparsed, report_buf, report_len);
+        if (status != HIDP_STATUS_SUCCESS) WARN("HidP_SetUsageValue MANUAL_TRIGGER returned %#lx\n", status);
+        if (!HidD_SetOutputReport(controller->device, report_buf, report_len))
+        {
+            WARN("HidD_SetOutputReport failed with error %lu\n", GetLastError());
+            return GetLastError();
+        }
+
+        return 0;
+    }
+
     /* send haptics rumble report (left motor) */
     status = HidP_InitializeReportForID(HidP_Output, report_id, preparsed, report_buf, report_len);
     if (status != HIDP_STATUS_SUCCESS) WARN("HidP_InitializeReportForID returned %#lx\n", status);




More information about the wine-cvs mailing list