[RFC] dinput: Length can actually be 0.

Vincent Pelletier plr.vincent at gmail.com
Tue Mar 29 15:57:17 CDT 2011

(Sorry for sending to wine-patches initially, it was intended for wnie-devel.)

This fixes force feedback devices slamming for 10ms at full strength, as
attack is an absolute value, not a factor of effect level.

Daniel Remenak told me that 0-length envelopes (attack and/or fade, not sure 
which combination) cause the effect to be not played (possibly played with 0-
level) on devices using the Linux iforce driver. This is the reason of the 
comment in the code.

But to other drivers, such as hid-ff, this code causes the device to jump as 
full strength, which was reported (to me directly) for example when playing 
"Live for Speed"[1] with a steering wheel having strong force feedback 
(Logitech G27).

My question: Is it acceptable to risk some regression for iforce driver (until 
bug is identified) to fix other devices ?
I guess iforce devices also suffer from the too-strong attack/fade effect.

[1] http://www.lfs.net (demo available, I didn't try it)
 dlls/dinput/effect_linuxinput.c |   11 +++++------
 1 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/dlls/dinput/effect_linuxinput.c b/dlls/dinput/effect_linuxinput.c
index fbc5994..0154f49 100644
--- a/dlls/dinput/effect_linuxinput.c
+++ b/dlls/dinput/effect_linuxinput.c
@@ -606,13 +606,12 @@ static HRESULT WINAPI 
         else env = NULL; 
 	if (peff->lpEnvelope == NULL) {
-	    /* if this type had an envelope, reset it
-	     * note that length can never be zero, so we set it to something 
minuscule */
+	    /* if this type had an envelope, reset it */
 	    if (env) {
-		env->attack_length = 0x10;
-		env->attack_level = 0x7FFF;
-		env->fade_length = 0x10;
-		env->fade_level = 0x7FFF;
+		env->attack_length = 0;
+		env->attack_level = 0;
+		env->fade_length = 0;
+		env->fade_level = 0;
 	} else {
 	    /* did we get passed an envelope for a type that doesn't even have 
one? */

More information about the wine-devel mailing list