Custom Windows APO that turns a VB-Cable virtual 7.1 endpoint into a headphone surround stack: apps play to the cable, HeSuVi (Equalizer APO) convolves 7.1 to binaural, and vss_apo.dll forwards the result to any physical output from inside the audio engine. Device switching is live, no audio restart.
Replaces the SteelSeries Sonar dependency this repo previously wrapped, no GG software needed.
- Inline APO forwarding with ~10ms added latency, runs inside Windows Audio Engine on the RT thread
- Lock-free SPSC ring buffer bridging the DSP thread and a dedicated WASAPI render thread
- Live output device switching without audio restart, target stored in registry and watched via
RegNotifyChangeKeyValue IAudioClient3low-latency path where available, 20ms shared mode fallback- Volume OSD (AutoHotkey) with tray device picker and scrollable volume
- Auto-route on device plug/unplug via Task Scheduler
apps (7.1) -> CABLE Input (default device)
-> EAPO SFX (pre-mix)
-> EAPO MFX (HeSuVi 7.1 -> binaural)
-> vss forwarder MFX -> physical device (WASAPI)
The forwarder passes audio through untouched and mirrors it to the target device via a lock-free ring plus a dedicated render thread. Target device ID lives in HKLM\SOFTWARE\VirtualSurroundSound\TargetDeviceId, watched live by the APO so device switches take effect mid-stream.
Plumbing details and Windows APO registration rules: docs/apo-forwarder-internals.md
Prerequisites:
- Windows 10/11
- VB-Cable Pack45 or newer (older 2014-era driver blocks all endpoint effects)
- Equalizer APO + HeSuVi
- AutoHotkey v2 (volume OSD and device switching)
Warning
The Equalizer APO device selector overwrites the EAPO chain on CABLE Input when you re-run it. If that happens, re-run apo\install.ps1 to restore the chain.
Steps:
- Install VB-Cable, Equalizer APO (tick
CABLE Inputin its device selector), HeSuVi - Download the latest release, run
apo\install.batas admin (registers the APO, deploys to Program Files, writes the composite FX chain on CABLE Input) - Set CABLE Input to 7.1 in mmsys.cpl if not already
- Pick output device:
scripts\vss-device-select.bat - Optional:
tasks\import_tasks.batimports Task Scheduler tasks for auto-route on device plug/unplug (do not move the repo folder after import)
Uninstall: apo\uninstall.bat
Requires VS Build Tools 2022 (x64). All dependencies are Windows SDK.
cd apo
build.batOutput: apo\build\vss_apo.dll, which is where install.ps1 expects it.
- Pick an HRIR on the Virtualization tab
- If virtualization seems off, recheck
On/OffandAuto-Deactivate for 2 OS Channels(latches off if CABLE was ever 2-channel) - Verify channel routing:
debug\tone_channels.ps1sweeps all 8 channels, rears should sound behind you
scripts\vss-volume-osd.ahk handles Volume Up/Volume Down and shows an overlay with the active device name.
- Click or right-click the tray icon to switch output device or toggle the OSD
- Scroll on the tray icon to adjust volume
- Active only when
CABLE Inputis the default device - Ignores remote mouse focus from
PowerToys.MouseWithoutBordersHelper.exe
apo/- APO source, build script, install/uninstallscripts/- device picker (console) + volume OSD (AutoHotkey)tasks/- Task Scheduler auto-route on device changesdebug/- diagnostic tools (tone player, meters, FX slot dump, 7.1 format switch)docs/- forwarder internals, historical Sonar.APO analysistools/- SoundVolumeView (see NIRSOFT_NOTICE.txt)
- NirSoft SoundVolumeView: device enumeration utility
- SteelSeries Sonar: forwarding mechanism blueprint

