Windows tray utility
A different volume for every app,
in one click.
Chrome at 30%, Teams at 70%, Spotify at 20%. Instead of opening the volume mixer every time, one profile puts it all back. Two clicks from the tray menu, or one slider in the panel.
The window the tray icon opens. Every value here can also be changed straight from the menu.
What it does
What you used the volume mixer for, in two clicks from the tray.
Per-app volume and mute
Groups the sessions making sound right now by application. An app that runs many processes, like Chrome, is still one row.
A different output device per app
The game on the speakers, Discord on the headset. The default output can be switched from the menu too, and a profile saves the device along with the volumes.
Kept when the app is closed and reopened
Remembers each app's volume and puts it back when that app starts playing again. A device unplugged and plugged back in, or a wake from sleep, applies the profile again too.
The microphone in the same hand
The most urgent button in a meeting. CtrlAltK mutes and unmutes the microphone.
The panel
Editing profiles, changing shortcuts, writing automation rules - all of it in the window. There is never a reason to hand-edit the settings file.
Only what you switch on leaves
Anonymous usage reports, update checks and developer notices are all there is, and all three are off by default. The operator side is 127.0.0.1 only, and it opens only with a token minted fresh on every run.
Profiles
When the situation changes, every app volume should change with it.
Three come built in, and the current state can be saved as a new one at any time. Switching automatically - on an app starting, a device being plugged in, or the time of day - is off by default.
| Profiles | Master | Per-app settings |
|---|---|---|
| Work | 72% | Chrome 30% · Teams 70% · Spotify 20% |
| Gaming | 80% | Discord 65% · Spotify 15% · browser muted |
| Meeting | 60% | Teams 80% · Zoom 80% · Chrome 20% · Spotify muted |
Shortcuts
When your hands are already on the keyboard.
Every one can be changed, and if another program already holds the combination you are told, instead of it failing quietly.
- CtrlAlt↑ Master up
- CtrlAlt↓ Master down
- CtrlAltM Mute
- CtrlAltK Mute the microphone
- CtrlAltS Panel
- CtrlAlt1–3 Switch profile
Per-app routing
A path Windows never documented - checked before it is used.
measured
"this app on the headset" has no public API. The internal interface the Windows Settings app uses, Windows.Media.Internal.AudioPolicyConfig has to be called instead, and both its interface id and its vtable layout differ from build to build. SoundDesk does not guess at them.
The dangerous first call is made in a separate process, so the tray survives a crash, and after an application has actually been moved it is read back with Get; only when the same device comes back is it promoted to "verified". If the read-back disagrees, the feature switches itself off and opens the Windows settings page.
| State | Evidence |
|---|---|
| verified | A process was really moved and read back with a matching endpoint id. If nothing is playing, the self-test makes itself a session with a silent stream and checks against itself |
| probable | Nothing could be made to read back - only that activating the factory and calling through the vtable did not crash |
| unsupported | The self-test failed, or the call succeeded and Windows did not apply it → you are pointed at the settings page |
Security
Safe to run straight out of the downloads folder.
These are the problems a portable executable actually runs into. Not an abstract checklist: each line has code and a test behind it.
| Threat | What is done about it |
|---|---|
| DLL hijacking A forged DLL planted next to the exe |
System DLLs are loaded only by System32 absolute path. At startup the exe's own folder and the working directory are taken out of the search path |
| Mutex squatting Another session takes the name first and blocks the launch |
The single-instance object lives in the Local\ namespace |
| Injection through the settings file | An endpoint id reaches a COM call only after passing a regular-expression check |
| Log forgery A newline in a process name inserting a fake log line |
App and device names have control characters stripped and a length limit applied |
| An unquoted auto-start path | The Run value is always an absolute path in quotes, and only HKCU is used |
| Tampering with the panel Another program on the same PC, or a web page |
127.0.0.1 only, plus a fresh 256-bit token per run and a Host and Origin check. The token becomes an HttpOnly cookie on the first load and leaves the address bar |
Privacy
Only what you switch on leaves.
Application names and session information are handled on this PC and nowhere else, and the settings are one JSON file. There are exactly three features that reach the network - anonymous usage reports, update checks and developer notices - and all three are off by default. Until you turn one on in the panel, not a single request goes out.
| Settings file | %APPDATA%\SoundDesk\config.json |
|---|---|
| Log | %APPDATA%\SoundDesk\sounddesk.log |
| Anonymous usage report | Off by default — when on, once a day: a random install id, the version, the Windows build, the language, and three counts |
| Update check · developer notices | Off by default — when on, only the running version and language. The install id is not sent |
| Never sent, at all | Application names · device names · file paths · the Windows account name |
| APIs used | IMMDeviceEnumerator · IAudioSessionManager2 · ISimpleAudioVolume · IPolicyConfig · AudioPolicyConfig |
| Auto-start | HKCU\Software\Microsoft\Windows\CurrentVersion\Run (optional) |
Self-test
Ask the app itself whether it works on your PC.
Runs each of its own features against the real audio stack, one at a time, and puts back what it touched. Nothing that would make a sound is done at all — the master volume is proved by writing back the value it already has, which exercises the call path and nothing else.
| Command | What it checks |
|---|---|
| --selftest-audio | Devices · master · microphone · per-app volume, mute and routing · profiles · global shortcuts. If no app is playing, routing is checked against a silent session of its own |
| --selftest-panel | Whether the packaged executable really serves the panel |
| --report | Devices, sessions and profiles as JSON |
Result on this PC
OK Per-app volume (firefox.exe 100% → 42% → restored)
OK Per-app mute
OK Per-app output routing (firefox.exe → ASUS VZ279 → restored)
OK Default device switching · profiles · global shortcuts
— Microphone (no input device on this PC)
11 passed, 0 failed, 2 skipped — Windows 10 22H2 build 19045
Anywhere
In your language, on your PC.
The same settings at home and at work, read in the language you use, called from a macro when you need it.
12 languages
Follows the Windows display language. You can also pick one yourself, and when you do, the panel and the tray menu change on the spot without restarting.
한국어 · English · 日本語 · 简体中文 · 繁體中文 · Español · Português · Français · Deutsch · Русский · Italiano · Tiếng Việt
The same settings at home and at work
Export profiles, shortcuts and rules as one file and import it on another PC. Devices are matched by name — the same headset has a different id on each PC, so copying the file alone would make the routing quietly disappear. Any device this PC does not have is named for you.
Call it from a macro
Use it straight from a Stream Deck button or a single line of AutoHotkey. It works whether the tray is running or not, and does not raise a second icon. Exit code 0 if something changed, 1 if nothing matched.
SoundDesk.exe --set-app chrome.exe=25
SoundDesk.exe --profile Gaming
SoundDesk.exe --list apps
Install
One file. No installer.
SoundDesk.exe anywhere you like and run it, and an icon appears in the tray. To remove it, delete the file and the settings folder. Python is not needed.