Как стать автором
Обновить

Аудио микшер из двух и более звуковых карт на realtime Linux и Reaper

Время на прочтение9 мин
Количество просмотров12K
Когда играешь в группе, надо где-то репетировать. Попробуем дома собрать свой микшер с эффектами из того, что есть под рукой. А под рукой у меня есть 2-х ядерный компьютер с встроенной и 2-мя дополнительными аудиокартами, ESI Juli@ и C-Media CM8738. Итого 6 каналов на запись.
Если достаточно 2-х каналов, то можно дальше не читать, потому как 2 канала можно смикшировать через Reaper под Windows с asio4all (или родными драйверами), будет играть без проблем. Вся сложность начинается, когда хочется из 3-х карточек сделать одну виртуальную и многоканальную. Через asio4all запись одновременно 6-ти каналов на приемлемом уровне качества (даже для репетиций) не получилась (из-за разного clock source на карточках, а также из-за редких подтормаживаний), поэтому и пришлось идти таким нелёгким путём.

Запускать мы всё будем под Linux-ом с realtime-ядром. Realtime-патч желателен, но не необходим, без него тоже будет работать, разве что с большей задержкой и не так стабильно. Дистрибутив будет Debian, а не RemixOS, потому что, во-первых, хочется понимать что происходит, можно ли что-нибудь покрутить и ничего не сломается, во-вторых нужно будет немного патчить wineasio, и в-третьих, в remixos ужасный рабочий стол. Как ставить Debian я рассказывать не буду, на эту тему уже много написано. Итак, мы имеем свежеустановленный Debian 6.0.3 с рабочим столом. Выглядеть это будет почти что так, разве что иконок на рабочем столе не будет:

Первым делом обновляем (если Debian устанавливался не с netinstall). В рутовой консоли (Приложения->Стандартные->Root Terminal)
#aptitude update && aptitude safe-upgrade

Теперь ставим уже скомпиленное realtime ядро pengutronix, опять же в рутовой консоли:

#wget -O /etc/apt/sources.list.d/pengutronix.list http://debian.pengutronix.de/debian/pengutronix.list 
#aptitude update
#apt-get -q --allow-unauthenticated install pengutronix-archive-keyring
#aptitude update
#aptitude install linux-image-2.6-rt-osadl-686

Перезагружаемся на него, смотрим что скажет uname:

root@debian:/home/vasiliy# uname -a

Linux debian 2.6.33.7.2-rt30-1-686 #1 SMP PREEMPT RT Mon Jan 17 14:22:44 UTC 2011 i686 GNU/Linux

root@debian:/home/vasiliy# 

Далее необязательно удаляем update-notifier (или как-нибудь выключаем):

#aptitude purge update-notifier update-notifier-common

Теперь ставим необходимые пакеты. Во-первых, это демон JACK. Именно к нему будут соединяться аудио приложения. А он, в свою очередь, через ALSA соединяется к звуковой карточке.

#aptitude install jackd2 qjackctl jackeq

Audacity, для проверок

#aptitude install audacity

Пакеты чтобы собрать wineasio

#aptitude install build-essential libjack-jackd2-dev libwine-dev

И Wine, чтобы запускать Reaper. Wine можно поставить из репозиториев, а можно и самому собрать с rt-патчем. Патч нужен для того, чтобы wine мог давать realtime приоритеты нужным потокам. Т.е. с обычным wine все потоки reaper-a будут в sched_other, не зависимо от того, как хочет запускаемое приложение (или все в sched_fifo, если весь wine запустить через schedtool), а с патчем рипер сам скажет какие потоки критичные (это которые звук обрабатывают), а какие потоки нет (это графический интерфейс и всё остальное). В кратце, у потока с точки зрения планировщика может быть определен класс и приоритет. Класс — это sched_fifo, sched_rr, sched_other (он же sched_normal), sched_batch и еще какие-то. Интересных с точки зрения звука тут два, это обычный (sched_other) и реального времени (sched_fifo). Поток, который выполняется с классом sched_fifo, не может быть прерван потоком с классом sched_other. Т.е. все sched_other не смогут выполнится, пока кому-то из sched_fifo есть что делать. Хорошо что большую часть времени sched_fifo-потоки чего-нибудь ждут, сигнала от оборудования, к примеру. В нашем случае звуковые потоки (sched_fifo) будут ждать пока входящий аудио буфер заполнится, как поступит сигнал что буфер готов его быстро-быстро обработают, положат результат в исходящий буфер и снова будут ждать. А в эти перерывы будет рисоваться графический интерфейс итд.
Итак, вариант 1-й, ставим wine обычный (не желательно):

#aptitude install wine schedtool

И вариант 2-й, собираем wine 1.2.3 с патчем (скажу сразу что это не есть правильный debian-way, по-правильному нужно собирать пакет и его устанавливать, но это просто чуть сложней):

#aptitude build-dep wine
#exit
$wget http://ibiblio.org/pub/linux/system/emulators/wine/wine-1.2.3.tar.bz2     #Ссылка с официального сайта winehq.com
$tar xjvf wine-1.2.3.tar.bz2   #Ясно что, распаковываем
$cd wine-1.2.3
$wget http://dl.dropbox.com/u/879835/wine-rt-101107.patch    #Собственно, сам патч. Ссылку взял с http://wiki.cockos.com/wiki/index.php/Installing_and_configuring_Wine
$patch -p1 -i wine-rt-101107.patch     #Патчим
$./configure --prefix=/usr && make depend && make # make depend важен!
$su
#make install



Так как мы будем запускать Reaper, jackd и прочее не от рута, а от своего пользователя, то нужно поправить лимиты, иначе операционная система не даст запустить столько софта, съесть много памяти и получить realtime приоритеты. Правим /etc/security/limits.conf

#gedit /etc/security/limits.conf 

и пишем там (естественно, вместо vasiliy надо поставить свой логин в системе)

vasiliy	-	memlock	unlimited
vasiliy	-	rtprio	99
vasiliy	-	nice	-20

Чтобы лимиты применились, нужно перелогинится или перезагрузится. Проверяем что с лимитами всё ок:

vasiliy@debian:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 40
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 99
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
vasiliy@debian:~$ 

Смотрим что max locked memory unlimited и идём дальше. Сейчас будем настраивать и проверять ALSA и JACK. Логично начать с ALSA, запускаем Audacity, идём в настройки:

Выбираем ALSA, пускаем Audacity на запись, смотрим что работает, слушаем что получилось (здесь я просто дотрагивался пальцем до джека):

Если что-то не работает, к примеру играет, но не пишет (можно в Audacity импортировать любую mp3-шку для проверки), или пишет с большими шумами, то нужно смотреть настройки ALSA, Система->Параметры->Звук. На моей Juli@ всё заработало сразу, а вот с встроенной и c-media карточками прошлось повозится:
C-Media Electronics Inc CM8738 (rev 10)




Встроенная Intel Corporation 82801JI (ICH10 Family) HD Audio Controller





Интересно, что даже встроенная карточка на линейных вход даёт достаточно неплохой сигнал. Единственное что он должен быть достаточно мощным, иначе шумит. Уровень громкости на «Захват», вкладка «Запись» HDA Intel специально стоит на 25%, так у меня шумело меньше всего. Электрогитару, к примеру, так писать не очень, а вот если эту же гитару пропустить через какой-нибудь предусилитель (в моём случае это ART Tube MP), то получается очень даже ничего, даже можно программый дисторшн включать.

Теперь настроим JACK. Запускаем qjackctl через Приложения->Аудио и видео->JACK Control (или в терминале qjackctl), жмем «Параметры»:

Выбираем основной интерфейс, у меня это juli@, она на hw:2 (список карточек и какие они получили номера можно посмотреть в /proc/asound/cards Номер звуковой карточки не всегда сохраняется после перезагрузки, даже если все карточки pci). Включаем режим реального времени, выставляем размер буфера, дискретизацию, запускаем jackd, и через Audacity проверяем что работает (в настройках Audacity не забываем переключится на JACK). Так же желательно проверить запись (и вывод звука) на других карточках через JACK.
А сейчас начинается интересная часть. Будем подключать остальные аудиоинтерфейсы к основному. Всё так же запускаем qjackctl, стартуем и пишем в отдельном терминале:

$alsa_in -d hw:0 -j hda-intel -p 512 -n 2

hw:0 — это встроенная карточка, hda-intel — это просто тэг, можно и без него, 512 — размер буфера, 2 — их количество. Размер буфера и количество подбираются минимально нормально работающие (под нормально работающими понимается что alsa_in не выводит постоянно надпись «delay=<что-нибудь>»), в моём случае это получилось 512 (а потом и 128) сэмплов и два буфера, неплохо. Для остальных (остальной) звуковой тоже самое.


Проверить что всё работает можно через jackeq (Приложения->Аудио и видео->JackEq или, как я, в терминале jackeq). Выбираем порты входа, порты выхода, поднимаем громкость каналов, громкость master-а, смотрим и слушаем. На этом шаге можно поэкспериментировать с размерами буферов JACK и alsa_in (jackeq придётся перезапускать).


Собственно, какой-то простой микшер уже есть. Но ведь хочется большего, много эффектов, vst-плагины и так далее. Можно поставить Ardour, можно ardour пересобрать с поддержкой windows VST плагинов, можно поставить Mixbus. Всё это DAW (Digital Audio Workstation), через них вполне можно микшировать для репетиций. Я предпочёл Reaper потому что, во-первых, он мне привычней, во-вторых в нем самом есть встроенные неплохие эффекты, в-третьих у него удобный микшер, можно ручки настройки эффектов вынести на главный микшер, в-четвёртых в микшере можно настроить хоткеи почти на всё, в-пятых он работает с VST, в-шестых Reaper это живой софт, постоянно развивающийся.
Скачиваем и устанавливаем с reaper.fm, можно триальную версию. Сам Reaper запускать еще рано, у нас нет связки jack-asio. Нужно скачать, пропатчить, скомпилировать и установить wineasio (http://sourceforge.net/projects/wineasio/). Можно скачать стабильную версию (0.9.0), а можно и development, с git-а. Версия, которая лежит в git, она немногим отличается от стабильной, но она у меня запустилась с JACK буфером в 32 сэмпла, так что лучше скачать её:

git clone git://wineasio.git.sourceforge.net/gitroot/wineasio/wineasio

Для того, чтобы собрать wineasio, нужен файл asio.h, который содержится в Steinberg ASIO SDK. К сожалению, Steinberg запрещает распространять этот файл, поэтому его самостоятельно скачиваем с сайта Steinberg (http://www.steinberg.net/en/company/developer.html), и кладем в папку с распакованным wineasio. Теперь нужно пропатчить asio.c:
/* Находим такую строчку */
This->jack_input_ports = jack_get_ports(This->jack_client, NULL, NULL, JackPortIsPhysical | JackPortIsOutput); 
/* и заменяем её на такую: */
This->jack_input_ports = jack_get_ports(This->jack_client, NULL, NULL, JackPortIsOutput); 

/* И с такой тоже самое, найти */
This->jack_output_ports = jack_get_ports(This->jack_client, NULL, NULL, JackPortIsPhysical | JackPortIsInput);
/* Заменить на */
This->jack_output_ports = jack_get_ports(This->jack_client, NULL, NULL, JackPortIsInput);


В этом патче мы убирам флаг JackPortIsPhysical, чтобы wineasio сразу соединялся со всеми портами JACK, в том числе и виртуальными, которые мы создали через alsa_in.
Компилируем, устанавливаем:

$make
$su
#make install
#exit
$wine regsvr32 wineasio.dll


Тестовый запуск Reaper-а, проверяем что wineasio появился:

wineasio настраивается через реестр:

$wine regedit


Из интересных настроек тут только Number of inputs/ouputs, можно поставить какое-нибудь более похожее на реальность количество. Fixed buffersize желательно оставить в «1», чтобы размер буфера определял JACK.
Снова запускаем Reaper, в зависимости от того пропатченный wine или нет команда запуска будет разная:

$wine 'c:\program files\reaper\reaper.exe' # Это по обычному, с классом sched_other, приоритет 0 (обычный)
$nice -n -20 wine 'c:\program files\reaper\reaper.exe' # То же самый класс, только самый большой приоритет
$schedtool -F -p 10 -e wine 'C:\program files\reaper\reaper.exe' # Весь Reaper запускается в realtime. Может иногда предпочесть перерисовать интерфейс вместо того, чтобы обработать аудио.
$env WINE_RT=15 WINE_SRV_RT=10 wine 'C:\program files\reaper\reaper.exe'  # Самый предпочтительный вариант, Reaper сам укажет что важно, а что не очень.

Настраиваем его для лучшей работы под wine:
Убираем галочку с «Preferences->Buffering->Use native events for syncronizing», и в «Preferences->Appearances->UI updates» выбираем «Lazy always».



Ну а теперь осталось только добавить в Reaper-е нужное количество дорожек, включить их на запись и мониторинг, добавить эффектов и играть:


Удачных Вам репетиций!

PS:
  • Под этой версией wine 1.0.1 у меня запустился только 3-тий Guitar Rig, 4-й и 5-й не устанавливаются. Хотя порепетировать и 3-ей хватит. С GuitarRig-ом надо как-то поосторожней, если быстро пресеты переключать, то он вылетает вместе с рипером. Хотелось бы найти какую-нибудь более стабильно работающую под wine-ом альтернативу.
    Под версией wine 1.2.3 Guitar Rig 5 поставится, работает нормально, не вылетает.
  • С wineasio 0.9.0 задержки на основной карточке с буфером 256 получились около 20-ми мс, на дополнительных около 30-ти (поправил, спасибо egorinsk).
    А вот на git версии wineasio и меньшие размеры работают, сейчас вот на основной карточке размер буфера 32, что даёт задержку в 1,4 мс, и на alsa_in буфер 128, т.е. на дополнительных карточках получилось 6 мс.
  • В четыре карточки тоже работает, подключал EMU-0202 USB.
  • Не нашел VST подавителя обратной связи, давить свистящие частоты приходится вручную через эквалайзер.
  • Не знаю как по-человечески поставить nvidia драйвер на realtime ядро.
  • В Reaper-е есть особенность, что приоритеты на потоки он вешает не во время запуска, а как только начинается воспроизведение/запись. Т.е. если делать проект с микшером, после его открытия придётся жать play/stop. Посмотреть, что из потоков есть, какой у них класс и приоритет можно через
    
    ps -emo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm 
    


    Тут видно, что у reaper.exe есть 3 FF (sched_fifo) потока, один с приоритетом 5 (это тот, который ему создал jack, этот приоритет можно настроить через qjackctl), и два (у меня два ядра) с приоритетом 20, это потоки обработки эффектов, их Reaper запросил с приоритетом THREAD_PRIORITY_HIGHEST.


В общем не ленитесь поставить realtime ядро, wine с realtime патчем и wineasio версию с git. Результаты должны получится очень неплохие.

Ссылки:
debian.org
pengutronix.de/software/linux-rt/debian_en.html
reaper.fm
sourceforge.net/projects/wineasio
www.steinberg.net/en/company/developer.html
wiki.cockos.com/wiki/index.php/How_to_run_Reaper_in_Wine_on_Linux
Теги:
Хабы:
Всего голосов 42: ↑37 и ↓5+32
Комментарии21

Публикации

Истории

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань