AudioMixer (pwmicmix) — веб-микшер поверх PipeWire
AudioMixer (pwmicmix) — веб-микшер поверх PipeWire
Задача была конкретная: подключить микшерский пульт с несколькими отдельными USB-каналами, и я хотел превратить каждый канал в собственный виртуальный микрофон, который видят Chrome, OBS, Zoom, Discord — что угодно, что умеет выбирать вход.
AudioMixer — тёмная адаптивная консоль в браузере, которая берёт любой порт любого устройства (или монитор синка) и публикует его как отдельный Audio/Source:
- 🎙️ виртуальные микрофоны из любого порта — источники и мониторы синков;
- 📊 живые VU-метры: логарифмическая шкала, быстрая атака / медленный релиз, peak hold, индикатор клиппинга;
- 🎚️ дБ-фейдеры с бустом до +12 дБ, регулировка колесом мыши или вводом точного значения;
- 🔇 mute и 🟡 solo на канал, плюс общий master mute (solo глушит остальных и снимает мьют с выбранного);
- 🚪 шумовой гейт на канал — threshold, attack, hold, release, hysteresis, с применением настроек ко всем сразу или к связанной группе;
- 🔗 линковка фейдеров (двигаются как один) и выравнивание по опорному;
- 🎬 сцены-пресеты — снимок всего микса (гейн, мьют, соло, гейт, мастер, связки) с плавным «моторизованным» переездом фейдеров при вызове;
- 📱 доступ с телефона в той же сети — кнопка QR с зашитым PIN и выбором сетевого интерфейса;
- ♻️ переживает рестарт сервера — виртуальные микрофоны продолжают работать, приложения не теряют вход и не ловят шум.
Технически всё крутится вокруг pw-loopback: захватывающая сторона явно линкуется на порт устройства, отдающая сторона — это и есть виртуальный моно Audio/Source, который видят приложения. Итоговая громкость канала — gain × master × gate_envelope (ноль, если замьючено или «отсолено» другим каналом). Уровни и предусиление для гейта берутся через pw-record.
Hardware port --pw-link--> am_cap_<id> (loopback capture)
|
v
am_mic_<id> (Audio/Source) <-- сюда пишут приложения
Собирается в один AppImage (~200 МБ: портативный Python + Flask/numpy/qrcode + pywebview на Qt WebEngine для нативного окна с иконкой в таскбаре GNOME и KDE). Сами pw-* тулы не бандлятся — используются те, что уже стоят в системе, чтобы точно совпадать с версией демона. Релизы собираются автоматически по тегам vX.Y.Z через CI.
Запуск без AppImage — тоже минута:
git clone git@github.com:metallcorn/pwmicmix.git
cd pwmicmix
./run.sh
Открывается http://localhost:8723 — локально без PIN, с других устройств в сети по 4-значному коду из баннера запуска.
Репозиторий: github.com/metallcorn/pwmicmix
Комментарии
Отправить комментарий