mirror of
https://github.com/games-on-whales/wolf.git
synced 2026-10-15 21:12:08 +00:00
[GH-ISSUE #414] Dualsense Adaptive Triggers not working #273
Labels
No labels
🧠 1 - 🤖 999
AMD
bug
bug
cannot reproduce
documentation
duplicate
easy
enhancement
enhancement
enhancement
fixed?
fixed?
good first issue
hard
help wanted
Intel
invalid
LXC
medium
moonlight-protocol
Multi GPU
nixos
not a bug
nvidia
pull-request
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
games-on-whales/wolf#273
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @Masong19hippows on GitHub (May 28, 2026).
Original GitHub issue: https://github.com/games-on-whales/wolf/issues/414
Hey,
So I use a Dualsense controller connected to wolf within a Proxmox VM. Basic controller functions work fine, however some of the features like adaptive triggers and the touchpad don't work. I have tried numerous combinations with forwarding inputs and messing with privileged vs unprivileged containers. I have tested with dualsensectl for the most part.
Before I dive any deeper, I want to confirm that these things are supposed to work. I can't find any good documentation to confirm or deny this. I have also attached my configs below in case you see an obvious issue.
docker-compose.yml:
config.toml app:
The container I am mainly testing with is custom and can be found in the link below. However, I have also tested with the wolf container itself and dualsensectl. I am naive about the inner workings of wolf though, so I am not sure if that is a good way to test or not.
https://github.com/Masong19hippows/GOW-chiaki
Thanks in advance!
@ABeltramo commented on GitHub (May 30, 2026):
Hi there 👋
Sorry it took me long to reply, but I knew it's going to be a long reply..
That isn't required, and it can actually mess with the setup. If you have any of those changes please revert back to the defaults in the quickstart guide
Yep, we've got full support for Gyro, Acceleration, Touchpad, Adaptive triggers, LED and battery status. Obviously this only works with games that fully support that, for example, when using Steam you have to disable steam input and use a game that natively support DualSense for those features to be available.
Troubleshooting
A few things that can help you to figure out what's the issue:
/dev/uhid, make sure that you've added the udev rules in your host from here/dev/input/eventX(for basic joypad support) and/dev/hidrawXthis is the important one, apps/games that support native DualSense would access this instead of the event device.sdl2-jstest --gamecontroller 0IIRC) to access all the advanced features of the DualSense device including gyro and acceleration. You can press the microphone button to cycle the different trigger effects.Hope this helps!
@Masong19hippows commented on GitHub (Jun 1, 2026):
I have already added those udev rules, however /dev/hidraw* is created with root:root instead of root:input, and so I am not sure they are being applied correctly. Manually changing it to rooot:input also doesn't fix the issue.
/dev/hidraw1 is mounted in the container with root:root, however none of the advanced features work. Pressing the microphone button does not do anything to the triggers, and it also doesn't turn on the mic led.
I also get this error periodically when using sdl2-jstest "error: failed to read gamecontrollerdb.txt: Invalid RWops". The test program recognizes it as a dualsense controller though.
I don't know if this is relevant or not, but my controller is also on some older firmware from 2023, and do to jailbreak reasons, I do not want to update it. I don't know if this older firmware presents it differently to the input system or not.
@ABeltramo commented on GitHub (Jun 1, 2026):
Does gyro and acceleration work?
The only other thing I can think of is if the Moonlight client doesn't advertise the features, which one are you using? Can you try a different one?
@Masong19hippows commented on GitHub (Jun 1, 2026):
It looks like gyro and acceleration works.
I am using the official client, but I understand that its not really maintained well. I just tried the client here, but the controller was recognized as "PS5 controller" instead of dualsense. The gyro and acceleration wasn't even an option when running the program. I also tried moonlight repacked from here with the same results.
Still also got this error when using the program "error: failed to read gamecontrollerdb.txt: Invalid RWops".
Want client did you guys use to test this functionality? Is there a preferred client?
@Masong19hippows commented on GitHub (Jun 1, 2026):
I think I might have found part of the issue. It looks like the exact commands sent to the controller that sdl-test uses for adaptive triggers might be out of date.
I plugged my controller into a pc outside of wolf and tried using the test program, but I got the same results. Upon further looking, it looks like dualsense.h hasn't been updated in a year and the commands used were deprecated as of then. I think something just updated and those commands were fully deprecated. Dualsensectl is working fine with this setup and the adaptive triggers are also working for it. It seems like there is just something wrong with sdl2-jstest itself. I can investigate more tonight and maybe send a PR your way.
@ABeltramo commented on GitHub (Jun 1, 2026):
Or maybe this is tied to your specific old firmware that you mentioned before? You are the first one to report this kind of issues with the DualSense implementation..
@Masong19hippows commented on GitHub (Jun 1, 2026):
Forgot to mention it, but I also updated the firmware of the controller to the latest last night - before testing today outside of wolf. Everything should be up-to-date with the latest tests where I mentioned those depricated commands.
Are you able to test this yourself? I can spin up a new VM to make sure its not an environment issue, but I think its a sure sign when dualsensectl works but sdl2-jstest isn't.
@ABeltramo commented on GitHub (Jun 1, 2026):
How are you actually testing this? Running it in a container or have you built our little tool on your host? Which OS and Linux kernel version are you running?
I'll test it again on my end too, I'm running the latest Arch on my dev machine.
@Masong19hippows commented on GitHub (Jun 1, 2026):
Sorry, I didn't realize I gave such little info on my setup.
I compiled your tool locally on a ubuntu 24.04 vm using 6.17 generic kernel. This is outside of any container system and just inside of the vm using USB passthrough via proxmox for the controller.
I also locally compiled dualsensectl for testing. Both are ran with sudo, however sdl2-jstest doesn't do anything to the adaptive triggers while dualsensectl does.
Using the trigger cycle thing with sdl2-jstest though, it looks like the controller itself on the 3rd option rumbles when the triggers are pressed, however the adaptive triggers don't function.
@ABeltramo commented on GitHub (Jun 1, 2026):
Just tested this on Linux
7.0.7-arch2-1usingsdl2-compat 2.32.68-1(sdl3 3.4.8-1) with a DualSense directly plugged to the host andsdl2-jstest --gamecontroller 0correctly picks everything up. Pressing the microphone button cycles thru the different vibration modes including adaptive triggers.I feel this might be tied to the "old"
24.04Ubuntu version; if you could test that in a more recent VM it might help to narrow down the issue.@Masong19hippows commented on GitHub (Jun 1, 2026):
I can work on getting a ubuntu vm setup with 25.05 later today. I try to stay away from the latest "lts" version because alot of stuff isn't in the newer repos until a couple of years down the line. I also had to backport your docker containers for the same reason (intel arc drivers not available on 25.05), so it would make sense if that was the issue.
Did you run that in a vm, and are you able to update your controller and test again? I want to make sure this isn't a weird firmware thing either.
@ABeltramo commented on GitHub (Jun 1, 2026):
No VM, that is a normal Arch installation on bare metal. I haven't checked the DualSense firmware in a while but I'd be surprised if that's the case; this really smells like a kernel change. I'll checkout dualsensectl though, sounds like that's a great little utility to have in the toolbox.
@Masong19hippows commented on GitHub (Jun 1, 2026):
I think you are right with some sort of kernel change. I started to spin up a new vm, and while I did, I also installed the hwe kernel on my 24.04 vm. This changed the kernel from 6.17.0-29 -> 6.17.0-35. This seemed to make it work with root on the host machine. I am not sure if its a kernel difference itself, or maybe some driver that was left out with my original kernel. I use ubuntu server, and I am not sure how kernel drivers work between ubuntu server vs ubuntu. Maybe hwe just added a driver that was missing? Thank you for helping clarify that with me.
However, the original problem still persists, and I think I have a clue on where the issue is. It seems that sdl2-jstest only works with the adaptive triggers if executed with sudo. If I use a non-root user, everything else except for the adaptive triggers, gyro, and acceleration work. If I execute it as non-root, it shows up as "PS5 Controller" instead of "Dualsense wireless controller". This is the exact same behavior that happens when I use my controller through wolf. I think this hints to some underlying permissions issue.
On the host machine, I used chown to change /dev/hidraw1 to root:input instead of root:root that it originally was. This makes sdl2-jstest on the host work as non-root with the adaptive triggers, gyro, and acceleration. I think this means that the udev rules are either incorrect, or not being applied.
Here is the territory that I am not really familiar with though. I don't really know much about the linux input system other than the very basics. I only have 2 files in /etc/udev/rules.d/. Those are "85-wolf-virtual-inputs.rules" with the rules in your guide, and "ubuntu--vg-ubuntu--lv.rules" which contains
"SUBSYSTEM=="block", ACTION=="add|change", ENV{DM_NAME}=="ubuntu--vg-ubuntu--lv", SYMLINK+="disk/by-dname/ubuntu--vg-ubuntu--lv". It doesn't look like the recommended ruleKERNEL=="hidraw*", ATTRS{name}=="Wolf PS5 (virtual) pad", GROUP="input", MODE="0660", ENV{ID_SEAT}="seat9"is being applied.@ABeltramo commented on GitHub (Jun 1, 2026):
Ha! Right right, the bit you are missing is that Wolf runs as
rootin the container by default, so it gets access to/dev/hidrawX.To access that in your host you need to change the udev rule. On my dev machine it works because I have Steam installed which comes with it's own set of rules which gives me user access. Without hidraw SDL can't access the advanced features of the joypad.
With the new kernel, if everything works with sudo, everything should work under Wolf too. Wolf runs as
rootand it then mounts and gives access to the right device to the app containers which are running as unprivileged.@ABeltramo commented on GitHub (Jun 1, 2026):
And just to add: the default Wolf rules are moving virtual joypads to be root only on purpose so that they don't overlap with a normal desktop session; hence achieving full isolation.
Hope all that makes sense now 😅
@Masong19hippows commented on GitHub (Jun 1, 2026):
I agree that everything *should work, but it doesn't. I just rebooted and tried again with a couple of moonlight clients and I got the same result. /dev/hidraw1 is mounted in the container with root:root and gryo/acceleration work, but the adaptive triggers don't function using the cycle method.
Were you able to test using a moonlight client instead of going through the host directly?
That does make sense on why its done like that. I'm just confused on why mine is behaving differently.
@ABeltramo commented on GitHub (Jun 1, 2026):
I haven't tested a full streaming session today but I'm pretty sure it's still working.
I'd suggest testing out a newer VM if you can because that kernel change is really suspicious..
Sorry for all the trouble you are going thru; I'm definitely going to summarise all this in a doc page for troubleshooting.
@Masong19hippows commented on GitHub (Jun 2, 2026):
Sorry this took me awhile. I spun up a ubuntu desktop 26.06 LTS vm using kernel 7.0.0-22, installed docker, did the udev rules, rebooted, then used the official moonlight client with my ps5 controller hardwired to my computer.
This had the exact same behavior as outlined above with my 24.04 server vm. Everything works except the adaptive triggers. Can you please try this as well?
@Masong19hippows commented on GitHub (Jun 4, 2026):
I have been looking online, and it seems to be a loose fact that adaptive triggers don't work over wireless because the audio device required isn't there. Even though I have the controller plugged into my machine using moonlight, dualsensectl lists my controller as bluetooth. I think moonlight/wolf exposes the controller in a way where those audio devices arn't present, and it acts just like as if the controller was wirelessly paired. I don't know how true it is though that adaptive triggers don't work wirelessly. I see it sprinkled in random threads, but there are also people saying in those same threads that it works with first party Sony games on PC wirelessly.
I think I also confirmed something related to this is the issue. When I plug in my controller directly to my host machine, a new sound sound device is created in pulseaudio labeled "alsa_card.usb-Sony_Interactive_Entertainment_DualSense_Wireless_Controller-00" and adaptive triggers work. When I use wolf instead, no sound device is created on my host or in the container. Since the adaptive triggers work off of the sound device, I don't think they can work without something being created/used.
Is there a way to have moonlight/wolf expose this sound device?
@ABeltramo commented on GitHub (Jun 4, 2026):
Sorry for the late reply, I've been busy at work the past couple of days.
The virtual controller that Wolf creates being recognised as a bluetooth device is actually by design. I've been writing a few posts with the low level details of the implementation; here's the last one which cover why the bluetooth implementation is required. As for adaptive triggers not working, that's just not true; see the video in the original PR https://github.com/games-on-whales/wolf/pull/189 which is running our
sdl2-jstestover Moonlight in OSX. I've tested the same setup again today and adaptive triggers are working when cycling thru the modalities with the microphone button.How are you testing this? I feel that you are over relying on
dualsensectl, but we need a more rigorous test:sdl2-jsteston your client?sdl2-jsteston your remote host (running withroot) and a joypad plugged on the client during a streaming session with Wolf actually triggers the adaptive triggers in the client?ghcr.io/games-on-whales/steam:edgeto run our utility in a terminal, are you using a custom image?@Masong19hippows commented on GitHub (Jun 4, 2026):
It's all good
That makes sense. I also just installed the latest sunshine on my Linux server and it's not working for me there as well.
I am using your sdl test command each time. I use docker exec to get a shell into the container where the test program is already installed. Is there a better way to test? The only time I test with dualsensectl is when I am testing on the host machine itself that's running wolf. Even then, I use sdl in combination just because it's easier.
My client is a windows machine with the latest moonlight installed. I assumed your test program could only be used with Linux. Are you saying the sdl2 test can be used on windows? I used this to test the adaptive trigger functionality on the Windows client, and it works fine.
I have tried this numerous times with various config options, and I still get the same result. Everything works except for the adaptive triggers. This is the same for normal sunshine running on the host without wolf as well.
At first I was using that image + custom patch applied so that I could backport it to Ubuntu 24.04 with Intel arc support. However, I have been using the official image like you have since the first test. I think this issue lies outside of wolf though as it's not working with sunshine either.
I only have a Windows computer with moonlight running as a client right now. It sounds like you are running moonlight on a Linux machine. I have a machine I could repurpose to try that instead. I will let you know the results.
I understand the issue is probably with something on my setup, but I am just super confused on what could be different. I'm starting to think this is something on the client side because everything else is default. With a fresh Ubuntu desktop install, fresh wolf install, etc.
I have only been testing with different moonlight clients on the same windows machine. I can try spinning up a windows VM as well to act as a different client to test with. My windows machine is a work laptop with a bunch of security stuff installed so there's a possibility some driver is not working correctly.
@ABeltramo commented on GitHub (Jun 4, 2026):
Ok, that gives me a much better picture. The underlying implementation of both Sunshine and Wolf for the virtual DualSense is the same (as you probably have got by now) but it's at least a bit reassuring that it's consistently not working and it's not just something specific to our stack.
Now, I'm not sure about Windows.. I have left that boat years ago, and I'd like to keep it that way for the time being. 😅
I'm not sure about SDL in WSL, I guess you could try, but it wouldn't surprise me if
hidrawisn't available in WSL for one reason or another. I have tested the website that you've linked on Linux with a USB wired DS joypad and adaptive triggers work for me, so I guess that test is a good one.I would guess that there's something wrong with the old kernel, but you've tested Ubuntu 26.06 and that doesn't change anything, right? I'm a bit lost as to what else to try, could it be something with how the VM is setup? Which Moonlight client have you tested and which version? The PR has been merged in the official Moonlight QT roughly a year ago so I would guess you already have the required change bundled but it wouldn't hurt to double-check..
@Masong19hippows commented on GitHub (Jun 5, 2026):
hidraw indeed is not available on wsl. I have tested with 26.06 with wolf as the server on it with the same results.
I just spun up 2 vms to act as clients. One of them was a windows vm and the other is a linux vm. I passed through my controller to each one to test, and I get the exact same behavior. On the linux vm client, I used the sdl2-jstest program and it worked flawlessly. However once moonlight passed the input, everything except for the adaptive triggers worked witht he same test program on the server. This was the same behavior with windows except I was using that website to test instead. I also executed moonlight with root on the linux client.
The vms are setup through proxmox, and the servers are also vms on the same proxmox server. The original windows client is my work laptop though on bare metal. I tried with the latest moonlight from the official website each time (6.1). I
I could try bare metal, but honestly I'm at a point where I'm convinced there is something wrong with my setup, but I am not sure what. Maybe something to do with proxmox? I have heard people using usb-over-ip instead and I investigated those options with success. I think I might just use those until I have more time to look at this. Might open an issue on sunshine when I do. Kinda wondering if its a difference between ubuntu/arch as well. I know ubuntu isn't always good with usb devices
@ABeltramo commented on GitHub (Jun 5, 2026):
Really odd, I'm afraid I don't have any other idea on how to unlock this..
I'm going to close this because it feels like it's something very specific with your setup, feel free to ping me and link this issue if you try to open up an issue on Sunshine.