A high-performance virtual audio router for Windows
Capture per-app audio & microphones → mix → route to a single virtual mic
- Overview
- Why Sonixx?
- Features
- Architecture
- Prerequisites
- Quick Start
- Building a Standalone Executable
- Usage Guide
- Keyboard Shortcuts
- Configuration
- Project Structure
- Dependencies
- Troubleshooting
- Author
Sonixx is a lightweight, native Windows desktop application that acts as a virtual audio mixer and router. It lets you selectively capture audio from individual applications (games, browsers, music players, VoIP clients) and physical microphones, then blends them into a single virtual microphone output powered by VB-Cable.
Use-case example: You're in a Discord or VALORANT voice call and want to play background music from Spotify and your mic simultaneously — Sonixx makes that seamless with per-source volume controls, muting, and real-time peak metering.
The entire stack runs locally with zero cloud dependencies — no accounts, no telemetry, no latency overhead.
There is not a single soundboard on the market that routes live audio between applications.
Every existing "soundboard" — Voicemod, Soundpad, EXP Soundboard, Resanance, you name it — works the same way: you load pre-downloaded MP3/WAV files and trigger them with hotkeys. They are glorified audio-file players wired to a virtual mic.
Sonixx is fundamentally different:
| Traditional Soundboards | Sonixx | |
|---|---|---|
| Audio source | Pre-downloaded .mp3 / .wav files |
Live audio from any running application |
| How it works | Plays a static file to a virtual mic | Captures real-time audio streams via Windows WASAPI per-process loopback and mixes them on-the-fly |
| Use case | Sound effects, memes, pre-recorded clips | Stream Spotify, browser audio, game sounds, or any app's live output directly into Discord/Zoom/OBS — alongside your mic |
| Per-app control | ❌ N/A | ✅ Independent volume, mute, and enable per process |
| Mic passthrough | ❌ Separate tool needed | ✅ Built-in — mix your mic with app audio in one pipeline |
If you've ever wanted to share a YouTube video's audio in a call, play your Spotify playlist through your mic in VALORANT, or route a DAW's output into OBS — without manually recording and re-uploading files — Sonixx is the tool that finally makes it possible.
| Feature | Description |
|---|---|
| Per-App Audio Capture | Selectively capture audio from individual processes (Chrome, Spotify, VALORANT, OBS, etc.) using the process-audio-capture DLL via named pipes — no system-wide loopback needed. |
| Microphone Mixing | Add one or more physical microphones as input sources, each with independent volume and enable/disable toggles. |
| Hardware-Synced Mixing | All audio mixing runs inside PyAudio WASAPI callbacks, synced to the hardware clock. Zero background-thread drift. |
| Jitter Buffering | A 210 ms (~10 chunk) pre-buffer absorbs scheduling jitter, preventing glitches and dropouts. |
| Mono → Stereo Upmix | Mono microphones are automatically upmixed to stereo for consistent, high-quality output. |
| Loopback Monitor | A "Monitor Mix" toggle lets you hear exactly what is being sent to the virtual mic through your own headphones in real-time. |
| Master Controls | Global master volume slider (0–200%), master mute button, and a real-time peak meter with green/orange/red level indicators. |
| Per-Source Controls | Each application and microphone source has its own volume slider (0–200%), enable/disable switch, remove button, and peak meter. |
| System Tray Integration | Minimise to the system tray instead of closing. Restore with a double-click. |
| Auto-Start with Windows | Optional registry-based autostart so Sonixx launches on boot. |
| VB-Cable Auto-Install | If the VB-Cable driver is not detected, Sonixx offers a one-click silent installation from the bundled driver pack. |
| Device Renaming | Rename the VB-Cable device to "Sonixx" in the Windows audio registry so it appears as a branded device in apps like Discord. |
| Hotkey Support | Ctrl+Alt+M toggles master mute globally, even when the window is minimised. |
| Dark UI | A polished, dark-themed interface built with CustomTkinter — designed to feel like a native Windows 11 audio panel. |
| Self-Exclusion | Sonixx automatically excludes its own process from the audio capture scan to prevent feedback loops. |
graph TD
APP1["App Source (Chrome)\nNamed Pipe + PAC DLL"]
APP2["App Source (Spotify)\nNamed Pipe + PAC DLL"]
MIC["Mic Source (Realtek)\nWASAPI Input Callback"]
APP1 --> MIX
APP2 --> MIX
MIC --> MIX
MIX["AudioRouter._out_cb()\nHardware-synced WASAPI callback\nMix → master vol/mute → clip to ±1.0"]
MIX --> VBC["VB-Cable Output\n(Virtual Mic)"]
MIX --> MON["Monitor (Loopback)\nHeadphones"]
ASCII fallback (click to expand)
┌──────────────────────────────────────────────────────┐
│ Sonixx Application │
│ │
│ ┌────────────┐ ┌────────────┐ ┌──────────────┐ │
│ │ App Source │ │ App Source │ │ Mic Source│ │
│ │ (Chrome) │ │ (Spotify) │ │ (Realtek) │ │
│ │ │ │ │ │ │ │
│ │ Named Pipe │ │ Named Pipe │ │ WASAPI Input │ │
│ │ + PAC DLL │ │ + PAC DLL │ │ (Callback) │ │
│ └─────┬──────┘ └─────┬──────┘ └──────┬───────┘ │
│ │ │ │ │
│ └────────┬───────┘ │ │
│ │ │ │
│ ┌─────▼──────────────────────────▼───┐ │
│ │ AudioRouter._out_cb() │ │
│ │ (Hardware-synced WASAPI callback)│ │
│ │ │ │
│ │ Mix all sources → master vol/mute │ │
│ │ → clip to [-1.0, 1.0] │ │
│ └────────┬───────────────┬───────────┘ │
│ │ │ │
│ ┌───────▼───┐ ┌───────▼──────┐ │
│ │ VB-Cable │ │ Monitor │ │
│ │ Output │ │ (Loopback) │ │
│ │ (Virtual │ │ Headphones │ │
│ │ Mic) │ │ │ │
│ └───────────┘ └──────────────┘ │
└──────────────────────────────────────────────────────┘
| Module | Role |
|---|---|
main.py |
Entry point. Requests admin elevation via ShellExecuteW and launches the UI. |
app/ui.py |
Full CustomTkinter GUI — header, source panels, output controls, system tray, settings. |
app/audio_router.py |
Audio engine: AppAudioSource (per-process capture via named pipes), MicSource (WASAPI mic input), AudioRouter (mixer + output callbacks). |
app/driver.py |
VB-Cable detection, silent installation, registry-based device renaming, and Windows autostart management. |
| Requirement | Details |
|---|---|
| Windows 10 / 11 | WASAPI APIs are Windows-only. |
| Python ≥ 3.13 | Required for the uv lockfile and modern typing features. |
| uv | Fast Python package manager. Install via pip install uv or curl -LsSf https://astral.sh/uv/install.sh | sh. |
| Administrator privileges | Required for VB-Cable installation, device renaming, and system-level audio hooks. |
| VB-Cable (auto-installed) | Virtual audio cable driver. Sonixx bundles VBCABLE_Driver_Pack45.zip and will offer to install it on first launch if not detected. |
Simply double-click the included batch file:
run.bat
This will:
- Verify Python is installed.
- Run
uv syncto install all dependencies. - Launch Sonixx with
uv run main.py.
Note: The application will automatically request Administrator privileges on startup.
# 1. Clone the repository
git clone https://github.com/Felix-au/Sonixx.git
cd Sonixx
# 2. Install dependencies
uv sync
# 3. Launch
uv run main.pyCreate a single-file .exe with all assets bundled:
uv run pyinstaller SonixxAudioRouter.spec --noconfirmThe compiled executable will be at:
dist/SonixxAudioRouter.exe
The spec file automatically bundles:
assets/— Logo, icons, and SVGsVBCABLE_Driver_Pack45.zip— VB-Cable installercustomtkinterandprocess_audio_capture— Collected hidden imports
If VB-Cable is not detected, Sonixx displays a setup screen:
- Click ⚡ Install VB-Cable Driver for a silent, automated install.
- Or install manually and click ⟳ Already installed — Refresh.
- Play audio in the applications you want to capture (e.g., open Spotify, a YouTube tab, a game).
- Click ⟳ Scan in the Applications panel.
- Detected processes appear as source rows with individual controls.
- Toggle the switch on each source to include it in the mix.
Tip: Scanning briefly pauses the audio router to ensure a clean process enumeration.
- Select your microphone from the dropdown in the 🎤 Microphones section.
- Click + Add to create a mic source row.
- Toggle it on and adjust volume.
- Loopback Source: Select which output device to capture system-wide audio from (usually your speakers/headphones).
- Monitor Mix: Enable to hear the mixed output in your headphones.
- Master Volume: 0–200% with real-time peak metering.
- Master Mute: Click 🔊 or press
Ctrl+Alt+M.
- Click ▶ Start — the status indicator turns green:
● Routing. - In your target application (Discord, VALORANT, etc.), select "Sonixx" or "CABLE Output" as the microphone input.
- Click ■ Stop to halt routing.
Click Rename to "Sonixx" (Admin) to change the VB-Cable device name in the Windows audio registry. Applications will then display the device as "Sonixx" instead of "CABLE Output".
| Shortcut | Action |
|---|---|
Ctrl + Alt + M |
Toggle master mute (works globally, even when minimised) |
Settings are persisted at:
%APPDATA%\Sonixx\settings.json
| Key | Type | Default | Description |
|---|---|---|---|
tray |
bool |
true |
Minimise to system tray on window close |
startup |
bool |
false |
Launch Sonixx on Windows startup (registry entry) |
theme |
string |
"dark" |
UI theme (currently only dark is supported) |
Sonixx/
├── main.py # Entry point (admin elevation + app launch)
├── run.bat # One-click launcher script
├── pyproject.toml # Project metadata & dependencies (uv/pip)
├── requirements.txt # Fallback pip requirements
├── settings.json # Default settings template
├── SonixxAudioRouter.spec # PyInstaller build specification
├── VBCABLE_Driver_Pack45.zip # Bundled VB-Cable driver installer
│
├── app/
│ ├── __init__.py # Package init
│ ├── ui.py # CustomTkinter GUI (538 lines)
│ ├── audio_router.py # Audio engine & mixer (481 lines)
│ └── driver.py # VB-Cable driver management (173 lines)
│
├── assets/
│ ├── sonixx_logo.png # Application logo (high-res)
│ ├── sonixx_logo.ico # Windows icon
│ ├── github.png / .svg # Footer profile icon
│ └── email.png / .svg # Footer profile icon
│
├── build/ # PyInstaller build artifacts
├── dist/ # Compiled executable output
└── .venv/ # Python virtual environment
| Package | Purpose |
|---|---|
customtkinter |
Modern, dark-themed Tkinter UI framework |
pyaudiowpatch |
PyAudio fork with WASAPI loopback support |
process-audio-capture |
Per-process audio capture via Windows APIs |
numpy |
High-performance audio buffer manipulation |
pycaw |
Python Core Audio Windows library |
psutil |
Cross-platform process utilities |
comtypes |
COM interface access for Windows audio APIs |
Pillow |
Image processing for UI assets |
keyboard |
Global hotkey registration |
pystray |
System tray icon and menu |
tksvg |
SVG rendering in Tkinter |
pyinstaller |
Executable bundling (dev dependency) |
VB-Cable not detected after installation
- Reboot your PC — some systems require a restart for the driver to register.
- Open Sound Settings → Input Devices and verify "CABLE Output" appears.
- Click ⟳ Already installed — Refresh in the Sonixx setup screen.
No applications appear after scanning
- Ensure the target application is actively producing audio (e.g., play a song, join a call).
- Windows Audio Device Graph Isolation (
audiodg.exe) and Sonixx itself are automatically excluded from the scan. - Try closing and re-scanning.
Audio glitches or crackling
- Ensure your audio sample rates match (default: 48000 Hz). Mismatched rates between loopback and output devices can cause artifacts.
- The 210 ms jitter buffer should absorb most scheduling delays. If issues persist, check CPU load.
Rename to "Sonixx" fails
- Ensure you are running as Administrator.
- The rename modifies
HKEY_LOCAL_MACHINEregistry keys, which requires elevated privileges. - Restart your audio applications after renaming for the change to take effect.
"Run as Administrator" prompt keeps appearing
- This is by design. Sonixx requires admin rights for driver installation, device renaming, and system-level audio hooks.
- If building a standalone
.exe, right-click → Properties → Compatibility → "Run this program as an administrator" to skip the UAC prompt.
Felix-au (Harshit Soni)
- 🔗 GitHub: github.com/Felix-au
- 📧 Email: harshit.soni.23cse@bmu.edu.in
Built with ❤️ and too many late nights debugging WASAPI callbacks.
