Иногда у меня, как у звукача аниме/гик фестивалей/конвентов, появляется задача обеспечить звуком небольшой ивент, на площадке которого нет вообще ничего из оборудования. Такие патички довольно лайтовы и располагают к экспериментам. Так, для нашего осеннего опенэйра я выбрал следующий (весьма непривычный) опенсорсный сетап, который в итоге отлично сработал: Идея делать микшер из простейшего аудиоинтерфейса на опенсорсном софте мне настолько понравилась, что я решил поделиться.  Однако, это же и минус: если посреди шоу выходит из сторя ноут, то наступает полный блэкаут. Даже микрофоны перестают работать. Решения нет: надо эксплуатировать аккуратно, много тестить до ивента и подготовить резервный ноут... Обработка живого звука на бытовом железе обычно связана с одним неприятным эффектом: задержкой вывода. Чем больше задержка, тем сложнее человеку говорить в микрофон, так что, для комфортной работы ведущих, необходимо её минимизировать. Задержка вызвана буферизацией, а уменьшение буфера приводит к его периодическому опустошению или переполнению (xrun), что звучит как 100-1000мс громкого треска, то есть, неприемлемо. С обычным ядром Linux, xrun'ы у меня возникают примерно раз в пару минут даже при очень большом буфере. Не знаю с чем это связано, но так точно не пойдёт. Можно было бы докопаться до сути и собрать своё ядро без лишнего мусора, однако, наиболее простым plug-and-play решением является Real-Time ядро Linux. На сайте JACK пишут, что RT-режим звукового сервера работает даже на обычном ядре, но точно не из коробки. Первое, что мы сделаем для подготовки системы к обработке живого звука — установим RT-ядро и перезагрузимся в него: После установки соответствующего пакета, в Вашем GRUB появится новый пункт с RT-ядром. Для повседневной работы RT-ядро не рекомендуется. На это есть как минимум две причины: Окей, вы добились работоспособности Real-Time ядра в Вашем дистрибутиве Linux, что дальше? Далее нам потребуется звуковой сервер: это та программа, которая связывает звуковоспроизводящие (и звукослушающие) программы с "железным" аудиоинтерфейсом. Именно звуковой сервер отвечает за буферизацию (которая приводит к задержке вывода) и коммутацию входов/выходов. For CentOS: Disable memory limits Звуковых серверов много. В десктопном линуксе по умолчанию обычно работает связка ALSA+PulseAudio. ALSA ближе к железу, PulseAudio ближе к прикладному ПО. Для простых задач коммутации динамиков и микрофонов в браузеры и дискорды это работает сносно, но, как писал @merlin-vrn в комментариях к своей замечательной статье Интернет-радио с множеством ведущих из разных городов и звонками в прямом эфире (которая в далёком 2014м побудила меня заниматься звуком на линуксах), И это отчасти правда даже в 2020-м: во время тестов пару раз у меня возникала ситуация, когда демон PulseAudio вешал всю аудио-подсистему и сильно грузил процессор, хотя никто его вообще не трогал. Если когда-нибудь PulseAudio умрёт, мне кажется, мир станет чуточку лучше (надежда есть). Я допускаю, что мы просто не умеем его готовить, но чистота архитектуры, производительность, гибкость и удобство JACK Audio Connection Kit сделало именно его стандартом отрасли проф. аудио на линуксе. Устанавливаем пакет jackd (для debian и ubuntu; также может называться jack-audio-connection-kit или просто jack). В системе должна появиться команда jackd (jack daemon). В AVLinux и Ubuntu Studio он уже установлен, ничего делать не надо. Если в Вашем дистрибутиве есть QjackCtl, можете тоже поставить. Эта программа предоставляет GUI к JACK, что помогает его настраивать и коммутировать каналы. Однако мы будем работать без неё, поскольку в CentOS её нет, компилировать лень, и без неё можно обойтись. Инсталлятор JACK по максимуму подготавливает систему к работе в RealTime, но есть одна вещь, которую он упускает (по крайней мере на CentOS). Если при старте jackd или Ardour появляется ворнинг Cannot allocate memory, значит не применился лимит на максимальный объем выделенной оперативки. Проверить можно командой ulimit -l: если всё ок, она выводит семизначное число не первых миллионов или unlimited. По идее, лимиты должны настраиваться файлом /etc/security/limits.d/95-jack.conf, который JACK успешно создаёт, но на CentOS при работе в GNOME, лимиты из SystemD почему-то перекрывают лимиты из /etc/security/limits.conf, так что нужно их отдельно настроить в /etc/systemd/: В качестве микшера будем использовать Ardour. Из альтернатив имеется Non Mixer, но это какая-то совсем отдельная вселенная: я туда не заныривал и слышал, что там пока сыровато. Ardour — наш бро. Это бесплатная опенсорсная программа для профессиональной работы со звуком. По возможностям, удобству и дизайну интерфейса она не уступает коммерческим альтернативам под Windows и MacOS, так как у команды разработчиков Ardour есть финансирование. Схема монетизации Ardour весьма хороша: установщик не-триального Ardour можно скачать только за деньги, а исходный код с минимальными инструкциями по компиляции — бесплатно. Таким образом те, кто не может или не хочет хакать исходники могут заплатить сколько могут и максимально быстро получить готовую к работе DAW, а те, кто готов поменять деньги на время (и не считают необходимым поддерживать разработчиков) могут самостоятельно скомпилировать программу и пользоваться ей бесплатно. Вот она — настоящая свобода! Установка из установщика тривиальная, а с запуском сейчас будем разбираться. Ура, наконец-то будут картинки! Запускаем Ardour и создаём новую сессию "Live" из Empty Template (либо Advanced Session, если хочется глубоко вникнуть в роутинг):   Выбираем JACK с какими-нибудь такими настройками:  Такая конфигурация запишет в файл cat ~/.jackdrc примерно следующую команду запуска звукового сервера (отрефакторено для наглядности): Файл ~/.jackdrc используется для того, чтобы любое приложение могло при необходимости запустить звуковой сервер и его параметры были в порядке. Если Ardour обнаружит уже запущенный JACKd на момент открытия, то он попытается его использовать и уведомит при расхождении настроек проекта с параметрами работающего сервера. Флаг --temporary означает, что звуковой сервер остановится когда от него отключится последний клиент. Возможно Вам будет удобнее держать сервер постоянно запущенным, но это актуально только если Вы полностью отказались от PulseAudio. Вас встретит пустая DAW. Нужно переключиться в Mixer, скрыть всё лишнее и добавить первый канал:  Чтобы Track мониторился в мастере, нужно на нём нажимать кнопку In (Monitor input) и следить, чтобы она не слетела. Тем временем, Bus всегда выводится и это невозможно изменить. То, что надо для работы в режиме микшера. Подключать к физическим инпутам можно как Track, так и Bus. Если у Вас нет и не планируется ни одного Track, можно вообще скрыть из интерфейса панельку Record & Monitor (у Bus в ней синяя кнопка Show Sends, бесполезная в нашем сценарии). Теперь необходимо подключить добавленный канал к какому-нибудь источнику звука. В меню сразу перечисляются аппаратные входы аудиоинтерфейса, так что подключим его к первому (MIC/LINE 1). Если нужно подключить что-то более глубокое из недр JACK, открываем Routing Grid или QjackCtl.  Профит! Звук с микрофона проходит через Ardour, выходит в MASTER и мониторится на выходе звучки. Аналогичным образом можно добавить остальные каналы Вашего аудиоинтерфейса и накинуть плагинов в соответствующей секции канала. Говоря о плагинах, также стоит упомянуть отличный хост плагинов Carla. Его можно использовать для построения сложных цепочек обработки и контроля графа соединений JACK (вместо QjackCtl). Если маленькое окошко в панели канала не удовлетворяет Ваши потребности в удобстве коммутации плагинов, попробуйте Carla. Также, в связи с плагинами, появляется одна мега-важная вещь, о которой почти нереально узнать чисто из практического опыта. Спасибо, @merlin-vrn, за посвящение в глубокие внутренности цифровой обработки звука. Суть в следующем: при работе с вещественными числами (а JACK работает с вещественными числами), процессору время от времени приходится обрабатывать очень маленькие (по модулю) числа. Для работы с такими числами процессоры используют некий приём под названием Денормализованные числа, и во многих процессорах этот приём дико лагает. Его используют потому что он позволяет избежать проблем с точностью (а это, в общем случае, куда важнее). То есть, если число становится меньше определённого порога, арифметические операции с ним могут (при определённых условиях) стать чуть ли не в 100 раз медленнее. При обработке звука, чаще всего маленькое число означает тихий звук, который даже и не слышно, так что критически важно принять меры для защиты от denormals. В Ardour достаточно просто подкрутить настроки:  Возможно, DC bias — это оверкилл, процессоры чаще всего поддерживают режимы работы округления denormals. Но, зато, безопасно. У меня для ивента была вот такая раскладка:  Всё, классический микшер уже готов. Есть инпуты, у каждого свой фэйдер и кнопка MUTE, есть обработка, есть MASTER OUT и физический разъём к нему (у моей BEHRINGER UM2 даже два: тюльпаны для колонок и джек для мониторинга). Однако, для полного счастья, стоит добавить возможность включать треки с того же компа. Этим и займёмся. Для меня VLC — это плеер по умолчанию для любого медиаконтента. Однако, если Вас не пугают диджейские пульты, можно использовать Mixxx. В принципе, тогда Ardour и не нужен, в Mixxx есть 4 AUX и 4 MIC входа. Но лично мне комфортнее с классическим микшером и я расскажу про VLC. Ещё есть IDJC, но он уже довольно стар (даже его форк IDJC-X уже много лет не обновляется) и больше адаптирован под интернет-радио (тёплый ламповый Icecast), но может быть Вам будет удобен. VLC умеет работать напрямую через JACK, в нём это реализовано максимально удобно.   То есть, VLC будет автоматически подключать свой аутпут к сорсам, имя которых совпадает с регуляркой VLC. Можно просто указать подходящую строку в качестве имени канала в Ardour, и VLC сам подключатся к этому каналу при попытке что-то воспроизвести. Максимально удобно и надёжно. Главное потом не забыть вернуть на PulseAudio или ALSA, когда через недельку захотите посмотреть видос, а звук работать не будет. Нам понадобится утилита alsa_in. Она позволит ввести в JACK звук из приложений, которые сами не умеют выводить звук в JACK (например, браузер). Скорее всего alsa_in установилась вместе с JACK, но в RHEL-мире это отдельный пакет jack-audio-connection-kit-example-clients. Также нам потребуется PulseAudio Volume Control (пакет pavucontrol), без него сложновато понимать что происходит внутри PulseAudio и влиять на это. Важный момент: во многих дистрибутивах есть отличный пакет pulseaudio-module-jack, который позволяет соединять PulseAudio с JACK напрямую, минуя ALSA. Если у Вас он есть, используйте module-jack-sink вместо alsa_in. Это будет намного чище, чем описанный далее способ. Я не пробовал, но хотел бы. Может как-нибудь соберу из исходников. Утилиту alsa_in можно запускать (в screen, чтобы она работала в фоне, но была доступна) вот таким скриптом: Спасибо за интерес к свободному ПО. Если что-то не понятно или не получается, пишите комменты, попробуем разбираться :) Internal Developer