A tiny Windows tray utility for switching the default audio output. You pick which outputs appear, name them yourself, and switch with a single click — no Steam Streaming Speakers or Oculus Virtual Audio Device cluttering the menu unless you asked for them.
One signed executable, about 100 KB, no runtime to install, no registry persistence, no installer.
Windows lists every virtual endpoint any app has ever installed. A normal machine ends up with Steam Streaming Speakers, Steam Streaming Microphone, an Oculus virtual device and several HDMI outputs, none of which can be removed, and the two you actually use are buried among them.
This app shows only the outputs you ticked, under names you chose.
- Left or middle click the tray icon moves to the next output. With two outputs that is simply a toggle.
- The tray icon tells you what is playing — a coloured badge with your own one or two letters, drawn at run time.
- A popup confirms the switch, right above the tray. Not a balloon tip: those queue up in the Windows 11 notification centre and arrive too late to be useful.
- Optional global hotkey, and a
--togglecommand line for external key binders and stream decks. - Pin the icon next to the clock instead of hiding it behind the chevron.
- Start menu and autostart shortcuts are two checkboxes.
- English and Russian, switchable in settings, detected from Windows on first run.
- Portable. It runs from wherever you put it and keeps a plain text
FastAudioSwitch.ininext to itself.
Download FastAudioSwitch.exe from the
latest release, put it in a folder you like, and run
it. That is the whole installation. Tick Add to the Start menu and Start
with Windows in settings if you want them.
Windows 10 and 11 only. Nothing else is required: the app targets .NET Framework 4.8, which is already part of the operating system.
SmartScreen will warn about an unknown publisher. The binary is signed, but with a certificate that only this project trusts — see Antivirus and code signing.
Needs Windows and either a .NET SDK (its Roslyn compiler is used) or the
in-box csc.exe.
.\build\new-signing-cert.ps1 # once: a certificate to sign local builds
.\build\build.ps1 # -> build\out\FastAudioSwitch.exe
.\build\build.ps1 -Run
.\build\build.ps1 -NoSign
.\build\deploy.ps1 # copy to a permanent folder, create shortcuts
.\build\deploy.ps1 -Removedeploy.ps1 defaults to %LOCALAPPDATA%\Programs\FastAudioSwitch; pass
-Destination for anywhere else. Dragging the .exe there in Explorer does the
same thing.
| Left or middle click the tray icon | Switch to the next output in your list |
| Right click | Menu with your outputs, settings and exit |
| Global hotkey | The same switch, from any application (off by default) |
--toggle |
Switch and exit — for external key binders |
--settings |
Open the settings window |
--register / --unregister |
Create or remove the Start menu and autostart shortcuts |
Windows only lists an HDMI endpoint while that screen is on and connected. If your TV is missing from the list, switch it on and press Refresh. Once ticked, the output stays in your settings and in the menu even when the screen is off: it greys out, and switching skips over it.
Windows 11 stores per icon taskbar visibility in
HKCU\Control Panel\NotifyIconSettings\<hash of the exe path> as IsPromoted.
The Always show the icon next to the clock checkbox writes exactly that,
and Explorer picks it up immediately — no restart. Dragging the icon out of the
overflow flyout does the same.
Because the key is tied to the executable path, the setting is lost if you move the .exe; just tick the box again. On Windows 10 the same state lives in an undocumented binary blob, so the checkbox is hidden there.
| Program | wherever you put it |
| Settings | FastAudioSwitch.ini next to the .exe, or %APPDATA%\FastAudioSwitch if that folder is read only |
| Start menu shortcut | %APPDATA%\Microsoft\Windows\Start Menu\Programs |
| Autostart | a shortcut in the Startup folder |
| Registry | only HKCU\Control Panel\NotifyIconSettings, the Explorer setting above |
To uninstall, delete the folder. The shortcuts come off with the checkboxes or
with --unregister.
Early builds were quarantined twice by Windows Defender as
Trojan:Win32/Bearfoos.A!ml — a machine learning false positive. The trigger
turned out not to be the file: a signed build ran untouched for minutes, and
the detection fired the instant an "Install to system" button was pressed.
A process that copies its own executable into the user profile and registers it for startup is the behavioural definition of a dropper. A self-signed certificate cannot argue with that, because the cloud does not trust it.
So the app does not do it:
- the .exe never copies itself — deployment is a copy made by
deploy.ps1or by you in Explorer; - autostart is a shortcut in the Startup folder, not an
HKCU\...\Runvalue; - nothing is written to the registry except the Explorer icon setting;
- version and publisher metadata are embedded, and every build is signed.
new-signing-cert.ps1 creates a self-signed certificate in the current
user's stores and build.ps1 signs each build with it. That removes the
"unknown publisher" wording locally and lowers the heuristic score, but it buys
no cloud reputation — only a real CA certificate, or a false positive report to
Microsoft, does that. Remove the certificate with
.\build\new-signing-cert.ps1 -Remove.
Plain text, safe to edit by hand:
lang=en
communications=1 # also switch the communications device
toast=1 # popup when switching
hotkey=1
hotkeyModifiers=3 # 1=Alt, 2=Ctrl, 4=Shift, 8=Win, added together
hotkeyKey=83 # virtual key code, 83 = S
autostart=1 # a record of the Startup shortcut
startmenu=1 # a record of the Start menu shortcut
# device=<endpoint id>|<colour>|<badge>|<name>
device={0.0.0.00000000}.{8ef7dd92-...}|#3B82F6|SP|Speakers
device={0.0.0.00000000}.{65d4c3b2-...}|#F59E0B|TV|TelevisionShortcuts and icon pinning are recorded here but the real state is the files and the registry value; the settings window always shows what is actually there.
| File | |
|---|---|
src/Interop.cs |
Core Audio interfaces and IPolicyConfig |
src/AudioDevices.cs |
Enumerating endpoints and setting the default |
src/Switcher.cs |
"Next connected output in the list", shared by tray, hotkey and --toggle |
src/TrayApp.cs |
Icon, menu, hotkey, device arrival and removal |
src/SettingsForm.cs |
The settings window |
src/IconFactory.cs |
Icons drawn at run time, no image resources in the .exe |
src/SystemIntegration.cs |
Shortcuts and taskbar icon visibility |
Windows has no public API for changing the default audio endpoint. The app uses
IPolicyConfig, undocumented but stable since Windows 7, with a fallback to
IPolicyConfigVista.
The default is changed for the Console and Multimedia roles; Communications only when the corresponding box is ticked, so a headset can stay the call device while music moves elsewhere.
MIT — see LICENSE.


