Commit a4f7ef29 authored by Rémi Bernon's avatar Rémi Bernon Committed by Alexandre Julliard

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

parent 3a95a4a0
...@@ -81,6 +81,8 @@ struct xinput_controller ...@@ -81,6 +81,8 @@ struct xinput_controller
char *feature_report_buf; char *feature_report_buf;
BYTE haptics_report; BYTE haptics_report;
BYTE haptics_none_ordinal;
BYTE haptics_stop_ordinal;
BYTE haptics_rumble_ordinal; BYTE haptics_rumble_ordinal;
BYTE haptics_buzz_ordinal; BYTE haptics_buzz_ordinal;
} hid; } hid;
...@@ -244,6 +246,8 @@ static BOOL controller_check_caps(struct xinput_controller *controller, HANDLE d ...@@ -244,6 +246,8 @@ static BOOL controller_check_caps(struct xinput_controller *controller, HANDLE d
return TRUE; 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_buzz_ordinal = 0;
controller->hid.haptics_rumble_ordinal = 0; controller->hid.haptics_rumble_ordinal = 0;
for (i = 3; status == HIDP_STATUS_SUCCESS; ++i) for (i = 3; status == HIDP_STATUS_SUCCESS; ++i)
...@@ -291,6 +295,22 @@ static DWORD HID_set_state(struct xinput_controller *controller, XINPUT_VIBRATIO ...@@ -291,6 +295,22 @@ static DWORD HID_set_state(struct xinput_controller *controller, XINPUT_VIBRATIO
if (!controller->enabled) return ERROR_SUCCESS; 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) */ /* send haptics rumble report (left motor) */
status = HidP_InitializeReportForID(HidP_Output, report_id, preparsed, report_buf, report_len); status = HidP_InitializeReportForID(HidP_Output, report_id, preparsed, report_buf, report_len);
if (status != HIDP_STATUS_SUCCESS) WARN("HidP_InitializeReportForID returned %#lx\n", status); if (status != HIDP_STATUS_SUCCESS) WARN("HidP_InitializeReportForID returned %#lx\n", status);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment