https://github.com/jeffreytse/winsoftvol
đ Software volume bridge for Windows USB audio devices â makes taskbar and keyboard volume controls work correctly.
https://github.com/jeffreytse/winsoftvol
audio-driver audio-mixer multimedia rust software-volume sound-card system-tray tray-icon usb usb-audio usb-dac volume-control wasapi windows-api windows-audio windows-utility
Last synced: 11 days ago
JSON representation
đ Software volume bridge for Windows USB audio devices â makes taskbar and keyboard volume controls work correctly.
- Host: GitHub
- URL: https://github.com/jeffreytse/winsoftvol
- Owner: jeffreytse
- Created: 2026-06-01T00:43:06.000Z (14 days ago)
- Default Branch: main
- Last Pushed: 2026-06-01T02:34:55.000Z (13 days ago)
- Last Synced: 2026-06-01T03:19:44.024Z (13 days ago)
- Topics: audio-driver, audio-mixer, multimedia, rust, software-volume, sound-card, system-tray, tray-icon, usb, usb-audio, usb-dac, volume-control, wasapi, windows-api, windows-audio, windows-utility
- Language: Rust
- Homepage:
- Size: 49.8 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## đ¤ Why WinSoftVol?
You plug in a USB audio device â a DAC, a USB sound card, maybe a WONDOM UCM board â and everything seems fine. Music plays. Then you reach for the taskbar volume slider and drag it down. The number changes. The slider moves. Nothing happens. You press the mute key. Still nothing.
You dig through device properties, update drivers, try every Windows audio setting you can find. Nothing works. You resign yourself to controlling volume from within each application individually, tab by tab, window by window â a small but persistent frustration every single time.
What is actually happening: Windows stores the volume change in the audio endpoint and expects the hardware to act on it. Your device, like many USB Audio Class devices without a Feature Unit in their descriptor, has no hardware volume control to speak of â so the driver silently ignores the request. The per-application session volumes are never touched.
WinSoftVol fixes this. It sits in the system tray, watches the endpoint for changes, and immediately propagates them as software volume to every running audio session. The taskbar slider works. Keyboard keys work. Mute works. It just works â the way it always should have.
## ⨠Features
- đī¸ Intercepts system volume changes (taskbar slider, keyboard volume keys, mute button) and applies them to all audio sessions as software volume.
- đĨī¸ System tray icon â unobtrusive, always available, zero UI overhead.
- đ Automatic re-plug detection â reconnecting the USB device restores control within one second, confirmed by a toast notification.
- đ Autostart on Windows startup via the registry Run key, toggled from the tray menu.
- đ Force software volume mode â disables hardware volume on capable devices, routing all attenuation through the session mixer for cleaner, step-free control.
- đ Volume cap â sets a ceiling on maximum output (100% / 80% / 60% / 40%) so the full slider range stays usable while preventing any app from blasting past the limit.
- đąī¸ Scroll wheel on tray icon â adjust volume up/down 2% per notch without touching the taskbar.
- đ Left-click tray icon â instantly toggle mute/unmute.
- đ Dynamic tray icon â volume bar overlaid on the icon updates in real time; bar turns red when muted.
- â ī¸ Exclusive mode detection â detects when a game or DAW bypasses the session mixer and notifies you why volume control stops working for that app.
- âšī¸ About dialog with version, build commit hash, and build timestamp.
- đĻ Written in Rust â small binary, no runtime, minimal resource usage.
## đŧ Requirements
- Windows 10 or later (x64)
## đĻ Installation
1. Download the latest `winsoftvol-vX.Y.Z-.exe` from the [Releases](https://github.com/jeffreytse/winsoftvol/releases) page.
2. Run it. A speaker icon appears in the system tray.
3. Optional: right-click the tray icon â **Start on Windows startup** to enable autostart.
No installer. No admin rights required. Single executable.
## đ Usage
Right-click the tray icon to open the menu.
| Menu Item | Effect |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------ |
| About WinSoftVol | Shows version, build info, and description |
| Start on Windows startup | Toggles autostart (registry Run key) |
| Force software volume | Routes all volume control through the session mixer; disables hardware attenuation on capable devices |
| Max volume | Sets a ceiling on output: 100% / 80% / 60% / 40% of full scale â the slider still covers 0â100% but is scaled to the cap |
| Quit WinSoftVol | Exits cleanly |
Tray icon also responds to direct interaction:
| Action | Effect |
| ----------------- | ------------------------------- |
| Left-click | Toggle mute / unmute |
| Scroll wheel up | Increase volume by 2% per notch |
| Scroll wheel down | Decrease volume by 2% per notch |
Once running, use Windows volume controls normally:
| Control | Effect |
| ---------------------------- | ------------------------------------- |
| Taskbar volume slider | Adjusts volume for all audio sessions |
| Keyboard volume up/down keys | Same |
| Keyboard mute key | Mutes / unmutes all audio sessions |
## đ Platform Notes
This problem is Windows-specific. On other platforms, the audio stack already handles software volume transparently:
- **Linux (PulseAudio / PipeWire)**: The audio server applies software volume during mixing before audio reaches the driver. Whether the hardware has a Feature Unit is irrelevant â volume is scaled in the server, not the hardware.
- **macOS (CoreAudio)**: The HAL applies software volume attenuation for devices that report no hardware volume capability. The system volume slider controls the HAL mix level, not a hardware register.
- **Windows**: Volume changes are written to the endpoint and the driver is expected to apply them in hardware. If the device has no Feature Unit, the driver ignores the change. Per-application session volumes are not updated unless something bridges them â which is what WinSoftVol does.
## âī¸ How It Works
Windows exposes audio through the Core Audio API. Each device has an **endpoint volume** (`IAudioEndpointVolume`) and a set of per-application **session volumes** (`ISimpleAudioVolume`).
On normal hardware, Windows writes the endpoint volume and the driver applies it. On devices without a Feature Unit, the driver ignores the endpoint level entirely.
Windows audio output is a product of two levels:
```
output = session_volume (per-app mixer) Ã endpoint_volume (system slider) Ã audio_content
```
On normal hardware the driver applies both. On USB devices without a hardware Feature Unit the driver ignores the endpoint level entirely, making the system slider ineffective. WinSoftVol bridges the gap by moving attenuation into the session layer where software always applies it.
WinSoftVol:
1. Registers `IAudioEndpointVolumeCallback` on the default render device. Every time the endpoint level changes (slider, key press), `OnNotify` fires on the COM STA thread.
2. Inside `OnNotify`, reads each audio session's current volume via `IAudioSessionManager2` and scales it proportionally by `(new_level / old_level)` â preserving any per-app balance the user set in the Windows Volume Mixer.
3. Registers `IAudioSessionNotification` so applications started after WinSoftVol are initialised at the correct volume automatically.
4. Registers `IMMNotificationClient` to detect device plug/unplug events and reinitialise the bridge within one second, confirmed by a toast notification.
5. Polls `IAudioMeterInformation` once per second to detect when a game or DAW takes WASAPI exclusive mode (bypassing the session mixer) and notifies the user.
## đ ī¸ Building
Requires Rust (stable).
#### macOS â cross-compile to Windows x64
```sh
# First time only
make setup # installs rustup target x86_64-pc-windows-gnu + mingw-w64
# Build versioned release binary
make # produces dist/winsoftvol-v-.exe
```
#### Windows â native build
```sh
cargo build --release
```
## đĢ Contributing
Issues and Pull Requests are welcome. If you've never contributed to an open source project before, feel free to [open an issue](https://github.com/jeffreytse/winsoftvol/issues/new) describing the problem and we'll go from there.
## đ License
This project is licensed under the [MIT license](https://opensource.org/licenses/mit-license.php) Š Jeffrey Tse.