Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
usernatilds opened this issue Jan 11, 2018 · 16 comments
Closed

Comments

@usernatilds
Copy link

usernatilds commented Jan 11, 2018

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

@00cpxxx
Copy link
Owner

00cpxxx commented Jan 11, 2018

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.

@usernatilds
Copy link
Author

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

@00cpxxx
Copy link
Owner

00cpxxx commented Jan 11, 2018

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/

@usernatilds
Copy link
Author

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?

@00cpxxx
Copy link
Owner

00cpxxx commented Jan 12, 2018

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.

@usernatilds
Copy link
Author

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

@00cpxxx
Copy link
Owner

00cpxxx commented Jan 26, 2018

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.

@usernatilds
Copy link
Author

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.

@00cpxxx
Copy link
Owner

00cpxxx commented Jan 27, 2018

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).

@usernatilds
Copy link
Author

usernatilds commented Jan 27, 2018

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)

@00cpxxx
Copy link
Owner

00cpxxx commented Jan 27, 2018

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.

@usernatilds
Copy link
Author

usernatilds commented Jan 27, 2018

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?

@00cpxxx
Copy link
Owner

00cpxxx commented Jan 27, 2018

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.

@usernatilds
Copy link
Author

usernatilds commented Jan 27, 2018

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

@00cpxxx
Copy link
Owner

00cpxxx commented Jan 28, 2018

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 00cpxxx closed this as completed Jan 28, 2018
@usernatilds
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants