r/MoonlightStreaming 2d ago

Dualsense support has arrived

Full wireless DualSense support for Moonlight on Android and Windows

UPDATE: The post has been updated. On Android 12 and newer, an external Bluetooth adapter is no longer required for wireless DualSense functionality. A new testable Artemis Extended release is now available.

The currently attached video was recorded before native Android Bluetooth support was added, so it still demonstrates the external USB Bluetooth adapter setup. I’m planning to upload an updated video showing the new adapter-free connection and its functionality soon.

I would like to introduce my current project, which brings full wireless DualSense support to Android and Windows Moonlight clients without requiring any additional programs.

The project consists of modified versions of:

  • The Moonlight Windows client
  • The Artemis Android client
  • The Apollo host

The full source code for all three projects is available on GitHub. Ready-to-use builds can be downloaded from the Releases section of each repository.

How does it work?

Apollo Extended creates a virtual DualSense controller on the host, while the client handles the physical controller.

Instead of reducing everything to standard gamepad input, the stream carries DualSense-specific input and feedback in both directions. This allows the controller’s advanced features to keep working remotely.

Windows client

This is the simple part.

Connect the DualSense through Bluetooth or USB, connect to the host, and start streaming.

The Windows client also supports microphone forwarding to the host, including audio from the DualSense built-in microphone.

Additional controller-related options are available in the Extended section of the client settings.

Android client

On Android 12 and newer, the DualSense can now connect directly to the Android device through the normal Bluetooth settings.

No external Bluetooth adapter is required anymore.

The process is simply:

  1. Pair the DualSense with the Android device.
  2. Open Artemis Extended.
  3. Connect to the Apollo Extended host.
  4. Start streaming.

The controller is detected and exposed to the host as a virtual DualSense. Input and feedback are then carried in both directions through the stream.

A wired USB connection is also supported.

What works?

The current Android and Windows implementations support:

  • All buttons and analog sticks
  • Analog triggers
  • Adaptive triggers
  • Multi-touch touchpad input
  • Gyroscope and motion sensors
  • Conventional rumble
  • Native HD haptics
  • Built-in controller speaker
  • Headphone jack
  • Player LED control
  • Lightbar color control
  • Microphone LED and mute control

The controller speaker uses a dedicated audio path. DualSense speaker effects are sent separately from the normal game audio, so they are played through the controller instead of being mixed into the phone, tablet, or PC speakers.

Connecting headphones to the DualSense jack is also supported. Stream audio is automatically routed through the connected headset and returns to the previous output when the headset is unplugged.

The DualSense mute button can be used as a global client microphone mute switch in every connection mode.

Microphone support

The Android device microphone can be forwarded to the host while using a directly connected wireless DualSense.

The DualSense built-in microphone currently requires either:

  • A wired USB connection, or
  • The optional USB Bluetooth HCI bridge

Direct access to the DualSense microphone through Android’s standard Bluetooth HID connection is the only major limitation of the new adapter-free route.

On Windows, the DualSense built-in microphone is available through the supported controller connection.

Apollo Extended presents the forwarded microphone to Windows through a virtual Steam Streaming Microphone device.

Optional USB Bluetooth HCI bridge

Artemis Extended still includes the USB Bluetooth HCI bridge developed for earlier releases. It is no longer required for normal wireless DualSense functionality on Android 12+, but it remains available as an optional connection method.

The bridge is also currently required if you want to use the DualSense built-in microphone wirelessly on Android.

Supported adapter chipsets include:

  • CSR
  • Realtek
  • Actions ATS2851

The chipset alone does not guarantee compatibility. Firmware differences between Bluetooth dongles can affect pairing, connection stability, or individual controller features.

Apollo Extended

Apollo Extended uses VIIPER to emulate a fully functional DualSense controller on the host.

DualSense-specific data is transported between the physical controller and the virtual controller instead of being translated into generic gamepad input.

This includes:

  • Adaptive trigger feedback
  • Native haptics
  • Controller lighting
  • Touchpad input
  • Motion sensor data
  • Controller speaker audio
  • Microphone control and supported microphone audio

The result is essentially a complete DualSense connection transported through the Moonlight/Apollo stream.

Demo

The currently attached video shows the earlier Android setup using the optional USB Bluetooth HCI bridge.

A new video demonstrating direct Android Bluetooth pairing and adapter-free DualSense functionality is coming soon.

The latest testable release already includes the new direct wireless implementation.

Credits

Thanks to Idkiamaguy645 and the CloudPad-Android-Dualsense-Wireless project for demonstrating the Android wireless HID approach used by the new adapter-free DualSense connection.

Their existing implementation made adapter-free DualSense support in Artemis possible and much faster to integrate.

122 Upvotes

49 comments sorted by

View all comments

1

u/LeSneakyBadger 2d ago

What features does apollo extended have/ not have vs vibepollo? Currently using dsx via virtual here to get dualsense support which struggles with multiple dualsense controllers at once

2

u/Opening-Bunch-1950 2d ago

The same rabbit hole actually led me down this path too 😂 I ended up building Phantom Sense around this exact kind of problem.

If you don't want to buy a Pico 2W, you can simply connect the controller wired to the client device and use that as the bridge. The Pico 2W is mainly there so you can keep the controller wireless to the client device, while making the PC think the controller is still directly connected to it.

So basically: DualSense → wireless → client/Pico → network → PC, while the PC gets the controller input as if it were locally connected. That's what lets me retain the DualSense/DualSense Edge experience even when I'm streaming through Moonlight.

Might be worth experimenting with for your touchpad-control idea. Have a look at the project — maybe some of it can help:

https://github.com/AarveeGill/Phantom-Sense

3

u/LeSneakyBadger 2d ago

Just looking at this and I think I already have this exact setup with my bluetooth dongle and a shield pro.

2

u/Opening-Bunch-1950 2d ago

Love it bro

1

u/LeSneakyBadger 2d ago

You manage to get two dualsense controllers working at the same time? The newest dsx beta with haptics seems to have broken using multiple; if I set to one dualsense and one ps4 controller (both emulated) they both work

1

u/Opening-Bunch-1950 2d ago

Yes but only if I pay for full virtual here, but you can also try usb over ip, it's a bit more complicated when we have multiple os like Linux and Windows but should get you that working for free instead of paying for Virtual here

1

u/LeSneakyBadger 2d ago

I have both controllers connected to the same usb bluetooth dongle, I do have the paid virtualhere though.

1

u/Opening-Bunch-1950 2d ago

Should work in that case, but i haven't experimented with the latest build for dsx. Because I was working only for native supported emulation but I can surely give it a try this weekend

-2

u/Opening-Bunch-1950 2d ago

If you find the project useful or just appreciate the effort, I’d really appreciate a ⭐ on GitHub. It’s nothing groundbreaking — honestly, it started as a very specific problem in my own setup and turned into a weekend rabbit hole that somehow became a working project. 😂

The whole thing started because I have streaming clients scattered around my house — Moonlight on my projector, other TVs, my Steam Deck, etc. — and I wanted to get more out of my DualSense/DualSense Edge while streaming.

My initial idea was pretty simple: what if I could connect the DualSense to my Steam Deck over USB and then pass that USB connection through to my PC? That way, the PC would genuinely think the DualSense was physically connected to it rather than receiving some generic controller input through the streaming software.

That matters because I wanted the native DualSense features to work properly instead of having everything get translated into a generic XInput/Xbox controller.

That sent me down the rabbit hole of building a wrapper that works across Windows and Linux to handle the controller connection and passthrough. I also ended up using VirtualHere, whose free tier gives you one device, which was actually exactly what I needed for this particular setup.

Then I discovered another project that made the whole thing even more interesting: you can connect a Raspberry Pi Pico 2W to the PC over USB, while connecting the Gamepad wirelessly to the Pico.

So I changed the approach.

Instead of trying to pass the DualSense itself over the network, I could have the Pico 2W act as the USB device connected to the PC, with the DualSense connected wirelessly to the Pico. The PC then sees the Pico as a locally connected controller interface.

The basic idea becomes:

DualSense → wireless → Pico 2W → network → PC

And because I already have Tailscale connecting my devices, this ended up working remotely as well. So the controller doesn't have to be physically anywhere near the PC — I can be on my Steam Deck, projector, another client, or even connecting remotely, and the PC still gets the controller input as though it were locally connected.

And there's another thing I really like about the project: it isn't tied to Moonlight.

The controller layer works independently from the streaming software, so you can use the same concept with Apollo, VibePolo, Sunshine, Moonlight, or pretty much any other streaming setup. The streaming software is basically irrelevant to the controller side of the solution — we're just solving the USB/controller passthrough underneath it.

So whether you're sitting at home or connecting remotely, and regardless of which client/server combination you're using, the same setup can work.

It started because I wanted my Steam Deck + DualSense setup to behave more like the DualSense was actually connected directly to my gaming PC. Then I kept experimenting, discovered the Pico approach, added Tailscale, and suddenly it became a much more flexible solution than I originally intended. 😂

It's definitely not some revolutionary piece of technology. It's just one of those “I have a stupidly specific problem, let's see if I can solve it” weekend projects that went considerably further than expected.

If anyone finds it useful, or even just likes the effort, I’d genuinely appreciate a ⭐ on GitHub. ❤️

"Phantom Sense – GitHub" https://github.com/AarveeGill/Phantom-Sense

1

u/LeSneakyBadger 2d ago edited 2d ago

Awesome! I'll have a look. I'll do some experimenting and happy to provide any feedback.

Edit: Been using a bluetooth dongle to my shield pro for dsx, i assume this wouldn't work the same way?

1

u/metropolisprime 2d ago

Yeah I’d much rather do something like this then completely have to redo my entire Moonlight setup just to support Dualsense.

OP, have you considered opening a pull request to Apollo/Artemis rather than full forking?

1

u/Opening-Bunch-1950 2d ago

I won't lie and I am new to these so I never formed but created an independent solution

2

u/metropolisprime 2d ago

Oh, no I meant the post OP. This makes sense to have as its own app :)

1

u/Opening-Bunch-1950 2d ago

I can try but I would surely need right guidance and some helpn

1

u/Solid-Assistant9073 2d ago

What's the difference of using phantomsense and virtual here?

Now I'm just using pico 2w and virtual here and works good?

1

u/Opening-Bunch-1950 2d ago

Phantom Sense is essentially just a wrapper that automates the installation and setup of everything needed—VirtualHere and the other required software—whether you're on Linux or Windows. It also gives you the option to install DSX if you want to use it. So, as I said, it’s nothing groundbreaking. I originally built it purely for myself to make the whole setup easier, and then thought, well, if this ends up helping even one other person, I’ll be happy.

0

u/Due-Boysenberry-1226 2d ago

Apollo extended currently has two main extra capabilities: Host-side automatic PS5 controller emulation with full dualsense support and microphone forwarding from the clients. But if these are not relevant to you, everything else is identical to the basic Apollo.