Rémi Bernon : winebus.sys: Add a repeat count value to haptics output report.

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


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

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

winebus.sys: Add a repeat count value to haptics output report.

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

---

 dlls/winebus.sys/hid.c | 11 ++++++++++-
 dlls/xinput1_3/main.c  |  6 ++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/dlls/winebus.sys/hid.c b/dlls/winebus.sys/hid.c
index d308e7f276b..1b2681fdb94 100644
--- a/dlls/winebus.sys/hid.c
+++ b/dlls/winebus.sys/hid.c
@@ -314,6 +314,7 @@ struct hid_haptics_waveform
 {
     UINT16 intensity;
     BYTE manual_trigger;
+    BYTE repeat_count;
 };
 #include "poppack.h"
 
@@ -373,6 +374,13 @@ BOOL hid_device_add_haptics(struct unix_device *iface)
             REPORT_SIZE(1, 8),
             REPORT_COUNT(1, 1),
             OUTPUT(1, Data|Var|Abs),
+
+            USAGE(1, HID_USAGE_HAPTICS_REPEAT_COUNT),
+            LOGICAL_MINIMUM(1, 0),
+            LOGICAL_MAXIMUM(1, 1),
+            REPORT_SIZE(1, 8),
+            REPORT_COUNT(1, 1),
+            OUTPUT(1, Data|Var|Abs),
         END_COLLECTION,
     };
 
@@ -1066,7 +1074,8 @@ static void hid_device_set_output_report(struct unix_device *iface, HID_XFER_PAC
             {
                 haptics->waveform_intensity[report->manual_trigger] = report->intensity;
                 duration_ms = haptics->features.waveform_cutoff_time_ms;
-                io->Status = iface->hid_vtbl->haptics_start(iface, duration_ms, *rumble_intensity, *buzz_intensity);
+                if (!report->repeat_count) io->Status = STATUS_SUCCESS;
+                else io->Status = iface->hid_vtbl->haptics_start(iface, duration_ms, *rumble_intensity, *buzz_intensity);
             }
         }
     }
diff --git a/dlls/xinput1_3/main.c b/dlls/xinput1_3/main.c
index 2179da1db72..bc0baa21ebf 100644
--- a/dlls/xinput1_3/main.c
+++ b/dlls/xinput1_3/main.c
@@ -320,6 +320,9 @@ static DWORD HID_set_state(struct xinput_controller *controller, XINPUT_VIBRATIO
     status = HidP_SetUsageValue(HidP_Output, HID_USAGE_PAGE_HAPTICS, 0, HID_USAGE_HAPTICS_MANUAL_TRIGGER,
                                 controller->hid.haptics_rumble_ordinal, preparsed, report_buf, report_len);
     if (status != HIDP_STATUS_SUCCESS) WARN("HidP_SetUsageValue MANUAL_TRIGGER returned %#lx\n", status);
+    status = HidP_SetUsageValue(HidP_Output, HID_USAGE_PAGE_HAPTICS, 0, HID_USAGE_HAPTICS_REPEAT_COUNT,
+                                1, preparsed, report_buf, report_len);
+    if (status != HIDP_STATUS_SUCCESS) WARN("HidP_SetUsageValue REPEAT_COUNT returned %#lx\n", status);
     if (!HidD_SetOutputReport(controller->device, report_buf, report_len))
     {
         WARN("HidD_SetOutputReport failed with error %lu\n", GetLastError());
@@ -335,6 +338,9 @@ static DWORD HID_set_state(struct xinput_controller *controller, XINPUT_VIBRATIO
     status = HidP_SetUsageValue(HidP_Output, HID_USAGE_PAGE_HAPTICS, 0, HID_USAGE_HAPTICS_MANUAL_TRIGGER,
                                 controller->hid.haptics_buzz_ordinal, preparsed, report_buf, report_len);
     if (status != HIDP_STATUS_SUCCESS) WARN("HidP_SetUsageValue MANUAL_TRIGGER returned %#lx\n", status);
+    status = HidP_SetUsageValue(HidP_Output, HID_USAGE_PAGE_HAPTICS, 0, HID_USAGE_HAPTICS_REPEAT_COUNT,
+                                1, preparsed, report_buf, report_len);
+    if (status != HIDP_STATUS_SUCCESS) WARN("HidP_SetUsageValue REPEAT_COUNT returned %#lx\n", status);
     if (!HidD_SetOutputReport(controller->device, report_buf, report_len))
     {
         WARN("HidD_SetOutputReport failed with error %lu\n", GetLastError());




More information about the wine-cvs mailing list