PulseAudio: Перенаправление потоков аля jackd

Что мы хотим? Мы хотим подмешать к микрофонному сигналу еще что-то. Например дополнительный сигнал с другой звуковой карты для того, чтобы по скайпу с кем-то поджемить на гитаре\ударке.

В jackd это сделать довольно просто — там куча графических роутеров. Но что делать если надо подмешать сигнал в pulse?

Возьмем самый простой пример: нужно подмешать к звуку микрофона аудио из браузера.

mic -> skype <- ff

Просто так это работать не будет. Потребуется виртуальное loopback-устройство, которое будет смешивать сигналы, а после остальное по будет использовать его как микрофон.

       skype
^
|
mic -> loopback <- ff

1 — Создаем устройство

Создаем само устройство и задаем ему описание чтобы в панели управления бло что-то вразумительное, а не «Пустой выход».

$ pacmd load-module module-null-sink sink_name=fx-sink
42
$ pacmd update-sink-proplist fx-sink device.description=Виртуальный_микрофон_вход
$ pacmd update-source-proplist fx-sink.monitor device.description=Виртуальный_микрофон_выход

Цифру, которая выдает первая команда можно запомнить. Это идентификатор, по которому можно sink удалить.

2 — Перенаправляем микрофонный выход на это устройство

$ pactl load-module module-loopback source=alsa_input sink=fx-sink
43

Номер так же можно запомнить чтобы потом удалить ассоциацию.

Теперь в качестве устройства для ввода в панели управления (ставим как дефолтный девайс) или в программе выбираем fx-sink.monitor. Он будет называться «Виртуальный_микрофон_выход» (выше мы прописали в описании).

Чтобы посмотреть что писать в аргументе source просматриваем вывод команды

$ pactl list-sinks

Тут нам нужно найти содержимое поля name системного микрофона.

Источники:

Jackd: Измеряем задержку аудио сигнала в цепочке обработки

Не секрет, что большинство диванных музыкантов любят мериться минимальной задержкой своей звуковой карты считая, что это задержка сигнала от поступления на вход карты, прохождения через обработку и появления в мониторах.

Но что на самом деле означает эта задержка? Это лишь время, которое будет затрачено на обработку сигнала после поступления его в роутер (в моем случае в роли роутера выступает jackd).

А как измерить полную задержку вместе со временем на обработку и перевод сигнала в аналог?

jack_iodelay — утилита генерирует тестовый сигнал, который можно направить в роутере куда угодно, потом вернуть на вход этой же утилиты и посмотреть в консоли что получится.

Для измерения нам потребуется небольшой патч чтобы соединить один из входов интерфейса с выходом.

После этого запускаем утилиту, коммутируем нужный вход и выход в роутере и смотрим на результат в консоли.

Общая задержка составляет в среднем 820 фреймов. Чтобы узнать задержку в миллисекундах делим это число на частоту семплирования. (96кГц). Это 8,5мс.

Поле extra loopback latency содержит лаг, который был вызван ЦАП’ом и АЦП.

Задержка зависит и от настроек джека. От количества семплов и периодов на буфер

Для текущего теста 2 периода на буфер и 128 сэмплов. Итого 384. И ~430 фреймов — это задержка на железе. В сумме и получается ~820.

Можно пользоваться опциям -I и -O. Они отдельно позволяют посмотреть задержку по входу и выходу сигнала.