(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Cобираем звуковую станцию на базе Linux и MPD

Источник: habrahabr
XakepRU

В основе референсного аудиопроигрывателя 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@ демонтирована
Подопытный комп, аналоговая часть ESI Juli@ демонтирована

Для тестов использовался цифро-аналоговый преобразователь Nagra DAC
Для тестов использовался цифро-аналоговый преобразователь 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 fakeroot make-kpkg --initrd --append-to-version=-rt kernel_image kernel_headers
Вместо 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
Теперь уже можно выбирать опции сборки. Конечно, это дело вкуса, но мы собирали со следующими опциями:

# ./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 - поддержка изменения частоты дискретизации на лету;
  • --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@, подключенной по SPDIF (Toslink либо RCA) к внешнему ЦАП # Конфигурация аудиовывода - почти единственный многострочный параметр в `mpd.conf`. Возможно использование одновременно нескольких аудиовыводов audio_output { # Указываем, что будем использовать ALSA type "alsa" # Название конфигурации name "ESI Julia SPDIF" # Используем цифровой выход (для получения информации о звуковой карте смотри вывод команды aplay -L) 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" } ... # Размер внутреннего аудиобуфера в килобайтах audio_buffer_size "2048" # Заполнение аудиобуфера перед проигрыванием музыки в процентах buffer_before_play "50%" ... # Конфигурация realtime-опций MPD - второй многострочный параметр в данном файле realtime_option { memlock "yes" # Поддержка locks in-memory 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" # Используемый кодек, может быть vorbis или lame encoder "vorbis" port "8000" # quality "5.0" # Параметры quality и bitrate взаимоисключающие bitrate "128" # Формат аудиопотока (44,1 кГц, 16 бит, стерео) format "44100:16:2" }
Конфигурационный файл mpd.conf
Конфигурационный файл mpd.conf

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

@audio - rtprio 99 @audio - memlock unlimited @audio - nice -19
Этот файл практически выключает ограничения приоритетов для демона. Далее необходимо изменить настройку 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 набираем команды

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

Интерфейс QMPDClient
Интерфейс QMPDClient

Sonata - еще один клиент для MPD
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
Затем выполняем следующую трехэтажную команду:

# apt-get remove $(apt-cache showsrc "mpd" / grep Build-Depends / perl -p -e 's/(?:[\[(].+?[\])]/Build-Depends:/,/\/)//g')
Команда эта выглядит пугающе, но делает вполне безобидную вещь - удаляет все пакеты, которые нужны были для сборки 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 довольно симпатичен
Интерфейс MPDRoid довольно симпатичен

MPoD: клиент для iPhone
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, поскольку она увеличивает задержки.
  • Отключи все ненужные встроенные устройства.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 29.11.2013 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Business Studio 4.2 Enterprise. Конкурентная лицензия + Business Studio Portal 4.2. Пользовательская именная лицензия.
Quest Software. Toad for Oracle Development Suite
AutoCAD LT 2022 Commercial New Single-user ELD Annual Subscription
ABBYY Lingvo x6 Европейская Профессиональная версия, электронный ключ
Купить Антивирус Dr.Web Server Security Suite для сервера
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Реестр Windows. Секреты работы на компьютере
Один день системного администратора
Компьютерная библиотека: книги, статьи, полезные ссылки
Новости мира 3D-ускорителей
Проект mic-hard - все об XP - новости, статьи, советы
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100