00cpxxx/wine-xinput

Twin Usb Joystick not work force feedback (vibration) in some games

Closed this issue · 16 comments

Force Feedback (vibration) work in $wine control joy.cpl, but in games this not work, i
have installed "Legacy Of Kain Defiance" and not work, is occurs in others
games force feedback no work.

My device ID is:
ID 0810:0001 Personal Communication Systems, Inc. Dual PSX Adaptor

Is possible solve this? I tested in Windows 10 and force feedback work in this game.

Twin Usb Joystick is device that enable DualShock 2 (Playstation 2 joystick) connect in PC via USB.
045145vs3gi6y63tc6yult

I use the exact same model. The problem is that many games rely on a type of FF called Constant. This specific type is emulated in Windows driver so every joystick has it.

In Wine we don't do that. I usually keep this patch applied to convert this unsupported event to a more supported event. It's been a while since I used it last time (around 1 year) but it seems to still apply in Wine, you could try it.

diff --git a/dlls/dinput/effect_linuxinput.c b/dlls/dinput/effect_linuxinput.c
index d3fede5..3c40eff 100644
--- a/dlls/dinput/effect_linuxinput.c
+++ b/dlls/dinput/effect_linuxinput.c
@@ -175,13 +175,35 @@ static HRESULT WINAPI LinuxInputEffectImpl_Download(
 {
     LinuxInputEffectImpl *This = impl_from_IDirectInputEffect(iface);
     int ret, old_effect_id;
+    struct ff_effect fallback, *effect = &This->effect;
 
     TRACE("(this=%p)\n", This);
+
+    /* Convert unsupported events to periodic */
+    if (effect->type == FF_CONSTANT)
+    {
+        fallback = *effect;
+        fallback.type = FF_PERIODIC;
+        fallback.u.periodic.waveform = FF_SQUARE;
+        fallback.u.periodic.magnitude = This->effect.u.constant.level;
+        fallback.u.periodic.period = 1000;
+        fallback.u.periodic.offset = 0;
+        fallback.u.periodic.phase = 0;
+        fallback.u.periodic.custom_len = 0;
+        effect = &fallback;
+        printf("CONVERT!\n");
+    }
+
     ff_dump_effect(&This->effect);
 
     old_effect_id = This->effect.id;
-    if (ioctl(*(This->fd), EVIOCSFF, &This->effect) != -1)
+    if (ioctl(*(This->fd), EVIOCSFF, effect) != -1)
+    {
+        if (&fallback == effect)
+            This->effect.id = fallback.id;
+        printf("OUT ID = %d\n", This->effect.id);
         return DI_OK;
+    }
 
     /* Linux kernel < 3.14 has a bug that incorrectly assigns an effect ID even
      * on error, restore it here if that is the case. */

This bug is not specific to xinput but I'll keep the bug open to try help you the best I can.

I use Debian Buster, but how to apply your patch in wine? I use wine in debian package.

Well, then you are probably not using my patch also. In order to compile wine you can refer to https://wiki.winehq.org/Building_Wine

It requires some knowleged on console use and compiling stuff. For doubts and help you can refer to
https://forum.winehq.org/

Agora que vi que você é Brasileiro, cara, não existe uma forma mais fácil? Eu não tenho noção de compilação no wine, na verdade eu uso o pacote Debian, eu teria que desinstalar o wine do Debian e compilar um novo a partir do código fonte?

Puts, pior que não tem meu. Porque essas coisas não oficiais não tem um pacote pronto pra baixar e instalar. Precisa compilar na mão mesmo.

Já pensou em mandar esse Patch pra equipe do Wine? Dependendo eles podem implementar na versão 3.0.

Oi, eu estive fora. Esse patch do Xinput não é compatível com o caminho que o Wine está tomando para a implementação do Xinput oficialmente. Então não tem como mandar. O patch de conversão de efeitos eu vou mandar em algum momento.

O que é estranho é o fato da vibração funcionar no $ wine control joy.cpl, mas ao correr o jogo no wine, nada. No Windows 10 foi possível conseguir executando o mesmo jogo com esse recurso (FF) funcionando.
Um instalador .exe para Wine seria possível você fazer? Ou só com o lance do código fonte mesmo?

É uma pena a equipe do Wine não ter resolvido esse caso, o Twin USB Joystick tem uma demanda grande, visto que ele é o segundo no rank do x360ce Database.

Funciona no painel de controle porque no painel ele usa os efeitos suportados pelo kernel do Linux, você vai ver que lá na lista não tem o efeito CONSTANT que é o efeito que os jogos usam em geral. O que o patch faz é converter o efeito constante em um efeito periódico (que sempre tem suporte no kernel).

Agora entendi, de fato, na hora que vai fazer o teste de FF no Linux, o modo
Constant dá como um argumento inválido.

#fftest /dev/input/event13
Force feedback test program.
HOLD FIRMLY YOUR WHEEL OR JOYSTICK TO PREVENT DAMAGES

Device /dev/input/event13 opened
Features:

  • Absolute axes: X, Y, Z, RZ, Hat 0 X, Hat 0 Y,
    [27 00 03 00 00 00 00 00 ]
  • Relative axes:
    [00 00 ]
  • Force feedback effects types: Periodic, Rumble, Gain,
    Force feedback periodic effects: Square, Triangle, Sine,
    [00 00 00 00 00 00 00 00 00 00 03 07 01 00 00 00 ]
  • Number of simultaneous effects: 16

Setting master gain to 75% ... OK
Uploading effect #0 (Periodic sinusoidal) ... OK (id 0)
Uploading effect #1 (Constant) ... Error: Invalid argument
Uploading effect #2 (Spring) ... Error: Invalid argument
Uploading effect #3 (Damper) ... Error: Invalid argument
Uploading effect #4 (Strong rumble, with heavy motor) ... OK (id 1)
Uploading effect #5 (Weak rumble, with light motor) ... OK (id 2)

Exato. E no Windows ele sempre informa suporte pro tipo Constante, independente do hardware suportar ou não. Por isso que é o mais comum usado em jogos. Mas no Linux o kernel não dá esse suporte, aí sempre vai dar errado quando o Wine tenta criar esse efeito. Aí o patch que colei aí em cima converte o efeito para periódico, que é sempre suportado.

Achei outros modelos de controle no google que tem um OK no Constant pro Linux, seria mais no caso da equipe do Kernel Linux implementar os demais effects no futuro pro Twin Usb Joystick?

Eu não sei explicar a diferença entre os vários tipos de efeitos. Tem alguns que fazem sentido só para alguns tipos de controle (como volantes de carro de corrida e manches para jogos de avião). O efeito constante particularmente acho que nunca vai ser suportado diretamente em joysticks comuns.

Agora entendi, torcendo pra que seu patch de conversão seja implementado no wine quando você for mandar, vai ajudar bastante, valeu por tudo.

Bom, agora que está tudo entendido acho que é hora de fechar a issue já que não tem a ver diretamente com o projeto de Xinput.

@00cpxxx, já enviou o patch pra equipe do wine? https://wiki.winehq.org/Submitting_Patches
Queria saber o andamento se eles aceitaram.