[PATCH 1/5] xinput1_3: Use the implicit Stop waveform ordinal to stop the effects.
Rémi Bernon
rbernon at codeweavers.com
Tue Feb 15 02:03:37 CST 2022
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
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);
--
2.34.1
More information about the wine-devel
mailing list