Windows can already send one app to a different speaker — it is buried five clicks deep in Settings, resets itself, and shows you a dropdown list of device names.
Sound Router gives you the patchbay instead. Drag a cable from an app to a device. That app's audio moves there and nothing else changes.
| 🔌 Drag-and-drop patching | Grab a socket, drop it on a device. That is the whole interaction. |
| 🎚️ Per-app volume | A real rotary knob on every node. Drag it, or scroll over it. |
| 📊 Live VU meters | Proper dB-scaled metering so you can see what is actually playing where. |
| 🔀 Many-to-one, one-to-many | Several apps into one device, different apps into different devices, simultaneously. |
| 📌 Pin what you use | Keep your five apps and two devices on screen instead of scrolling a system list. |
| 💾 Remembers everything | Routes survive restarts and are re-applied when an app relaunches with new process ids. |
| 🚀 Starts with Windows | Optional, and boots straight to the tray. |
| 🎨 DJ deck styling | LED outlines, glowing patch cables, segmented meters. |
⬇ Download the latest installer
Run it. No administrator rights needed — it installs to your user profile and offers to start Sound Router with Windows.
Grab the .zip from the same page,
extract it anywhere, run SoundRouter.exe. Nothing is written outside
%APPDATA%\SoundRouter.
Both downloads are self-contained. You do not need the .NET runtime installed.
Requirements: Windows 10 version 1803 or later, or Windows 11.
- Click + ADD under SOURCES and pick an app. Anything currently making noise is
sorted to the top and tagged
AUDIO. - Click + ADD under OUTPUTS and pick a device.
- Drag from the app's socket across to the device's socket.
That's it. The cable lights up and the audio moves.
| Action | What it does |
|---|---|
| Drag a source socket onto an output | Route that app to that device |
| Right-click a socket | Unplug it — the app goes back to the system default |
| Drag a knob, or scroll over it | Adjust volume (hold Shift for fine control) |
| Hover a node, click the × | Unpin it from the panel |
| ☰ menu | Start with Windows, and close-to-tray behaviour |
| RESET ALL | Hand every application back to the Windows default output |
| Close the window | Keeps running in the tray — click the tray icon to bring it back |
One device per app. Windows routes an application to a single output. Playing one app through two devices at once needs a virtual audio driver like VoiceMeeter — that is a different kind of tool.
A few apps ignore it. Anything that grabs a device in exclusive mode — some games, most pro-audio software — will stay where it is. Sound Router checks whether the move actually took effect and marks the node NO SIGNAL PATH in red instead of pretending. Restarting the app usually sorts it out.
Device meters read lower than the app feeding them. That is correct, not a bug — the device meter is measured after its volume knob, exactly like a hardware mixer.
Routes outlive the app. They are stored by Windows, not by Sound Router, so they stay put after you close or uninstall it. Hit RESET ALL first if you want a clean slate.
git clone https://github.com/NonayMete/WindowsSoundRouter.git
cd WindowsSoundRouter
dotnet build SoundRouter.sln
dotnet run --project src/SoundRouter/SoundRouter.csprojNeeds the .NET 8 SDK. Full build, publish and installer instructions are in TECHNICAL_DETAILS.md.
Windows exposes per-application routing through an undocumented internal WinRT class,
Windows.Media.Internal.AudioPolicyConfig. Sound Router calls it through explicit vtable
slots, because the CLR's built-in WinRT support was removed in .NET 5.
Everything else — endpoint enumeration, per-app sessions, volume, metering — is documented WASAPI.
If you want the vtable layout, the PROPVARIANT sizing trap, why routes are applied
across a whole process tree, or how the meters are scaled:
TECHNICAL_DETAILS.md.
Issues and pull requests welcome. If you are reporting a routing problem, the smoke test output helps enormously:
dotnet run --project tests/SoundRouter.SmokeTestGNU General Public License v3.0
The AudioPolicyConfig interface was mapped by the
EarTrumpet project, whose interop
declarations were the reference for the vtable layout used here.

