Desktop app to manage virtual audio sinks (null sinks and loopbacks) for PipeWire/PulseAudio.
Architecture: Python backend + Web frontend + PyWebView native window
rog-v-audio/
├── src/rog_v_audio/
│ ├── audio_manager.py # Core PulseAudio logic
│ ├── api.py # Python API bridge
│ └── main.py # PyWebView launcher
├── frontend/
│ ├── index.html # UI structure
│ ├── app.js # Frontend logic
│ └── style.css # Styling
└── pyproject.toml
# Install dependencies
uv sync
# Run the app
uv run rog-v-audio- Linux with PulseAudio or PipeWire
- Python 3.11+
- WebKit2GTK:
sudo apt install gir1.2-webkit2-4.0(Ubuntu/Debian) orsudo pacman -S webkit2gtk(Arch)
Frontend files are in frontend/. Edit HTML/CSS/JS and reload the window (Ctrl+R) to see changes.
list_sinks()- Get all audio sinkslist_sources()- Get all audio sourcescreate_virtual_setup(physical, v1, v2)- Create 2 virtual sinks + loopbacksget_virtual_modules()- List virtual sink/loopback modulesremove_module(module_id)- Unload a module
// Call Python backend from JavaScript
const sinks = await pywebview.api.list_sinks();
const result = await pywebview.api.create_virtual_setup('sink', 'Virtual1', 'Virtual2');uv run pytesttree -I '.venv|__pycache__|*.pyc|uv.lock|.python-version' -L 3