Overlord 50849540fa Add support for --loopback-no-mix flag and topology synchronization
- Introduced the `--loopback-no-mix` flag to control 2-node vs 4-node loopback topologies.
- Updated topology handling logic to recompute and migrate as needed based on loopback flags.
- Enhanced database schema to include `loopback_no_mix` with automatic migration for backward compatibility.
- Refactored `create`, `edit`, and `route` commands to integrate new topology management capabilities.
- Improved `list` command output to include architecture details.
2026-08-11 15:33:40 +02:00
2026-08-09 08:14:17 +00:00

vmic

Create and manage PipeWire virtual microphones easily, from the command line.

What it does

A vmic is two chained loopback stages:

apps -> vmic_X_sink =(stage 1)=> vmic_X_mid -> vmic_X_mix =(stage 2)=> vmic_X_mic -> recorders
                                                   ^ hardware mic joins here (route -s)

Point an app's output device at vmic_X_sink, and a recording app's input device at vmic_X_mic. Optionally mix in a real microphone downstream, and optionally hear your own output via a self-monitor loopback (which never carries the mixed-in mic).

Requirements

  • PipeWire + pipewire-pulse (pactl, pw-loopback, pw-link on PATH)
  • Rust (edition 2021)

Build

cargo build --release

If the build fails inside libspa-sys (e.g. no field 'data' on type 'spa_pod_builder'), your system clang is newer than the pinned bindgen version supports. Point LIBCLANG_PATH at an older libclang - a quick fix is a pip-vendored one:

python3 -m venv ~/.local/share/vmic-build/libclang-venv
~/.local/share/vmic-build/libclang-venv/bin/pip install libclang

then add to .cargo/config.toml:

[env]
LIBCLANG_PATH = "/home/<you>/.local/share/vmic-build/libclang-venv/lib/python3.*/site-packages/clang/native"

Usage

vmic create <name> [-l]              # create a vmic, optionally with self-monitor
vmic route  <name> -i <app[:media]>  # move an app's playback into the vmic
vmic route  <name> -o <app[:media]>  # move an app's recording off the vmic
vmic route  <name> -s <source|none>  # mix a hardware mic in, or remove it
vmic edit   <name> -l <true|false>   # toggle the self-monitor loopback
vmic edit   <name> -v <0.8|80>       # self-monitor loopback volume
vmic edit   <name> -sv <0.8|80>      # mixed-in source volume
vmic delete <name>                   # tear down one vmic
vmic list                            # show all vmics and their status
vmic wipe                            # tear down every vmic, tracked or not

Aliases: create = mk/make, delete = rm/remove, list = ls, wipe = reset.

Shell completions: vmic completions <bash|zsh|fish|...>.

Example

vmic create podcast -l
# set your app's output device to vmic_podcast_sink
# set your recorder's input device to vmic_podcast_mic
vmic route podcast -s "USB Microphone"

State

Tracked in a SQLite database at ~/.config/vmic/vmic.db (override the directory with VMIC_STATE_DIR_OVERRIDE).

License

APGL-3

Description
Create and manage PipeWire virtual microphones easily.
Readme AGPL-3.0 137 KiB
2026-08-14 19:15:15 +00:00
Languages
Rust 86.4%
Shell 13.6%