Журнал LinuxFormat - перейти на главную

LXF132:Sound

Материал из Linuxformat
Версия от 11:15, 1 июля 2011; Crazy Rebel (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Linux реального времени

Содержание

Живой звук

Желаете использовать Linux в студии звукозаписи? Дмитрий Михирев расскажет, как превратить просто свободную ОС в свободную ОС реального времени.

Работа со звуком – одна из областей, в которых Linux на высоте. И всё же при необходимости превратить компьютер в импровизированную студию звукозаписи или микшерный пульт непременно возникает ряд проблем: вроде всё необходимое ПО имеется, но настроить его так, чтобы оно работало безупречно, непросто. Это даже послужило причиной появления специализированных дистрибутивов Linux, ориентированных на работу со звуком; наиболее известный из них – 64 Studio (http://www.64studio.com). И всё же устанавливать отдельную ОС под одну-единственную задачу – это слишком расточительно. Давайте лучше разберёмся, как сделать всё необходимое на базе любого уже установленного дистрибутива.

Зачем это надо?

Чтобы просто слушать музыку в Linux, никаких особых ухищрений не требуется. Необходимость в них возникает при профессиональной работе со звуком, когда компьютеру отводится роль того или иного устройства обработки – будь то микшерный пульт, гитарный процессор или просто записывающее устройство. Основное требование, предъявляемое к этой аппаратуре – отсутствие сколько-нибудь заметных задержек сигнала. Музыкант должен слышать в мониторах ту ноту, которую он берёт сейчас, а не ту, которую извлёк из инструмента полсекунды назад. Такие требования обуславливают неприемлемость сколько-нибудь значительной буферизации, а без неё возможно появление «заиканий» звука, что ещё хуже.

Получается, казалось бы, порочный круг, выбраться из которого не так-то просто. Однако у любого современного компьютера вполне достаточно вычислительных мощностей для обработки нескольких аудиопотоков в реальном времени: надо лишь использовать их оптимальным образом.

Как это делается

Чтобы ничто не мешало обработке звука, надо «всего лишь» превратить Linux в систему реального времени. Задача эта непростая, но с ней успешно справился Инго Мольнар [Ingo Molnar], а уже скомпилированные ядра с наложением написанных им патчей есть в репозиториях многих двоичных дистрибутивов.

Потребуется также звуковой сервер, обеспечивающий минимальные задержки, но (при необходимости) позволяющий производить даже многоступенчатую обработку звука. Тут всё очевидно: этим требованиям удовлетворяет JACK, и никаких серьёзных альтернатив ему нет – да и нужны ли они? Поскольку в большинстве современных дистрибутивов по умолчанию устанавливается PulseAudio, его нужно будет отключить, чтобы он не оттягивал на себя ресурсы.

Ну и, само собой, потребуется собственно ПО для обработки звука в реальном времени. С этим замечательно справляются как самостоятельные программы, так и многочисленные модули LADSPA и LV2 (LADSPA version 2). JACK позволяет использовать для последовательной обработки звука практиче­ски любое их число. В большинстве дистрибутивов, установив пакеты ll-plugins и swh-plugins, вы получите возможность делать со звуком почти всё, что угодно.

С аппаратной частью обстоит сложнее: требования к ней зависят от конкретных задач. В любом случае, потребуется качественная звуковая карта, а если количество входов на ней мало – придётся раздобыть аппаратный микшерный пульт. Если компьютер должен будет заменить ещё и синтезатор, то, разумеется, не обойтись без MIDI-клавиатуры. Впрочем, вопросов выбора оборудования мы в этой статье касаться не будем, а вплотную займёмся настройкой программ.

Приступим

Ну что же, пора перейти от слов к делу. В первую очередь разберёмся с ядром реального времени. Как я уже отмечал, таковое имеется в репозиториях многих двоичных дистрибутивов. Например, в Mandriva понадобится установить пакет kernel-rt-latest. Пользователям Ubuntu следует установить мета-пакет linux-rt, а в других дистрибутивах следует поискать пакет, название которого начинается на kernel-rt. Не лишним будет прочитать описание пакета: обычно в ядре реального времени присутствуют некоторые ограничения. Например, в Mandriva оно не содержит никаких дополнительных патчей, и, как следствие, может не поддерживать некоторое оборудование, нормально работающее со стандартным ядром.

Но установка пропатченного ядра – это даже ещё не полдела. Само по себе оно ничего не изменит, поэтому потребуется также скрипт rtirq, повышающий приоритет потоков (threads), которые обрабатывают прерывания, назначенные аудиоустройствам. Этот скрипт существует в двух вариантах: в виде обычного исполняемого файла, который можно запустить вручную, и в виде init-сценария, выполняющегося при загрузке системы. Именно второй вариант нам и понадобится. В Ubuntu он уже имеется в репозиториях под именем rtirq-init, а пользователи других дистрибутивов могут найти его на прилагающемся к журналу диске.

Ну и, разумеется, надо установить JACK. В дополнение к нему не лишним будет QjackCtl – если, конечно, вы не фанат консоли и не предпочитаете запускать JACK с помощью собственноручно написанного скрипта.

Прежде чем перезагрузиться и задействовать, наконец, ядро реального времени, нужно обеспечить себе возможность повышения приоритета процессов: с настройками по умолчанию система может этого не позволить. Первым делом следует убедиться, что пользователь, от имени которого будет запускаться JACK, состоит в группе audio, и если это не так – добавить его туда. Затем членам этой группы надо разрешить повышение приоритета реального времени до 99, а также увеличить лимит блокирования памяти, отредактировав файл /etc/security/limits.conf (в некоторых дистрибутивах – /etc/limits.conf). Нужно найти строку вроде этой:

@audio - rtprio 50

и исправить её на

@audio - rtprio 99

Кроме того, добавьте строку

@audio - memlock 1048576

Число здесь – ограничение памяти в килобайтах; следует отдать столько, сколько не жалко.

Сделай сам

К сожалению, готовое ядро реального времени имеется не во всех дистрибутивах. Если это про вас, то его придется собирать самостоятельно. Понадобится только исходники ядра (с http://kernel.org) и патч для той же версии ядра, который можно найти по адресу http://www.kernel.org/pub/linux/kernel/projects/rt/. (Пользователи Gentoo могут просто установить пакет rt-sources с уже пропатченным ядром.)

Архив с патчем надлежит поместить в директорию с исходниками ядра и затем наложить командой

bzcat ../patch-2.6.23.1-rt11.bz2 | patch -p1

Это, конечно, ещё меньше, чем полдела. Далее ядро нужно правильно сконфигурировать. Если в данный момент запущено ядро той же версии, что собираете вы (с точностью до числа после второй точки), можно облегчить себе задачу, используя его конфигурационный файл. Извлечём его –

zcat /proc/config.gz > .config

и применим команду

make oldconfig

На все выводимые ею вопросы ответить можно отрицательно. Важные для работы в режиме реального времени параметры установим потом, при посредстве

make menuconfig

В появившемся текстовом диалоге следует пробежаться по некоторым разделам конфигурационного меню:

  • В Enable the block layer > IO Schedulers > Default I/O scheduler нужно выбрать вариант Deadline (см. LXF126/127).
  • В Processor type and features необходимо включить поддержку таймеров высокого разрешения (High Resolution Timer Support) и установить режим вытеснения (Preemption Mode) в Complete Preemption (Real-Time), а для частоты прерываний таймера (Timer frequency) указать 1000 Hz.
  • В Device Drivers > Character devices активируйте устройства Enhanced Real Time Clock Support (legacy PC RTC driver) и HPET — High Precision Event Timer, а затем переместитесь в ветку Sound card support > Advanced Linux Sound Architecture и включите опции RTC Timer support и Use RTC as default sequencer timer.
  • Наконец, отключите отладку ядра в Kernel hacking > Kernel debugging: в нашем случае это пустая трата ресурсов.

Далее собираем и устанавливаем ядро обычным путём:

make && make modules_install
cp arch/i386/boot/bzImage /boot/kernel-2.6.33.1-rt11
cp System.map /boot/System.map-2.6.33.1-rt11

после чего настраиваем загрузчик – в зависимости от того, какой установлен. В двоичных дистрибутивах более «правильным» путём будет сборка и последующая установка пакета с ядром, но это уже выходит за рамки данной статьи.

Реальное время пошло

Вот теперь можно перезагружаться и проверять работоспособность RT-ядра. Если загрузка прошла успешно, надо запустить rtirq – пока сделаем это вручную, выполнив от имени суперпользователя команду

/etc/rc.d/init.d/rtirq start

В отчёте можно будет наблюдать примерно такую картину:


Setting IRQ priorities: start [rtc] irq=8 pid=1282 prio=90: OK.
Setting IRQ priorities: start [HDA NVidia] irq=22 pid=1966 prio=85: OK.
Setting IRQ priorities: start [E-mu 0404b PCI [MAEM8852] (rev.0, serial:0x40021102)] irq=19 pid=1945 prio=84: OK.
Setting IRQ priorities: start [ohci_hcd] irq=22 pid=954 prio=80: OK.
Setting IRQ priorities: start [ehci_hcd] irq=23 pid=951 prio=80: OK.
Setting IRQ priorities: start [i8042] irq=1 pid=920 prio=75: OK.

Если тут всё в порядке, то с чистой совестью добавим сценарий на уровень запуска по умолчанию. Как правило, это уровень 5, но не помешает всё же проверить:

grep :initdefault: /etc/inittab

Если в выводе будет

id:5:initdefault:

значит, используется 5-й уровень. Выполняем от имени суперпользователя команду

chkconfig --add rtirq --level 5

Теперь всё готово для запуска JACK, и можно, наконец, его опробовать. На первый раз достаточно запустить QjackCtl и нажать на кнопку загрузки сервера. Если сервер запустился успешно и индикатор RT мигает, то всё в порядке. Для проверки подойдёт любой аудиопроигрыватель с возможностью вывода через JACK. Наслушавшись музыки, остановим сервер и перейдём к его более тонкой настройке.

Если при запуске JACK вы не увидели индикатора «RT», значит, сервер выполнялся не в режиме реального времени. Включить его можно в окне настройки QjackCtl. Здесь также находятся параметры, определяющие величину задержки сигнала. Это частота дискретизации, число выборок (фреймов) в буфере и число периодов на буфер. Если точнее, то задержка равна произведению числа выборок на число периодов, делённому на частоту дискретизации. Тянуться за калькулятором не надо: QjackCtl сам вычисляет эту величину для облегчения настройки.

Какую частоту дискретизации выбрать – решайте сами, исходя из возможностей звуковой карты и ваших запросов. В большинстве случаев подойдут стандартные 48 000 Гц, хотя в случае, если запись производится в расчёте на будущую обработку, иногда имеет смысл выставить 96 000 Гц, а то и 192 000 Гц. Не стоит только забывать, что увеличение этого значения увеличивает затраты на обработку звука, что также может стать причиной заиканий и хрипов (xruns).

Число периодов на буфер почти всегда можно использовать равное 2; только в случае с USB-аудиокартами рекомендуют выставить значение 3. А вот число выборок в буфере следует подбирать эмпирически, уменьшая до тех пор, пока не появятся помехи (или пока аудиодрайвер не откажется использовать такое низкое значение). Как правило, с числом выборок 128 проблем не бывает.

З-заикаемся-с?

В некоторых случаях добиться качественного звука путём настройки JACK не удаётся: он всё равно хрипит, а в выводе сервера появляются сообщения вида

18:05:27.832 XRUN callback (1).

Это означает, что, скорее всего, звуковая карта настроена не оптимальным образом. Следует проверить, не используется ли назначенное ей прерывание заодно ещё каким-нибудь устройством:

cat /proc/interrupts

Если прерывание назначено только звуковой карте, как в этом примере

19: 194541 841686 IO-APIC-fasteoi EMU10K1

то всё в порядке, а вот если оно используется чем-то ещё, как здесь –

22: 317650 220908 IO-APIC-fasteoi ohci_hcd:usb2, HDA Intel

то надо исправлять ситуацию.

Возможных решений два. Первое – простое, но подойдёт не для всех компьютеров: нужно вручную назначить IRQ для аудиокарты в настройках BIOS. К сожалению, сделать это можно только на немногих материнских платах. Второе решение потребует взять в руки отвёртку: если назначить IRQ напрямую нельзя, следует просто переставить карту в другой слот. После этого нужно загрузить систему и вновь проверить список прерываний, назначенных устройствам.

Даже назначение уникального IRQ не всегда помогает добиться успеха. Дело в том, что аудиокарта – не единственное устройство на шине PCI, и передача данных прочей периферии влияет на ее работу. Для регулирования этого процесса для каждого устройства устанавливается таймер задержки. Он определяет, какое время после окончания передачи устройство продолжает занимать шину. Соответственно, при работе со звуком оптимальным является вариант, когда задержка для звуковой карты максимальна, а для прочих устройств – минимальна. По умолчанию это не всегда так; для проверки следует изучить вывод команды

lspci -v

Вот пример настроек аудиокарты моего компьютера:

01:07.0 Multimedia audio controller: Creative Labs SB0400
Audigy2 Value
	 Subsystem: Creative Labs Device 4002
	 Flags: bus master, medium devsel, latency 64, IRQ 19
	 I/O ports at dc00 [size=64]
	 Capabilities: [dc] Power Management version 2
	 Kernel driver in use: EMU10K1_Audigy
	 Kernel modules: snd-emu10k1

Слова «latency 64» в третьей строке означают, что значение таймера задержки установлено в 64. Для прочих устройств оно равно 0, и проблем при этом не наблюдается. Изменить эти значения можно, выполнив от имени суперпользователя команду

setpci -v -s *:* latency_timer=0

Это установит задержки для всех устройств в 0. Увеличить же задержку для аудиокарты можно командой

setpci -v -s 01:07.0 latency_timer=40

Число здесь вводится в шестнадцатеричной системе, то есть 40 соответствует 64 в десятичной системе. Адрес устройства (в данном примере 01:07.0), конечно, нужно заменить на ваш, из вывода lspci -v.

Приведённые здесь числа указаны только для примера. В каждом случае величины таймера задержки следует подбирать индивидуально (в диапазоне от 0 до 255), общее правило заключается лишь в том, что для аудиокарты оно должно быть самым высоким. Когда подходящие значения будут подобраны, их можно установить в BIOS, чтобы не писать скрипт для изменения настроек после каждой перезагрузки.

Микшерный пульт

Помимо малой задержки звука, основное преимущество, которое даёт JACK – это возможность легко соединять программы для аудиообработки, точно так же, как аппаратные устройства соединяются последовательно кабелями. Делать это можно и в QjackCtl, и непосредственно во многих клиентах JACK. Самое сложное тут – не запутаться в виртуальных «проводах», поэтому для подключения лучше всего пользоваться программой Patchage. В ней всё выглядит наиболее наглядно.

Какое ПО понадобится для обработки звука, зависит от конкретной ситуации. Однако есть джентльменский набор программ, держать которые на компьютере стоит всегда. В первую очередь это JAMin, сочетающая в себе компрессор и эквалайзер (аж 1023‑полосный!). Подключение его на выходе сигнала будет очень полезным. Работу с JAMin освещал на страницах LXF создатель 64 Studio Дэниел Джеймс [Daniel James].

Гитаристам должен понравиться виртуальный гитарный процессор Rackarrack: он сочетает до десяти эффектов в любой последовательности, имеет 80 общих пресетов и по несколько пресетов для каждого эффекта. Впрочем, пригодится он не только для гитары: в нём есть и эффекты общего назначения.

В начале статьи упоминалось о многочисленных модулях LADSPA, позволяющих вытворять со звуком практически всё что угодно. Самый простой способ задействовать любые из них – воспользоваться JACK Rack. Эта программа служит для подключения неограниченного числа модулей (ладно, не будем привирать – оно ограничено числом портов JACK) и их настройки.

Ну и, конечно, никак не обойтись без микшера. Тут выбор довольно широк; например, можно установить jack_mixer. Любое число моно- и стереовходов и выходов, отдельный выход на мониторы – что ещё надо для счастья?

Проблемы с программами

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

Причиной «потери» программы сервером может быть слишком малый тайм-аут соединения, установленный по умолчанию. При возникновении проблем следует увеличить это значение в настройках QjackCtl – например, до 1000 мс или, для верности, 2000 мс. Как правило, этого достаточно, чтобы подобное не повторялось, но от проблемы с хрипами не избавляет.

Бороться с последними можно путём запуска программ с высоким приоритетом. Тут, однако, следует быть весьма осторожным: если программа работает нестабильно, это может приводить к зависаниям всей системы. Даже в случае со стабильными программами перестараться – значит, навредить: приоритет, более высокий, чем у JACK или потоков, работающих с прерываниями аудиоустройств, скорее всего, только ухудшит ситуацию. Приоритет 51 – это вполне разумное значение.

Чтобы запустить программу, например JAMin, с повышенным приоритетом, следует выполнить команду

chrt 51 jamin

В результате количество xrun’ов заметно уменьшается, либо они пропадают вовсе – правда, нагрузка на процессор существенно возрастёт.

Персональные инструменты
купить
подписаться
Яндекс.Метрика