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