Cобираем звуковую станцию на базе 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 могут
некорректно работать с некоторыми материнскими платами.
Подопытный комп, аналоговая часть ESI Juli@ демонтирована
Для тестов использовался цифро-аналоговый преобразователь Nagra DAC
Компиляция RT-ядра
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
Распаковываем и патчим:
# tar xjf linux-3.8.13.tar.bz2 && cd linux-3.8.13
# bzcat ../patch-3.8.13-rt11.patch.bz2 | patch -p1
Затем в menuconfig/nconfig включаем опцию Processor type and features
-> Preemption Model -> Fully Preemptible Kernel (RT) и собираем
ядро:
- -- -----
Вместо CONCURENCY_LEVEL=3 можешь поставить свое число, в зависимости от количества ядер процессора + 1.
Устанавливаем и перезагружаемся:
# dpkg -i ../*.deb
# reboot
Выбор нужной опции ядра
Подготовка MPD
Для начала — что это такое? Зачем нужен еще один плеер, если их и так
предостаточно? Собственно, MPD — демон с клиент-серверной архитектурой,
что открывает довольно любопытные возможности, а именно:
- в отличие от множества других графических плееров, он прекрасно
обходится без иксов, так что, если они упали или вообще отсутствуют на
компе,
- музыка все равно будет играть;
- это клиент-серверное приложение — при желании им можно управлять из графического интерфейса;
- MPD мало того что клиент-серверный — он еще и сетевой!
Следовательно, его можно поставить на безголовый сервер и спокойно
рулить им хоть с
- нетбука, хоть с другого компа, хоть со смартфона или
планшета (iOS/Android).
Сам же 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
После этого можно, в принципе, заходить в каталог и набирать команду
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
Теперь уже можно выбирать опции сборки. Конечно, это дело вкуса, но мы собирали со следующими опциями:
.. - - - --- --- --- --- --- --- ---- --- --- --- --- --- ---
Рассмотрим некоторые опции подробнее:
- --enable-alsa — включает поддержку ALSA;
- --enable-rtopt — собственно, то, ради чего мы патчили;
- --enable-id3 — поддержка тегов ID3;
- --enable-sqlite — поддержка SQLite для внутренней БД MPD;
- --enable-audiofile — поддержка WAV-файлов;
- --enable-flac — поддержка FLAC — формата сжатия без потери качества;
- --enable-cdio-paranoia — аудиоCD;
- --enable-lsr — поддержка изменения частоты дискретизации на лету;
- --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"
audio_output {
type "alsa"
name "ESI Julia SPDIF"
device "iec958:CARD=Juli,DEV=0"
replay_gain_handler "none"
auto_resample "no"
auto_channels "no"
auto_format "no"
use_mmap "yes"
priority "FIFO:99"
}
...
audio_buffer_size "2048"
buffer_before_play "50%"
...
realtime_option {
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"
encoder "vorbis"
port "8000"
bitrate "128"
format "44100:16:2"
}
Конфигурационный файл mpd.conf
Также необходимо произвести тюнинг системы. Первым делом создаем файл /etc/security/limits.d/mpd со следующим содержанием:
-
-
- -
Этот файл практически выключает ограничения приоритетов для демона.
Далее необходимо изменить настройку HPET (который является генератором
тактовой частоты и на многих довольно старых материнских платах по
умолчанию не используется). Для этого правим строку в файле
/etc/default/grub — заодно добавим опцию threadirqs, которая имеет
отношение к RT-ядру и которая понадобится в дальнейшем:
GRUB_CMDLINE_LINUX_DEFAULT="quiet clocksource=hpet threadirqs"
HPET необходим для более точной (по времени) подачи сигнала на ЦАП.
Казалось бы, разница в несколько микро- (а то и нано-) секунд при подаче
потока битов настолько незначительна, что на нее не стоит обращать
внимания… ан нет. Один бит задержался, два пришли раньше времени — и в
высококлассной стереосистеме разница может быть ощутима человеческим
ухом. С использованием HPET вероятность подобного сценария уменьшается.
Давай также настроим некоторые параметры ядра через sysctl. Открой в
своем любимом редакторе /etc/sysctl.conf и добавь в него следующие
строчки:
# Настройки виртуальной памяти, в частности стратегия распределения памяти и коэффициент подкачки
vm.overcommit_memory = 2
vm.overcommit_ratio = 50
vm.swappiness = 10
# Настройка максимально допустимой частоты HPET
dev.hpet.max-user-freq = 2048
В дополнение к последнему параметру необходимо изменить подобный же для
rtc — но, поскольку он находится в sysfs, придется прописывать его в
rc.local:
echo 2048 > /sys/class/rtc/rtc0/max_user_freq
Поставим пакет rtirq-init. Он содержит скрипт, увеличивающий приоритеты IRQ-потоков, связанных со звуковым оборудованием:
# apt-get install rtirq-init
После установки, возможно, потребуется отредактировать файл
/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 набираем команды
- -
- - .
Эти команды ты тоже можешь прописать в rc.local.
Интерфейс QMPDClient
Sonata — еще один клиент для MPD
RT-патч превращает ядро Linux в полностью преемптивное (то есть с вытесняющей многозадачностью)
Проверка работоспособности
В общем-то, теперь можно запускать демон MPD. Перед запуском убедись,
что музыка в соответствующем каталоге присутствует и создан каталог для
плей-листов. Если же она разбросана по разным каталогам, то можно
указывать на них симлинками. Команда для ручного запуска выглядит так:
# mpd /etc/mpd.conf
А как же проверить работоспособность? Дело в том, что даже самый простой
консольный клиент в состав исходников MPD не входит, как и библиотека
libmpdclient, поэтому можно либо скомпилировать их самостоятельно, либо
установить соответствующий пакет. Поскольку клиент не требует наложения
патчей, то особого смысла заморачиваться с компиляцией нет, а значит,
ставим пакет:
# apt-get install mpc
Перед запуском рекомендуем посмотреть настройки микшера — в Debian 7.1
звук по умолчанию отключен. Обновляем базу данных MPD, добавляем всю
музыку в плей-лист и запускаем воспроизведение:
# mpc update --wait
# mpc listall | mpc add
# mpc play
Если все нормально, то должна зазвучать музычка. В случае же потокового
воспроизведения тебе надо еще проверить работу этого потока. Указываем
адрес и порт, прописанный в конфиге. Для некоторых плееров необходимо
также указывать файл mpd.ogg — например 192.168.1.5:8000/mpd.ogg.
Удаляем лишнее
Ну а теперь необходимо подчистить систему. В общем-то, ты можешь это
сделать и сам, но есть некоторые тонкости — к примеру, пакеты,
установленные с помощью apt-get build-dep, удалить не совсем просто.
Итак, сначала мы отмечаем нужные для 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
Затем выполняем следующую трехэтажную команду:
- - - - - [[].+[]]-,
Команда эта выглядит пугающе, но делает вполне безобидную вещь — удаляет все пакеты, которые нужны были для сборки MPD.
Удаляем также MTA — зачем нам почта на аудиостанции?
# apt-get remove exim
В общем-то, остальные бесполезные для аудиостанции пакеты ты можешь
удалить и сам. Но если ты не уверен, понадобится ли тебе, к примеру,
cron или syslog, — лучше их просто отключить из init-скриптов.
Монтирование корневой ФС в режиме RO
Если музыка у тебя будет находиться на ином накопителе, нежели система,
имеет смысл при загрузке монтировать корневую ФС в режиме read only.
Наиболее простой способ сделать это — прописать соответствующую опцию в
/etc/fstab. Однако это потребует размещения всех изменяемых частей на
других разделах либо удаления программ, которые эти данные генерируют,
что иногда не совсем просто.
Еще один способ заключается в использовании unionfs/aufs/overlayfs — эти
файловые системы позволяют объединять в одной точке монтирования и RO, и
RW — последняя может размещаться в оперативной памяти. Данная техника
используется при создании Live-дистрибутивов. Подробнее о том, как это
делать, можно узнать на страничке.
Клиенты для MPD
Есть ли для MPD другие клиенты? Конечно, есть. Более того, наличие
множества клиентов — одна из особенностей этого демона. Некоторые из них
опишем чуть подробнее.
- Ncmpc — довольно простой клиент для MPD, основанный на ncurses. К сожалению, не очень удобно работать с плей-листами.
- А вот еще один клиент на ncurses — ncmpcpp в этом смысле куда более приятен. В нем имеется поиск по тегам.
- Клиент для xfce, xfmpc, отличается присущей этой среде минималистичностью и отсутствием лишних функций.
- Еще один графический клиент, Sonata, позволяет, кроме всего прочего,
загружать из интернета обложки альбомов и тексты песен и обладает
- большим количеством настроек. К примеру, он поддерживает работу с
несколькими серверами MPD. Правда, вызывается окно настроек не слишком интуитивно.
- QMPDClient, как понятно из названия, является Qt-клиентом и на вид
очень мощный плеер — но не особо впечатлил. Тем не менее отметим такую
- возможность, как автоматическое удаление уже сыгранной композиции из
плей-листа.
Отдельно стоит упомянуть клиенты для коммуникаторов. Для Android в
Google Play нашлись MPDroid и DroidMPD. Какой из них выбрать — дело
вкуса; интерфейс второго показался несколько аляповатым. Для iPhone/iPod
пользуется популярностью MPoD, для iPad есть специализированная версия —
MPaD.
Интерфейс MPDRoid довольно симпатичен
MPoD: клиент для iPhone
Околоаудиофильские дистрибутивы
Существует множество дистрибутивов для работы со звуком — от
минималистичных, для работы исключительно в качестве аудиоцентра без
монитора с управлением по сети, до навороченных, имеющих кучу
секвенсоров и VST-плагинов. Все их, конечно, описать невозможно, но
небольшой обзор отдельных не помешает. И начнем мы с Voyage MPD.
Voyage MPD —
встраиваемый дистрибутив на базе Debian 7.1. Последняя на момент
написания статьи версия содержит MPD 0.18, ядро 3.8.13 с последними
драйверами ALSA, веб-интерфейс на основе Meshlium, заявлена также
поддержка DoP (DSD over PCM, упаковка DSD в фреймы PCM). Имеется Voyage
MPD Starter Kit, позволяющий собрать аудиостанцию. Стоимость набора 149
долларов, но звуковая карта в комплект не входит.
64 Studio — дистрибутив (опять же
на Debian), позиционируется как заточенный под создание медиаконтента.
Имеет следующие особенности: low-latency ядро, секвенсоры, такие как
Rosegarden, Ardour — мультитрековый звуковой редактор… Однако
дистрибутив не обновлялся с 2008 года.
Ubuntu Studio — как говорится, без
комментариев. По сути, тот же Ubuntu с XFCE, заточенный под создание
мультимедийного контента. Ничем особенным не выделяется — разве только
low-latency ядром да возможностью поставить на обычный Ubuntu метапакет и
превратить в данный дистрибутив.
AV Linux, несмотря на
название, не антивирус под Linux, а еще один дистрибутив для работы с
аудио и видео. Из особенностей можно назвать то, что он включает в себя
не только свободное ПО, но и демоверсии проприетарных продуктов, таких
как LinuxDSP и Mixbus.
Итоги
Linux вполне может использоваться как в качестве ПО для аудиоцентров,
так и в качестве ПО для профессиональной работы со звуком. И если первый
аспект еще более-менее обозрим (хотя и тут есть свои тонкости, как
можно было увидеть из вышесказанного), то профессиональная работа со
звуком настолько разнообразна, что и в рамках книги ее не охватишь.
Статья, однако, такую цель не преследовала — мы хотели всего лишь
показать, что на основе древнего компа можно собрать систему, качество
звучания которой не будет уступать оборудованию стоимостью в тысячи
долларов.
Оптимальные настройки BIOS
Приведем некоторые настройки BIOS, которые рекомендуется подправить для улучшения производительности:
- Если имеется HyperThreading, лучше его отключить.
- Video BIOS shadow тоже лучше отключить.
- Для устройств PCI выключи опцию PCI Delay Transaction, поскольку она увеличивает задержки.
- Отключи все ненужные встроенные устройства.
Впервые опубликовано в журнале «Хакер» от 08/2013.
http://habrahabr.ru/company/xakep/blog/203598/
|