protonscr

DualSense advanced features compatibility

protonopen
ValveSoftware/Proton#5900 · opened 2022-06-12 by ClearlyClaire · updated 2026-08-22 · 360 comments · github
2 matching comments, n / p to jump
CClearlyClaire 2022-06-12 github

DualSense feature compatibility

EDIT: the patches at discussed in this thread have now been merged in Proton Experimental; they allow using DualSense-specific features (Adaptive triggers, speaker, VCM-based haptics) in at least:

  • Final Fantasy XIV Online
  • Final Fantasy 7 Remake Intergrade (the game does not make use of the speaker, and only makes light use of the other features)
  • Ghostwire: Tokyo (note that the game does not appear to use the speaker, unlike the PS5 version)
  • Deathloop (for the speaker to be used, XAudio2 needs to be disabled, see https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1180859190)
  • Returnal™
  • Season: A Letter to the Future
  • Horizon: Forbidden West
  • The Last of Us™ Part 1

All features require the DualSense to be plugged through USB before starting the game and Steam Input to be disabled for Playstation controllers (or simply Steam Input being disabled for the specific game). I have not found hid-playstation to cause any issue (apart from registering additional events on the touchpad which could interfere in some games).

Technical details

All DualSense features are implemented directly in the game application, with no additional driver. However, the games' implementation rely on low-level APIs that may not be implemented in Wine or details that may be different on a typical Linux environment.

Adaptive triggers work through custom HID reports, so this will work out of the box as long as Steam Input is disabled.

Speaker and advanced haptics rely on a 4-channel audio device, and the difficulties lie in games finding and selecting that audio output. Various games use various means to do it, but from what I have seen, it mainly boils down to one or more of these:

  • have the audio device name contain “Wireless Controller” (FF14 and FF7R do that)
  • get the BaseContainerID from the HID device and select the first MMDevice with the same ContainerID (Ghostwire: Tokyo, Deathloop)
  • get the BaseContainerID from the HID device and use SetupDi to find an audio device with the same BaseContainerID (Deathloop does that for the speaker if XAudio2 is available)

I have written a sample test application to sum up these findings and test Wine/Proton against those behaviors without requiring the games: https://github.com/ClearlyClaire/dualsense-games-compat-check

CClearlyClaire 2022-06-12 github

EDIT: this post is only of historical interest, recent versions of Wine and Proton name the audio device appropriately, and no renaming is needed on the system side

I made some progress with it, it seems like it's mainly a naming issue indeed. Renaming the device from the default “DualSense wireless controller (PS5)” to “Wireless Controller” lets Final Fantasy XIV Online enable the speakers and output interface sounds through them. Haptics feedback does not seem to work, though, but I'm not sure why.

For the record, I changed the device name through the following command:
pacmd 'update-sink-proplist alsa_output.usb-Sony_Interactive_Entertainment_Wireless_Controller-00.analog-surround-40 device.description="Wireless Controller" device.product.name="Wireless Controller"'

EDIT: alternatively, using ALSA for audio in FF XIV's prefix also lets it use the speakers (protontricks 312060 sound=alsa)
EDIT2: it seems that at least when using pulseaudio, FFXIV outputs the interface sounds and only the interface sounds on all 4 channels. This also occurs with a module-null-sink with device.description="Wireless Controller" device.product.name="Wireless Controller"

BBitwolfies 2022-06-13 github

Triggers only work through USB on Windows, your controller is wired right? I'm very interested to know if Proton can pass the triggers over.

CClearlyClaire 2022-06-13 github

Yes, I'm trying all of these features wired, and I'm not aware of any game providing support for any of these features over bluetooth. As said earlier, the only game I have been able to try so far is FF XIV Online, and as far as I understand, the Triggers are only used for a handful quests late in the game and I'm not anywhere close to that, so I have not been able to test that. But considering the game consistently resets the Adaptive Triggers settings, I think this would work fine.

Ggabriele2000 2022-06-14 github

Triggers only work through USB on Windows, your controller is wired right? I'm very interested to know if Proton can pass the triggers over.

Wrong.
Try this and see for yourself: triggers can be configured even via bluetooth

BBitwolfies 2022-06-14 github

Triggers only work through USB on Windows, your controller is wired right? I'm very interested to know if Proton can pass the triggers over.

Wrong. Try this and see for yourself: triggers can be configured even via bluetooth

I should say that zero games currently pass them over bluetooth, every single one demands usb atm.

Ggabriele2000 2022-06-14 github

Triggers only work through USB on Windows, your controller is wired right? I'm very interested to know if Proton can pass the triggers over.

Wrong. Try this and see for yourself: triggers can be configured even via bluetooth

I should say that zero games currently pass them over bluetooth, every single one demands usb atm.

Faking USB connection even in bluetooth mode?

CClearlyClaire 2022-06-15 github

Faking USB connection even in bluetooth mode?

I am not sure how feasible that is (though doing that only for the main HID device should be doable), but my understanding is that current userland drivers shipped in games use an audio device (as exposed by the system) for VCM-based haptics, microphone and speakers. Over USB, the audio uses a standard protocol and will be recognized out of the box, but over bluetooth, this uses a completely different custom protocol that needs to be implemented.

Either way, I initially created this topic to understand and track support in games that offer official compatibility, not to discuss ways to extend that compatibility to connection methods not natively supported by those games.

Ggabriele2000 2022-06-15 github

Faking USB connection even in bluetooth mode?

I am not sure how feasible that is (though doing that only for the main HID device should be doable), but my understanding is that current userland drivers shipped in games use an audio device (as exposed by the system) for VCM-based haptics, microphone and speakers. Over USB, the audio uses a standard protocol and will be recognized out of the box, but over bluetooth, this uses a completely different custom protocol that needs to be implemented.

Either way, I initially created this topic to understand and track support in games that offer official compatibility, not to discuss ways to extend that compatibility to connection methods not natively supported by those games.

Roger that. That being said: sony should update its HID-Playstation driver to include VCM-based haptics support + microphone over bluetooth, since that's the only limit (as far as I know).

CClearlyClaire 2022-06-15 github

Although that is off-topic, I have started exploring the possibility of exposing a bluetooth-connected DualSense to Windows games as if it were connected through USB. This seems possible, but involves translating reports between USB and Bluetooth as they are slightly different.

I wrote this sample program, it's very rough and incomplete and actually doesn't get you any of the advanced DualSense feature because it does not forward/translate feature requests from the host to the controller (the feature request I'm seeing FFXIV use over USB is different from those used by trigger-control and hid-playstation, so I'm unsure how to translate it), but demonstrates that at least Final Fantasy XIV is happy to connect to a “fake” HID device. It is also happy to output UI sounds to a dummy “Wireless Controller” sound device when using the “fake” HID device.

EDIT: updated to translate 0x2 USB output reports to 0x31 Bluetooth reports, which does let FFXIV reset the Adaptive Trigger settings

CClearlyClaire 2022-06-16 github

I finally managed to get haptic feedback working! For some reason, winepulse.drv will use the capabilities of the default audio device for reporting the internal supported capabilities for any subsequent stream. This means to get haptic feedback, you need to set the Wireless Controller to be your default output device when starting the game, and you can then switch the device to something else.

EDIT: more precisely, if the default output only supports stereo, all AudioClient_GetMixFormat calls made by the game will return formats with nChannels: 2; dwChannelMask: 00000003. I am not sure where exactly the fault lies though.

BBitwolfies 2022-06-16 github

Hope Valve can look into this and streamline it all.

CClearlyClaire 2022-06-16 github

Edited the first post with the list of quirks I ran into and the workarounds I have found, including an udev rule to make sure the audio device automatically gets the proper name when the DualSense is plugged. I think the AudioClient_GetMixFormat is a Proton/wine bug but I'm not familiar enough with the code to get much further.

HHadrianneue 2022-06-18 github

Edited the first post with the list of quirks I ran into and the workarounds I have found, including an udev rule to make sure the audio device automatically gets the proper name when the DualSense is plugged. I think the AudioClient_GetMixFormat is a Proton/wine bug but I'm not familiar enough with the code to get much further.

Death Stranding is also a game where adaptive triggers work by default but no haptic feedback. renaming and setting it as default device also does not work :/

GGloriousEggroll 2022-06-18 github
  • Wireless Controller

This may be something patchable in wine:

/dlls/hidclass.sys/device.c

    /* Sony controllers */
    { .id = L"VID_054C&PID_05C4", .product = L"Wireless Controller" },
    { .id = L"VID_054C&PID_09CC", .product = L"Wireless Controller" },
    { .id = L"VID_054C&PID_0BA0", .product = L"Wireless Controller" },
    { .id = L"VID_054C&PID_0CE6", .product = L"Wireless Controller" },

I guess we need to know what these controllers actually show up named as. We know the PS5 controller (054c, 0ce6) comes up as "DualSense wireless controller (PS5)" -- maybe a quick check into the kernel code will tell us what the others register as.

-edit-

When the controller is plugged in it comes up as DualSense wireless controller (PS5)" but when it connects via bluetooth it comes up as "Wireless Controller"

BBitwolfies 2022-06-18 github

Running into the an issue with FF7 on Linux, because it shows up as "Wireless controller" and not Dualsense, rumble fails to function, its very, very annoying. I guess it needs to be named the exact same as it is on Windows in kernel for it to function, is that what you're getting at @GloriousEggroll?

CClearlyClaire 2022-06-18 github
  • Wireless Controller

This may be something patchable in wine:

/dlls/hidclass.sys/device.c

    /* Sony controllers */
    { .id = L"VID_054C&PID_05C4", .product = L"Wireless Controller" },
    { .id = L"VID_054C&PID_09CC", .product = L"Wireless Controller" },
    { .id = L"VID_054C&PID_0BA0", .product = L"Wireless Controller" },
    { .id = L"VID_054C&PID_0CE6", .product = L"Wireless Controller" },

I guess we need to know what these controllers actually show up named as. We know the PS5 controller (054c, 0ce6) comes up as "DualSense wireless controller (PS5)" -- maybe a quick check into the kernel code will tell us what the others register as.

I'm not sure what you mean. Do you suggest changing how it is exposed within wine from “Wireless Controller” to something else? The games expect “Wireless Controller” for both the HID device and the audio device. The issue here is the audio device in wine not being called that.

Death Stranding is also a game where adaptive triggers work by default but no haptic feedback. renaming and setting it as default device also does not work :/

Same issue :/
The game does open the audio device, though, but does not seem to output anything to it. I will investigate.
EDIT: no idea why the game doesn't output anything to the “Wireless Controller” audio device after opening it.

BBitwolfies 2022-06-18 github

Rumble in FF7 remake works just fine with my DS4, even uses the proper icons compared to the DS5, yet both report to the game as "wireless controller". I guess whatever is preventing haptics on linux is still at play, maybe it isnt the name thing?

CClearlyClaire 2022-06-18 github

Yeah, I can confirm that all the observations I made until now hold true for FF7R: in order to open the audio device properly, it needs it to be called “Wireless Controller” and it needs to be started with a 4-channel default audio device… but unlike with FFXIV this isn't enough to have any kind of rumble.

Likely unrelated, but note that Steam has just been updated with:

  • Show firmware update dialog for DualSense(tm) Wireless Controllers on Windows
  • Enable improved rumble emulation on DualSense(tm) Wireless Controllers with updated firmware
BBitwolfies 2022-06-18 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1159357657

Really funny timing but this just seems to be them intergrating Sonys firmware update program into steam, which is super neat albeit windows only (Despite adding settings to the linux client)

With spiderman coming out I assume sony is gonna take a second look at their pc drivers, maybe make this stuff work wirelessly out of the box.

BBitwolfies 2022-06-18 github

I find it very odd that adaptive triggers work ootb on Linux through proton (At least thats what was said here, cant confirm myself) along with the speaker sync rumble, but any game that attempts to use the native DS5 rumble api just, doesn't.

CClearlyClaire 2022-06-18 github

I find it very odd that adaptive triggers work ootb on Linux through proton (At least thats what was said here, cant confirm myself) along with the speaker sync rumble, but any game that attempts to use the native DS5 rumble api just, doesn't.

Adaptive triggers is relatively simple, it's just output reports on an HID device which is properly exposed. VCM-based haptic feedback also requires access to the audio device. It works on FFXIV once you've dealt with the quirks I have listed. Not sure why that isn't enough for FF7R or Death Stranding though. What do you call “speaker sync rumble”?

BBitwolfies 2022-06-18 github

I find it very odd that adaptive triggers work ootb on Linux through proton (At least thats what was said here, cant confirm myself) along with the speaker sync rumble, but any game that attempts to use the native DS5 rumble api just, doesn't.

Adaptive triggers is relatively simple, it's just output reports on an HID device which is properly exposed. VCM-based haptic feedback also requires access to the audio device. It works on FFXIV once you've dealt with the quirks I have listed. Not sure why that isn't enough for FF7R or Death Stranding though. What do you call “speaker sync rumble”?

Your DS5 should appear in your speaker list, along with its mic, its primary purpose is to have audio go to the controller and your normal listening device to vibrate in sync with the sounds.

CClearlyClaire 2022-06-18 github

Your DS5 should appear in your speaker list, along with its mic, its primary purpose is to have audio go to the controller and your normal listening device to vibrate in sync with the sounds.

Ah, going through that audio device is precisely how the “native DS5 rumble api” works over USB. First two channels are for jack/speaker and the last two for rumble. Games such as FFXIV and FF7R open that device and FFXIV outputs interface sounds (if enabled) and rumble (for steps, mount effects etc.) through it. The trick is that Windows games with DualSense support find this device based on its name, which is not the expected one by default on linux.

@GloriousEggroll my understanding is that to address that in Wine itself, the device name should be overridden in https://github.com/ValveSoftware/wine/blob/a7618abea5ffeb3bfb1e69c0dbcdc1008bd88163/dlls/winepulse.drv/pulse.c#L550 or similar.

Though as stated earlier, this does not appear to be enough to get haptic feedback working in all games.

EDIT: I have identified a difference between FFXIV and FF7R, in that unlike FFXIV which uses 4-channel output, FF7R may attempt to output rumble data as single-channel audio, though I am still not sure why nothing seems to be actually sent to the device:

6114.311:0144:trace:pulse:AudioClient_IsFormatSupported (0000000000704250)->(0, 0000000000809F6C, 00000000004E6E28)
6114.311:0144:trace:pulse:dump_fmt wFormatTag: 0x3 (WAVE_FORMAT_IEEE_FLOAT)
6114.311:0144:trace:pulse:dump_fmt nChannels: 1
6114.311:0144:trace:pulse:dump_fmt nSamplesPerSec: 48000
6114.311:0144:trace:pulse:dump_fmt nAvgBytesPerSec: 192000
6114.311:0144:trace:pulse:dump_fmt nBlockAlign: 4
6114.311:0144:trace:pulse:dump_fmt wBitsPerSample: 32
6114.311:0144:trace:pulse:dump_fmt cbSize: 0
6114.311:0144:trace:pulse:AudioClient_IsFormatSupported returning: 00000000 0000000000000000

HHadrianneue 2022-06-18 github

EDIT: my mistake, haptic feedback not working on Ghostwire: Tokyo, even disabling pulseaudio still produces the same effect, still interesting in comparison to other games like Death Stranding where it doesn't vibrate at all.

original comment:
Interesting find i just had with Ghostwire: Tokyo, with no steam input, when pressing R2 to charge an attack or L2 to grab a core you get both adaptive triggers and haptic feedback, feels awesome, and a very subtle feedback when you collect ether.

Apart from that the controller is dead... vibration works when using steam input, just as a xbox controller would vibrate... edit: and a broken adaptive trigger "breaking eggshell" effect with no haptic feedback.

CClearlyClaire 2022-06-18 github

Interesting find i just had with Ghostwire: Tokyo, with no steam input, when pressing R2 to charge an attack or L2 to grab a core you get both adaptive triggers and haptic feedback, feels awesome, and a very subtle feedback when you collect ether.

Apart from that the controller is dead... vibration works when using steam input, just as a xbox controller would vibrate...

Can you open pavumeter on your DualSense audio output and see what it shows when performing those actions? Does it show anything at all? If so, are the 4 channels used the same way? It's a pretty wild guess, but I wonder if this could be a mixing issue, e.g. the game using a 1-channel audio stream that doesn't get properly mixed for “basic” vibrations, and more deliberately using the 4 channels to better effect (e.g. FFXIV outputs to all channels presumably because it also uses the speaker).

HHadrianneue 2022-06-18 github

EDIT: see my last comment above

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1159370452

can't get it to work, damn. if it just run pacmd list-sinks it shows RUNNING status when passing audio to the dualsense, no surprises there, it shows idle if not doing anything, ok... but it shows SUSPENDED when running the game, it doesnt report anything... i could be wrong and perhaps its just vibration, but it doesn't feel like traditional vibration at all. going to try again tomorrow, perhaps its a pulseaudio bug.

CClearlyClaire 2022-06-18 github

Double-check that device.description = "Wireless Controller" otherwise the game won't pick it up! Otherwise I don't know.

I'm digging into winepulse.drv to see if I can make sense of it. So far I understand the 4-channel VS 2-channel issue as winepulse.drv not reporting different formats for each sink/input, but just for the default sink/input. It simply doesn't detect or store the rest. For the issue of nothing being played despite the audio device being open, I have no clue so far.

CClearlyClaire 2022-06-18 github

@GloriousEggroll I'm not sure this is the best place to do that, but the audio naming stuff in Wine itself could be done this way for the PulseAudio backend:

diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c
index 60b1c7126dc..ec9a81ab148 100644
--- a/dlls/winepulse.drv/pulse.c
+++ b/dlls/winepulse.drv/pulse.c
@@ -521,6 +521,15 @@ static void fill_device_info(PhysDevice *dev, pa_proplist *p)
 
     if ((buffer = pa_proplist_gets(p, PA_PROP_DEVICE_PRODUCT_ID)))
         dev->product_id = strtol(buffer, NULL, 16);
+
+    // Games with DualSense support need the audio device to be called "Wireless Controller"
+    if (dev->vendor_id == 0x054c && dev->product_id == 0x0ce6) {
+        WCHAR *new_name = get_device_name("Wireless Controller", NULL);
+        if (new_name) {
+          free(dev->name);
+          dev->name = new_name;
+        }
+    }
 }
 
 static void pulse_add_device(struct list *list, pa_proplist *proplist, int index, EndpointFormFactor form,

The GetMixFormat thing is significantly more involved as we have to pass the values from pulse.c to mmdevdrv.c somehow, and there seem to be no readily-available interface to do that. Or I guess we could do something similar to pulse_probe_settings

The FF7R issue seem to be related to GetMixFormat as well, as after a few calls this returns nChannels: 2 for the Wireless Controller as well. I'm going to work on that next.

EDIT: an alternative, slightly more generic way (as in, it would work with other audio backends) to do the same (enforce the “Wireless Controller” name) could be done in MMDevice_Create to overwrite the DEVPKEY_Device_FriendlyName key

CClearlyClaire 2022-06-18 github

The FF7R issue seem to be related to GetMixFormat as well, as after a few calls this returns nChannels: 2 for the Wireless Controller as well. I'm going to work on that next.

I have implemented per-device GetMixFormat (in an extremely rough way, lacking many sanity checks), and it works! Beware that not everything has rumble in FF7R, e.g. hitting enemies has rumble, but not hitting crates.

AudioClient_GetMixFormat proof of concept patch
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
index 66e83b5c475..49178aece77 100644
--- a/dlls/winepulse.drv/mmdevdrv.c
+++ b/dlls/winepulse.drv/mmdevdrv.c
@@ -1149,7 +1149,16 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
     if (!pwfx)
         return E_POINTER;
 
-    *pwfx = clone_format(&pulse_config.modes[This->dataflow == eCapture].format.Format);
+    if (This->pulse_name[0]) {
+      struct get_device_mix_format_params params;
+      params.render = This->dataflow == eRender;
+      params.pulse_name = This->pulse_name;
+      pulse_call(get_device_mix_format, &params);
+      *pwfx = clone_format(&params.fmt.Format);
+    } else {
+      *pwfx = clone_format(&pulse_config.modes[This->dataflow == eCapture].format.Format);
+    }
+
     if (!*pwfx)
         return E_OUTOFMEMORY;
     dump_fmt(*pwfx);
diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c
index 6418179fb03..d0666542988 100644
--- a/dlls/winepulse.drv/pulse.c
+++ b/dlls/winepulse.drv/pulse.c
@@ -89,6 +89,8 @@ typedef struct _PhysDevice {
     EndpointFormFactor form;
     DWORD channel_mask;
     UINT index;
+    pa_sample_spec ss;
+    pa_channel_map map;
     char pulse_name[0];
 } PhysDevice;
 
@@ -532,7 +534,7 @@ static void fill_device_info(PhysDevice *dev, pa_proplist *p)
     }
 }
 
-static void pulse_add_device(struct list *list, pa_proplist *proplist, int index, EndpointFormFactor form,
+static void pulse_add_device(struct list *list, pa_sample_spec *ss, pa_channel_map *map, pa_proplist *proplist, int index, EndpointFormFactor form,
         DWORD channel_mask, const char *pulse_name, const char *desc)
 {
     DWORD len = strlen(pulse_name);
@@ -545,6 +547,13 @@ static void pulse_add_device(struct list *list, pa_proplist *proplist, int index
         free(dev);
         return;
     }
+
+    if (map)
+      memcpy(&dev->map, map, sizeof(pa_channel_map));
+
+    if (ss)
+      memcpy(&dev->ss, ss, sizeof(pa_sample_spec));
+
     dev->form = form;
     dev->index = index;
     dev->channel_mask = channel_mask;
@@ -571,14 +580,14 @@ static void pulse_phys_speakers_cb(pa_context *c, const pa_sink_info *i, int eol
     if (speaker)
         LIST_ENTRY(speaker, PhysDevice, entry)->channel_mask |= channel_mask;
 
-    pulse_add_device(&g_phys_speakers, i->proplist, i->index, Speakers, channel_mask, i->name, i->description);
+    pulse_add_device(&g_phys_speakers, &i->sample_spec, &i->channel_map, i->proplist, i->index, Speakers, channel_mask, i->name, i->description);
 }
 
 static void pulse_phys_sources_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata)
 {
     if (!i || !i->name || !i->name[0])
         return;
-    pulse_add_device(&g_phys_sources, i->proplist, i->index,
+    pulse_add_device(&g_phys_sources, &i->sample_spec, &i->channel_map, i->proplist, i->index,
         (i->monitor_of_sink == PA_INVALID_INDEX) ? Microphone : LineLevel, 0, i->name, i->description);
 }
 
@@ -694,6 +703,7 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
         PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS|PA_STREAM_VARIABLE_RATE, NULL, NULL);
     else
         ret = pa_stream_connect_record(stream, NULL, &attr, PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS);
+
     if (ret >= 0) {
         while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 &&
                 pa_stream_get_state(stream) == PA_STREAM_CREATING)
@@ -737,12 +747,48 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
         fmt->Samples.wValidBitsPerSample = wfx->wBitsPerSample;
     else
         fmt->Samples.wValidBitsPerSample = 24;
+
     if (ss.format == PA_SAMPLE_FLOAT32LE)
         fmt->SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
     else
         fmt->SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
 }
 
+static NTSTATUS pulse_get_device_mix_format(void *args)
+{
+    struct get_device_mix_format_params *params = args;
+    WAVEFORMATEXTENSIBLE *fmt = &params->fmt;
+    WAVEFORMATEX *wfx = &fmt->Format;
+    int ret;
+
+    struct list *list = params->render ? &g_phys_speakers : &g_phys_sources;
+    PhysDevice *dev;
+
+    LIST_FOR_EACH_ENTRY(dev, list, PhysDevice, entry) {
+        if (strcmp(params->pulse_name, dev->pulse_name))
+            continue;
+
+        wfx->wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+        wfx->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
+
+        convert_channel_map(&dev->map, fmt);
+
+        wfx->wBitsPerSample = 8 * pa_sample_size_of_format(dev->ss.format);
+        wfx->nSamplesPerSec = dev->ss.rate;
+        wfx->nBlockAlign = wfx->nChannels * wfx->wBitsPerSample / 8;
+        wfx->nAvgBytesPerSec = wfx->nSamplesPerSec * wfx->nBlockAlign;
+
+        if (dev->ss.format != PA_SAMPLE_S24_32LE)
+            fmt->Samples.wValidBitsPerSample = wfx->wBitsPerSample;
+        else
+            fmt->Samples.wValidBitsPerSample = 24;
+
+        return STATUS_SUCCESS;
+    }
+
+    return STATUS_SUCCESS;
+}
+
 /* some poorly-behaved applications call audio functions during DllMain, so we
  * have to do as much as possible without creating a new thread. this function
  * sets up a synchronous connection to verify the server is running and query
@@ -800,8 +846,8 @@ static NTSTATUS pulse_test_connect(void *args)
     list_init(&g_phys_speakers);
     list_init(&g_phys_sources);
 
-    pulse_add_device(&g_phys_speakers, NULL, 0, Speakers, 0, "", "PulseAudio");
-    pulse_add_device(&g_phys_sources, NULL, 0, Microphone, 0, "", "PulseAudio");
+    pulse_add_device(&g_phys_speakers, NULL, NULL, NULL, 0, Speakers, 0, "", "PulseAudio");
+    pulse_add_device(&g_phys_sources, NULL, NULL, NULL, 0, Microphone, 0, "", "PulseAudio");
 
     o = pa_context_get_sink_info_list(pulse_ctx, &pulse_phys_speakers_cb, NULL);
     if (o) {
@@ -2342,4 +2388,5 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
     pulse_test_connect,
     pulse_is_started,
     pulse_get_prop_value,
+    pulse_get_device_mix_format,
 };
diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h
index 4f6d856ac79..1f396da381a 100644
--- a/dlls/winepulse.drv/unixlib.h
+++ b/dlls/winepulse.drv/unixlib.h
@@ -159,6 +159,13 @@ struct get_current_padding_params
     UINT32 *padding;
 };
 
+struct get_device_mix_format_params
+{
+    const char *pulse_name;
+    BOOL render;
+    WAVEFORMATEXTENSIBLE fmt;
+};
+
 struct get_next_packet_size_params
 {
     struct pulse_stream *stream;
@@ -260,4 +267,5 @@ enum unix_funcs
     test_connect,
     is_started,
     get_prop_value,
+    get_device_mix_format,
 };
CClearlyClaire 2022-06-18 github

EDIT: my mistake, haptic feedback not working on Ghostwire: Tokyo, even disabling pulseaudio still produces the same effect, still interesting in comparison to other games like Death Stranding where it doesn't vibrate at all.

I guess the motors in the triggers can do a vibration effect themselves. I've got VCM-based haptic feedback to work in both FF7R and FFXIV, so I think this would work with Death Stranding and Ghostwire: Tokyo too. If you can, try rebuilding Proton with the two patches to wine I provided above (one to name the controller audio device “Wireless Controller” inside of wine, and the other to expose device-specific format so that the game picks up 4-channel audio).

HHadrianneue 2022-06-18 github

EDIT: my mistake, haptic feedback not working on Ghostwire: Tokyo, even disabling pulseaudio still produces the same effect, still interesting in comparison to other games like Death Stranding where it doesn't vibrate at all.

I guess the motors in the triggers can do a vibration effect themselves. I've got VCM-based haptic feedback to work in both FF7R and FFXIV, so I think this would work with Death Stranding and Ghostwire: Tokyo too. If you can, try rebuilding Proton with the two patches to wine I provided above (one to name the controller audio device “Wireless Controller” inside of wine, and the other to expose device-specific format so that the game picks up 4-channel audio).

i was trying that just now, but only applied the second one using wine-ge from aur (a lot easier to build than proton) with errors

2 out of 8 hunks FAILED -- saving rejects to file dlls/winepulse.drv/pulse.c.rej
patching file dlls/winepulse.drv/unixlib.h
Hunk #2 FAILED at 267.
1 out of 2 hunks FAILED -- saving rejects to file dlls/winepulse.drv/unixlib.h.rej
==> ERROR: A failure occurred in prepare().

gonna try using both of your patches with proton then.

CClearlyClaire 2022-06-18 github

oh yeah sorry it's based on mainline proton not wine-ge

BBitwolfies 2022-06-18 github

So is this proposed fix something that will only fix proton with a unique controller hack and not wine, or is it something we can fix on a driver/wine level? Just curious is all.

CClearlyClaire 2022-06-18 github

So is this proposed fix something that will only fix proton with a unique controller hack and not wine, or is it something we can fix on a driver/wine level? Just curious is all.

The two patches I wrote are patches to wine's PulseAudio backend (written specifically for the version Proton uses, but it's not specific to Proton):

  • one is specific to the DualSense controller and makes sure that it is called “Wireless Controller” as this is how games know where to output haptic feedback “sound”. Alternatives I guess are either an udev rule that overrides the device name (such as in the first post of this issue), or changing the hardware database definitions to have “Wireless Controller” there.
  • the other is more generic (but much cruder) and is aimed at exposing the format supported by each individual device rather than by the default one. I think that feature would be useful to wine outside of the context of the DualSense, but I don't think my patch in its current form has any chance of being included. It demonstrates what the problem is, though, and someone that has more knowledge about Wine and PulseAudio could write a better patch.
BBitwolfies 2022-06-19 github

The FF7R issue seem to be related to GetMixFormat as well, as after a few calls this returns nChannels: 2 for the Wireless Controller as well. I'm going to work on that next.

I have implemented per-device GetMixFormat (in an extremely rough way, lacking many sanity checks), and it works! Beware that not everything has rumble in FF7R, e.g. hitting enemies has rumble, but not hitting crates.
AudioClient_GetMixFormat proof of concept patch

I think it's amazing you were able to figure out any sorta patch that works, maybe you or GE could attempt to upstream it to wine and maybe get others in the project involved?

GGloriousEggroll 2022-06-20 github

The FF7R issue seem to be related to GetMixFormat as well, as after a few calls this returns nChannels: 2 for the Wireless Controller as well. I'm going to work on that next.

I have implemented per-device GetMixFormat (in an extremely rough way, lacking many sanity checks), and it works! Beware that not everything has rumble in FF7R, e.g. hitting enemies has rumble, but not hitting crates.
AudioClient_GetMixFormat proof of concept patch

Tried testing this + the "Wireless Controller" patch -- it seems to work in FFVIIR for the DualShock 4 but I couldn't get it working for the DualSense

GGloriousEggroll 2022-06-20 github

weirdly enough it works fine if i enable steam input and enable ps5 controller (note i also have ps5 gamepad with flickstick template applied for desktop mode). This works fine without the patches mentioned

CClearlyClaire 2022-06-20 github

Hm… this is surprising… DualSense with Steam Input enabled with PS5 Controller support should indeed work, though with basic rumble (but the game doesn't make an impressive use of the VCM-based haptics), XBox button labels and I think adaptive triggers wouldn't work (also as far as I know they are only used in the motorbike sections of the game).

I don't expect the DualShock 4 to need any of these patches since rumble doesn't go through audio afaik.

Does the game open two audio streams, one on the default output and one on the controller? Is the device ID of your controller 0ce6? I think it's the only one so far but I may be wrong.

BBitwolfies 2022-06-20 github

The FF7R issue seem to be related to GetMixFormat as well, as after a few calls this returns nChannels: 2 for the Wireless Controller as well. I'm going to work on that next.

I have implemented per-device GetMixFormat (in an extremely rough way, lacking many sanity checks), and it works! Beware that not everything has rumble in FF7R, e.g. hitting enemies has rumble, but not hitting crates.
AudioClient_GetMixFormat proof of concept patch

Tried testing this + the "Wireless Controller" patch -- it seems to work in FFVIIR for the DualShock 4 but I couldn't get it working for the DualSense

FF7 remake works fine without the patch with PS4 controllers.

CClearlyClaire 2022-06-24 github

I got Ghostwire: Tokyo and I can confirm that adaptive triggers work, but not VCM-based haptics feedback. I don't know why. Another thing that is especially weird is that it shows XBox button prompts rather than Playstation button prompts.

Unlike for FF7R and FF14, I also haven't seen the string “Wireless Controller” hardcoded in the game's executables, so I suppose it comes with a different version of Sony's lib that matches the audio device. Also, unlike FF7R and FF14, Ghostwire uses XAudio2 (EDIT: although as far as I understand, XAudio2 and device enumeration are unrelated).

HHadrianneue 2022-06-24 github

I don't know why. Another thing that is especially weird is that it shows XBox button prompts rather than Playstation button prompts.

You can change that on the game settings, i've also used a ds4 with GWT iirc it doesn't default to playstation button icons either. even on windows if i'm not mistaken.

HHadrianneue 2022-06-24 github

Just to report, Dolmen also uses adaptive triggers and vibrates a little bit, no haptic feedback, at least i didn't bother to check if it was sending something to pulseaudio...

CClearlyClaire 2022-06-24 github

I had a hunch Ghostwire: Tokyo read more device properties, but this does not appear to be the case (or I'm not looking at the right place).

Here is a comparison of how FF7R and Ghostwire: Tokyo enumerate audio outputs.

Honestly, I don't know why Ghostwire doesn't use the DualSense audio device, and any idea is welcome.

FF7R

FF7R enumerates audio devices only once, and only checks for the audio device's friendly name, stopping as soon as it finds “Wireless Controller”. It then proceeds to test 4-channel audio formats.

https://gist.github.com/ClearlyClaire/09b7172a6bda5dca2d41d1ce3770036d

Ghostwire: Tokyo

Ghostwire: Tokyo enumerates output devices twice, once enumerating all known devices (including inactive/unplugged ones), and once enumerating all active devices. It does not stop at “Wireless Controller”, and it does not seem to check any other output device property. It does check compatibility with output formats each time, but that does not include 4-channel audio formats.

https://gist.github.com/ClearlyClaire/43260dafa2d77640d2a2fcccd78e9366
https://gist.github.com/ClearlyClaire/658ebf5e7efc6455655506472fbde77d

EDIT: it appears the audio device may be opened later on, when in the game, not in the main menu

CClearlyClaire 2022-06-25 github

I don't know why. Another thing that is especially weird is that it shows XBox button prompts rather than Playstation button prompts.

You can change that on the game settings, i've also used a ds4 with GWT iirc it doesn't default to playstation button icons either. even on windows if i'm not mistaken.

Just got to try the game on Windows, it does indeed show XBox button prompts by default. It properly uses the DualSense's audio output for haptic feedback though. I guess I could try tracing the API calls on Windows to see if I can spot something useful, but I'm not sure how to do that.

HHadrianneue 2022-06-25 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1166347471

On windows probably something like x64dbg or IDA Pro, maybe windbg with some luck?!

CClearlyClaire 2022-06-26 github

I tried windbg and after fumbling a bit, I got to see that it re-enumerates audio devices and checks a lot more properties when loading the game itself (that is, when starting/continuing a game, not from the main menu itself). I don't understand windbg and Windows APIs well enough to understand what those properties are, but it's a behavior I can't replicate on wine: starting the game does not re-enumerate anything, so I suppose we are missing something before the audio devices are taken into consideration…

CClearlyClaire 2022-06-26 github

I think the API used by Ghostwire is this one: https://www.audiokinetic.com/fr/library/edge/?source=SDK&id=integrating_elements_motion.html

For DualSense, it states “Use the handle of the device returned by scePadOpen or scePadGetHandle.” I guess the issue might lie with how these functions work.

EDIT: DualSense support is only documented for PS5, so it may work differently on Windows. In any case, this doesn't provide much information on how the audio device is detected/chosen.
EDIT2: plugging in the DualSense causes a SetupDiGetDeviceRegistryPropertyW for the undocumented property 36, which according to the Internet is called SPDRP_BASE_CONTAINERID. Wine doesn't handle it, and it seems like it could be used to match devices on a same USB hub, so I guess this is part of how Ghostwire: Tokyo find the audio device from the HID device

CClearlyClaire 2022-06-27 github

I got Ghostwire: Tokyo to enumerate audio devices again when starting the game by returning a dummy string value for SetupDiGetDeviceRegistryPropertyW for property 36.

extremely rough, probably buggy patch
diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c
index 29b275bc55b..c2139cc0dc2 100644
--- a/dlls/mmdevapi/devenum.c
+++ b/dlls/mmdevapi/devenum.c
@@ -325,6 +325,11 @@ static MMDevice *MMDevice_Create(WCHAR *name, GUID *id, EDataFlow flow, DWORD st
             MMDevice_SetPropValue(id, flow, (const PROPERTYKEY*)&DEVPKEY_DeviceInterface_FriendlyName, &pv);
             MMDevice_SetPropValue(id, flow, (const PROPERTYKEY*)&DEVPKEY_Device_DeviceDesc, &pv);
 
+            if (wcscmp(name, L"Wireless Controller") == 0) {
+              pv.pwszVal = L"{12345678-9ABC-DEF0-1234-56789ABCDEF0}";
+              MMDevice_SetPropValue(id, flow, (const PROPERTYKEY*)&DEVPKEY_Device_ContainerId, &pv);
+            }
+
             pv.pwszVal = guidstr;
             MMDevice_SetPropValue(id, flow, &deviceinterface_key, &pv);
 
@@ -1418,9 +1423,30 @@ static HRESULT WINAPI MMDevPropStore_GetValue(IPropertyStore *iface, REFPROPERTY
     }
 
     hres = MMDevice_GetPropValue(&This->parent->devguid, This->parent->flow, key, pv);
+
     if (FAILED(hres))
         return hres;
 
+    // Client apps expect a CLSID
+    if(IsEqualPropertyKey(*key,DEVPKEY_Device_ContainerId) && pv->vt == VT_LPWSTR && pv->pwszVal) {
+        LPWSTR guidstr = pv->pwszVal;
+
+        pv->puuid = CoTaskMemAlloc(sizeof(*pv->puuid));
+        if (!pv->puuid)
+          return E_OUTOFMEMORY;
+
+        hres = CLSIDFromString(guidstr, pv->puuid);
+        if (FAILED(hres))
+          return hres;
+
+        TRACE("RETURNED %s\n", debugstr_w(guidstr));
+
+        pv->vt = VT_CLSID;
+        CoTaskMemFree(guidstr);
+
+        return hres;
+    }
+
     if (WARN_ON(mmdevapi))
     {
         if ((IsEqualPropertyKey(*key, DEVPKEY_Device_FriendlyName) ||
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index aea0e605f1d..b8a0f81b983 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -3227,6 +3227,26 @@ BOOL WINAPI SetupDiGetDeviceRegistryPropertyW(HDEVINFO devinfo,
         return FALSE;
     }
 
+    if (Property == 36) {
+        STRING *guid = L"{12345678-9abc-def0-1234-56789abcdef0}";
+        if (PropertyRegDataType != NULL) {
+          *PropertyRegDataType = REG_SZ;
+        }
+
+        DWORD size = (wcslen(guid) + 1) * sizeof(WCHAR);
+
+        if (PropertyBufferSize > size) {
+          wcscpy(PropertyBuffer, guid);
+
+          if (RequiredSize)
+            *RequiredSize = size;
+
+          TRACE("output: %s\n", debugstr_w(PropertyBuffer));
+
+          ret = TRUE;
+        }
+    }
+
     if (Property < ARRAY_SIZE(PropertyMap) && PropertyMap[Property].nameW)
     {
         DWORD size = PropertyBufferSize;

This causes Ghostwire: Tokyo to attempt to open the audio device, but it then fails because of a supposedly incompatible audio format:

0370:trace:mmdevapi:MMDevCol_Item (00000000676C0B90)->(0, 0000000068B7F608)
0370:trace:mmdevapi:MMDevice_AddRef Refcount now 1
0370:trace:mmdevapi:MMDevice_OpenPropertyStore (00000000677009B0)->(0,0000000068B7D500)
0370:trace:mmdevapi:MMDevPropStore_GetValue (00000000676C0BD0)->("{8c7ed206-3f8a-4827-b3ab-ae9e1faefc6c},2", 0000000068B7D518)
0370:trace:mmdevapi:MMDevPropStore_GetValue RETURNED L"{12345678-9ABC-DEF0-1234-56789ABCDEF0}"
0370:trace:mmdevapi:MMDevPropStore_Release Refcount now 0
0370:trace:mmdevapi:MMDevCol_Release Refcount now 0
0370:trace:mmdevapi:MMDevEnum_Release Refcount now 4
0370:trace:mmdevapi:MMDevice_Activate (00000000677009B0)->({1cb9ad4c-dbfa-4c32-b178-c2f568a703b2}, 17, 0000000000000000, 0000000061301F38)
0370:trace:pulse:AUDDRV_GetAudioEndpoint {e51933f1-3cc8-4f57-be21-56ff9e2501ef} 00000000677009B0 0000000061301F38
0370:trace:mmdevapi:MMDevice_AddRef Refcount now 2
0370:trace:pulse:AudioClient_AddRef (00000000676A0290) Refcount now 1
0370:trace:mmdevapi:MMDevice_Activate Returning 00000000
0370:trace:pulse:AudioClient_GetMixFormat (00000000676A0290)->(0000000068B7F630)
0370:trace:pulse:convert_channel_map got mask for PA: 0x33
0370:trace:pulse:dump_fmt wFormatTag: 0xfffe (WAVE_FORMAT_EXTENSIBLE)
0370:trace:pulse:dump_fmt nChannels: 4
0370:trace:pulse:dump_fmt nSamplesPerSec: 48000
0370:trace:pulse:dump_fmt nAvgBytesPerSec: 384000
0370:trace:pulse:dump_fmt nBlockAlign: 8
0370:trace:pulse:dump_fmt wBitsPerSample: 16
0370:trace:pulse:dump_fmt cbSize: 22
0370:trace:pulse:dump_fmt dwChannelMask: 00000033
0370:trace:pulse:dump_fmt Samples: 0010
0370:trace:pulse:dump_fmt SubFormat: {00000000-0000-0000-0000-000000000000}
0370:trace:pulse:AudioClient_GetDevicePeriod (00000000676A0290)->(0000000068B7F648, 0000000068B7F640)
0370:trace:pulse:AudioClient_Initialize (00000000676A0290)->(0, 0, d0554, 0, 0000000068B7F650, (null))
0370:trace:pulse:dump_fmt wFormatTag: 0xfffe (WAVE_FORMAT_EXTENSIBLE)
0370:trace:pulse:dump_fmt nChannels: 4
0370:trace:pulse:dump_fmt nSamplesPerSec: 48000
0370:trace:pulse:dump_fmt nAvgBytesPerSec: 384000
0370:trace:pulse:dump_fmt nBlockAlign: 8
0370:trace:pulse:dump_fmt wBitsPerSample: 16
0370:trace:pulse:dump_fmt cbSize: 22
0370:trace:pulse:dump_fmt dwChannelMask: 00000033
0370:trace:pulse:dump_fmt Samples: 0010
0370:trace:pulse:dump_fmt SubFormat: {00000000-0000-0000-0000-000000000000}
0370:err:pulse:pulse_spec_from_waveformat Invalid format! Channel spec valid: 1, format: -1
0370:trace:pulse:pulse_create_stream Obtaining format returns 88890008
0370:trace:pulse:AudioClient_Stop (00000000676A0290)
0370:trace:pulse:AudioClient_Release (00000000676A0290) Refcount now 0

EDIT: I think this last error is because of my earlier one-format-per-audio-device may return incomplete format data

CClearlyClaire 2022-06-27 github

I have got Ghostwire: Tokyo to work!

The last patch especially is an ugly workaround, it does not really implement the missing APIs, but returns a hardcoded arbitrary value that is enough to match this very specific case (but won't work appropriately if you plug in two DualSense controllers, even though this would work well on Windows)

CClearlyClaire 2022-06-30 github

I had an informal conversation with someone at Audiokinetic, and they have helpfully confirmed that most games using Wwise will either search for a device called “Wireless Controller” or use the containerId obtained from a handle to the DualSense gamepad, and finding an IMMDevice with a matching containerId (via the IMMDevice's property store). That can happen inside a Wwise library or in game-specific code (or both).

They also pointed out that some games with earlier implementation of DualSense support might behave differently, so it could be worth confirming if the changes I have discussed so far are enough to get them working properly:

  • Assassin's Creed: Valhalla
  • Deathloop
  • Guardians of the Galaxy

Finally, while the person at Audiokinetic has been kind enough to confirm those details about the current implementation in Wwise, it does not mean that Audiokinetic will actively put any effort into getting games to work with Proton/Wine or commit to providing any kind of support.

CClearlyClaire 2022-06-30 github

In other news, I have submitted some of my patches upstream and have some idea on how to properly implement the containerId stuff but that would still require a lot of work. Basically, one would need to get the sysfs path for the devices and walk up to find a “removable” device (see https://docs.microsoft.com/en-us/windows-hardware/drivers/install/how-container-ids-are-generated-from-the-removable-device-capability and https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-removable)

Finally, I have been informed that my solution for FF7R and FF14 won't currently work if you are using pipewire-pulse because the exposed properties are not exposed quite in the same way: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/2485

HHadrianneue 2022-07-01 github

Interesting. I'm surprised haptics would work at all without any patch or tweaks, but maybe it uses the compatibility mode rather than advanced haptics? You could check if it's outputting anything to the DualSense audio device.

EDIT: and i'm wrong yet again, nothing on pavumeter....

@ClearlyClaire

In other news, my patch to rename the audio device to “Wireless Controller” has been accepted in Wine.

that is awesome :D

i did build proton with your patches, problem is that whenever i build it myself, be it proton, proton-ge, wine-ge, etc, it always forces xinput on for whatever reason, both Death Stranding/Ghostwire: Tokyo only sees a xinput device, and because of that even the adaptive triggers won't work, so i can't test it on my end :(

original post:
F1 2021 has both adaptive triggers and haptic feedback working without any tweaking whatsoever besides disabling steam input (apparently using libscepad), however F1 Series also have a 'Radio Output Device' option to output the race engineer comms, it does let you set it to the wireless controller audio output but it goes through my headset nonetheless... following forum reports however that seems to be a common issues with previous F1 installments...

CClearlyClaire 2022-07-01 github

Interesting. I'm surprised haptics would work at all without any patch or tweaks, but maybe it uses the compatibility mode rather than advanced haptics? You could check if it's outputting anything to the DualSense audio device.

In other news, my patch to rename the audio device to “Wireless Controller” has been accepted in Wine. The one I submitted for the appropriate mix format to be returned is pending, and I'm still trying to write a proper one for the containerId thing (this is way more involved than the other patches, and I think I will only be able to deliver something that works when using udev in combination with either winepulse.drv or winealsa.drv as audio backend).

BBitwolfies 2022-07-01 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1172038570

Fantastic to hear, and it looks like the pw team is looking into fixing pulse too. Though im surprised wine accepted it, don't they not really like specific hacks?

BBitwolfies 2022-07-02 github

Looks like the PW fix was merged, those guys are fast

CClearlyClaire 2022-07-02 github

I'm still working on proper support for the ContainerID stuff (required by Ghostwire: Tokyo and most probably most of the other games, see https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1170775313), but I think I have figured it out, and I have started submitting parts of it to Wine.

When all the patches are merged upstream, I will backport them for latest proton, but for the time being, the patches in https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1167700297 should do the trick as long as you use a single DualSense controller at a time.

i did build proton with your patches, problem is that whenever i build it myself, be it proton, proton-ge, wine-ge, etc, it always forces xinput on for whatever reason, both Death Stranding/Ghostwire: Tokyo only sees a xinput device, and because of that even the adaptive triggers won't work, so i can't test it on my end :(

I am sorry I'm unable to help you with that :/

and it looks like the pw team is looking into fixing pulse too

Indeed, when I started discussing my plans for DualSense support on the Wine development channel, someone mentioned possible incompatibilities with pipewire-pulse, and when we identified them, someone quickly stepped up to actually fix them!

CClearlyClaire 2022-07-05 github

Took advantage of the sales to buy Deathloop, as it was listed by the Audiokinetic person as one of the games using an earlier implementation of DualSense support in Wwise. It uses the containerId to find the audio device, and my patches are enough to get it to use the audio-based haptic feedback perfectly.

However, the controller's speaker isn't used at all, while on Windows it is used for various sound effects and radio chatter. I'm not sure why that is. It's not a GetMixFormat issue, as the Windows box I tried it on returns exactly the same formats and timings as my patched Proton. I suspect more SetupApi is involved, but I haven't investigated much yet.

None of my new patches has been merged upstream so far, but some of them got improvements. In any case, I'm going to regularly rebase them on proton's fork of Wine here: https://github.com/ClearlyClaire/wine/tree/features/dualsense

BBitwolfies 2022-07-06 github

Hopefully valve pays attention to your work, would be a nice thing to see DS5 features supported in the next patch notes.

CClearlyClaire 2022-07-11 github

Progress update: all patches necessary for FF7R and FF14 have been merged in upstream Wine! Those necessary for Ghostwire: Tokyo have not been merged, but I have slightly improved them.

As for Deathloop's use of the speaker, I believe I have figured everything that was missing from Wine, but unfortunately this will be a lot of work, and I have no patch to show for this. Basically it involves:

  • finding the MMDevice corresponding to the DualSense (already covered by my work-in-progress patches)
  • enumerating audio devices through SetupApi to find the device path of that MMDevice (not covered by any of my patches, MMDevApi does not currently expose devices through SetupApi)
  • calling IXAudio2Impl_CreateMasteringVoice with that DevicePath to open an audio stream for the speaker. Unfortunately, it seems like Wine's implementation of XAudio2 does not support selecting an audio output at all, and the parameter is ignored

Excerpt of Deathloop trace regarding speaker audio initialization: https://gist.github.com/ClearlyClaire/2a185be39755dd3f30058fd8ee405230

I also have started writing a sample program that attempts to replicate the various games' logic regarding DualSense audio selection in order to more easily test them without needing to buy, install or run large games (a DualSense is still required though): https://github.com/ClearlyClaire/dualsense-games-compat-check

CClearlyClaire 2022-07-11 github

I ended up figuring out a way to make Deathloop use the speaker properly, not by adding code but by… disabling XAudio2. When the xaudio2_8 and xaudio2_9 DLLs are disabled (or set to “native”, for some reason it does not make a difference, even though they are in the game's prefix), Deathloop happily uses audio anyway, and it does not need the audio devices to be present in SetupApi. For the speaker, it uses the audio device it has detected using ContainerID.

I'm not sure this workaround would work for other games, but at least it works for Deathloop for some reason.

BBitwolfies 2022-07-12 github

I ended up figuring out a way to make Deathloop use the speaker properly, not by adding code but by… disabling XAudio2. When the xaudio2_8 and xaudio2_9 DLLs are disabled (or set to “native”, for some reason it does not make a difference, even though they are in the game's prefix), Deathloop happily uses audio anyway, and it does not need the audio devices to be present in SetupApi. For the speaker, it uses the audio device it has detected using ContainerID.

I'm not sure this workaround would work for other games, but at least it works for Deathloop for some reason.

What are the other games that use the deathloop style of detection?

CClearlyClaire 2022-07-12 github

I don't know. It's the only one I encountered so far, but for obvious reasons I haven't tested every game with DualSense features out there.

Hopefully there aren't a lot of games working like this as implementing it correctly sound like a massive amount of work.

MMutcholoko 2022-09-13 github

Finally got it to work! Thanks for the patch files :)

CClearlyClaire 2022-09-13 github

Sorry, I should probably edit the first post to make clear that the latest and most complete patchset is available at https://github.com/ClearlyClaire/wine/tree/features/dualsense. I have been busy with other stuff lately (and I still am), so I haven't been able to rebase them on latest proton, nor rewrite the last patches for inclusion upstream.

As far as I know, this should work with PipeWire indeed, as long as it's a recent enough version, but I haven't tried.

CClearlyClaire 2022-10-01 github

I have rebased the changes on proton 7.0-4, there were no conflicts: https://github.com/ClearlyClaire/wine/tree/proton-wine-7.0-4+dualsense ; everything still works in at least FF7R, Deathloop and Ghostwire: Tokyo.

I have also bought Death Stranding Director's Cut, but could not get the haptics to work. The game enumerates the audio devices and queries both the FriendlyName and the ContainerId properties for every device. It does not stop the enumeration at the DualSense output and does not seem to attempt to select and open any of these outputs for haptics feedback. I am unsure why. Possibly of interest, it enumerates HID devices right after enumerating audio devices, and the following message appears, that does not appear with other games:

013c:fixme:combase:RoGetActivationFactory (L"Windows.Gaming.Input.Gamepad", {8bbce529-d49c-39e9-9560-e47dde96b7c8}, 000000000041EA68): semi-stub
BBitwolfies 2022-10-02 github

I'm no expert on this but its trying to query Windows.Gaming.Input of all things? Valve added support for it not too long ago, but that only applies to Xbox One/One S/Series X controllers. So I somehow don't think it would be related to the DS5 haptics.

In theory it could be trying to work with the impulse triggers on the Xbox controllers, they were never added to Xinput, only Windows.Gaming.Input. PCGamingWiki says the game does in fact use them.

CClearlyClaire 2022-10-02 github

I don't know this API but I agree with you, this does not seem to be directly related. Still, I don't understand yet why the game does not attempt to open the DualSense audio output (or any second audio output for that matter). I'm also not sure where the game is supposed to use adaptive triggers, so maybe it doesn't decide to use DualSense features at all for some unknown reason, but it at least does reset them on startup.

BBitwolfies 2022-10-02 github

I don't know this API but I agree with you, this does not seem to be directly related. Still, I don't understand yet why the game does not attempt to open the DualSense audio output (or any second audio output for that matter). I'm also not sure where the game is supposed to use adaptive triggers, so maybe it doesn't decide to use DualSense features at all for some unknown reason, but it at least does reset them on startup.

Triggers should be used nearly every time you adjust your cargo, so basically all the time, Steam Input must be disabled and ect for it to work.

As for audio, the game does have a feature where you can send BB audio to any speaker, though its meant specifically for PS controllers, as all the audio BB has in the PS versions comes out of it. You have to manually enable it, but in theory its unrelated to the haptic speakers.

CClearlyClaire 2022-10-02 github

Triggers should be used nearly every time you adjust your cargo, so basically all the time, Steam Input must be disabled and ect for it to work.

ok, I have only played a few minutes so I might just not have picked up heavy enough cargo, but I haven't noticed any use of the adaptive triggers when picking up the first few items or balancing myself in the river. So I guess the game may decide to not use the DualSense features at all for some reason? But Steam Input is disabled, and in addition to resetting the adaptive triggers on startup, the game is properly handling input (including different actions for the left and right side of the touchpad) and displaying proper button labels, so I'm not sure what may be going on.

EDIT: Got to a point of the game where you have heavier cargo, and the adaptive triggers are definitely used.

As for audio, the game does have a feature where you can send BB audio to any speaker, though its meant specifically for PS controllers, as all the audio BB has in the PS versions comes out of it. You have to manually enable it, but in theory its unrelated to the haptic speakers.

Yeah I'd expect haptics to work without changing the setting for the speaker output (even though they would technically be on the same output device). I tried with default audio out and with the DualSense out specifically, but neither results in haptics feedback. Without selecting the DualSense audio output for the BB audio, the game doesn't open the DualSense audio output at all.

HHadrianneue 2022-10-02 github

013c:fixme:combase:RoGetActivationFactory (L"Windows.Gaming.Input.Gamepad", {8bbce529-d49c-39e9-9560-e47dde96b7c8}, 000000000041EA68): semi-stub

CodeWeaver's Rémi Bernon (and yourself) are the only ones who submitted patches for this api/dualsense support, probably just some stubbed function (or even just UUID check failling).

CClearlyClaire 2022-10-20 github

I've switched away from PulseAudio to PipeWire, and noticed another discrepancy. I updated the patches in https://github.com/ClearlyClaire/wine/tree/proton-wine-7.0-4+dualsense and https://github.com/ClearlyClaire/wine/commits/features/dualsense to account for that.

I have made no progress with regards to Death Stranding Director's Cut.

CClearlyClaire 2022-10-27 github

Tried “Sackboy: A Big Adventure”, and the audio-based haptics don't work. What's odd is that whenever a DualSense is plugged in, I can see the game enumerating the audio devices in a loop, including querying their FriendlyName, but not their container ID. I'm not sure what is going on.

BBitwolfies 2022-10-27 github

Just to clarify, when you say does not work, are we referring just to the rumble, or the triggers as well?

CClearlyClaire 2022-10-27 github

Just to clarify, when you say does not work, are we referring just to the rumble, or the triggers as well?

VCM-based rumble, as usual. Everything else is going through the HID device, and while I haven't seen the triggers yet I'm confident it'd work, as gyro works.

EDIT: Played a bit to get to the point where adaptive triggers are used (throwing an acorn), and I can confirm they are properly used.

MMutcholoko 2022-11-07 github

Just wanna say that I've tested your patches and both Ghostwire: Tokyo and Uncharted 4 worked perfectly. I have even created a repo with a build of Proton including those patches (and also a guide on how to build Proton with your patches, Claire). You are doing an amazing job, and if you want someone to test this and get this further investigated, you can count on me :)

CClearlyClaire 2022-11-29 github

Just an update: I am very busy and have very little time to work on this. I have made no progress whatsoever about Death Stranding or Sackboy.

I have tried Marvel's Spider-Man remastered, though, and my patches make the game crash whenever a DualSense is plugged in, because it tries to use a SetupAPI function that is not even stubbed in Wine: SetupDiGetDeviceInterfacePropertyW.

Stubbing this function makes the game fall back to more classic rumble. The method is used to query at least DEVPKEY_Device_InstanceId. I haven't tried to implement it yet.

EDIT: I implemented SetupDiGetDeviceInterfacePropertyW for DEVPKEY_Device_InstanceId specifically (which as I understand may be a more modern alternative to SetupDiGetDeviceInstanceIdW) to see if it got me further, but it's still not using the DualSense haptics.

CClearlyClaire 2023-02-15 github

I'm happy to to report that the patches work flawlessly for Returnal! (though Returnal itself has an issue with hanging during shaders precompilation for some reason, see https://github.com/ValveSoftware/Proton/issues/6538)

HHadrianneue 2023-02-16 github

I'm happy to to report that the patches work flawlessly for Returnal! (though Returnal itself has an issue with hanging during shaders precompilation for some reason, see #6538)

it works beautifully, i have a question however...

your patches seems to work only with proton and within steam, building against wine-ge, wine, or even trying to use proton on lutris simply doesn't enable haptic feedback...

the issue being that most if not all current dualsense supported games are available on other stores...

can you advice me on which change should i do when building with, for instance wine-ge, to make it work without steam?

CClearlyClaire 2023-02-16 github

IIRC upstream Wine and Proton differ in that the former will try to use SDL for gamepad input unless instructed otherwise, and my patches do not implement everything needed when the gamepad is controlled through SDL. That distinction shouldn't apply to the Proton on Lutris configuration though. I'm not sure what else would cause issues.

(To disable SDL for gamepad input, search for “Enable SDL” in https://wiki.winehq.org/Useful_Registry_Keys)

BBitwolfies 2023-02-16 github

Im curious, what's the status of your patches being merged upstream (and then presumably proton after a rebase)? They sadly seem to have flown under the wine teams radar.

CClearlyClaire 2023-02-16 github

There hasn't been much progress on that, my patches are functionally ok but some of them are far from ideal. Unfortunately I'm not knowledgeable enough about wine's internals and windows APIs to really come up with something cleaner, and I'm a bit busy with my dayjob as well.

On February 16, 2023 10:38:22 AM GMT+01:00, Bitwolf @.***> wrote:

Im curious, what's the status of your patches being merged upstream (and then presumably proton after a rebase)? They sadly seem to have flown under the wine teams radar.

--
Reply to this email directly or view it on GitHub:
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1432792749
You are receiving this because you were mentioned.

Message ID: @.***>

MMicaelJarniac 2023-02-16 github

Could these patches be added to https://github.com/GloriousEggroll/proton-ge-custom in the meanwhile? I'm pretty clueless about how it all works, but as far as I can tell, proton-ge is basically a customized version of Proton with some additional features, so I'd imagine it could be a nice place to add these patches.

Also, what's the progress with Death Stranding Director's Cut? That's the main game I wanted to play with the haptics working.

CClearlyClaire 2023-02-16 github

I'm not sure what ProtonGE's policy is for patches, but I can't see why they couldn't use them.

Also, what's the progress with Death Stranding Director's Cut? That's the main game I wanted to play with the haptics working.

Unfortunately, no. I have no idea what's missing, I'm not sure where to even start looking, and I haven't got any help with it either.

RRoman-AE 2023-03-28 github

@ClearlyClaire patches works great with Last of Us. Applied it to ProtonGE.

BBitwolfies 2023-03-28 github

@ClearlyClaire patches works great with Last of Us. Applied it to ProtonGE.

You actually managed to get the port to work? Shits pegged at 30fps for me with the worlds slowest shader compile ever.

RRoman-AE 2023-03-28 github

@ClearlyClaire patches works great with Last of Us. Applied it to ProtonGE.

You actually managed to get the port to work? Shits pegged at 30fps for me with the worlds slowest shader compile ever.

Yes, it works out of the box. Slowest shader compilation ever (before for me it was Detroit).

CClearlyClaire 2023-07-29 github

Quick update: with the release of Ratchet & Clank: Rift Apart, I wanted to give it a try. Seems like Proton 7.0 is unable to run it, so I had to rebase my work on Proton 8.0. Link to the build: https://github.com/ClearlyClaire/wine/releases/tag/experimental-wine-bleeding-edge-8.0-50838-20230727-p70694a-w9303d4-d4ed147-vdb6089%2Bdualsense

The good news is that the Proton 8.0 build appears to work on all games where my Proton 7.0 build worked.

The bad news is that my patches are not enough to have proper DualSense audio-based features to work in Ratchet & Clank: Rift Apart. Like other Nixxes-ported games, the game fails to use audio-based haptics and gracefully falls back to the “classic” vibrations.

A note on upstreaming: I have made no further effort to upstream my pending patches. Stock Wine / Proton 8.0 includes a number of my patches already, but those are not enough to bring proper support to any game. Furthermore, while some of those patches should have been enough for some games (FF7R and FFXIV), a bug in Wine 8.0 rendered it pointless. That bug is already fixed in the development version of wine (see https://gitlab.winehq.org/wine/wine/-/merge_requests/3045).

BBitwolfies 2023-07-30 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1656718656

Do you happen to have a list of which games do and dont work, and why they dont work? Just curious to see the progress made, thanks!

CClearlyClaire 2023-07-30 github

Not really. The last few I tested are:

  • Deathloop (doesn't work unless you disable XAudio2 (see https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1180859190)
  • Returnal™, Season: both work
  • Sackboy™: audio-based features don't work and there is no fallback to classic rumble ; cause unknown
  • Ratchet & Clank: audio-based features don't work for an unknown reason, but there is fallback to classic rumble
BBitwolfies 2023-09-08 github

Interestingly, on the decks dev branch, with steam input disabled, the triggers work wirelessly. Tested with both ratchet and Clank and the last of us. Wonder if that's valves or Sony's doing.

Ppinkflames 2023-09-08 github

Interestingly, on the decks dev branch, with steam input disabled, the triggers work wirelessly. Tested with both ratchet and Clank and the last of us. Wonder if that's valves or Sony's doing.

Odd. I do not believe it's supposed to be possible on PC when using the standard Bluetooth protocols. As such there's nothing Valve or the game could do about it without kernel level support for this, since the driver would need to expose something be it a custom HID or another interface.

BBitwolfies 2023-09-08 github

Interestingly, on the decks dev branch, with steam input disabled, the triggers work wirelessly. Tested with both ratchet and Clank and the last of us. Wonder if that's valves or Sony's doing.

Odd. I do not believe it's supposed to be possible on PC when using the standard Bluetooth protocols. As such there's nothing Valve or the game could do about it without kernel level support for this, since the driver would need to expose something be it a custom HID or another interface.

They could very well be using the HID files now, I know Valve supposedly has it working with Steam input but turning that on made the wireless triggers stop working. We know Valve and Sony have some sorta contact what with the new dualsense tag for games and the updater being built into steam.

BBitwolfies 2023-09-10 github

Update: manged to get it to connect to my arch machine, can confirm the triggers work there. Not sure if this works across all dualsense games, but it sure works there with ratchet and clank.

Pcgamingwiki mentions wireless compatibility on Ratchet and Clank, so this might be nothing, ill try it with ghostwire.

BBitwolfies 2023-09-10 github

Ghostwire didnt even respond in wireless mode so I tried bugsnax. Sadly triggers only worked in wired mode, so this its not driver related and sony found a way to get the feature working wirelessly with new games only on the current driver.

I do hope Sony or a Third party can rework the dualsense driver on Linux to allow backwards compatable wireless functions, but I sadly doubt that's gonna happen and we'll be stuck with this growing pain of the games that came before.

CClearlyClaire 2023-09-11 github

Triggers can be used over bluetooth, although using a slightly different format for the HID reports. You could rewrite the HID reports on the fly, which is actually what I did in https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1156822244, but that won't cover audio-based features. I don't know of any PC game or software that use the audio-based features wirelessly, and I don't know what protocol the PS5 uses for that. I am not actually sure this is doable over bluetooth, and it's possible you'd need specific hardware adapters for that.

Ppinkflames 2023-09-11 github

For regulatory reasons it's almost certain that Sony is using the existing IEEE 802.15.1 (or 802.11.2?) PHY and MAC layers, since otherwise the controller would not even implement them. As such any proprietary magic must be in the higher layers such as the network or transport protocol.

Whether an existing Bluetooth adapter can be made to fully support the DualSense is not known to me but perhaps it's not as hopeless as might seem at first. At worst it would require BT adapter firmware changes but perhaps only kernel level changes could suffice, with the understanding that doing so might make that device incompatible with the standard Bluetooth ecosystem.

BBitwolfies 2023-09-11 github

Triggers can be used over bluetooth, although using a slightly different format for the HID reports. You could rewrite the HID reports on the fly, which is actually what I did in [#5900 (comment)](https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1156822244), but that won't cover audio-based features. I don't know of any PC game or software that use the audio-based features wirelessly, and I don't know what protocol the PS5 uses for that. I am not actually sure this is doable over bluetooth, and it's possible you'd need specific hardware adapters for that.

Well, I'm glad to hear that its therortically possible to make a backwards compatible trigger driver. Hope it's a reality one day.

Question, is it possible to have the dualsense speaker work over Bluetooth with a driver update? Or does that go beyond the stand bt stack.

HHadrianneue 2023-10-29 github

@ClearlyClaire seems to work on Alan Wake 2

HHadrianneue 2023-12-11 github

Cyberpunk 2077 2.1 update also has haptic feedback working with your Proton 8.0 build @Mutcholoko but not on ClearlyClaire's latest release (same happens with other games iirc, like TLOU) also it seems to work at random, not sure what is happening there.

SSid127 2024-01-08 github

@ClearlyClaire seems to work on Alan Wake 2

mind if I ask how exactly you got it working? I've tried multiple builds, including rolling my own, but I don't seem to hav haptics, only adaptive triggers

HHadrianneue 2024-01-08 github

@ClearlyClaire seems to work on Alan Wake 2

mind if I ask how exactly you got it working? I've tried multiple builds, including rolling my own, but I don't seem to hav haptics, only adaptive triggers

make sure these registry keys values are set like so:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\winebus
(dword) DisableHidraw = 0
(dword) Enable SDL = 0

also make sure your volume is not muted/too low.

Pparov0z 2024-02-19 github

I remember a year ago adaptive triggers worked in No Man's Sky through bluetooth, but they don't work now, tried connecting via usb and with different proton versions

Upd:
Ah nevermind. I've just tested overwatch and seems like its only problem with No Man's Sky, but not with proton or my setup

Hhivehivemind 2024-02-26 github

Update:

Patches from @ClearlyClaire does not work with Proton 9 (dlls/mmdevapi/devenum.o compile error 1) or Proton 9 Experimental (patch does not apply error for all of our patches).
At the moment the DualSense features are only working on Proton 8 (need to test 8-5).

CClearlyClaire 2024-03-03 github

Rebased my patches on top of Proton 9.0 beta12 and fixed the errors: https://github.com/ClearlyClaire/wine/releases/tag/proton-wine-9.0beta12%2Bdualsense

I tested the build with Returnal, but not the other games. I still haven't figured out how Death Stranding, Spider-Man Remastered, Sackboy: A Big Adventure or Ratchet & Clank: Rift Apart select the audio device, so don't expect those to work.

EDIT: tried to poke some more at Ratchet & Clank: Rift Apart, but I've been unable to figure out what's wrong. It seems to fetch a lot of info, including ContainerID, from the HID device, but I can only see it checking the FriendlyName of MMDevAPI entries. The game also prints errors in its own log file when switching to advanced vibrations, but I've not been able to correlate these errors with API calls—maybe the underlying library caches the information and/or regularly polls and the game code doesn't trigger more API calls.

EEljeyna 2024-03-13 github

I found strange things in Marvel's Spider-Man Remastered. If i change sound output to Dualsense Speaker then all entire game sound play throughout him, but in other games it trick doesn't work (maybe i test it better).

P.S. in browser speaker doesn't work too.
P.S.S. after close MSMR my speaker works for everyone.

CClearlyClaire 2024-03-21 github

Rebased on Proton experimental from yesterday: https://github.com/ClearlyClaire/wine/releases/tag/experimental-9.0-20240320%2Bdualsense

All DualSense features work in Horizon: Forbidden West!

SSid127 2024-04-06 github

both adaptive triggers and haptic feedback seem to work over USB in Helldivers 2, on upstream proton experimental

SSid127 2024-04-06 github

came across something funny:
if I change the udev rule to SUBSYSTEM=="sound", ACTION=="change", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="0ce6", ENV{SOUND_DESCRIPTION}="DualSense Controller" and launch Miles Morales with the dualsense plugged in already, it crashes 100% of the time on upstream proton experimental, and it doesn't crash if I launch the game first and then plug in the dualsense though if I launch to main menu first and then plug in the dualsense, all game audio goes through the dualsense speaker

DDynsks 2024-05-19 github

Rebased on Proton experimental from yesterday: https://github.com/ClearlyClaire/wine/releases/tag/experimental-9.0-20240320%2Bdualsense

All DualSense features work in Horizon: Forbidden West!

Rebased my patches on top of Proton 9.0 beta12 and fixed the errors: https://github.com/ClearlyClaire/wine/releases/tag/proton-wine-9.0beta12%2Bdualsense

I tested the build with Returnal, but not the other games. I still haven't figured out how Death Stranding, Spider-Man Remastered, Sackboy: A Big Adventure or Ratchet & Clank: Rift Apart select the audio device, so don't expect those to work.

EDIT: tried to poke some more at Ratchet & Clank: Rift Apart, but I've been unable to figure out what's wrong. It seems to fetch a lot of info, including ContainerID, from the HID device, but I can only see it checking the FriendlyName of MMDevAPI entries. The game also prints errors in its own log file when switching to advanced vibrations, but I've not been able to correlate these errors with API calls—maybe the underlying library caches the information and/or regularly polls and the game code doesn't trigger more API calls.

I really want to play Death Stranding with haptic feedback and adaptive trigger, I've no idea how it works to see what audio is for the controller and that it gets recognized right and that stuff. Wouldn't it be possible to write to the developer's support and ask if they could help?

CClearlyClaire 2024-05-20 github

Wouldn't it be possible to write to the developer's support and ask if they could help?

Customer support is extremely unlikely to be able to help on this, and the developers themselves are likely busy with other things or may be unable to disclose that kind of information. That being said, it doesn't cost anything (except time) to ask.

On a related note, I've played Animal Well, and despite it supposedly having support for the DualSense advanced features, that didn't work with my patches. So I guess Billy Basso is another person it might be worth reaching to (I tried to do that earlier but maybe not through the best channel—haven't heard back yet).

While I'm still interested in getting this to work with as many games as possibles, my main motivations were Returnal and Horizon: Forbidden West, which both work correctly now, and I have significantly less free time than when I started working on this, so don't expect any breakthrough.

Hhivehivemind 2024-05-20 github

Also adding a bit of context, I had games work by using the previous Proton 8 patch and, then, the latest Proton 9 one. If I have a clean game install it won't work straight away with the Proton 9 patch.

CClearlyClaire 2024-05-20 github

Also adding a bit of context, I had games work by using the previous Proton 8 patch and, then, the latest Proton 9 one. If I have a clean game install it won't work straight away with the Proton 9 patch.

Hm, then I may have missed something when rebasing the patches for Proton 9. A lot of what those patches do is when “installing” the device in the windows registry, so depending on what the game does, the first time you connect the DualSense may be the most important.

Do you have an example of a game that fails if you go straight with patched Proton 9, but works if you go through patched Proton 8 first?

EEljeyna 2024-05-20 github

I have several tests and what i did:
Alan Wake2, Cyberpunk 2077, The Last of Us Part 1, Far Cry 6
worked only with these patches (i patched latest git proton 8.0) https://github.com/Mutcholoko/Haptic-Feedback-Linux

Returnal (except speaker), Pacific Drive, Metro Exodus Enhanced Edition (win + linux native), Horizon Forbidden West, Genshin Impact works flawlessly with ClearlyClaire patches on any wine version 9.5+ and ProtonGE 9.4+

HHadrianneue 2024-05-20 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-2120786401

speaker should also work on returnal, there may be a difference between all the proton 7, 8 and 9 that changes that, iirc worked with the older version.

CClearlyClaire 2024-05-20 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-2120786401

That is weird, I have tried the following games with a fresh prefix:

  • The Last of Us Part 1: works fine with my Proton 9 branch
  • Pacific Drive: only classic rumble, not audio-based rumble, no matter if I use my Proton 8 or my Proton 9 branch
  • Returnal: everything works fine with my Proton 9 branch
  • DEATH STRANDING DIRECTOR'S CUT: no rumble at all nor speaker
  • Horizon Forbidden West™ Complete Edition: everything works fine with my Proton 9 branch

I don't have Alan Wake 2, Cyberpunk 2077, Far Cry 6 nor Genshin Impact, so I cannot test them. I have Metro Exodus Enhanced Edition, but I haven't installed it at the moment, so I can't test.

If you're experiencing something different, could you share whether you are using PulseAudio or PipeWire, and which version?

EEljeyna 2024-05-20 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-2120958689

Yep, i use CachyOS (based on Arch Linux) with pipewire audio system. Basically i rename "DualSense Wireless Controller" to "Wireless Controller"
pipewire --version:
Compiled with libpipewire 1.0.6
Linked with libpipewire 1.0.6

And games does not recognize DualSense for Haptic Feedback, but icons, Adaptive Triggers, Sensor panel with Light bar, Gyro and Accelerometer also works normally. Speaker also work only with patches Mutcholoko on Proton 8.0

UPD: Lastly i tested Pacific Drive with ProtonGE (something like 9-4 or 9-3) and Haptic Feedback with Adaptive Triggers works.

EEljeyna 2024-05-20 github

I just retested Returnal and confirm that speaker now works with Proton 9.0. Sorry for disinformation

EEljeyna 2024-05-20 github

The Last of Us Part 1 with Proton 9.0 says that "Vibrations are currently unavailable because the controller's audio is disabled. Re-enable the sound playback device". With Proton 8.0 it works ok.

CClearlyClaire 2024-05-20 github

I just rebuilt Proton 9.0-1 with my patches and re-tried The Last of Us Part 1 with a fresh prefix, everything worked well.

You can find the build here: https://github.com/ClearlyClaire/wine/releases/tag/proton-wine-9.0-1%2Bdualsense

If this still doesn't work, can you post the details of your plugged-in DualSense as seen by the PulseAudio API through pactl list sinks?

EDIT: As for Animal Well, I just noticed the game does output DualSense-specific audio, but on the wrong audio output. Using pavucontrol, I could change that stream's sink to the DualSense, enjoying the haptics and speaker use. Still, not sure why the game picks up the wrong audio device.

DDynsks 2024-05-20 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-2120958689

The GOG version of Cyberpunk 2077 installed through Heroic doesn't work anymore the issues came with the REDlauncher that Heroic added, before that the game was fine with this Proton version https://github.com/verbumfeit/proton-ge-custom-dualsense. Shouldn't be an issue in the Steam version .Metro Exodus feels a bit strange, the right side of the controller feels stronger.

EEljeyna 2024-05-20 github

I just rebuilt Proton 9.0-1 with my patches and re-tried The Last of Us Part 1 with a fresh prefix, everything worked well.

You can find the build here: https://github.com/ClearlyClaire/wine/releases/tag/proton-wine-9.0-1%2Bdualsense

If this still doesn't work, can you post the details of your plugged-in DualSense as seen by the PulseAudio API through pactl list sinks?

Yes, it worked now with Proton 9.0-1! Thanks!

EEljeyna 2024-05-20 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-2121055202

My English is very bad, but on Cyberpunk 2077 i doesn't have any issues, game works very well and DualSense 100% used (Haptic Feedback, Adaptive Triggers, Speaker)

HHadrianneue 2024-05-20 github

I don't have Alan Wake 2, Cyberpunk 2077, Far Cry 6 nor Genshin Impact, so I cannot test them. I have Metro Exodus Enhanced Edition, but I haven't installed it at the moment, so I can't test.

CP2077 was fully functional, cops comms came through the dualsense speaker.

MMutcholoko 2024-05-20 github

Speaker also work only with patches Mutcholoko on Proton 8.0

Again, I didn't write any patches, those were all made by @ClearlyClaire . I only read through them, collected and made a quick little guide because at the time there was no way to easily understand how to use it. You shouldn't use my repo anymore as it is absurdly outdated, please use Claire's instead.

EEljeyna 2024-05-20 github

Oh, i understood, my apologies. But thanks, it's great work anyway. If it needed i may test many games that implemented DualSense features, because huge fun linux, dualsense and motion control with gyro :)

Hhivehivemind 2024-05-21 github

Also adding a bit of context, I had games work by using the previous Proton 8 patch and, then, the latest Proton 9 one. If I have a clean game install it won't work straight away with the Proton 9 patch.

Hm, then I may have missed something when rebasing the patches for Proton 9. A lot of what those patches do is when “installing” the device in the windows registry, so depending on what the game does, the first time you connect the DualSense may be the most important.

Do you have an example of a game that fails if you go straight with patched Proton 9, but works if you go through patched Proton 8 first?

So the issue seems to happen on fresh Linux images as, for example, using Bazzite (Fedora Atomic OCI) and ChimeraOS (Arch immutable) I have to use the Proton 8 patch, which DualSense haptics work, and then Proton 9, otherwise after an OS update, or fresh distro reinstall, if I jump to Proton 9 I have the issue again.
It's game-agnostic, happened with every game I tried that the patch applies for (The Last of Us Part 1, Jedi Survivor, Cyberpunk, Ghostwire Tokyo, Alan Wake 2).

Hope that helps.

CClearlyClaire 2024-05-21 github

That is weird, I can't reproduce it. I tried The Last of Us Part 1 and Ghostwire Tokyo and both work (I thought Ghostwire Tokyo stopped working, but I guess I may have previously messed up my wine prefix) with the Proton 9 patches, and I can't explain how a system reinstall or update would “reset” this.

Which build of Proton 9 are you using? Are you sure it has all my custom patches? (last 9 commits at https://github.com/ClearlyClaire/wine/commits/proton-wine-9.0-1%2Bdualsense/)

Stock Proton 9 has better support than earlier versions (FFXIV and FF7R should work) but is still missing some patches.

DDynsks 2024-05-21 github

I don't know is that's new but I noticed that there is this proton experimental version "dualsense-haptics-wip - WIP DualSense support" does this version has better haptic feedback support?

EEljeyna 2024-05-22 github

GhostWyre: Tokyo works ok (on Proton 9.0-1), haptic feedback and adaptive triggers works, but game always shows me Xbox contoller layout (it's not a problem, just confused me and maybe others too). Same situtation with Scars Above (xbox controller layout, but others features works).

EEljeyna 2024-05-22 github

I write table with own tests and launch many games (3 days working on them), here these (on english and russian language):
https://docs.google.com/spreadsheets/d/1YvnaCKplTCEyWBWw-ypcDK1N_saDmuygA3RWhpcO8Ak/edit#gid=600629178

CClearlyClaire 2024-05-22 github

I don't know is that's new but I noticed that there is this proton experimental version "dualsense-haptics-wip - WIP DualSense support" does this version has better haptic feedback support?

This is an older version of proton with my patches.

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-2120969774

Btw, you shouldn't have to rename anything, this part is handled by Wine/Proton and this is one of the patches that have been merged into mainline.

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-2123883176

Ghostwire: Tokyo does that on Windows too. There is a game setting to change the input labels. I don't know about Scars Above.

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-2124143099

Surprised about Deathloop, last time I tried, all features were working (but speaker required disabling some APIs, see https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-1180859190)

EEljeyna 2024-05-22 github

Deathloop is very annoying game, sometimes it launches, sometimes not, idk what is problem and dualsense features doesn't work for me, only adaptive triggers works.
P.S. speaker doesn't work with disabling API too on my side.

CClearlyClaire 2024-05-23 github

I retried with a fresh prefix, and DEATHLOOP works as before, haptics work out of the box with the patches, but speaker requires disabling xaudio2_8 and xaudio2_9. Have you checked that Steam Input is disabled? Most of the other games do advertise support for the DualSense through Steam, but that is not the case of DEATHLOOP.

EEljeyna 2024-05-23 github

You test with Proton 9.0-1?
And yes, i have Steam Input disabled (PS layout, adaptive triggers). I checked soon that game.

CClearlyClaire 2024-05-23 github

I'm testing with my custom build of Proton 9.0-1, yes.

EEljeyna 2024-05-23 github

I rebuild prefix once again and now it works. Magic :D

EEljeyna 2024-05-23 github

Updated my table with new tests and problematic engines.
Seems to be World War Z always crashed with these patches both on Epic and Steam version.

Ppierrinator 2024-06-13 github

Did anyone manage to have Dualsense haptics working in Ghost Of Tsushima ?

Adaptative triggers works on my side, but no luck about haptics.
Using Helvum, i can see that the game doesn't output other audio channels than the front l/r

I also tried with your last build @ClearlyClaire but the problem stays the same.

EEljeyna 2024-06-13 github

@pierrinator Haptic Feedback doesn't work in Ghost of Tsushima, it's only need wine to be patched for this, but no luck for this time. You may check my table with working DualSense features on Linux:
https://docs.google.com/spreadsheets/d/1YvnaCKplTCEyWBWw-ypcDK1N_saDmuygA3RWhpcO8Ak/edit?gid=600629178#gid=600629178

MMwenDavo 2024-06-15 github

Hi! I've managed to get the haptic feedback and adaptive triggers on most of the games that I have that support it (Death Stranding and Cyberpunk 2077), but the haptic feedback requires that the gamepad is selected as the audio output, which makes it inconvenient. It seems to be related to what was said here. On Windows games can access the audio output of the gamepad automatically without it needing to be the default, can't something similar be implemented to Wine's audio module?

EEljeyna 2024-06-15 github

@MwenDavo i checked Death Stranding and no, it's not haptic feedback, it's sound hack that translate all audio game to dualsense haptic feedback, game does not recognize properly audio output.

MMwenDavo 2024-06-16 github

@Eljeyna You are right, I didn't differentiate both cases.

Also, just tested Star Wars Jedi Survivor and Haptic Feedback does work correctly (It doesn't vibrate with audio), along with Adaptive Triggers and Lightbar support. Tested using Bottles since I don't own the game on Steam but have EA Play through Gamepass.

Though to get it to work It is required to set the controller as the default audio device, so I have to use the controllers 3.5mm headphone jack to listen to the game's audio which makes it pretty annoying since I have a high end DAC.

EEljeyna 2024-06-17 github

@MwenDavo you may install Helvum or pavucontrol and manually set audio to controller and your headphones. Unfortunately i doesn't have SW Jedi Suvivor for test.

Rruvaldak 2024-06-29 github

Also adding a bit of context, I had games work by using the previous Proton 8 patch and, then, the latest Proton 9 one. If I have a clean game install it won't work straight away with the Proton 9 patch.

Hm, then I may have missed something when rebasing the patches for Proton 9. A lot of what those patches do is when “installing” the device in the windows registry, so depending on what the game does, the first time you connect the DualSense may be the most important.
Do you have an example of a game that fails if you go straight with patched Proton 9, but works if you go through patched Proton 8 first?

So the issue seems to happen on fresh Linux images as, for example, using Bazzite (Fedora Atomic OCI) and ChimeraOS (Arch immutable) I have to use the Proton 8 patch, which DualSense haptics work, and then Proton 9, otherwise after an OS update, or fresh distro reinstall, if I jump to Proton 9 I have the issue again. It's game-agnostic, happened with every game I tried that the patch applies for (The Last of Us Part 1, Jedi Survivor, Cyberpunk, Ghostwire Tokyo, Alan Wake 2).

Hope that helps.

I'm having this exact same issue, where I have to launch a game with claire's Proton 8 first before any Dualsense features will function. After launching with proton 8, I can swap to proton 9 and everything continues to work as expected. Tested with Cyberpunk 2077 and Animal Well.

info dump:

  • Dualsense controller is plugged into my PC via a USB-C to USB-A cable rated for USB 2
  • System is a ryzen 5600X in an Asus tuf gaming x570-plus (wi-fi) motherboard
  • Distro is CachyOS
  • Issue persisted on a completely fresh OS install
  • Games did not have any audio source for dualsense haptics or sound in pavucontrol until after running with Proton 8.0
  • adding udev rule and wireplumber did not affect anything
  • when testing audio channels of the dualsense's audio sink, front left has no noticeable effect, front right is the controller speaker, and the back channels are for each respective haptic motor
  • confusingly, the controller defaulted to being in headphones mode and volume at 0, had to correct with dualsensectl volume 255 and dualsensectl speaker internal
EEljeyna 2024-07-05 github

Genshin Impact and ZZZ works flawlessly with DualSense.

DDynsks 2024-07-23 github

Is there any way I can contribute to getting games running with haptic feedback?

CClearlyClaire 2024-07-23 github

Is there any way I can contribute to getting games running with haptic feedback?

Unfortunately, I'm not sure. I currently don't have the time to investigate more, and even with time I'm not sure I'd figure out what the remaining games are doing. If you have the time and abilities, you could try figuring out which API calls the games do and how. Alternatively, maybe reaching out to the correct people at Sony Interactive Entertainment, Audiokinetic, The Eccentric Ape, Kojima Productions, … but in practice pretty much everybody there is likely to be pretty busy and require approval from other people to disclose details.

Hhivehivemind 2024-09-29 github

Contributing back here,

Previous issues of requiring ClearlyClaire's Proton 8 DualSense fix and, then, Proton 9 DualSense fix for the haptics to work are currently isolated to Fedora-based distros (Bazzite, Nobara).
Been using CachyOS since my latest update. Never had issues jumping directly to ClearlyClaire's Proton 9 DualSense fix.

Ccarloscheddar 2024-10-03 github

~On Bazzite running GoW Ragnarok I tried all of the prefixes mentioned above and none of them worked. However setting the controller as the default audio device does enable haptics if I start the game afterwards. So my current workaround is to plug in my headphones into the controller in order to hear the game and enjoy the haptics.~

Turns out it was just surround sound causing the vibrations.

EEljeyna 2024-10-04 github

@carloscheddar It's not haptics made by developers, it's entire sound and music placed in game that does vibrate your gamepad

Ccarloscheddar 2024-10-09 github

@carloscheddar It's not haptics made by developers, it's entire sound and music placed in game that does vibrate your gamepad

After trying out the game for a bit I've realized that you're correct. So far I haven't been able to get haptics working with GoW: Ragnarok even with the @ClearlyClaire prefix. Also tried the proton 8 prefix that worked for Spider-Man but it can't load this game.

Kkode54 2024-10-10 github

@ClearlyClaire I got your Proton 9.0-1 package working with ANIMAL WELL. I had to use pavucontrol to remap the haptics/controller speaker output session to the controller's sound output, as it ended up outputting to the default sound output device, along with the main sound output on its own session. (Two sound output sessions open from the game, one meant for sound output, one meant for the controller.)

CClearlyClaire 2024-10-10 github

Yes, this means the game is doing something that I have not figured out. The purpose of the patches is that the games detect and properly select the audio output.

By the way, I've heard of some efforts in getting my existing patches into Proton itself but I'm not sure where it is at at the moment. As for other games, I have not been able to work on this nor get any additional information from Sony, Audiokinetic or the individual game studios.

DDynsks 2024-10-12 github

@pierrinator Haptic Feedback doesn't work in Ghost of Tsushima, it's only need wine to be patched for this, but no luck for this time. You may check my table with working DualSense features on Linux: https://docs.google.com/spreadsheets/d/1YvnaCKplTCEyWBWw-ypcDK1N_saDmuygA3RWhpcO8Ak/edit?gid=600629178#gid=600629178

What proton version do you mean with Proton_LG?

EEljeyna 2024-10-13 github

@Dynsks it's custom Proton based on Proton-GE with some patches like DualSense, Gstreamer and other, it's used by default in project PortProton (instead of lutris/bottles) that i like

Hhleonps 2024-12-11 github

@kode54 Did you do something else besides downloading the Proton package and using pavucontrol? I've tried to make my DualSense work, but it only shows 1 stream for ANIMAL WELL.

It may be due the audio server in the Steam Deck (Pipewire), but not sure what else to do to get it working (adding an udev rule and Wireplumber configuration for renaming the controller do nothing)

Kkode54 2024-12-11 github

I installed and set it to ClearlyClaire's Proton 9.0 fork, and also plugged in the controller using a USB-C cable.

Aarnxxau 2025-01-02 github

Hi, I wanted to play Silent Hill 2, but the latest release of ClearlyClaire's Proton 9.0 fork was crashing.
To fix this, I patched the latest version of Proton and uploaded it to my repository:
Proton DualSense Release 9.0-4.

For anyone who wants to patch their own version, I’ve also included the nine patches in the repository:
Proton DualSense Repository.

Also, thanks to ClearlyClaire for the amazing work with the patches.

WWujekFoliarz 2025-01-04 github

Has anyone fixed haptic feedback in Death Stranding: Director's Cut?

HHadrianneue 2025-02-01 github

if anyone is wondering, it works on marvel's spider man 2

?ghost 2025-02-02 github

Hi im kinda new, i be able to play cyberpunk on steam safely with this but my deathloop its from epic games and i cant get use to make work the vibration and the speakers, lutris dont detect at all the dual senses (making as a xinput) and heroic games launcher detect everything like adaptative triggers input and the dual senses, but i miss the speakers and the haptic feed back.

And how that i use the https://github.com/ClearlyClaire/dualsense-games-compat-check and compile to and .exe and dosent know how to work. I really interest in this topic.

Ggabriele2000 2025-02-03 github

Would it be possible, one day, to use the advanced features wirelessly?

WWujekFoliarz 2025-02-03 github

USB via IP maybe

CCsiPA0723 2025-02-17 github

Could anyone else check to see if the haptic feedback works in Star Wars Jedi Survivor? I tried all the above-mentioned prefixes, and none of them worked. (Adaptive triggers are working, even on the none patched prefixes) The audio source appears and connects to the controller but is completely silent.

CClearlyClaire 2025-03-01 github

I had a try at Monster Hunter: Wilds and could not get haptics to work. I'm under the impression they are supposed to work on Windows, but I have no setup to test this. Furthermore, the DualSense is only supported at all if Steam Input is enabled, so I'm wondering whether support for haptics in this case go through Steam Input as well?

WWujekFoliarz 2025-03-01 github

Steam input fucks with haptics

KKnuxer 2025-03-01 github

I've tested Wilds on Windows, and the audio haptics work as intended if the controller is set to the "Default Communications Device." It also only worked with Steam Input enabled.

FFakeMichau 2025-03-03 github

Yep, Wilds works on Windows while wired out of the box with steam input. Disabling steam input there disables the controller entirely, game seems to force enable it anyway. Trying to do wireless on Windows doesn't even give simple vibrations while it does with dualshock 4.
On Linux with patches from arnxxau's repo applied, neither wired nor wireless has haptics or vibrations. Disabling steam input has the same effect as on windows - the controller doesn't work at all.

As I understand it, those patches are not needed when going through steam input (similarly to helldivers 2) but applied them anyway.

CClearlyClaire 2025-03-03 github

I am not aware of Steam Input providing APIs for the kind of haptic feedback the Dualsense does, so the game likely relies on things the patches do, but it is not enough. I'm really curious to know how Monster Hunter: Wilds matches the Steam Input devices with the audio output. Unfortunately, I have little time to investigate that, Steam Input is closed source, and investigating Monster Hunter: Wilds is pretty tedious with Denuvo kicking you out whenever you change Proton prefixes too much.

WWujekFoliarz 2025-03-03 github

@ClearlyClaire the game probably grabs the first audio device called "Wireless Controller" and that's it

Hhgaiser 2025-03-03 github

Apologies if this is out of place, but there seems to be a lot of knowledge here about advanced features for DualSense controllers. I'm just curious what is currently preventing the use of adaptive triggers over Bluetooth? It seems games interact with raw USB devices for this functionality, why is Bluetooth seemingly difficult to implement? Would it even matter if a driver suddenly implements adaptive trigger (hid-playstation for example), or would games need to be adapted in that case too?

WWujekFoliarz 2025-03-03 github

@hgaiser You need to send a specific CRC32 checksum at the end of report state for it to work

WWujekFoliarz 2025-03-03 github

Why some games work over BT and some not? I have no idea, when I'm trying to open the controller via official PS5 SDK, it does get a handle but nothing else works

Image

perhaps you have to send some initial data on your own

CClearlyClaire 2025-03-03 github

@ClearlyClaire the game probably grabs the first audio device called "Wireless Controller" and that's it

Some games do that, but that's a small minority. Most games use different APIs to match the audio device with the HID device. I don't know how Monster Hunter: Wilds does it, I don't know if it even tries to find the audio device or fails earlier than that, but having the DualSense audio output called “Wireless Controller” is definitely not enough for it to open it.

Apologies if this is out of place, but there seems to be a lot of knowledge here about advanced features for DualSense controllers. I'm just curious what is currently preventing the use of adaptive triggers over Bluetooth? It seems games interact with raw USB devices for this functionality, why is Bluetooth seemingly difficult to implement? Would it even matter if a driver suddenly implements adaptive trigger (hid-playstation for example), or would games need to be adapted in that case too?

Most games handle the DualSense directly with Sony-provided libraries, and those libraries (at least older versions of it) just don't implement advanced features over bluetooth. Steam Input's implementation does handle Adaptive Triggers over bluetooth, though, and some games support them through it. No game I'm aware of supports DualSense audio-based features (speaker and VCM-based haptics) over bluetooth on PC, and the protocol for wireless audio is, as far as I'm aware, not known (and might even not be bluetooth).

WWujekFoliarz 2025-03-03 github

Most games handle the DualSense directly with Sony-provided libraries, and those libraries (at least older versions of it) just don't implement advanced features over bluetooth.

I tried with the latest DLL from Zenless Zone Zero's plugin folder and it doesn't work

WWujekFoliarz 2025-03-03 github

having the DualSense audio output called “Wireless Controller” is definitely not enough for it to open it.

If you only have one player then it's more than enough

Ppinkflames 2025-03-03 github

Let me just repeat myself from more than a year ago: Sony DualSense only has Bluetooth certifications, so it must use the PHY and MAC layers of it. At least, that's my understanding of the state of laws and regulations around wireless communication technology.

That being said, they might be using some secret sauce in layers above the MAC. Also let's not forget that both PS5 and the DS controller have Bluetooth Low Energy certifications, so it's quite likely that Sony would actually use LE features as ingredients in their DualSense secret sauce e.g. the LC3 audio codec. They could even have implemented an all new audio codec just like PIpeWire did with its Linux specific Opus A2DP profile.

CClearlyClaire 2025-03-03 github

having the DualSense audio output called “Wireless Controller” is definitely not enough for it to open it.

If you only have one player then it's more than enough

It could be enough, but a game being single-player does not mean you're guaranteed that only one controller will be plugged at a time. And we were discussing what games actually do, not what would be enough for them to do. FF XIV Online and FF7 Remake use the device's name, but most of the other games uses other means (such as matching container ID). Unfortunately, I have not been able to figure out what games like Death Stranding: Director's Cut, Sackboy: A Big Adventure, Ratchet & Clank: Rift Apart or Monster Hunter: Wilds rely on to select the audio device.

WWujekFoliarz 2025-03-05 github

I noticed that basically all games that support wireless adaptive triggers don't have libScePad.dll present in the game files. Maybe there is some other version?

SSyntist 2025-03-07 github

GTA 5 Enhanced, Dualsense work in usb mode using proton, but on wireless it's detected as normal X360 controller, but on windows bluetooth connection have Adaptive Triggers. Any way to make it work wirelessly? Or on linux i'll have to connect controller?

Hhivehivemind 2025-03-09 github

I noticed that basically all games that support wireless adaptive triggers don't have libScePad.dll present in the game files. Maybe there is some other version?

libScePad.dll is a DualShock 4 library, so it won't interface the game with DualSense tech such as adaptive triggers.

having the DualSense audio output called “Wireless Controller” is definitely not enough for it to open it.

If you only have one player then it's more than enough

It could be enough, but a game being single-player does not mean you're guaranteed that only one controller will be plugged at a time. And we were discussing what games actually do, not what would be enough for them to do. FF XIV Online and FF7 Remake use the device's name, but most of the other games uses other means (such as matching container ID). Unfortunately, I have not been able to figure out what games like Death Stranding: Director's Cut, Sackboy: A Big Adventure, Ratchet & Clank: Rift Apart or Monster Hunter: Wilds rely on to select the audio device.

FF VII Rebirth runs with every Dualsense functionality, including haptics and controller audio output, directly from upstream Proton. They are either using some sort of updated lib from Sony or have something custom to work with Linux (I wouldn't be surprised since SE is the only AAA studio working harder on Steam Deck/Linux support).
Anyway, it was a nice surprise.

WWujekFoliarz 2025-03-09 github

libScePad.dll is a DualShock 4 library, so it won't interface the game with DualSense tech such as adaptive triggers.

That's not what I mean, I said that every game that supports wireless connection does not have the DLL in the game files. Maybe there is another version that's not external.

Hhivehivemind 2025-03-10 github

libScePad.dll is a DualShock 4 library, so it won't interface the game with DualSense tech such as adaptive triggers.

That's not what I mean, I said that every game that supports wireless connection does not have the DLL in the game files. Maybe there is another version that's not external.

Not exactly. This is what its source code should be: https://github.com/MasonLeeBack/libscepad_windows_sdk/blob/master/libscepad.h
As far as I know that DLL is distributable (not built into Windows). Games without it just interface the controller differently (there are a range of ways a game can connect with a dualshock/dualsense controller. This is this whole thread hardship)

WWujekFoliarz 2025-03-10 github

Games without it just interface the controller differently

You can tell a game uses sony's library when the microphone LED lights up after you release the mic button

UUklosk 2025-03-16 github

So still nothing about Death Stranding, right?

2386.277:0128:012c:fixme:combase:RoGetActivationFactory (L"Windows.Gaming.Input.Gamepad", {8bbce529-d49c-39e9-9560-e47dde96b7c8}, 000000000041EA68): semi-stub
2386.277:0128:0238:warn:threadname:NtSetInformationThread Thread renamed to L"DualShock4Haptic"

Maybe it uses GameInput (XInput successor) for rumble and haptics, this API is relatively new and very few games use it, so may be not a priority for Wine devs.

WWujekFoliarz 2025-03-16 github

"DualShock4Haptic"

Dualshock 4 rumble =/= Dualsense haptics

UUklosk 2025-03-16 github

"DualShock4Haptic"

Dualshock 4 rumble =/= Dualsense haptics

I know, but that is the only trace referring haptics.

UUklosk 2025-03-16 github

These are the GameInput API related calls registered using procmon, you probably know them and I'm just reviving and old debate.

It seems the game is using GameInput API to define DualSense as a custom device?

https://learn.microsoft.com/es-es/uwp/api/windows.gaming.input.custom.gamecontrollerfactorymanager?view=winrt-26100

Click to expand

"11:21:13,4859431","ds.exe","17320","RegOpenKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad","SUCCESS","Desired Access: Read"
"11:21:13,4859575","ds.exe","17320","RegQueryKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad","SUCCESS","Query: Basic, Name: Windows.Gaming.Input.Gamepad"
"11:21:13,4859708","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\ActivationType","SUCCESS","Type: REG_DWORD, Length: 4, Data: 0"
"11:21:13,4859838","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\Server","NAME NOT FOUND","Length: 144"
"11:21:13,4859956","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\DllPath","SUCCESS","Type: REG_SZ, Length: 90, Data: C:\Windows\System32\Windows.Gaming.Input.dll"
"11:21:13,4860054","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\Threading","SUCCESS","Type: REG_DWORD, Length: 4, Data: 0"
"11:21:13,4860214","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\TrustLevel","SUCCESS","Type: REG_DWORD, Length: 4, Data: 0"
"11:21:13,4860648","ds.exe","17320","RegQueryKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad","SUCCESS","Query: HandleTags, HandleTags: 0x0"
"11:21:13,4860890","ds.exe","17320","RegOpenKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\CustomAttributes","NAME NOT FOUND","Desired Access: Read"
"11:21:13,4861448","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\RemoteServer","NAME NOT FOUND","Length: 144"
"11:21:13,4861772","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\ActivateAsUser","NAME NOT FOUND","Length: 16"
"11:21:13,4862073","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\ActivateInSharedBroker","NAME NOT FOUND","Length: 16"
"11:21:13,4862442","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\ActivateInBrokerForMediumILContainer","NAME NOT FOUND","Length: 16"
"11:21:13,4862737","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\Permissions","NAME NOT FOUND","Length: 140"
"11:21:13,4863011","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad\ActivateOnHostFlags","NAME NOT FOUND","Length: 16"
"11:21:13,4863592","ds.exe","17320","RegCloseKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Gamepad","SUCCESS",""
"11:21:13,4865661","ds.exe","17320","FASTIO_NETWORK_QUERY_OPEN","C:\Windows\System32\Windows.Gaming.Input.dll","FAST IO DISALLOWED",""
"11:21:13,4866247","ds.exe","17320","IRP_MJ_CREATE","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened"
"11:21:13,4866455","ds.exe","17320","FASTIO_QUERY_INFORMATION","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","Type: QueryBasicInformationFile, CreationTime: 26/06/2024 12:29:20, LastAccessTime: 16/03/2025 11:21:12, LastWriteTime: 26/06/2024 12:29:20, ChangeTime: 25/01/2025 10:20:05, FileAttributes: A"
"11:21:13,4866564","ds.exe","17320","IRP_MJ_CLEANUP","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS",""
"11:21:13,4866751","ds.exe","17320","IRP_MJ_CLOSE","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS",""
"11:21:13,4867441","ds.exe","17320","IRP_MJ_CREATE","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","Desired Access: Read Data/List Directory, Execute/Traverse, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: n/a, ShareMode: Read, Delete, AllocationSize: n/a, OpenResult: Opened"
"11:21:13,4867734","ds.exe","17320","FASTIO_ACQUIRE_FOR_SECTION_SYNCHRONIZATION","C:\Windows\System32\Windows.Gaming.Input.dll","FILE LOCKED WITH ONLY READERS","SyncType: SyncTypeCreateSection, PageProtection: PAGE_EXECUTE_READ"
"11:21:13,4867817","ds.exe","17320","FASTIO_RELEASE_FOR_SECTION_SYNCHRONIZATION","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS",""
"11:21:13,4867902","ds.exe","17320","FASTIO_ACQUIRE_FOR_SECTION_SYNCHRONIZATION","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","SyncType: SyncTypeOther"
"11:21:13,4867972","ds.exe","17320","FASTIO_RELEASE_FOR_SECTION_SYNCHRONIZATION","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS",""
"11:21:13,4869012","ds.exe","17320","Load Image","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","Image Base: 0x7ff88d8c0000, Image Size: 0xee000"
"11:21:13,4870449","ds.exe","17320","IRP_MJ_CLEANUP","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS",""
"11:21:13,4870623","ds.exe","17320","IRP_MJ_CLOSE","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS",""
"11:21:13,4871123","ds.exe","17320","IRP_MJ_READ","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","Offset: 901.120, Length: 16.384, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal"
"11:21:13,4872485","ds.exe","17320","IRP_MJ_READ","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","Offset: 892.928, Length: 8.192, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal"
"11:21:13,4873636","ds.exe","17320","IRP_MJ_READ","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","Offset: 851.968, Length: 16.384, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal"
"11:21:13,4874887","ds.exe","17320","IRP_MJ_READ","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","Offset: 868.352, Length: 8.192, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal"
"11:21:13,4876362","ds.exe","17320","IRP_MJ_QUERY_INFORMATION","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","Type: QueryNameInformationFile, Name: \Windows\System32\Windows.Gaming.Input.dll"
"11:21:13,4878603","ds.exe","17320","IRP_MJ_READ","C:\Windows\System32\Windows.Gaming.Input.dll","SUCCESS","Offset: 839.680, Length: 12.288, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal"
"11:21:13,4932390","ds.exe","17320","RegOpenKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager","SUCCESS","Desired Access: Read"
"11:21:13,4932530","ds.exe","17320","RegQueryKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager","SUCCESS","Query: Basic, Name: Windows.Gaming.Input.Custom.GameControllerFactoryManager"
"11:21:13,4932640","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\ActivationType","SUCCESS","Type: REG_DWORD, Length: 4, Data: 0"
"11:21:13,4932729","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\Server","NAME NOT FOUND","Length: 144"
"11:21:13,4932808","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\DllPath","SUCCESS","Type: REG_SZ, Length: 90, Data: C:\Windows\System32\Windows.Gaming.Input.dll"
"11:21:13,4932889","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\Threading","SUCCESS","Type: REG_DWORD, Length: 4, Data: 0"
"11:21:13,4932966","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\TrustLevel","SUCCESS","Type: REG_DWORD, Length: 4, Data: 0"
"11:21:13,4933049","ds.exe","17320","RegQueryKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager","SUCCESS","Query: HandleTags, HandleTags: 0x0"
"11:21:13,4933136","ds.exe","17320","RegOpenKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\CustomAttributes","NAME NOT FOUND","Desired Access: Read"
"11:21:13,4933238","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\RemoteServer","NAME NOT FOUND","Length: 144"
"11:21:13,4933314","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\ActivateAsUser","NAME NOT FOUND","Length: 16"
"11:21:13,4933407","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\ActivateInSharedBroker","NAME NOT FOUND","Length: 16"
"11:21:13,4933493","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\ActivateInBrokerForMediumILContainer","NAME NOT FOUND","Length: 16"
"11:21:13,4933571","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\Permissions","NAME NOT FOUND","Length: 140"
"11:21:13,4933649","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager\ActivateOnHostFlags","NAME NOT FOUND","Length: 16"
"11:21:13,4933771","ds.exe","17320","RegCloseKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.Custom.GameControllerFactoryManager","SUCCESS",""
"11:21:13,4934374","ds.exe","17320","RegOpenKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController","SUCCESS","Desired Access: Read"
"11:21:13,4934484","ds.exe","17320","RegQueryKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController","SUCCESS","Query: Basic, Name: Windows.Gaming.Input.RawGameController"
"11:21:13,4934575","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\ActivationType","SUCCESS","Type: REG_DWORD, Length: 4, Data: 0"
"11:21:13,4934650","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\Server","NAME NOT FOUND","Length: 144"
"11:21:13,4934720","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\DllPath","SUCCESS","Type: REG_SZ, Length: 90, Data: C:\Windows\System32\Windows.Gaming.Input.dll"
"11:21:13,4934793","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\Threading","SUCCESS","Type: REG_DWORD, Length: 4, Data: 0"
"11:21:13,4934862","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\TrustLevel","SUCCESS","Type: REG_DWORD, Length: 4, Data: 0"
"11:21:13,4934935","ds.exe","17320","RegQueryKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController","SUCCESS","Query: HandleTags, HandleTags: 0x0"
"11:21:13,4935004","ds.exe","17320","RegOpenKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\CustomAttributes","NAME NOT FOUND","Desired Access: Read"
"11:21:13,4935086","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\RemoteServer","NAME NOT FOUND","Length: 144"
"11:21:13,4935154","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\ActivateAsUser","NAME NOT FOUND","Length: 16"
"11:21:13,4935222","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\ActivateInSharedBroker","NAME NOT FOUND","Length: 16"
"11:21:13,4935293","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\ActivateInBrokerForMediumILContainer","NAME NOT FOUND","Length: 16"
"11:21:13,4935364","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\Permissions","NAME NOT FOUND","Length: 140"
"11:21:13,4935435","ds.exe","17320","RegQueryValue","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController\ActivateOnHostFlags","NAME NOT FOUND","Length: 16"
"11:21:13,4935534","ds.exe","17320","RegCloseKey","HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\Windows.Gaming.Input.RawGameController","SUCCESS",""

Hhivehivemind 2025-03-16 github

An update: Spider Man 2 is the first Nixxes game to benefit from ClearlyClaire's patch I think, and its actual DualSense haptics are only working using it.
I actually ported her patch to the current Proton Experimental Bleeding Edge to test this.

UUklosk 2025-03-17 github

There is a WINE issue open about the lack of haptics in WINE's Game Input implementation, I have revived it:

https://bugs.winehq.org/show_bug.cgi?id=54697

?ghost 2025-04-11 github

Any update for death stranding? By some reason The game detect my controller as a generic on linux. He get the input but the adaptative triggers e haptic feedback dosent work

CClearlyClaire 2025-04-11 github

Any update for death stranding? By some reason The game detect my controller as a generic on linux. He get the input but the adaptative triggers e haptic feedback dosent work

The game should handle adaptive triggers just fine (make sure you use the controller via USB and disable Steam input for it). Audio-based haptics don't work, there has been no progress on that, unfortunately.

Aandrew-ld 2025-04-27 github

Hi everyone, as a temporary workaround for games that uses gameinput you can use my compatibility library https://github.com/andrew-ld/gameinput2xinput/releases/tag/1.0.3.

just download the dll and place as gameinput.dll in the same directory of game exe

there is also a not-yet-released version that via steamapi adds support for advanced dualsense vibration https://github.com/andrew-ld/gameinput2xinput/issues/4#issuecomment-2562694198

UUklosk 2025-05-06 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-2833573952

So the SteamInput version adds haptics to games like Death Stranding DC? Does it also work over bluetooth?

WWujekFoliarz 2025-05-06 github

So the SteamInput version adds haptics to games like Death Stranding DC? Does it also work over bluetooth?

No it just uses the xbox 360 rumble

Hhivehivemind 2025-06-06 github

@ClearlyClaire @GloriousEggroll So I've spent some considerable time looking into the past issue of requiring using your Proton 8 patches with every game first to get Dualsense haptics to work here with future Proton versions (up to current bleeding edge with your rebased patches).
The issue pointed to be this wine commit: b1b231f3
I just reverted HRESULT load_driver_devices(EDataFlow flow) from the commit for compatibility and Proton with your patches now work upfront with every game, I don't need to use the older Proton 8 + DS patch first anymore.

It seems some systems USB states with more complex MMDevice enumeration are not fully compatible with that loop simplification for DEVICE_STATE_ACTIVE, but that is just a guess. For example, using a ROG X570-i Gaming and disabling USB S5 power management + ErP in the BIOS will make the Dualsense haptics to completely not work with any patched Proton version, it only does with USB S5 enabled (ErP doesn't matter).

In any case, here is my diff on top of current Wine upstream + dualsense haptics MR rebased (7238)

devenum.c.patch

SStaringLongingly 2025-06-10 github

Can you provide a build with your patch please? I can't get proton-ge to build

TTheGreatestJannet 2025-06-16 github

I was wondering if anyone has had any luck getting Stellar Blade to work with the DualSense Haptics?

So far I have tried arnxxau, Proton 9.0-4 build and Proton GE 10-4 but haven’t had any luck. There are no vibrations at all not even simple ones. I did firmware upgrade my DualSense too but that didn’t help either.

SStaringLongingly 2025-06-16 github

@TheGreatestJannet That was my original goal, adaptive triggers work for me on GE 10-4 but no speaker / haptics. Other games' haptics (i tested tloup1) dont work unless using claire's proton 8 i found on this thread

Aartogahr 2025-07-29 github

Hi folks, I know it's been asked here before, but I still feel like this is the best place to ask, has anyone got the haptics to work natively with Death Stranding DE?

I'm running it through Proton within Steam, in wayland/pipewire, Dualsense connected with USB. Works perfectly fine in Windows (apart from the sound output, which I don't care about).

I'm able to send sound to the RL and RR speakers of the controller sound device, which do vibrate the controller. I've seen other people use Helvum to manually route the outputs to the correct places. However, no matter which Proton version I try (including Claire's patched version) or what settings I change, Death Stranding doesn't expose RL and RR outputs for haptics.

hid_playstation is loaded. I've even got the udev rules to enable hidraw. As with many people's experiences, adaptive triggers and gyro also work, just not the haptics.

The sound output device name is "DualSense wireless controller (PS5)". Is this fine? Or is it only supposed to be named "Wireless Controller"?

UUjinT34 2025-07-29 github

Patches included with proton-tkg and proton-ge are either incomplete or have some other issue which prevents ContainerID setting. Probably some issue with mmdevapi. mmdevapi patches that are marked as '[pending review]' expect some values to be present in the registry while those keys don't exist or have a bunch of zeroes as their value. These patches worked on some earlier proton versions iirc.

Hhivehivemind 2025-07-29 github

Trying to simplify a bit on its current state and direction.

The DualSense haptics was implemented most likely under a specific Playstation SDK version range in an engine level (so we can't just replace DLLs externally for a fix, it's in each game engine binary), and they utilize not fully discovered protocols, or how they can be ported into Wine.
Games on that range include Nixxes ones (Ratchet & Clank, Spider Man Remastered/Miles Morales, Death Stranding DE, Ghost of Tsushima), and some more that we are exploring testing.

ClearlyClaire has been very busy with other projects, so right now in a new lead the code was rebased with Wine upstream, there were new commits on its current work (no new support for the games we know of, I think) and its state should be tracked here: https://gitlab.winehq.org/wine/wine/-/merge_requests/7238

We have this issue open in GitHub here for visibility, maybe Valve can merge the progress so far into upstream Proton, or monitor its progress at least and decide to do that (if they will).

Hope that helps.

CCodyexter 2025-08-02 github

libScePad.dll is a DualShock 4 library, so it won't interface the game with DualSense tech such as adaptive triggers.

In God Of War Ragnarok it enables native DualSense support with adaptive triggers but no haptics. When booting the game with SteamDeck="1" , it completely ignores the existence of the dll, but if you copy the libScePad.dll from the PSPC_SDK and paste it in the folder next to the .exe, and use NoPSSDK: https://github.com/dandykong/nopssdk then the DualSense works.

also libScePad.dll make a lot of external calls to other dlls that could potentially lead to haptics on this game.

HID.DLL:
HidP_GetValueCaps
HidD_GetProductString
HidD_GetAttributes
HidD_GetManufacturerString
HidP_GetCaps
HidD_GetSerialNumberString
HidD_GetHidGuid
HidD_GetFeature
HidD_FreePreparsedData
HidD_SetFeature
HidD_GetPreparsedData

SETUPAPI.DLL
SetupDiGetClassDevsW
SetupDiGetDeviceRegistryPropertyW
SetupDiEnumDeviceInfo
SetupDiEnumDeviceInterfaces
SetupDiGetDeviceInterfaceDetailW
SetupDiDestroyDeviceInfoList

WINMM.DLL
timeGetDevCaps
timeGetTime
timeBeginPeriod
timeEndPeriod

I know nothing about this tho, I'm just genuinely curious about what make haptics tick

WWujekFoliarz 2025-08-02 github

I know nothing about this tho, I'm just genuinely curious about what make haptics tick

The game handles haptics with it's sound engine, libScePad only provides hints about the speaker device

CCodyexter 2025-08-02 github

The game handles haptics with it's sound engine, libScePad only provides hints about the speaker device

Yes I'm aware. All I'm saying is that in the end is an identification/synchro problem between the game and the controller. My dualsense have even been vibrating with the game's audio when starting with the dualsense as default sound device.

WWujekFoliarz 2025-08-02 github

My dualsense have even been vibrating with the game's audio when starting with the dualsense as default sound device.

Isn't that normal though?

Qquuinnn 2025-08-05 github

I've been tracking this issue for a while now and I've came here to say that it seems like Death Stranding DC all of a sudden started working DualSense triggers and haptics via Steam Input. I switched to the Steam Beta branch a few weeks ago after I realised how much stuff I was missing out on and I believe it might have something to do with Steam Input: Added support for games that use the GameInput API as part of the July 24th beta update. Wonder if anyone else could verify for me.

WWujekFoliarz 2025-08-05 github

haptics

you sure it's not just fallback rumble? Even if it is, it's better than nothing because the game doesn't normally switch to rumble and you get no vibrations whatsoever on Bluetooth.

Qquuinnn 2025-08-05 github

The haptics feel the same so it's probably that.

EErfboom 2025-09-15 github

hey guys, i don't know if this is the place to share feedback on the status of the dualsense with games, but i'm not sure where else to post this information so i figured i'd start here with something interesting i found.

silent hill 2 with the latest patch only had partial adaptive triggers working using proton-ge 10-15 and they would stop working after a while. i got a modern usb-a to usb-c cable rated for usb 3.0, and then i plugged the controller into a 3.0 port and now it charges whereas before i was using a usb 2.0 port and it charged extremely slow or none at all.

i ended up blowing the prefix out and created a new one and started the game up and low and behold i had rumble, adaptive triggers and partial haptic feedback (no speaker). the features stopped working after a few minutes (expected with sh2), and then i unplugged the controller and plugged it back in and then everything worked including the speaker.

really not sure what happened here, but my understanding is the current patches in place for the dualsense in proton are going to be hit or miss with games, correct?

i tried doing the same set of steps for god of war ragnarok, but that game only gives me half working adaptive triggers and nothing else.

anyways, i thought i'd share that tidbit. it seems to align with a lot of what was discussed in this thread (timing of when to plug the controller in at least).

WWujekFoliarz 2025-09-15 github

In Silent Hill 2 you need to touch the M/KB once in a while to keep the triggers and haptics working

CClearlyClaire 2025-10-25 github

As far as I understand, my patches have now all been merged or superseded by similar ones that have landed in the latest Proton 10 experimental build (https://github.com/ValveSoftware/Proton/wiki/Changelog).

This doesn't seem to go much further than what I did, and games like Death Stranding Director's Cut or Sackboy still don't have working haptics, but Horizon, Returnal, The Last of Us, and so on, appear to work fine without the need for a custom build.

Eemansom 2025-10-28 github

@ClearlyClaire

I should say that zero games currently pass them over bluetooth, every single one demands usb atm.

GTA 5 Enhanced on Windows 11 via Steam (Steam Input disabled for the game) has support for DualSense haptic feedback adaptive triggers over Bluetooth. Hope this helps.

MMwenDavo 2025-10-28 github

@ClearlyClaire

I should say that zero games currently pass them over bluetooth, every single one demands usb atm.

GTA 5 Enhanced on Windows 11 via Steam (Steam Input disabled for the game) has support for DualSense haptic feedback over Bluetooth. Hope this helps.

That is not possible, since Haptic Feedback requires an audio output on the PC to send the haptics through, but the Bluetooth implementation does not register one, only on USB. What is possible is that the game is sending normal rumble signals.

Eemansom 2025-10-28 github

@MwenDavo

That is not possible, since Haptic Feedback requires an audio output on the PC to send the haptics through, but the Bluetooth implementation does not register one, only on USB. What is possible is that the game is sending normal rumble signals.

My bad. Apologies. Didn't understand properly. I was confusing haptic feedback with adaptive triggers.

Adaptive Triggers are working over Bluetooth on Windows 11 for me with the DualSense in GTA 5 Enhanced. Steam Input disabled for the game, that way the game has full control over the DualSense.

GTA 5 Enhanced was released with this feature advertised. They might be using some propietary Sony SDK functionality. It works.
The DualSense is giving me tension in the L2 and R2 triggers that vary per weapon type and vehicle.

WWujekFoliarz 2025-10-28 github

Too bad rockstar didn't bother to port haptic feedback to PC at all, it's rumble even on USB

MMwenDavo 2025-11-03 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3456909487

Yes, adaptive triggers work over Bluetooth because they are implemented as part of the gamepad's components on a driver level. You can see this on many frameworks, such as SDL. This is unlike the audio component of the Dualsense, since the current Bluetooth implementation doesn't allow to register 2 devices from 1 connection (gamepad and audio).

USB does allow this since there are many devices that require having this feature (USB hubs for example), so the driver takes advantage of this.

On the PS5 Sony developed a custom driver for it so they can support both Haptic Feedback and Adaptive Triggers through one Bluetooth connection.

Xxzn 2025-11-28 github

I've done some work that makes haptic works in Stellar Blade #8819 :

proton-ds5-haptic-wip.patch

Caveats:

  • Controller need to be plugged in before the game launches. If you reconnect your controller after game has launched, there will be no haptic.
  • The patch will litter your prefix's registry somewhat.
  • Needs much cleanup overall.

While on this subject, in theory we could create a virtual USB hub driver with a virtual DS5 device complete with audio channels, then we proxy that from the bluetooth device to get haptic working on bluetooth. Assuming hidraw allow us access to audio on bluetooth ofc. (Totally not gonna work on this myself, Linux kernel driver is out of my reach for now.)

WWujekFoliarz 2025-11-28 github

Assuming hidraw allow us access to audio on bluetooth ofc.

Tested this and it works
https://github.com/egormanga/SAxense

Xxzn 2025-11-28 github

Tested this and it works https://github.com/egormanga/SAxense

That's awesome. To get it to work with existing programs seamlessly that expects audio tied to an USB device, I was looking at various Linux driver's source, it seems that neither vhci_hcd or dummy_hcd support isochronous transfer, which is what USB audio devices use. I could be overthinking this but it seems we have to modify those kernel modules to add that ability if to use them.

WWujekFoliarz 2025-11-28 github

It doesn't have to be directly tied to the dualsense, it just needs to be named "Wireless Controller" but to work correctly in most games the fake audio device has to match the container id of the controller, which I think is assigned entirely by windows and I think the latest patch of proton already returns a dummy id.

WWujekFoliarz 2025-11-28 github

Anyway, in SAxense readme the guy wrote that he's already working on something

Xxzn 2025-11-28 github

While working my patch it seems that the container id is determined by the winepulse/winehid/wineusb drivers.

So there's two things:

  • Get wine to see the bluetooth ds5 as a usb one, so games will try to do haptic.
  • Associated the audio sink with the virtual usb hid (unless we are fully emulating a virtual ds5), so games will use it, by way of wine special casing and detection.

If no full virtual ds5 usb device proxy, then some changes in wine/proton will be needed.

At the present, inputplumer's virtual usb hid ds5 does not work in any proton games that I've tested. Same with hhd, whose virtual ds5 only works in bluetooth mode. I suspect the issue is that the virtual hid doesn't actually have a usb controller assigned, so it's confusing the games.

MMwenDavo 2025-11-28 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3590018507

I know Sunshine (Streaming program) supports creating virtual Dualsense controllers on Linux using this.

Maybe you'll find something useful there?

Aarnxxau 2025-11-29 github

replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3588361963

I tested your patch and it works perfectly in Stellar Blade

I’ve uploaded a proton-GE patched build to https://github.com/arnxxau/proton-dualsense/releases/tag/GE-10-25-dualsense

Thank you!

Xxzn 2025-11-29 github

Update:

proton-staging-ds5-haptic-v2-wip.patch

Changes:

Diffed against staging patched, fixed a few bugs in my code ..

proton-ds5-haptic-v2-wip.patch (has bugs do not use :>)

Changes:

  • Keep pulse audio backend audio devices lists up-to-date when they change in the system. Haptic with hot-plugged dualsense now works.
  • Some error handling.

And like previously Stellar Blade now works. (Sadly not Spider-Man Remastered etc. still)

Otherwise still the same issue with littering the registry with stale keys.


Note:
The behavior I implemented for RegisterEndpointNotificationCallback doesn't match what I observed on Windows. But it seems to work for now.

Specifically normally OnDeviceStateChanged is called when plugging/unplugging the device, but I also make calls to OnDeviceAdded and OnDeviceRemoved without distinction (not the behavior on Windows). In addition I set all devices as disabled then re-enable the rest when one device is plugged/unplugged, instead of only changing the state for the device that has changed, which leads to hiccup in audio when that happens.

OTOH the changes I made (not sure which one) seem to have eliminated the static sound sometimes heard when launching a game if a recording session is present. (Likely caused by improper/stale format info which is now fixed)

Xxzn 2025-11-30 github

proton-staging-ds5-haptic-v2.5-wip.patch

(requires proton-staging-ds5-haptic-v2-wip.patch)

Spider-Man Remastered/Miles Morales now works.


As before it litters the registry somewhat. And I'm not sure I added the code in the right place.

Basically:

For Stellar Blade:

Changes needed

  • xaudio2/faudio take device id as input to open device
  • create fake entries for audioendpoint driver interface instances in setupapi (I did it from mmdevapi), with containerid set
  • add devices to DeviceContainers registry location

For Spider-Man:

Additional changes needed:

  • fake entries for audioendpoint driver itself
  • friendly name for driver interface instances

For hot-plug audio/haptic:

  • calls IMMNotificationClient for various events
  • actual audio backend (pulse in this case) modified to detect and support hotplug
WWujekFoliarz 2025-12-01 github

Do you think you could check out death stranding director's cut?

CClearlyClaire 2025-12-01 github

I think @alasky17 is also working on expanding DualSense support in Proton, so I'd like to make sure they see what you're doing @xzn so that you may coordinate and work faster towards a proper implementation / avoid duplicate work.

Aalasky17 2025-12-02 github

@ClearlyClaire Thank you for the ping!
@xzn To my knowledge there isn't anyone working on the support right at this moment -- in general it is our intention to improve the dualsense support in proton/upstream wine, but the folks working on it have gotten pulled to other projects currently. I just passed along the message that you've made a massive start on the support for Stellar Blade and the Spider-man games so far, so that no one wastes their effort duplicating your work - thank you!

It sounds like there is some additional clean-up work to be done before these patches could be upstreamed. I'll keep an eye on this thread and if someone else does start working on upstreaming, I imagine they'll loop you in :) For now - no risk of duplication, and great work :D

HHadrianneue 2025-12-03 github

did anyone else got it working with those patches on spider man? i've built proton-em with both of them, still no haptic feedback... probably did something wrong on my end

Xxzn 2025-12-03 github

@Hadrianneue Which Spider-Man game are you playing? I've only tested Remastered and Miles Morales. The games don't activate haptic audio on main menus immediately but it should show up in your PulseAudio Volume Control if you go to controller setting or load in game. (Or if you don't have PulseAudio but ALSA or OSS then it wouldn't work.)


I've uploaded the latest revision of my patches applied on top of two common Proton releases:

https://github.com/xzn/proton-ds5-haptic

Let me know if something does or does not work for you.

Changes since my earlier patches:

  • Fixed a couple of race conditions in my code for hotplugged audio device support in PulseAudio.
  • Fixed a wrong registry api usage in my code (passed the wrong len for input buffer when setting guid string).
  • Tries to clean up stale DeviceContainers registry entries.

That's pretty much all that I'm aware of for now.

P.S.
@arnxxau feel free to link my repo to yours, in case of updates. Working on this continuously for the few days and maybe I won't have too much update soon but just in case. Thanks for the earlier upload btw! Much appreciated.

Also thanks for the kind words from everyone else. I cleaned up as much as I could and will likely go over them again in a few days when they are not so fresh to me. The main issue with my implementation I suspect is that the setupapi usage from mmdevapi is quite hacky. Creating a separate audio driver for wine seems more appropriate, though I couldn't really get that approach to work:

First I'm not familiar the Windows driver loading process and how wine implements them, The driver I tried to write ends up being a lot of code even for minimal function, plus some dummy driver to get setupapi working with it. Also I couldn't figure out a way to set friendly name from ntoskrnl's side without duplicating much of the same code from setupapi etc.. If someone has some ideas or wants to take a crack at it, feel free to go ahead, and let me know what you find.

HHadrianneue 2025-12-03 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3604942509

I was running the spider man remastered, noticed that on windows the web sounds come through the dualsense, didn't hear that on linux, i'm using pulseaudio, will try your new patch soon enough, pretty sure its skill issue on my part, thanks

Xxzn 2025-12-03 github

@Hadrianneue Thanks for the catch! Found the issue and fix. Will upload a new build soon.

Update: patch files and releases are now updated here.

HHadrianneue 2025-12-03 github

@Hadrianneue Thanks for the catch! Found the issue and fix. Will upload a new build soon.

Update: patch files and releases are now updated here.

i didn't try rebuilding myself but your build works beautifully, tysm (i can finally enjoy sm trilogy), downloading death stranding to see if that works as well

HHadrianneue 2025-12-03 github

Update: patch files and releases are now updated here.

So, this works on MSFS 2024 as well, which is awesome, didn't work on Death Stranding Director's Cut, but if someone else could test it, preferably the steam version, i have the EGS version (running using umu, not even sure if correctly).

UUklosk 2025-12-03 github

Update: patch files and releases are now updated here.

So, this works on MSFS 2024 as well, which is awesome, didn't work on Death Stranding Director's Cut, but if someone else could test it, preferably the steam version, i have the EGS version (running using umu, not even sure if correctly).

Not working on DSDC on Steam for me.

HHadrianneue 2025-12-03 github

On DSDC i also got an xaudio2_9 error when trying to change the BB audio device (even without the dualsense connected) wonder if its related....

error message Image
PPostnozet 2025-12-04 github

I've uploaded the latest revision of my patches applied on top of two common Proton releases:

https://github.com/xzn/proton-ds5-haptic

Let me know if something does or does not work for you.

Thank you. Haptics in Animal Well now work.

Xxzn 2025-12-04 github

On DSDC i also got an xaudio2_9 error when trying to change the BB audio device (even without the dualsense connected) wonder if its related....

Thanks for the catch again. That part is easy to fix. (New build uploaded.) Still couldn't get haptic to work in DSDC though..

EErfboom 2025-12-04 github

Are these proton builds meant to be tried with all games? If so I have a
few games like God of War:R I'd like to try these new builds with to see if
the new patches do anything.

On Thu, Dec 4, 2025, 10:11 AM JS Deck @.***> wrote:

xzn left a comment (ValveSoftware/Proton#5900)
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3612719812

On DSDC i also got an xaudio2_9 error when trying to change the BB audio
device (even without the dualsense connected) wonder if its related....

Thanks for the catch again. That part is easy to fix. (New build uploaded.
https://github.com/xzn/proton-ds5-haptic/releases/tag/20251204) Still
couldn't get haptic to work in DSDC though..


Reply to this email directly, view it on GitHub
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3612719812,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ANOCNBYA6BBODDZ4BMPV44L4ABFLRAVCNFSM5YR3MBQKU5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TGNRRGI3TCOJYGEZA
.
You are receiving this because you commented.Message ID:
@.***>

MMcMarius11 2025-12-05 github

i tested Promise Mascot Agency and it works with xzn's build GE-Proton10-20251204
haptics and analogue triggers work perfectly, thanks everyone!

HHadrianneue 2025-12-06 github

Are these proton builds meant to be tried with all games? If so I have a
few games like God of War:R I'd like to try these new builds with to see if
the new patches do anything.

Tried on ragnarok, don't think its working, wireless i get vibrations but nothing while wired, works as expected on windows

Xxzn 2025-12-07 github

I found out what's needed for Death Stranding Director's Cut to have haptic:

  1. DSDC expects SetupDiGetDeviceRegistryPropertyW to return the container id in all lower case. It's currently in upper cases.
  2. DSDC wants to open the haptic audio device in exclusive mode, which is not supported by winepulse. A workaround is to have winepulse work in shared mode but pretend it's supporting exclusive mode anyway, (perhaps controlled by an envvar) which hopefully would mean haptic and BB sound through the controller speakers can play at the same time. In other words better than Windows unintentionally. (Not that I've tried the last part, not sure where in the game BB audio would play haha).

Edit:

Build for DSDC if you want to try it.

Sometimes there will be an access violation error after upgrading the prefix, preventing you from running the game. I'll have to fix this later. For now a fresh prefix should hopefully not have this issue.

HHadrianneue 2025-12-07 github

I found out what's needed for Death Stranding Director's Cut to have haptic:

Awesome that works perfectly on the EGS version, didn't work on GoW: Ragnarok however

WWujekFoliarz 2025-12-07 github

not sure where in the game BB audio would play haha

Go in first person, click down d-pad and shake the capsule

Xxzn 2025-12-08 github

Haptic in God of War Ragnarok should now work: https://github.com/xzn/proton-ds5-haptic/releases/tag/20251208

(Fix turned out to be simple: SetupDiGetDeviceRegistryPropertyA returns a wide string on Windows for containerid despite it's an ansi function..)

not sure where in the game BB audio would play haha

Go in first person, click down d-pad and shake the capsule

How do I go in first person?

Zzaps166 2025-12-08 github

Haptic in God of War Ragnarok should now work: https://github.com/xzn/proton-ds5-haptic/releases/tag/20251208

Stellar Blade doesn't start anymore: Image

Xxzn 2025-12-08 github

Stellar Blade doesn't start anymore:

Just tried it and I'm not having any issue. Try using a fresh prefix. Unfortunately the game has denuvo so keep that in mind when testing.

Also back up your save data just in case steam cloud doesn't work as expected. (I usually rename my old prefix instead of deleting it because of this.)


Also I got BB audio in DSDC though DualSense speaker working:

Need to use dualsensectl and run

dualsensectl speaker internal

and maybe

dualsensectl volume 255

as well.

MMcMarius11 2025-12-09 github

Xaudio 2.7 issue Stellar Blade doesn't start anymore:

i have the exact issue when i am above GE-Proton10-20251202 with UE4SS Build 6 (Stellar Blade) and the controller is plugged in, if i unplug the controller the game will start.

with GE-Proton10-20251202 and a clean prefix everything works!

all newer versions will give me the xaudio 2.7 error, even when i clear the prefix!
and the issue is the same if the dualsense microphone is enabled or disabled.

So yes, the latest build have the issue.
Can i provide some logs to help fix it?

HHadrianneue 2025-12-09 github

Also I got BB audio in DSDC though DualSense speaker working

Works fine here, too bad we need to use dualsensectl but at least it works, can't think of any other game atm where dualsense was troublesome, tsym <3

WWujekFoliarz 2025-12-09 github

We would have to find
int scePadSetAudioOutPath(int handle, int path) in DSDC and make it always pass 3 in path for it to use the speaker automatically without external tools or just make a small dll that sets it in loop when the game is running

Xxzn 2025-12-10 github

@zaps166
@McMarius11

In the mean time: https://github.com/xzn/proton-ds5-haptic/releases/tag/20251210

While working on bug fixing my patches rebased on latest Proton-GE/Proton-EM, I was running into the same xaudio2_7 not found error in Stellar Blade. Due to denuvo I wasn't able to track down the cause fully yet (unless you want to help?):

  • It's inconsistent even on affected version:
    • If I copy xaudio2_9.dll from prefix to the game directory, it works.
    • Make winepulse not initializing audio devices except for the default one and it mostly works.
    • Make winepulse not initialize saved audio devices in registry mostly works.
  • The issue is a narnia pointer ntdll.dll loader tries to read while loading xaudio2_9.dll a second time indirectly by xaudio2_9redist.dll

I gotten as far as testing my patches rebased on GE-10-25 (not 26) and has not run into the issue.
I can upload a few different builds from various more recent versions of wine with my patches applies if you want to help test, or I can do it over the next few days when I have more activation limit.

What I have in mind:

  • Valve's bleeding edge
  • EM's Wayland patched
  • GE's latest git
  • GE's 26

That should helps us pinpoint where the issue popped up and in case it's been fixed upstream.

MMcMarius11 2025-12-10 github

thanks for the update @xzn, i tested your new build GE-Proton10-25-DS5 with a clean prefix, and this is what i found

controller plugged in it works for the first time
controller unplugged xaudio2.7 error
i tried again and it worked 5 times out of 5

i plugged to controller in and it works for the first time
i tried again and the error appeared 5 out of 5 times

unplugged the controller the xaudio2.7 error appears
i tried again and it worked 5 times out of 5

plugged it again and it works
try again and it does not work


here i tested your GE-Proton10-20251202 build with a clean prefix

no controller
tried 5 times it works 5 times

plugged it in
Fatal Error - that is new
try again and it works 5 out of 5 times

unplugged
tried 5 times it works 5 times

plugged in
tried 5 times it works 5 times

i can test some more builds if you want :)

Xxzn 2025-12-10 github

@McMarius11

It'd be really appreciated! I've uploaded Valve/GE/EM respectively latest versions haptic patched to the link above.

If you could set the following variables to your launch argument for log:

PROTON_LOG=1 WINEDEBUG=+module,+xaudio2

or if you don't mind logs being bigger:

PROTON_LOG=1 WINEDEBUG=+module,+xaudio2,+mmdevapi,+pulse

MMcMarius11 2025-12-10 github

@xzn here are the logs, i always made a new prefix when i switch version, i hope you can figure it out :)

GE-Proton10-20251210-DS5
steam-3489700_second_run_with_Controller_working.log
steam-3489700_third_run_with_controller_issue.log
steam-3489700_first_run_without_controller_working.log

Proton-DS5
steam-3489700_third_run__with_controller_crash.log
steam-3489700_second_run_with_controller_works.log
steam-3489700_first_run_without_controller.log

i could not test Proton-EM-10-20251210-DS5, temper limit

Zzaps166 2025-12-10 github

@xzn Thanks, I'll test it soon, no time now 😄

Xxzn 2025-12-11 github

Don't mean to spam but a new build is uploaded with (further) attempts to fix xaudio2_7 not found error in Stellar Blade:

https://github.com/xzn/proton-ds5-haptic/releases/tag/20251211

AFAICT a RegEnumValueW call I used somehow was causing ntdll.dll loader to have corrupt entries for xaudio2_9.dll. For now I changed it to RegQueryInfoKeyW instead. (Could be a red herring and I'm totally wrong about this.)

Edit:

Okay I think I know, lpcchValueName in RegEnumValueW is in characters not bytes, so there were massive buffer overrun due to me passing in the wrong value.. (very dumb of me but at least I can sleep knowing why this happened).

Edit 2:

Alright I rebased my patches. Hopefully that's the last of it unless someone has other games to test :>

MMcMarius11 2025-12-11 github

i tested your newest build, and the issue did not occur, i think you fixed it :) nice work!

AApeeksiht 2025-12-15 github

hey, i play helldivers 2 where haptics and adaptive triggers used to work really well before the merger. now it doesn't work. i tried your build by default it doesn't work, but when i rerouted audio to my dualsense to i get haptic feedback but that isn't same like it used to,it's more sound focused, previous haptics felt more baked in, any help would be helpful. thanks

Xxzn 2025-12-15 github

@Apeeksiht

Hello, my patches aren't merged anywhere (it's incomplete and a bit wrong in some area still). Did you update Proton, or has there been a Helldivers 2 update? Can't really help you myself since I don't have that game.

AApeeksiht 2025-12-15 github

@xzn I'm using latest proton ge, em even experimental. somehow haptics don't work anymore. i tried yours. it's same. if i route my audio to dualsense i get some haptics but that's not same it was before. idk if it's from game side or the new proton merger.

Xxzn 2025-12-15 github

When did haptic in Helldivers 2 last work? There was an update for the game two weeks ago. You can always try older version of Proton-GE and such.

MMaxiTornado 2025-12-27 github

Hello! I was told to report an issue here: FFXIV is suddenly crashing if you launch the game with a DualSense plugged in. It's fine if you plug it in afterwards, but then haptics and the speaker won't work. If it disconnects and reconnects due to an unstable connection, it'll also attempt to enable those features again, causing a game crash. Tested with Proton-GE 10-27, 10-26, 10-25, 10-17, Wine 10.20 with DXVK 2.7.1 GPLAsync, with and without NVAPI-DXVK, XIVlauncher, native launcher...

The game also now has a strange issue where if you click the mouse, it swaps from game mouse to system mouse for a moment, causing a second of lag. Changing in-game mouse settings from game HW mouse to OS HW mouse, or software mouse doesn't change anything, but the software mouse does make the cursor leave trails. Borderless vs. fullscreen doesn't matter. Neither does Wine-Wayland.

Xxzn 2025-12-27 github

@MaxiTornado

Are you using XLM with the latest XIVLauncher.Core v1.3.1? I was having similar issue on rb-v1.2.1.7, and after updating to v1.3.1.1 prerelease for the rb fork it was working again.

The v1.3.1 version from goatcorp works for me as well.

Other things to check is if you are using any input remapping software (inputplumber/hhd, etc.)

MMaxiTornado 2025-12-27 github

Yeah, just tried earlier, problem persists. Only "input" packages I have installed are xinput, libinput, steam-devices, and device-mapper. I've not manually installed any of this, so I'm assuming they're all normal and needed on a Fedora system. The problem has only appeared in FFXIV 7.4, I should note. Was fine a month ago. I also have Steam set to disable Steam Input in games that have native support, and it does so in FFXIV. If I force-enable it, things work just fine, but no haptics or speaker, obviously.

Xxzn 2025-12-27 github

Does the problem only happen for Fedora users? There has been no dualsense changes in any Proton versions you listed since FFXIV 7.4.

I tried fresh prefix with XLM 1.3.1 + stable wine and dxvk, dualsense is not causing any crash for me.

MMaxiTornado 2025-12-28 github

Yeah, I cleared prefixes, stable wine and dxvk, no plugins, still crashes to a bunch of ff14.exe errors. I've been communicating with people on the XIVLauncher Discord server about this, and others are having issues with the controller as well, but I do not know what distros they use. Things worked fine before 7.4. Though, I should note, detection of the controller by the game has always been a bit finicky. Another game, Tokyo Xtreme Racer, works fine on my end, but even though it has native DualSense support, it doesn't use any of the advanced features. I was told my issue could arise from any number of things from Wine to Mesa (Currently on 25.3.1 from the terra-mesa repo), but I've no clue how I would even begin to debug that.

MMaxiTornado 2025-12-29 github

Another Fedora user confirmed it happens for him as well. It is looking increasingly like it's a Fedora-specific issue, yes.

MMaxiTornado 2025-12-29 github

Courtesy of Discord user "xzn92" (Whom is the user above me, I am blind apparently.:

This file: https://github.com/alsa-project/alsa-ucm-conf/blob/master/ucm2/USB-Audio/Sony/DualSense-PS5-HiFi.conf maps the surround output channel to a mono one for some reason, causing the game to break.
The easiest way to fix this for now is to modify the file /usr/share/alsa/ucm2/USB-Audio/USB-Audio.conf and comment out the block around If.sony-dualsense-ps5 {
Fedora is simply more bleeding edge than what I normally use. This should be considered an upstream bug from alsa-ucm.

I tested it as well. Works fine.

Xxzn 2025-12-30 github

@Apeeksiht

https://github.com/xzn/proton-ds5-haptic/releases/tag/20251229

Turns out Helldivers 2 now expects the name of the controller to be "DualSense Wireless Controller" instead of just "Wireless Controller"

AApeeksiht 2025-12-30 github

@xzn thanks for working on it I'll test it soon ❤️.

edit: just tested and haptics are working even better than before.

EEljeyna 2025-12-30 github

@xzn DualSense shutdown and turns on when launching Death Stranding (Epic Games version), after that gamepad doesn't work and don't recognize inputs, tried DS build and new GE and EM builds.
nvm, i have non DC edition

UPD: download DC edition and all works, thanks for work!

EEljeyna 2025-12-30 github

Also tested on Metro Exodus Enhanced Edition and haptic doesn't work :(
UPD: provided log

steam-1449560.log

EEljeyna 2025-12-30 github

Ratchet & Clank: Rift Apart works with parameter:
WINEDLLOVERRIDES="xaudio2_8,xaudio2_9=b"

UPD: tested some games

works out of box: World War Z, Ghost of Tsushima, Animal Well, Hogwarts Legacy

doesn't work: Bramble: The Mountain King, Pacific Drive (i think all UE4-UE5 games won't work with haptics on linux)

Xxzn 2025-12-30 github

Thanks for testing these games. For Metro Exodus EE, I couldn't get haptic to work on Windows either. Wonder if haptic support for Metro Exodus EE on PC isn't true.

Edit:

Not seeing Bramble and Pacific Drive's haptic on Windows either. What I did was have a detour dll that hooks IMMDeviceEnumerator::GetDevice and see what audio devices get used. None of these three games opened the DualSense audio device.

EEljeyna 2025-12-31 github

@xzn oh, that's weird, pcgamingwiki lies to me that Bramble and Pacific have support, thanks
i want to test some games after new year and provide info to this topic

UPD: who want to play Sackboy, haptic works now :)

EEljeyna 2026-01-01 github

Cronos: The New Dawn (Windows version), Dave the Diver, Eriksholm: The Stolen Dream, Hell is Us, Sleep Awake, Still Wakes the Deep, Sword of the Sea, Lost Soul Aside perfectly works out of the box :)

AApeeksiht 2026-01-01 github

@xzn idk what happened but haptics borked on helldivers 2 again. quite unusual as game didn't receive any update in this timeframe. idk if it's my system, i even reinstalled everything.

Vvh45f 2026-01-01 github

@Apeeksiht I got them working again about 3 hours ago using the patched proton, mess around with the sound settings, you should have 3 audio streams from Helldivers 2.

AApeeksiht 2026-01-01 github

@Apeeksiht I got them working again about 3 hours ago using the patched proton, mess around with the sound settings, you should have 3 audio streams from Helldivers 2.

it's too late now I'll try again using helvum. but that haptic wasn't same as in game one. i think recent pipewire update borked it or something.

Xxzn 2026-01-01 github

Did you perform a system update? alsa-ucm-conf 1.2.15 introduced some changes that completely break DualSense haptic on Linux.

There's a workaround for now:

https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3696038585

(Or you can downgrade alsa-ucm-conf)

(Also if you are getting crashes now in Spider-Man it's likely the same cause)

AApeeksiht 2026-01-01 github

Did you perform a system update? alsa-ucm-conf 1.2.15 introduced some changes that completely break DualSense haptic on Linux.

There's a workaround for now:

[#5900 (comment)](https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3696038585)

(Or you can downgrade alsa-ucm-conf)

yes I'm using cachyos which is based on arch. I'll try downgrading. thanks.

edit: i just checked alsa ucm was last updated 19/12/25. which is after you sent me the patched proton something else might have broke it.

Xxzn 2026-01-01 github

That's the build date, the package was updated yesterday (for arch anyway)

AApeeksiht 2026-01-01 github

That's the build date, the package was updated yesterday (for arch anyway)

thanks for clarification I'll downgrade till it's fixed.

Kkisak-valve maintainer 2026-01-01 github

Hello @cristicc, the DualSense discussion on this issue report starting around https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3693690914, in particular https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3696038585, might be interesting to ponder in alsa-ucm-conf.

EEljeyna 2026-01-02 github

God of War Ragnarök does not recognize inputs until Steam Input is on, but haptic and triggers won't work with them (that's clear)
i have newest alsa-ucm-conf with commented ps5 section, on other games dualsense works perfectly
P.S. on steam deck dualsense doesn't work in GoWR too

UPD: i fixed it, for my country need nopssdk and libscepad.dll (all can find in web)

EErfboom 2026-01-02 github

Edit: fixed in latest testing release of Bazzite. That was quick!

Edit: As a bazzite user, I'm also affected by the alsa changes as it breaks the dualsense. However, I can't change the USB-Audio.conf file because bazzite is immutable so I had to roll back. Any ideas on how I can comment that section out in Bazzite?

God of War:R works for me using the proton GE builds from here but I have
not tested since the alsa changes.

On Fri, Jan 2, 2026, 3:06 AM Llein @.***> wrote:

Eljeyna left a comment (ValveSoftware/Proton#5900)
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3704711462

God of War Ragnarök does not recognize inputs until Steam Input is on, but
haptic and triggers won't work with them (that's clear)
i have newest alsa-ucm-conf with commented ps5 section, on other games
dualsense works perfectly


Reply to this email directly, view it on GitHub
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3704711462,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ANOCNB5G2XT64LJUEA2MH4T4EYRHHAVCNFSM5YR3MBQKU5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TGNZQGQ3TCMJUGYZA
.
You are receiving this because you commented.Message ID:
@.***>

MMcMarius11 2026-01-03 github

Days Gone has only adaptive triggers no vibration
i tested proton experimental and the latest GE-Proton10-20251227-DS5

it seems that other people have the same issue on windows :/

Zzaps166 2026-01-04 github

Shouldn't we report issue for alsa-ucm-conf?

My approach:

sudo rm /usr/share/alsa/ucm2/USB-Audio/Sony/DualSense-PS5*.conf
systemctl restart --user wireplumber.service
Xxzn 2026-01-04 github

@McMarius11 I have the base game for Days Gone and haptic is working (with my patches anyway). Are other games' haptic working still? Could be the recent alsa-ucm-conf update.

@zaps166 The developer who made the dualsense changes in alsa-ucm got pinged earlier in the discussion. Another developer who helps maintain a certain linux game compat tool also said in a discord discussion that they will create an issue after gathering info. I can report the issue to the alsa-ucm-conf github repo if I don't hear from them.

MMcMarius11 2026-01-04 github

@McMarius11 I have the base game for Days Gone and haptic is working (with my patches anyway). Are other games' haptic working still? Could be the recent alsa-ucm-conf update.

@xzn
yes you were right
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3696038585 this fixes my issue and yes the vibration is also gone in other games without that workaround

SSvdB-nonp 2026-01-05 github

@McMarius11 I have the base game for Days Gone and haptic is working (with my patches anyway). Are other games' haptic working still? Could be the recent alsa-ucm-conf update.

@zaps166 The developer who made the dualsense changes in alsa-ucm got pinged earlier in the discussion. Another developer who helps maintain a certain linux game compat tool also said in a discord discussion that they will create an issue after gathering info. I can report the issue to the alsa-ucm-conf github repo if I don't hear from them.

Stellar Blade does not have haptics for me. I am in Bazzite Stable, so not sure if the alsa patches from testing branch have reached here yet.

If I listen very closely I can hear the small "bumps" in the menu from the dualsense speaker, so I guess all the haptics are send there instead.
Looking at Helvum it looks like Stellar Blade sends a mono signal to one of the four haptics channels, which is routed to the controllers speaker afterwards.

Of note, last week (before the alsa changes I guess) the haptics were working as expected with your patches (using "20251227" release)

Image
EEljeyna 2026-01-05 github

@SvdB-nonp unfortunately you have bugged version of alsa-ucm-conf, that's why your haptics won't work properly

SSvdB-nonp 2026-01-05 github

Yeah, I think you are right @Eljeyna . When reverting to stable-43.20251127 it indeed works again as expected.
Will probably stay there for a week until it is fixed in stable branch.

EErfboom 2026-01-05 github

For Bazzite users, the alsa config issue is fixed in testing branch. But
there's HDR related issues now. Stellar Blade worked with native Proton HDR
enabled for Nvidia, but on the latest testing the colors are washed out.
Fixed by using gamescopes HDR implementation.

On Mon, Jan 5, 2026, 1:39 PM SvdB-nonp @.***> wrote:

SvdB-nonp left a comment (ValveSoftware/Proton#5900)
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3711646349

Yeah, I think you are right @Eljeyna https://github.com/Eljeyna . When
reverting to stable-43.20251127 it indeed works again as expected.
Will probably stay there for a week until it is fixed in stable branch.


Reply to this email directly, view it on GitHub
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3711646349,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ANOCNB3PKWHIF6JETROQBGL4FKVVFAVCNFSM5YR3MBQKU5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TGNZRGE3DINRTGQ4Q
.
You are receiving this because you commented.Message ID:
@.***>

Fford-prefect 2026-01-05 github

In case someone here knows, if games expect the 4 channel audio device to have a specific channel mask for the haptics channels (e.g. RL/RR), or does that not matter (i.e. it's fine if we expose them as unknown/aux channels).

Xxzn 2026-01-05 github

I don't know what the games do exactly, however if I use the Pro Audio profile for DualSense (in pipewire), the games will try to output haptic through aux0 and 1, while 2 and 3 are the haptic channels. So channel masks' likely needed.

Fford-prefect 2026-01-05 github

@xzn I was thinking that exposing it as FL/FR/AUX0/AUX1 would make it clearer which ones are audio channels and which ones are not. Will see how that works.

Ccristicc 2026-01-05 github

@kisak-valve @xzn Sorry for my late answer!

I successfully verified the following patch, but my testing capabilities are quite limited at the moment, hence I'd appreciate some feedback before opening the alsa-ucm-conf MR:

https://github.com/cristicc/alsa-ucm-conf/commit/48af6eac3651158b14a045661df71a4bb655c41f

@ford-prefect I experimented a bit with unknown/aux channels, but it didn't work as expected, e.g. it confuses Trackmania by generating unexpected haptic feedback during normal audio (not playing).

Xxzn 2026-01-06 github

Thank you for the patch! On my end "Internal Mono Speaker + Haptic Feedback" works well in Death Stranding, FFVII Rebirth, FFXIV and so on.
"3.5mm Headphones + Haptic Feedback" works too.


Unrelated to the patch, I just found out that the headphones settings do this thing which also happens on Windows, where if you set the DualSense headphones to the default device, games treat it as a regular surround device so you get almost constant rumble. Can be worked around with a stereo null sink and rerouting the output in pulseaudio/pipewire. (Which will also allow separate volume from the haptic. May be useful if someone really wants to use the DualSense headphones jack for some reason.)

Fford-prefect 2026-01-06 github

@xzn That should be related to the channels being marked as RL/RR, so potentially games might be generating all 4 channels incorrectly in that situation. I was hoping marking them as aux channels would avoid this situation, but it seems not.

Maybe it's better to mark the non-haptics and haptics devices as mutually exclusive, so that you explicitly select the one you want.

Zzaps166 2026-01-06 github

Thanks, it's working to me, too, but now I can't disable the microphone (previously it was possible to use 4-channel output without microphone).

Maybe it's better to mark the non-haptics and haptics devices as mutually exclusive, so that you explicitly select the one you want.

Good idea!

Btw. currently we can play only left audio channel when haptics are enabled:
Image

Xxzn 2026-01-06 github

That's intended I think. Both FL and FR are mapped to channel 1 (i.e. FR) on the controller and that's what the Split thing shows, since only FR is responsible for the controller speaker anyway. It does technically differ from before, where FR gets played by the speaker, and FL gets ignored, now FL and FR are mixed to mono then passed to FR on the controller if I'm reading it correctly. (This is my only concern really) Edit: actually FR get ignored now and only FL gets played.

For the mic is muting it in the settings not sufficient? From the other ucm configs I don't see a pattern of having a device verb for disabled playback/capture.

@ford-prefect There are games that can use the controller speaker and haptic at the same time (like MAI from FFVII Rebirth) so you can't really separate them. Especially since games select the them the same way. And from the usb audio it's just one playback device anyway.

Fford-prefect 2026-01-06 github

@ford-prefect There are games that can use the controller speaker and haptic at the same time (like MAI from FFVII Rebirth) so you can't really separate them. Especially since games select the them the same way. And from the usb audio it's just one playback device anyway.

@xzn yup, I get that. I was talking about what channel positions we should assign to the haptic channels (i.e. we could tag them as aux channels rather than rear left/right to be more "correct"). Probably just makes sense to follow what we see on Windows (so if that's RL/RR, so be it).

Zzaps166 2026-01-06 github

I can't see any issues in 6.18.x kernel without alsa-ucm-config file for this game controller - I can use haptics, internal speaker, headphones without any issues and without changing profiles (and without microphone). What is the purpose of this config?

Ccristicc 2026-01-07 github

Maybe it's better to mark the non-haptics and haptics devices as mutually exclusive, so that you explicitly select the one you want.

@ford-prefect Making them mutually exclusive (via the ConflictingDevice directive) would actually prevent the user to switch the profiles, e.g. wpctl would filter out the non-haptics devices and show only the haptic ones due to their higher playback priority (200 vs 100).

currently we can play only left audio channel when haptics are enabled

@zaps166 Sadly I couldn't find a solution to keep mixing FL & FR channels into a mono one which is further mapped to FR on the controller side (per HW design, as @xzn already pointed out), while still using separate RL & RR channels for haptics. I've asked the alsa-ucm-config maintainer if that's achievable with the current UCM capabilities, still waiting for an answer.

What is the purpose of this config?

@zaps166 I initially used the config to validate my work on the kernel side, i.e. enabling the controller to report HP & MIC plug events within the hid-playstation driver (see [1]), while hooking that up via a quirk in the generic USB audio driver to setup the Headphone Jack & Headset Mic Jack controls (see [2]). Those landed in upstream kernel since 6.18, but I've never really verified how well the generic profiles are able to deal with the specific hardware capabilities. One of the very first issues I immediately noticed back then was the incorrect handling of the mono speaker, hence the config allowed me to remap the channels as required.

Unfortunately I was not aware of the broken haptics, as I tested on Steam Deck and missed to turn off Steam Input emulation which coincidentally managed to properly provide the haptic feedback.

[1] https://lore.kernel.org/all/[email protected]/
[2] https://lore.kernel.org/all/[email protected]/

Zzaps166 2026-01-08 github

@cristicc

Sadly I couldn't find a solution to keep mixing FL & FR channels into a mono one which is further mapped to FR on the controller side (per HW design, as @xzn already pointed out), while still using separate RL & RR channels for haptics. I've asked the alsa-ucm-config maintainer if that's achievable with the current UCM capabilities, still waiting for an answer.

Ok, but if you'll create a 3-channel device I don't know if games will be able to choose mono channel for audio (games also uses it for audio playback, e.g. Stellar Blade, Horizon Forbidden West, etc.) and two channels for haptics, maybe games expect 4-channel device and one channel is unused 🤔

currently we can play only left audio channel when haptics are enabled

What if game will send audio in right channel and silence in left channel (game knows the hardware, so it's theoretically possible)?

I initially used the config to validate my work on the kernel side, i.e. enabling the controller to report HP & MIC plug events within the hid-playstation driver (see [1]), while hooking that up via a quirk in the generic USB audio driver to setup the Headphone Jack & Headset Mic Jack controls (see [2]). Those landed in upstream kernel since 6.18, but I've never really verified how well the generic profiles are able to deal with the specific hardware capabilities. One of the very first issues I immediately noticed back then was the incorrect handling of the mono speaker, hence the config allowed me to remap the channels as required.

The only issue I noticed is the mono speaker playing only right channel. Headphones works out of the box. Default profiles allow to not use microphone which is a good idea to me.

Maybe keep default profiles and just add mono profile for case when someone will use game controller for audio playback?

Unfortunately I was not aware of the broken haptics, as I tested on Steam Deck and missed to turn off Steam Input emulation which coincidentally managed to properly provide the haptic feedback.

Happens 😄

Ccristicc 2026-01-09 github

@zaps166

if you'll create a 3-channel device I don't know if games will be able to choose mono channel for audio

Yeah, I also tried to expose all 4-channels, and only do the mixing & routing internally, but couldn't get it working - might not be possible at UCM level.

What if game will send audio in right channel and silence in left channel?

Well, with the generic surround profile we currently get the reversed situation, i.e. playing only the right channel.
Agree that (some) games could have provided dedicated quirks, but I think that's still a hack which might break in the future.

Regardless, I'll try to fix this up and get the same behavior, if it turns out that mixing is not feasible.

Default profiles allow to not use microphone which is a good idea to me

I perceive that as a limitation. Why should we force disabling a hardware capability that is already supported?

Xxzn 2026-01-09 github

Well, with the generic surround profile we currently get the reversed situation, i.e. playing only the right channel. Agree that (some) games could have provided dedicated quirks, but I think that's still a hack which might break in the future.

Games and applications expect a surround sound device without mixing. As in, the DualSense exposes a surround sound audio device in the USB and we simply let games and applications handle that directly. (This is what used to happen and how it works on Windows as well.)

If someone want to use the DualSense as a mono/stereo device, a null sink can be created and routes added just for that.

IMO we should have a unmixed default option or something at least. If we really want alternate mixing profiles, maybe enabling the Direct option anyway if it has high enough priority?

Correct me if I'm wrong, it isn't possible to create multiple devices from one hardware surround sound device anyway it seems? And let's say we do create a mono/stereo device alongside the surround one (automatically in ucm,, not through null sink in pipewire/pulseaudio), it'll have the same container id and card name so that would just confuses games trying to use haptic. (Unless both container id and card name can be overridden.)

This isn't the first time a config causes applications to see different behaviors than the default (or Windows): systemd has some udev config that changes the names of DualSense devices to something different than what games expect so one thing wine does to get DualSense working is the override the name back to what it was before.

TTheGreatestJannet 2026-01-18 github

Has anyone got the Haptics to work with Marvel Spider-man 2? Currently using
GE-Proton10-20251227-DS5 I get no rumble at all.

Edit: sorry everyone it was the Arch bug. Fixed it using: https://github.com/alsa-project/alsa-ucm-conf/issues/677#issuecomment-3743887845

EErfboom 2026-01-23 github

hey guys, any place i can check to see if @xzn's patches will hit main proton ge branch, or valves own proton? love that haptics work on games they didn't before, but it would be cool if they got upstreamed.

Xxzn 2026-01-23 github

Found out by random that proton-cachyos has those patches.

Otherwise I haven't been working on upstreaming the changes. The code is a bit hacky and I kinda want to work out a better solution for audio devices hot-plug support. (Seem like having a service exe to do the audio device enum separate from the mmdevapi is the way to go, but that's a lot of work, will need to split audio backends to two parts, one that deals with enum, one deals with audio streams. Plus RPCs between mmdevapi and the enum service. It's not something I want to touch without coordination tbh, since I'm seeing other PRs for mmdevapi backends as well.)

Maybe I'll try to get the patches into proton-ge minus the hotplug audio device part.

EErfboom 2026-01-23 github

Thanks for the reply and as always great work :)

On Fri, Jan 23, 2026, 5:08 PM JS Deck @.***> wrote:

xzn left a comment (ValveSoftware/Proton#5900)
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3792762153

Found out by random that proton-cachyos
https://github.com/CachyOS/proton-cachyos has those patches.

Otherwise I haven't been working on upstreaming the changes. The code is a
bit hacky and I kinda want to work out a better solution for audio devices
hot-plug support. (Seem like having a service exe to do the audio device
enum separate from the mmdevapi is the way to go, but that's a lot of work,
will need to split audio backends to two parts, one that deals with enum,
one deals with audio streams. Plus RPCs between mmdevapi and the enum
service. It's not something I want to touch without coordination tbh, since
I'm seeing other PRs for mmdevapi backends as well.)

Maybe I'll try to get the patches into proton-ge minus the hotplug audio
device part.


Reply to this email directly, view it on GitHub
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-3792762153,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ANOCNBY53OIIZHMAIKMZ7ND4IKLXNAVCNFSM5YR3MBQKU5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TGNZZGI3TMMRRGUZQ
.
You are receiving this because you commented.Message ID:
@.***>

LloathingKernel 2026-02-04 github

Found out by random that proton-cachyos has those patches.

Sadly I had to remove it because it broke some games, such as Lego Batman 3. Tried reverting the hot-plug commits but it wouldn't build that way and I didn't try to fix it. I have not looked into it further yet, I hope to do it in the coming weekend.

Jjcsstelar 2026-03-01 github

@McMarius11 I have the base game for Days Gone and haptic is working (with my patches anyway). Are other games' haptic working still? Could be the recent alsa-ucm-conf update.

@zaps166 The developer who made the dualsense changes in alsa-ucm got pinged earlier in the discussion. Another developer who helps maintain a certain linux game compat tool also said in a discord discussion that they will create an issue after gathering info. I can report the issue to the alsa-ucm-conf github repo if I don't hear from them.

Days Gone wasnt picking the rumble for me, but @xzn your proton release made the job, thank you so much!

Ddigitaldiatribe 2026-03-20 github

Assuming more work needs to be done for Death Stranding 2? I couldn't get any haptic feedback at all despite the option being set to strong.

Ddotterian 2026-03-21 github

I'll add more games to the growing list of games without haptics:

  • Monster Hunter Wilds (no haptics, no rumble, adaptive triggers)
  • Dying Light 2 (no haptics, rumble, adaptive triggers)
  • RoadCraft (no haptics, rumble, adaptive triggers)
  • Animal Well (actually creates haptics output but I have to manually route it to a controller sink)

All tested on latest Proton GE + @xzn patches.

DDomiStyle 2026-03-21 github

@digitaldiatribe Haptics work in DS2 in regular Proton and Proton-GE when setting the controller audio mode in Pipewire to Pro Audio and using qpwgraph to redirect the haptics stream to port 3 (left) and 4 (right) on the controller.

For some reason it's trying to output to the speaker by default but I just muted it since I'm not using it.

Ddigitaldiatribe 2026-03-21 github

@DomiStyle Well, that's not ideal and had no idea that's how it worked. Learned something new today, thanks!

Xxzn 2026-03-21 github

Monster Hunter Wilds will likely be tricky since it requires steam input iirc (so not sure how much proton can do here). For others will look at them once I get a chance.

For Death Stranding 2, are haptic working for other games and just not this one, or none at all? If the latter the issue may be with alsa-ucm-conf, as the commit for fixing dualsense with proton had not made it to any release.

KKimiblock 2026-03-21 github

FYI: DS2 works after lowering channel 1 and connecing channel 0 + 1 to 2 + 3:

Image
Xxzn 2026-03-25 github

There's a known issue with alsa-ucm-conf that interferes with wine's dualsense support.

You can try using this old workaround if you have an affected version (sorry that I don't remember which versions are affected off the top of my head, but all recent releases are affected).

Aside from that:

Death Stranding 2 has both working haptic and controller speaker (going as far as the main menu).

Same with Animal Well.

@dotterian

For RoadCraft I'll have to check on Windows to see if the game actually does support various dualsense features, or if it's just regular rumble on Windows as well. (Won't be the first game that claims dualsense haptic support but actually doesn't support it fully).

For MHWilds it uses steam input directly, so can't do anything from wine as it is.

Zzaps166 2026-03-25 github

There's a known issue with alsa-ucm-conf that interferes with wine's dualsense support.

It's a game controller and it breaks gaming experience, so why it's still not reverted?

Systemd service
[Unit]
Description=Removes DualSense-PS5* ALSA UCM files

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'rm -f /usr/share/alsa/ucm2/USB-Audio/Sony/DualSense-PS5-HiFi.conf ; rm -f /usr/share/alsa/ucm2/USB-Audio/Sony/DualSense-PS5.conf'

[Install]
WantedBy=multi-user.target
MMarkomasou 2026-03-27 github

@Kimiblock

Admittedly a week late but! I've had the same issue with HapticFeedback not working on DS2 now as it released but it seemed to have worked when I followed a guide (which I unfortunately do not know the URL to anymore)

It was involved with a Wireplumber fragment monitor.alsa.rule

90-dualsense.conf

located in ~.config/wireplumber/wireplumber.conf.d/

monitor.alsa.rules = [
{
matches = [
{
device.name = "~alsa_card.usb-Sony_Interactive_Entertainment_DualSense.*"
}
]
actions = {
update-props = {
"api.alsa.use-ucm" = false,
"device.profile-set" = "analog-surround-40.conf"
}
}
},
{
matches = [
{
node.name = "~alsa_output.usb-Sony_Interactive_Entertainment_DualSense.*.analog-surround-40"
}
]
actions = {
update-props = {
"node.description" = "Wireless Controller",
"node.nick" = "Wireless Controller",
"audio.format" = "S16LE",
"audio.rate" = 48000,
"node.force-rate" = 48000,
"channelmix.disable" = true,
"priority.driver" = 1500,
"priority.session" = 1500
}
}
}]

This fixed the issue for me for DeathStranding 2 without needing to do any fiddling with pwcontrol or pavu.
Funny enough, what I am seeing in comparison with DeathStranding 1 is as already mentioned here, it doesn't detect that it's a dualsense (shows a generic xbox controller image at pause screen) and it also only generates 2 Audio sources.

Manually pairing the audio to Back Left Right (RL RR) channels makes it rumble indeed, but that's for the music being played on the headphones itself, so I'm assuming that at least for DS1 the issue is it only creates 2 audio sources.
Testing the same in DS2 it does make 3 audio sources (which disappear and regenerate each time you move the mouse and then back to the DualSense.

Just wanted to chime this in here as well should anyone ever need it but it's very strange how the DualSense Haptic Feedback is being handled by some games.

Also I do hope that the formatting works... never used markdown..

KKimiblock 2026-03-27 github

Thanks @Markomasou!

My workaround posted above actually works well and it’s not just generic game sound because the game was outputting to my headphones normally. And if I leave it as is, I hear no music but what is supposed to be haptics audio.

Will give yours a try once able.

Ddotterian 2026-03-27 github

@Bob-Owen

Hello, I had Claude help with diagnosing the dualsense haptics problem on Stellar Blade.

Claude won't provide proper results and in some cases will happily investigate "red herrings" for hours, if you yourself don't get how Dualsense haptics work and won't guide it in correct places. Believe me, I've spent 10+ hours with Claude on Monster Hunter Wilds haptics and several hours fixing things when my haptics stopped working in Cairn, half of it's suggestions were crap, some plain stupid and some even potentially harmful. And in one case it spent several hours trying to get some unknown usb device to enumerate in Wine properly. After several hours it found out it was my keyboard. Sadly I'll never get back time and tokens wasted on this pointless side-quest.

You can tinker with it by yourself as much as you wish, but I don't think it's a good idea to show your Claude slop-tweaks to the world as a potential solution to the problem.

its very faint, only the strongest events are felt

Are you sure that game routes proper haptics audio into your controller and not just all game audio? Have you checked in qpwgraph or some other pipewire/wireplumber graph plotting software exactly what output goes into your controller?

BBob-Owen 2026-03-27 github

@dotterian
Its unfortunate if there was no useful information in the report. No worries, I'll delete it.
If I do manually route main audio to the haptics channel then the controller does become very lively with every drumbeat and bass note felt, there is even some audible midrange audio. Probably not how its supposed to be but at least it confirms that the hardware can be used.

Xxzn 2026-03-27 github

https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-4141903975

Confirming that this works! Way better than editing the alsa-usm-conf system config files directly (which I was doing before). Many thanks!

From what I can see it disables alsa-ucm profiles and set the device name appropriately for games to detect the audio device.

(Same config from comment above, with indentation:)
90-dualsense.conf.zip

@Markomasou

For Death Stranding 1 Director's Cut, game wants to open the haptic audio in exclusive mode, which is not supported by wine's pulseaudio backend.

If you use either my patched proton, or cachyos' proton, the PROTON_MMDEV_FAKE_EXCLUSIVE=1 envvar allows wine to pretend it support exclusive mode for pulseaudio which should get haptic working in DSDC.

MMarkomasou 2026-03-28 github

Thank you a lot for the headsup regarding the CachyOS proton envvar!!! I'll admit and say I am somewhat clueless because it took me building a custom proton build, doing other things, and over all kind of wasting time instead of just looking if CachyOS doesn't just have it as a package to pacman. (Surprise surprise, it does!)

After doing the stuff I had to do and running the envvar I do now also have Haptics in DS1 Director's Cut!
I'd have to double check on my PS5 install if it's exactly what would be expected, as it feels off, but I'm assuming that's just what it is like usually and I'm just spoiled by DS2 at this point! (Aka, wet moss does create footstep haptics but soft ground doesn't which kind of makes sense but concrete doesn't but then metal walkways again do, it's confusing..)

Thank you a lot as you fixed my issue with that one. :)

Also I apologise for the horrible .conf file there hahah, definitely easier to look look at than what I posted.

Also glad to hear, it definitely gave me a day 1 comfortable experience with Death Stranding 2 there which is great, definitely something worth fighting all of the issues for.

Xxzn 2026-03-30 github

@dotterian

Update on MHWilds, I was wrong about the game supporting haptic through steam input. Instead the game sends haptic audio to all dualsense controllers (not just the active one) indiscriminately.

I've figured out the missing registry entries that the game looks for in order for haptic to function.

Give this a try: https://github.com/xzn/proton-ds5-haptic/releases/tag/20260330

Let me know if it works for you.

Ddotterian 2026-03-31 github

@xzn yeah, that fixed it for me. Thank you, you're the savior of DualSense haptics on Linux!

SStaringLongingly 2026-04-23 github

Using xzn's latest patches, Stellar Blade haptics are routed to the wrong channel, which makes them get played from the speaker instead of the motor.

CCaesar2552 2026-04-23 github

Avatar: Frontiers of Pandora (Snowdrop Engine) — DualSense haptic feedback not working.

Tested with GE-Proton 10-34 and Proton Experimental. DualSense connected via USB, Steam Input disabled. Kubuntu 25.10, Kernel 6.17, PipeWire/WirePlumber 0.5.10.

Adaptive triggers work. HID device is detected with the correct container ID, and the 4-channel audio endpoint is registered with the correct channel mask (0x00000033). No 'aux0'/'aux1' errors — ClearlyClaire's patches are working. However, the audio sink stays SUSPENDED; the game never sends audio to the haptic channels.

From the debug logs ('WINEDEBUG=+hid,+mmdevapi'), the game enumerates audio endpoints but doesn't appear to use any of the known discovery methods (name matching, BaseContainerID lookup, or SetupDi) to find the DualSense audio device. Snowdrop may be using something else entirely.

I'm attaching a cleaned up log focused on the DualSense functionality and a zip of the full, very verbose and, lengthy log.

steam-2840770-dualsense-focused.log

steam-2840770.zip

Xxzn 2026-04-23 github

@StaringLongingly Try this workaround https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-4141903975

@Caesar2552 Try my build https://github.com/xzn/proton-ds5-haptic/releases/latest

and if you want to log, try WINEDEBUG=+setupapi,+mmdevapi

(or maybe WINEDEBUG=+setupapi,+mmdevapi,+reg although those reg access adds a lot of noise) No guarantee I can help since I don't have the game to test with.

CCaesar2552 2026-04-23 github

@xzn Thanks for the build! It seems to work, but it's very faint, especially compared to Windows. BaseContainerID matching is working, haptic audio stream is active, but faint. Even when I boosted the volume on the audio device to 100%, it still felt faint. Maybe that might help out. I have the new log in case it helps.

Edit: Actual new log. Accidentally sent the one from yesterday.
Edit2: It was just the rumble I was feeling, no haptics. The controller is being identified, but the audio streams aren't being created, I think.

steam-2840770-new.zip

Mmbriar 2026-04-25 github

Haptic feedback/vibration works in Pragmata with @xzn's build.

SStaringLongingly 2026-05-03 github

@StaringLongingly Try this workaround [#5900 (comment)](https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-4141903975)

Oh yeah this worked, I am now getting all features in Stellar Blade and Returnal

Nnguyentdat23 2026-05-24 github

haptic feedback finally works in Uncharted TLL by using both wireplumber rule .zip file and proton build from @xzn. thx so much

Wwired-maya 2026-05-31 github

Death Stranding Director's Cut with the wireplumber rule and @xzn 's Proton (I've also tried CachyOS Proton) doesn't seem to work anymore. The DualSense itself works to control the game, although I don't know if the trigger haptics work correctly because I haven't played DSDC on PS5. Steam input is off of course.

The DualSense is set to Pro Audio in Pipewire, and testing the individual channels shows that sending audio through the correct channels does work to vibrate the controller.

Xxzn 2026-05-31 github

@wired-maya latest cachyos' proton doesn't have the dualsense patches anymore (until i get around rebasing it to proton 11)

For DSDC you need PROTON_MMDEV_FAKE_EXCLUSIVE=1 envvar. and dualsense controller audio output should be "Analog Surround 4.0 Output"

Regards.

Wwired-maya 2026-05-31 github

@xzn Thank you! The last piece of the puzzle to get it working was changing it to Analog Surround 4.0, I just hadn't realised that option had appeared after loading the Wireplumber rule. Thank you for all your hard work! Also thanks for the heads up about the CachyOS Proton!

For anyone else reading this, to fix haptic feedback in Death Stranding Director's Cut:

  1. Download 90-dualsense.conf.zip from https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-4143710542
  2. Create the folder ~/.config/wireplumber/wireplumber.conf.d/ and place the conf file extracted from the ZIP into there
  3. Reload Wireplumber and related services with systemctl --user restart wireplumber pipewire pipewire-pulse
  4. In the Pipewire profiles for the controller's speaker, select the newly appeared option Analog Surround 4.0 Output + Digital Stereo (IEC958) Input
  5. Download the latest Proton build linked to from https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-4307784181 and extract the folder into ~/.local/share/Steam/compatibilitytools.d/
  6. Restart Steam and select GE-Proton10-20260205-DS5 (or whichever version you downloaded) as the compatibility tool in DSDC's properties
  7. Set launch options to PROTON_MMDEV_FAKE_EXCLUSIVE=1 %command%
  8. Disable Steam Input under "Controller"
  9. Open the game and enjoy! If the haptic feedback seems too weak, you can adjust the volume of the controller's output device to your liking, as well as the strength settings in game
Jjcsstelar 2026-06-07 github

Hello gents, I wonder if Linux can do what Windows cant, that is, "fix" DS advanced features with mixed inputs (K/B, mainly for using DS GYRO as MOUSE to control the camera or shooting, or TOUCHPAD for extra mappings). It seems the right place to ask this.

Currently in most if not all games RUMBLE/TRIGGERS/MIC STOP as soon as you do mixed inputs, sometimes if both inputs stay active, ie you keep running using the LEFT STICK while looking around using MOUSE, the advanced features half work, like faintly, its really confusing to me but some games seems to behave better for some reason.

So, can technically WINE/PROTON make DS stay "active" 100% of the time no matter what, or this would disable mixed inputs? Not Linux specific, its how the games work? Maybe somebody can figure out a trick for this issue.

CChrisBln2302 2026-06-17 github

Many thx to @wired-maya for the instructions and of course to @xzn . I've got the DualSense haptics to work in "Stellar Blade" which is awesome. Do we know when the DualSense patches will find their way back into cachyos-proton so that we don't have to use a custom proton anymore?

Ccchulo 2026-07-03 github

thanks a lot! I can now play Stellar Blade just fine with Hd haptics.

The only gimmick i am missing out in is the speaker output on the dualsense, i have "Controller Speaker" set to on and volume in game to 100% but its not working. I checked in KDE sound settings, turning volume up to 100% there for the controller and i can hear the speaker beep. Does this require a proton patch as well to make the speaker work in game?

please let me know, am willing to be a guinea pig to make this work though i am on SteamOS :)

nvm everything works now, thanks again!

Ccchulo 2026-07-04 github

@xzn i did want some clarification: PROTON_MMDEV_FAKE_EXCLUSIVE is not required on every single game? this is only for God of War Ragnarok and Death Stranding Director's Cut, correct? i do not use this environment variable in stellar blade and it works fine

MMatthew-DeKock 2026-07-14 github

Hi Everyone,

I followed the steps that @wired-maya posted yet no vibration works at all

Regardless of haptic feedback or not. Games just do not vibrate my controller. I am on the latest version of cachyOS's proton and it does not fix anything. Adaptive triggers work yet nothing else. If anyone could point me in the right directon id really appreciate it. And if you need anything from my side please tell me :) I have been suffering for two months and have yet to find a fix. Thank you!

Wwired-maya 2026-07-15 github

@Matthew-DeKock You need to use @xzn's Proton fork.

EErfboom 2026-07-25 github

I saw the latest Proton GE has dualsense fixes. Does anyone know if they're xzn's fixes or their own?

Ccchulo 2026-07-26 github

I saw the latest Proton GE has dualsense fixes. Does anyone know if they're xzn's fixes or their own?

@Erfboom its unlikely, so I am using my own fork of the DS5-Linux-Bridge, and xzn's patched GE11-1 works flawlessly while ProtonGE 11-2/3 has issues where steaminput engages on the dualsense even though i have it disabled, i am a bit confused by this behavior I mispoke: https://github.com/GloriousEggroll/proton-ge-custom/tree/master/patches/proton-ds5-haptic looks like the patches from xzn are in there, and then some, my issues with the DS5-Linux-Bridge may stem from the 0014 regarding winebus, i am going to try to build it myself and see if i can figure out my weird issue, but anyway to answer your question, yes xzn patches seem to be here

Ccchulo 2026-07-27 github

I just ended up using proton-cachyos, i noticed xzn's patches are also in there via the wine-cachyos project, and not only does the DS5 work flawlessly via the DS5-Linux-Bridge, i also have FSR4 working

i'm not sure why ProtonGE has over ~90 extra patches on top of the original that xzn made, something is broken there and i can't figure out what. Proton-cachyos just works in this case. I want to make an issue with the proton-ge project but idk how to describe the problem im having or how to provide logs, it's really confusing

EErfboom 2026-07-27 github

Interesting project. So you achieve full hardware capabilities via
Bluetooth? Do you need the raspberry pi as the middle man or can that
project work on the same host that you pair the controller with?

On Sun, Jul 26, 2026, 8:05 PM Carlos Chulo @.***> wrote:

cchulo left a comment (ValveSoftware/Proton#5900)
https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-5086037873

I just ended up using proton-cachyos, i noticed xzn's patches are also in
there via the wine-cachyos project, and not only does the DS5 work
flawlessly via the DS5-Linux-Bridge, i also have FSR4 working

i'm not sure why ProtonGE has over ~90 extra patches on top of the
original that xzn made, something is broken there and i can't figure out
what. Proton-cachyos just works in this case. I want to make an issue with
the proton-ge project but idk how to describe the problem im having or how
to provide logs, it's really confusing


Reply to this email directly, view it on GitHub
https://github.com/ValveSoftware/Proton/issues/5900?email_source=notifications&email_token=ANOCNB47KBOZYAAS6YJ7QED5G2MFJA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTKMBYGYYDGNZYG4Z2M4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJLDGN5XXIZLSL5RWY2LDNM#issuecomment-5086037873,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ANOCNB42VFFJTYKXLZWBEXT5G2MFJAVCNFSNUABFKJSXA33TNF2G64TZHMYTENJQHE4DQOBQHNEXG43VMU5TCMRWHA3DANZSG42KC5QC
.
Triage notifications, keep track of coding agent tasks and review pull
requests on the go with GitHub Mobile for iOS
https://github.com/notifications/mobile/ios/ANOCNB4GNXKSTOIFAQXKBUD5G2MFJA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTKMBYGYYDGNZYG4Z2M4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJKTGN5XXIZLSL5UW64Y
and Android
https://github.com/notifications/mobile/android/ANOCNB7EVSA3CV242PUZ2ND5G2MFJA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTKMBYGYYDGNZYG4Z2M4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJLTGN5XXIZLSL5QW4ZDSN5UWI.
Download it today!
You are receiving this because you were mentioned.Message ID:
@.***>

Ccchulo 2026-07-27 github

@Erfboom exactly, specifically a raspberry pi pico 2w which has enough processing power to push through audio and other data needed to make haptics work while maintaining low latency connection. The PC sees it as a USB DS5 but you can use it wirelessly. It's branded as "the dongle that sony never made"

i have my own fork if you want to check it out where i added a LED RGB lightbar, but i recommend using kuungas version since it's the one that would be maintained longer term. His version is more plug and play whereas mine requires way more tinkering. Some of my changes and optimizations made it to his fork, not sure if he included the option for the LED light strip like i did.

Rrjbs91 2026-08-13 github

The latest GE-Proton (11-5) made the dualsense functionalities work without any workarounds, so no need for the wireplumber config. I just had to make sure the audio is set to Pro Audio and not direct, with the latest alsa-ucm-conf. There are still some issues with Death Stranding, but those seem to be fixed for the next release.

FFullbrightultra 2026-08-20 github

GE-Proton 11-5 does not fix this for libScePad titles, even though its release notes made me expect otherwise.

Environment: CachyOS (Arch), kernel 7.2.0, Plasma Wayland, RTX 4070 Ti, DualSense over USB, Steam Input disabled (PlayStation Controller Support off).

I ended up testing two games:

  • Cronos: The New Dawn - adaptive triggers, lightbar, and rumble all work. This title drives the pad over HID output reports, not the audio path.
  • Death Stranding 2 - adaptive triggers, lightbar, and correct PS glyphs work. Vibration is entirely absent. Identical behavior under proton-cachyos and GE-Proton11-5.

With the card on its 4-channel Direct profile, DS2 does open the sink and stream to it, so this is not a case of the game failing to find any device. Capturing 15s off the sink monitor during gameplay (sink at 40% at capture time):

FL: peak=6600 (20.1% FS)
FR: peak=   0 ( 0.0% FS)
RL: peak=6491 (19.8% FS)
RR: peak=   0 ( 0.0% FS)

Single-channel 50 Hz tone tests on this unit produced the following: ch0 nothing, ch1 speaker, ch2 speaker, ch3 vibration. So DS2's waveform exists, but using channels that never reach the actuators, while the one channel that does drive them receives silence. To me, this looks like the ContainerId / device-tree association problem described earlier in this thread rather than failure to enumerate.

Separate confounding finding worth pointing out for anyone testing this: On kernel 7.1.8, HID-driven features and rumble were mutually exclusive. Native reports gave triggers and lightbar but no rumble, and PROTON_DISABLE_HIDRAW=0x054C/0x0CE6 gave rumble and nothing else. Kernel 7.2.0 fixed that on its own, unrelated to anything in this issue.

Ccchulo 2026-08-21 github

Replying to https://github.com/ValveSoftware/Proton/issues/5900#issuecomment-5362826506

i think for death stranding you need to setup pipewire profile and the environment variable PROTON_MMDEV_FAKE_EXCLUSIVE it's noted in the comments in XZNs patches, which has been integrated in with cachyos-proton as well as his own fork

GGloriousEggroll 2026-08-21 github

i already have death stranding and ds 2 fixed in upstream ge-proton git, and even added a patch that enables the controller footstep sounds in death stranding dc that are internally disabled by the game.

Ccchulo 2026-08-22 github

i already have death stranding and ds 2 fixed in upstream ge-proton git, and even added a patch that enables the controller footstep sounds in death stranding dc that are internally disabled by the game.

@GloriousEggroll would you be willing to take a look into why DS5-Linux-Bridge no longer works on GE since 11-3? i am stumped, the logs don't really show a problem. I am using this since the HTPC is in a really inconvenient location. Using XZN's patches and proton-cachyos works flawlessly, but GE 11-3+ just refuses to work with the dongle, not sure why. It is my own custom fork of DS5-Linux-Bridge that i am using too, don't want to trouble you if it turns out the problem was crappy code claude fable put out (though it looked good when i checked it)

GGloriousEggroll 2026-08-22 github

i already have death stranding and ds 2 fixed in upstream ge-proton git, and even added a patch that enables the controller footstep sounds in death stranding dc that are internally disabled by the game.

@GloriousEggroll would you be willing to take a look into why DS5-Linux-Bridge no longer works on GE since 11-3? i am stumped, the logs don't really show a problem. I am using this since the HTPC is in a really inconvenient location. Using XZN's patches and proton-cachyos works flawlessly, but GE 11-3+ just refuses to work with the dongle, not sure why. It is my own custom fork of DS5-Linux-Bridge that i am using too, don't want to trouble you if it turns out the problem was crappy code claude fable put out (though it looked good when i checked it)

it's on my to-do, i know it's used to give usb haptics/sound to bluetooth connected controllers. wanted to get usb controllers working as best as possible first.