Issuu on Google+

118

Unixoid

ХАКЕР 05 /172/ 2013


ХАКЕР 08 /175/ 2013

119

Прикладная аудиофилия

ПРИКЛАДНАЯ АУДИОФИЛИЯ Собираем звуковую станцию на базе Linux и MPD В основе референсного аудиопроигрывателя Bryston BDP-2 стоимостью, на минуточку, 156 тысяч рублей лежит стандартная материнка с процессором Intel Atom и звуковой картой ESI Juli@ PCI. В качестве ОС для этого плеера разработчики выбрали Debian Linux. При наличии времени и желания можно собрать аналогичный цифровой источник из имеющегося железа, а с установкой нужного ПО и тонкой настройкой параметров системы тебе поможет эта статья. ВВЕДЕНИЕ Надо сказать, при создании BDP-2 инженеры из Bryston не сильно утруждали себя работой над программной частью: в поставке идет стоковый Debian 6.0.1, ядро версии 2.6.32 без поддержки realtime, предлагаются практически нетронутые настройки MPD, какие-либо оптимизации вовсе отсутствуют. Дело в том, что стандартные ядра имеют довольно большую задержку звука (11–20 мс), и это не позволяет работать со звуком профессионально. В realtime-системе эта задержка составляет ~1 мс, что уже считается отличным результатом. Поэтому первым делом мы скомпилируем ядро и звуковой сервер MPD с RT-патчами, чтобы максимально снизить задержки, затем настроим высокоточный таймер событий, выставим максимальные приоритеты для устройств и процессов, связанных с передачей аудио, и проведем тюнинг системных параметров. В общем, сделаем то, что должны были сделать hi-end’овцы. Будем рассматривать на примере древнего компа (материнка VIA Epia-MS, проц VIA C3 800 МГц, 512 Мб ОЗУ, звуковая карта ESI Juli@ PCI) и дистрибутива Debian 7.1, установленного по минимуму, то есть без графики и лишних сервисов. У тебя может быть другая звуковуха, только мы бы рекомендовали именно PCI/PCI-E, поскольку внешние карты USB могут некорректно работать с некоторыми материнскими платами.

Затем в menuconfig/nconfig включаем опцию Processor type and features Preemption Model Fully Preemptible Kernel (RT) и собираем ядро: Роман Ярыженко rommanio@yandex.ru

Вместо CONCURENCY_LEVEL=3 можешь поставить свое число, в зависимости от количества ядер процессора + 1. Устанавливаем и перезагружаемся:

Андрей Матвеев andrushock@real.xakep.ru

RT-патч предназначен для поддержки реального времени в ядре, причем не «мягкого», а «жесткого». Разница заключается в том, что системы «мягкого» реального времени допускают небольшое превышение желаемого времени выполнения, в системах же «жесткого» реального времени подобное превышение недопустимо. Патч накладывается на ванильное ядро, поэтому ставим все необходимое для его компиляции и качаем ядро и патч:

Распаковываем и патчим:

# tar xjf linux-3.8.13.tar.bz2 && cd linux-3.8.13 # bzcat ../patch-3.8.13-rt11.patch.bz2 | patch -p1

# dpkg -i ../*.deb # reboot

ПОДГОТОВКА MPD Для начала — что это такое? Зачем нужен еще один плеер, если их и так предостаточно? Собственно, MPD — демон с клиентсерверной архитектурой, что открывает довольно любопытные возможности, а именно: • в отличие от множества других графических плееров, он прекрасно обходится без иксов, так что, если они упали или вообще отсутствуют на компе, музыка все равно будет играть; • это клиент-серверное приложение — при желании им можно управлять из графического интерфейса; • MPD мало того что клиент-серверный — он еще и сетевой! Следовательно, его можно поставить на безголовый сервер и спокойно рулить им с любого устройства — хоть с нетбука, хоть с другого компа, хоть со смартфона или планшета (iOS/ Android).

КОМПИЛЯЦИЯ RT-ЯДРА

# apt-get install kernel-package libncurses5-dev fakeroot build-essential pkg-config wget gcc autoconf git # mkdir kernel && cd $_ # wget bit.ly/149djQn # wget bit.ly/14rDBvQ

# CONCURENCY_LEVEL=3 fakeroot make-kpkg --initrd --append-to-version=-rt kernel_image kernel_headers

DVD На прилагаемом к журналу диске ты найдешь исходники MPD с наложенным RT-патчем.

Сам же MPD имеет множество возможностей, в том числе поддержку FLAC, ALAC, WAV, MP3, OGG, потокового воспроизведения аудио, gapless playback (воспроизведение без пауз)… всего не перечислишь. Исходники берем с официального cайта (по указанным ниже причинам необходима версия 0.17.1), затем ставим необходимые зависимости для сборки:

# # # # #

wget bit.ly/14wxPtj tar xjvf mpd-0.17.1.tar.bz2 cd mpd-0.17.1 apt-get build-dep mpd apt-get install libcdio-paranoia-dev


Unixoid

120

После этого можно, в принципе, заходить в каталог и набирать команду autogen, а затем make… но мы торопиться не будем, поскольку в противном случае MPD будет скомпилирован с опциями по умолчанию, что нам может не подойти. Кроме того, придется применять RT-патч к самому MPD, который предназначен для улучшения качества звука путем управления приоритетами потоков (зря, что ли, RT-ядро компилировали?). Поскольку сам плеер развивается быстрее, чем патч, версия MPD должна быть именно 0.17.1. Скачиваем патч и накладываем его:

# wget bit.ly/10kbsHY -O mpd-rtopt.diff.gz # gunzip -c mpd-rtopt.diff.gz | patch -p1 Теперь уже можно выбирать опции сборки. Конечно, это дело вкуса, но мы собирали со следующими опциями:

# ./autogen.sh CFLAGS="-O2 -mtune=`uname -m`" --enable-alsa --enable-rtopt --enable-id3 --enable-sqlite --enable-audiofile --enable-flac --enable-cdio-paranoia --enable-lsr --disable-oss --disable-pulse --disable-jack --disable-ipv6 --disable-inotify # make && make install • • • • • • • •

Рассмотрим некоторые опции подробнее: --enable-alsa — включает поддержку ALSA; --enable-rtopt — собственно, то, ради чего мы патчили; --enable-id3 — поддержка тегов ID3; --enable-sqlite — поддержка SQLite для внутренней БД MPD; --enable-audiofile — поддержка WAV-файлов; --enable-flac — поддержка FLAC — формата сжатия без потери качества; --enable-cdio-paranoia — аудиоCD; --enable-lsr — поддержка изменения частоты дискретизации на лету;

Чтобы получить bit-perfect playback, запрещаем звуковой подсистеме самой выравнивать громкость, изменять частоту дискретизации, изменять количество каналов и выполнять преобразование разрядности аудиопотока

ХАКЕР 08 /175/ 2013

• Подопытный комп, аналоговая часть ESI Juli@ демонтирована

• • •

Для тестов использовался цифро-аналоговый преобразователь Nagra DAC

--disable-oss — поскольку мы будем использовать ALSA, OSS нам не понадобится; --disable-pulse, --disable-jack — обертки вокруг ALSA нам тоже ни к чему; --disable-ipv6 — если нет IPv6, зачем его включать? --disable-inotify — для меньшего потребления ресурсов.

А теперь, после успешной сборки и установки, давай перейдем к настройке аудиосистемы.

НАЧАЛЬНАЯ НАСТРОЙКА И ТЮНИНГ Приведем наиболее важные части файла mpd.conf:

# . # music_directory "/var/mpd/music" # playlist_directory "/var/mpd/plists" # db_file "/var/mpd/mpd_db" # — # sticker_file "/var/mpd/sticker_db" log_file "/var/log/mpd.log" # ESI Juli@, # (Toslink RCA) # — # mpd.conf. # # audio_output { # , type "alsa" # name "ESI Julia SPDIF" # ( # # aplay -L)

SPDIF

ALSA

BIOS Приведем несколько настроек BIOS, которые рекомендуется подправить для улучшения производительности: • Если имеется HyperThreading, лучше его отключить. • Video BIOS shadow тоже лучше отключить. • Для устройств PCI выключи опцию PCI Delay Transaction, поскольку она увеличивает задержки. • Отключи все ненужные встроенные устройства.


ХАКЕР 08 /175/ 2013

121

Прикладная аудиофилия

device "iec958:CARD=Juli,DEV=0" # bit-perfect playback, # # , # , # # replay_gain_handler "none" auto_resample "no" auto_channels "no" auto_format "no" # Memory-mapping I/O use_mmap "yes" # priority "FIFO:99"

Выбор нужной опции ядра

Конфигурационный файл mpd.conf

bitrate "128" # # ) format "44100:16:2"

, 16

,

} Также необходимо произвести тюнинг системы. Первым делом создаем файл /etc/security/limits.d/mpd со следующим содержанием:

} ... # audio_buffer_size "2048" # # buffer_before_play "50%" ...

@audio - rtprio 99 @audio - memlock unlimited @audio - nice -19

# realtimeMPD — # realtime_option { locks in-memory memlock "yes" # # ( ) stack_reserve "1024" # ( ) heap_reserve "10240" main_priority "OTHER:0" player_priority "FIFO:50" decoder_priority "FIFO:47" # update_priority "OTHER:0" } По желанию (и если MPD был скомпилирован с соответствующей опцией) можно, например, включить потоковое аудио по HTTP — для последнего надо добавить следующие строчки в конфиг:

audio_output { type "httpd" name "My HTTP Stream" # , # lame encoder "vorbis" port "8000" # quality "5.0" # quality bitrate

(44,1

vorbis

Этот файл практически выключает ограничения приоритетов для демона. Далее необходимо изменить настройку HPET (который является генератором тактовой частоты и на многих довольно старых материнских платах по умолчанию не используется). Для этого правим строку в файле /etc/default/grub — заодно добавим опцию threadirqs, которая имеет отношение к RT-ядру и которая понадобится в дальнейшем:

GRUB_CMDLINE_LINUX_DEFAULT="quiet clocksource= hpet threadirqs"

INFO Перед сдачей номера в печать нам удалось выяснить, что ядро, используемое в Bryston BDP-2, скомпилировано с опцией CONFIG_ PREEMPT_VOLUNTARY, позволяющей уменьшить latency и повысить отклик программ, когда система находится под нагрузкой. Это не режим жесткого реального времени, но хоть какая-то отдушина для владельцев столь дорогостоящего плеера.

HPET необходим для более точной (по времени) подачи сигнала на ЦАП. Казалось бы, разница в несколько микро(а то и нано-) секунд при подаче потока битов настолько незначительна, что на нее не стоит обращать внимания… ан нет. Один бит задержался, два пришли раньше времени — и в высококлассной стереосистеме разница может быть ощутима человеческим ухом. С использованием HPET вероятность подобного сценария уменьшается. Давай также настроим некоторые параметры ядра через sysctl. Открой в своем любимом редакторе /etc/sysctl.conf и добавь в него следующие строчки:

# , # # vm.overcommit_memory = 2 vm.overcommit_ratio = 50 vm.swappiness = 10 # dev.hpet.max-user-freq = 2048

HPET


Unixoid

122

ХАКЕР 08 /175/ 2013

Если у тебя PCI’ная карта, то надо увеличить до максимума таймер времени ожидания, задающий время, которое может занимать карта на шине В дополнение к последнему параметру необходимо изменить подобный же для rtc — но, поскольку он находится в sysfs, придется прописывать его в rc.local:

ге. Для некоторых плееров необходимо также указывать файл mpd.ogg — например http://192.168.1.5:8000/mpd.ogg.

УДАЛЯЕМ ЛИШНЕЕ Ну а теперь необходимо подчистить систему. В общем-то, ты можешь это сделать и сам, но есть некоторые тонкости — к примеру, пакеты, установленные с помощью apt-get builddep, удалить не совсем просто. Итак, сначала мы отмечаем нужные для MPD пакеты, чтобы они не удалились следующей командой, а уже затем удаляем пакеты, относящиеся к сборке:

# apt-mark manual libcdio-paranoia1 libavahi-glib1 libcurl3-gnutls libshout3 # apt-get autoremove kernel-package libncurses5-dev fakeroot build-essential pkg-config wget gcc autoconf git # apt-get remove libcdio-paranoia-dev

echo 2048 > /sys/class/rtc/rtc0/max_user_freq Поставим пакет rtirq-init. Он содержит скрипт, увеличивающий приоритеты IRQ-потоков, связанных со звуковым оборудованием:

Затем выполняем следующую трехэтажную команду:

# apt-get install rtirq-init

# apt-get remove $(apt-cache showsrc "mpd" | grep Build-Depends | perl -p -e 's/(?:[\ [(].+?[\])]|Build-Depends:|,|\|)//g')

После установки, возможно, потребуется отредактировать файл /etc/default/rtirq, а именно список IRQ-потоков, которые будут иметь повышенный приоритет:

RTIRQ_NAME_LIST="rtc snd usb i8042" Ну и напоследок — если у тебя PCI’ная звуковая карта, то надо увеличить до максимума таймер времени ожидания (latency timer, задающий время, которое может занимать карта на шине, если к шине обращаются другие карты) для нее и, соответственно, немного увеличить его для других устройств PCI. Но сперва надо узнать PCI ID карты:

# lspci | grep -i audio В моем случае ID был 01:09.0, следовательно, для увеличения latency timer набираем команды

# setpci -v -d *:* latency_timer=b0 # setpci -v -s 01:09.0 latency_timer=ff Эти команды ты тоже можешь прописать в rc.local.

ПРОВЕРКА РАБОТОСПОСОБНОСТИ В общем-то, теперь можно запускать демон MPD. Перед запуском убедись, что музыка в соответствующем каталоге присутствует и создан каталог для плей-листов. Если же она разбросана по разным каталогам, то можно указывать на них симлинками. Команда для ручного запуска выглядит так:

# mpd /etc/mpd.conf

Интерфейс QMPDClient

А как же проверить работоспособность? Дело в том, что даже самый простой консольный клиент в состав исходников MPD не входит, как и библиотека libmpdclient, поэтому можно либо скомпилировать их самостоятельно, либо установить соответствующий пакет. Поскольку клиент не требует наложения патчей, то особого смысла заморачиваться с компиляцией нет, а значит, ставим пакет:

# apt-get install mpc Перед запуском рекомендуем посмотреть настройки микшера — в Debian 7.1 звук по умолчанию отключен. Обновляем базу данных MPD, добавляем всю музыку в плей-лист и запускаем воспроизведение:

# mpc update --wait # mpc listall | mpc add # mpc play Если все нормально, то должна зазвучать музычка. В случае же потокового воспроизведения тебе надо еще проверить работу этого потока. Указываем адрес и порт, прописанный в конфи-

Sonata — еще один клиент для MPD


ХАКЕР 08 /175/ 2013

123

Прикладная аудиофилия

RO Если музыка у тебя будет находиться на ином накопителе, нежели система, имеет смысл при загрузке монтировать корневую ФС в режиме read only. Наиболее простой способ сделать это — прописать соответствующую опцию в /etc/fstab. Однако это потребует размещения всех изменяемых частей на других разделах либо удаления программ, которые эти данные генерируют, что иногда не совсем просто. Еще один способ заключается в использовании unionfs/aufs/overlayfs — эти файловые системы позволяют объединять в одной точке монтирования и RO, и RW — последняя может размещаться в оперативной памяти. Данная техника используется при создании Live-дистрибутивов. Подробнее о том, как это сделать, можно узнать тут: bit.ly/17BmZbf.

Команда эта выглядит пугающе, но делает вполне безобидную вещь — удаляет все пакеты, которые нужны были для сборки MPD. Удаляем также MTA — зачем нам почта на аудиостанции?

Voyage MPD MPoD: клиент для iPhone

# apt-get remove exim В общем-то, остальные бесполезные для аудиостанции пакеты ты можешь удалить и сам. Но если ты не уверен, понадобится ли тебе, к примеру, cron или syslog, — лучше их просто отключить из init-скриптов.

Интерфейс MPDRoid довольно симпатичен

64 Studio

КЛИЕНТЫ ДЛЯ MPD

www.64studio.com Дистрибутив (опять же на Debian), позиционируется как заточенный под создание медиаконтента. Имеет следующие особенности: low-latency ядро, секвенсоры, такие как Rosegarden, Ardour — мультитрековый звуковой редактор… Однако дистрибутив не обновлялся с 2008 года.

Есть ли для MPD другие клиенты? Конечно, есть. Более того, наличие множества клиентов — одна из особенностей этого демона. Некоторые из них опишем чуть подробнее. • Ncmpc — довольно простой клиент для MPD, основанный на ncurses. К сожалению, не очень удобно работать с плейлистами. • А вот еще один клиент на ncurses — ncmpcpp в этом смысле куда более приятен. В нем имеется поиск по тегам. • Клиент для xfce, xfmpc, отличается присущей этой среде минималистичностью и отсутствием лишних функций. • Еще один графический клиент, Sonata, позволяет, кроме всего прочего, загружать из интернета обложки альбомов и тексты песен и обладает большим количеством настроек. Поддерживает работу с несколькими серверами MPD. Правда, вызывается окно настроек не слишком интуитивно. • QMPDClient, как понятно из названия, является Qt-клиентом и на вид очень мощный плеер — но не особо впечатлил. Тем не менее отметим такую возможность, как автоматическое удаление уже сыгранной композиции из плей-листа. Отдельно стоит упомянуть клиенты для коммуникаторов. Для Android в Google Play нашлись MPDroid и DroidMPD. Какой из них выбрать — дело вкуса; интерфейс второго показался несколько аляповатым. Для iPhone/iPod пользуется популярностью MPoD, для iPad есть специализированная версия — MPaD.

ОКОЛОАУДИОФИЛЬСКИЕ ДИСТРИБУТИВЫ Существует множество дистрибутивов для работы со звуком — от минималистичных, для работы исключительно в качестве аудиоцентра без монитора с управлением по сети, до навороченных, имеющих кучу секвенсоров и VST-плагинов. Все их, конечно, описать невозможно, но небольшой обзор отдельных не помешает. И начнем мы с Voyage MPD.

linux.voyage.hk/voyage-mpd Встраиваемый дистрибутив на базе Debian 7.1. Последняя на момент написания статьи версия содержит MPD 0.18, ядро 3.8.13 с последними драйверами ALSA, веб-интерфейс на основе Meshlium, заявлена также поддержка DoP (DSD over PCM, упаковка DSD в фреймы PCM). Имеется Voyage MPD Starter Kit, позволяющий собрать аудиостанцию. Стоимость набора 149 долларов, но звуковая карта в комплект не входит.

Ubuntu Studio ubuntustudio.org Как говорится, без комментариев. По сути, тот же Ubuntu с XFCE, заточенный под создание мультимедийного контента. Ничем особенным не выделяется — разве только low-latency ядром да возможностью поставить на обычный Ubuntu метапакет и превратить в данный дистрибутив.

AV Linux www.bandshed.net/AVLinux.html Несмотря на название, не антивирус под Linux, а еще один дистрибутив для работы с аудио и видео. Из особенностей можно назвать то, что он включает в себя не только свободное ПО, но и демоверсии проприетарных продуктов, таких как LinuxDSP и Mixbus.

WWW Множество информации о музыке в Linux: linuxmusicians.com Подробное описание Bryston BDP-2 от дистрибьютора: bit.ly/14WQQXS

ИТОГИ Linux вполне может использоваться как ПО для аудиоцентров и даже как ПО для профессиональной работы со звуком. И если первый аспект еще более-менее обозрим (хотя и тут есть свои тонкости, как можно было увидеть из вышесказанного), то профессиональная работа со звуком настолько разнообразна, что и в рамках книги ее не охватишь. Статья, однако, такую цель не преследовала — мы хотели всего лишь показать, что на основе древнего компа можно собрать систему, качество звучания которой не будет уступать оборудованию стоимостью в тысячи долларов.


Хакер — Прикладная аудиофилия