From 7d88a12dc0371eb655f4aeec7bff4985c171311e Mon Sep 17 00:00:00 2001 From: Bruno Jesus <00cpxxx@gmail.com> Date: Wed, 24 Aug 2016 22:55:56 -0300 Subject: [PATCH] dinput: Fix calculation of too small periods for periodic effect. Based on ideas by Elias Vanderstuyft. Signed-off-by: Bruno Jesus <00cpxxx@gmail.com> Signed-off-by: Alexandre Julliard --- dlls/dinput/effect_linuxinput.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/dlls/dinput/effect_linuxinput.c b/dlls/dinput/effect_linuxinput.c index bbcadf5ce40..0d2fdf5e77c 100644 --- a/dlls/dinput/effect_linuxinput.c +++ b/dlls/dinput/effect_linuxinput.c @@ -588,19 +588,29 @@ static HRESULT WINAPI LinuxInputEffectImpl_SetParameters( if (dwFlags & DIEP_TRIGGERREPEATINTERVAL) This->effect.trigger.interval = peff->dwTriggerRepeatInterval / 1000; - if (dwFlags & DIEP_TYPESPECIFICPARAMS) { - if (!(peff->lpvTypeSpecificParams)) - return DIERR_INCOMPLETEEFFECT; - if (type == DIEFT_PERIODIC) { - LPCDIPERIODIC tsp; + if (dwFlags & DIEP_TYPESPECIFICPARAMS) + { + if (!(peff->lpvTypeSpecificParams)) + return DIERR_INCOMPLETEEFFECT; + + if (type == DIEFT_PERIODIC) + { + DIPERIODIC *tsp; if (peff->cbTypeSpecificParams != sizeof(DIPERIODIC)) return DIERR_INVALIDPARAM; tsp = peff->lpvTypeSpecificParams; - This->effect.u.periodic.magnitude = (tsp->dwMagnitude / 10) * 32; - This->effect.u.periodic.offset = (tsp->lOffset / 10) * 32; - This->effect.u.periodic.phase = (tsp->dwPhase / 9) * 8; /* == (/ 36 * 32) */ - This->effect.u.periodic.period = tsp->dwPeriod / 1000; - } else if (type == DIEFT_CONSTANTFORCE) { + + This->effect.u.periodic.magnitude = (tsp->dwMagnitude / 10) * 32; + This->effect.u.periodic.offset = (tsp->lOffset / 10) * 32; + This->effect.u.periodic.phase = (tsp->dwPhase / 9) * 8; /* == (/ 36 * 32) */ + /* dinput uses microseconds, linux uses miliseconds */ + if (tsp->dwPeriod <= 1000) + This->effect.u.periodic.period = 1; + else + This->effect.u.periodic.period = tsp->dwPeriod / 1000; + } + else if (type == DIEFT_CONSTANTFORCE) + { LPCDICONSTANTFORCE tsp; if (peff->cbTypeSpecificParams != sizeof(DICONSTANTFORCE)) return DIERR_INVALIDPARAM; -- 2.11.4.GIT