Gentoo Music Player Daemon (MPD) and ALSA installing
Решил я как-то использовать свой gentoo server box для проигрывания музыки. Купил нужные провода для соединения с системой 5.1. Дальше встал вопрос - как проигрывать музыку удалённо, управляя сервером по SSH или как-то ещё. Потратил некоторое время для поиска консольного плеера, чтобы запускать его по ssh, но случайно наткрунлся на клиент-серверную программу MPD. Прочитал о программе, крайне понравилась идея и огромное количество клиентов подовсе ОС, и даже, веб клиенты, что мне особенно понравилось! Решено, надо установить эту замечательную штуку.
Утсновка Music Player Daemon под Gentoo
Сперва надо выполнить стандартный
Обратите внимание на USE Flags, от них сильно зависит сможет ли программа проигрывать те или иные форматы аудио, например. Причём некоторые флаги лично мне показались с весьма странными названиями, например, mad - отвечает за поддержку mp3.
Use Flags: aac alsa audiofile bzip2 cue curl flac id3 ipv6 lame mad mikmod network ogg sqlite unicode vorbis wavpack wildmidi zip -ao -avahi -cdio -debug -ffmpeg -fifo -fluidsynth -jack -lastfmradio -libmms -libsamplerate -modplug -musepack -oss -pipe -profile -pulseaudio -sid (?)
Проблема установки MPD под Gentoo - создание нового пользователя
Однако, как обычно всё гладко не бывает в жизни. После установки всех необходимых сопуствующих программ система приступила к установке собственного самого mpd и на этом остановилась с ошибкой:
* ERROR: media-sound/mpd-0.15.15 failed.
* Call stack:
* ebuild.sh, line 49: Called pkg_setup
* mpd-0.15.15.ebuild, line 60: Called enewuser 'mpd' '' '' '/var/lib/mpd' 'audio'
* eutils.eclass, line 726: Called die
* The specific snippet of code:
* useradd -r ${opts} \
* -c "added by portage for ${PN}" \
* ${euser} \
* || die "enewuser failed"
* The die message:
* enewuser failed
Подтверждение этой ошибки я нашёл вот тут. Если прочитать ошибку, то видно, что проблема в невозможности создать пользователя для mpd, чтобы он не запускался от root'а. Далее я открыл на правку файл, который и вызвал этот затык и внёс в него следующие коррективы:
if [[ -z $@ ]] ; then
useradd ${opts} \
-c "added by portage for ${PN}" \
${euser} \
|| die "enewuser failed"
else
einfo " - Extra: $@"
useradd -r ${opts} "$@" \
${euser} \
|| die "enewuser failed"
fi
На выделенной 730-й строчке я убрал параметр -r у команды useradd. Ещё раз пробуем пересобрать mpd. Всё должно сработать.
Настройка MPD под Gentoo
Теперь приступаем к настройке конфигурационнго файла MPD:
music_directory "/var/lib/mpd/music"
playlist_directory "/var/lib/mpd/playlists"
db_file "/var/lib/mpd/database"
log_file "/var/log/mpd/mpd.log"
state_file "/var/lib/mpd/state"
user "mpd"
bind_to_address "localhost"
bind_to_address "/var/lib/mpd/socket"
port "6600"
log_level "default"
input {
plugin "curl"
# proxy "proxy.isp.com:8080"
# proxy_user "user"
# proxy_password "password"
}
audio_output {
type "alsa"
name "P5Q-E ALSA Device"
# device "hw:0,0" # optional
# format "44100:16:2" # optional
# mixer_device "default" # optional
# mixer_control "PCM" # optional
# mixer_index "0" # optional
}
filesystem_charset "UTF-8"
Привер вывода команды
-rw-r--r-- 1 mpd audio 2532 Mar 7 19:53 database
drwxr-xr-x 2 mpd audio 4096 Mar 7 19:35 music
drwxr-xr-x 2 mpd audio 4096 Mar 7 19:41 playlists
srw-rw-rw- 1 root root 0 Mar 7 19:53 socket
-rw-r--r-- 1 mpd audio 493 Mar 7 20:23 state
Так же я бы посоветовал не углублятся сильно в настройки устройства вывода, в частности не использовать прямое обращение к звуковой карте - параметр hw:0,0.
После этого запускаем MPD:
Добавляем MPD в автозагрузку:
Автоматизация сканирования базы песен
Для того, чтобы MPD сканировал автоматом при запуске папки с песнями и обновлял свой файл базы данных для этого надо добавить параметр в скрипт инициализации при запуске mpd.
start() {
checkconfig || return 1
ebegin "Starting Music Player Daemon"
start-stop-daemon --start --quiet --background --exec /usr/bin/mpd --pidfile /var/run/mpd.pid --make-pidfile -- --no-daemon /etc/mpd.conf --create-db 2>/dev/null
. Она как раз и пересоздаёт базу данных песен. Если у вас как и у меня сервер, работающий постоянно, то часто перезапускать mpd вам не нужно, что не будет влиять на скорость запуска mpd. Кстати, сканирование всего моего много гигабайтного раздела с песнями и создание файла database занимает секунду.
После чего перезапускаем MPD:
Добавляем в базу с песнями папки с других носителей
У меня все мои файлы хранятся на других носителях, не там где установленна ситсема, а так же они имеют других владельцев и другую группу (не mpd и не audio). Да и хранить каталоги с песнями на сисетмном разделе в var/lib как-то не хорошо. Как быть?
Для этого добавлям пользователя mpd в нужную нам группу:
Проверить изменения можно так:
Затем создаём символическую ссылку внутри нашей папки musci, которая будет ссылаться на нужные нам папки с музыкой.
Далее изменяем владельца на ссылку AUDIO, которую только что создали:
Мы добиваемся требуемого эффекта - символическая ссылка меняет владельца и группу с рута на нужные, но как побочный эффект, у нас меняются права на оригинальных папках на mpd:audio. Возвращаем всё назад:
Проблемы запуска MPD - TroubleShooting
В случае возникновения каких-либо сложностей или проблем при запуске mpd, надо смотреть вот эту ссылку. Это официальная Wiki и раздел TroubleShoot.
Причём для отладки крайне помогает следующая команда запуска mpd
Того же эффекта можно добится, если занести в конфиг /etc/mpd.conf строчку: log_level "verbose". Теперь в наших логах будет содержаться подробный отчёт обовсех событиях и ошибках. Посмотреть ошибки можно вот тут /var/log/mpd/mpd.log
И наконец, крайне важная ссылка - FAQ, который помогает в поиске ошибок. Очень полезная ссылка.
MPD не видит файлы в папке music
Если у вас в папке /var/lib/mpd/music лежат аудиофайлы, но mpd их не добавляет в базу данных, то как правило проблема вызвана правами на папки и файлы. Проверьте всё десять раз! Даже, если вы уверены 100%, надо проверить всё ещё раз, чтобы быть уверенным на 200%. Однако, такой эффект вполне может быть вызван и тем, что MPD не поддерживает ваши аудио форматы. Важно собрать MPD с нужными поддерживаемыми форматами. О том, какие форматы на данный момент поддерживает ваша сборка mpd, можно узнать по команде:
В общем подробнее об этом можно прочитать вот тут.
Установка ALSA под Gentoo
В качестве устройства вывода звука я решил использовать ALSA. Для её установки на свой компьютер, мне пришлось пересобрать ядро, включив поддержку ALSA, а так же необходимых драйверов под свою звуковую карту.
Найстройка ядра Gentoo для поддержки ALSA на P5Q-e
Для начала сразу скажу, что у меня в сервере стоит мать ASUS P5Q-e с слудующей звуковухой:
00:1b.0 Audio device: Intel Corporation 82801JI (ICH10 Family) HD Audio Controller
Таким образом запускаем Genkernel и выбираем следующие настройки:
Linux Kernel Configuration: 2.6.36 P5Q-e kernel config |
[*] Enable loadable module support ---> --- Enable loadable module support [*] Forced module loading [*] Module unloading [*] Forced module unloading [*] Module versioning support [ ] Source checksum for all modules Device Drivers ---> Character devices ---> <*> Enhanced Real Time Clock Support (legacy PC RTC driver) Device Drivers ---> <*> Sound card support ---> --- Sound card support [*] Preclaim OSS device numbers <M> Advanced Linux Sound Architecture ---> --- Advanced Linux Sound Architecture <M> Sequencer support <M> Sequencer dummy client <M> OSS Mixer API <M> OSS PCM (digital audio) API [*] OSS PCM (digital audio) API - Include plugin system [*] OSS Sequencer API <M> RTC Timer support [*] Use RTC as default sequencer timer -*- Dynamic device file minor numbers [*] Support old ALSA API [*] Generic sound devices ---> --- Generic sound devices <M> Virtual MIDI soundcard [*] PCI sound devices ---> --- PCI sound devices <M> Intel HD Audio ---> --- Intel HD Audio [*] Build Realtek HD-audio codec support [*] Build Analog Device HD-audio codec support [*] Build IDT/Sigmatel HD-audio codec support [*] Build VIA HD-audio codec support [*] Build ATI HDMI HD-audio codec support [*] Build NVIDIA HDMI HD-audio codec support [*] Build INTEL HDMI HD-audio codec support [*] Build Cirrus Logic codec support [*] Build Conexant HD-audio codec support [*] Build Creative CA0110-IBG codec support [*] Build C-Media HD-audio codec support [*] Build Silicon Labs 3054 HD-modem codec support [*] Enable generic HD-audio codec parser |
Почитать об этом можно вот тут.
Узнал я намёк, что проблема вся в том, что нет модулей при запуске конфигуратора alsa. При запуске конфигуратора выпадает следующая ошибка, которую реально заметить крайне сложно, т.к. она выпадает всего на полсекунды:
modinfo: could not find module snd
modinfo: could not find module snd
modinfo: could not find module snd
Посмотреть загруженные модули можно стандартной командой:
Теперь ставим библиотеки ALSA, которые будут работать с аудио:
Причём очень важно обратить внимание на то, что у нас активированны все ALSA_PCM_PLUGINS, возможно какие-то из них вам не потребуются, но разобраться в них очень сложно, они занимают малое места и практически все полезны и более того, необходимы.
Так что в файл /etc/make.conf добавляем следующую строчку:
ALSA_PCM_PLUGINS="adpcm alaw asym copy dmix dshare dsnoop empty extplug file hooks iec958 ioplug ladspa lfloat linear meter mmap_emul mulaw multi null plug rate route share shm softvol"
Причём, сперва я не добавлял некоторые плагины, тогда в логах выпадала следующая ошибка:
Mar 07 17:01 : decoder: audio_format=44100:24:2, seekable=true
ALSA lib dlmisc.c:121:(snd_dlsym_verify) unable to verify version for symbol _snd_pcm_empty_open
ALSA lib pcm.c:2175:(snd_pcm_open_conf) symbol _snd_pcm_empty_open is not defined inside [builtin]
Mar 07 17:01 : output: Failed to open "P5Q-E ALSA Device" [alsa]: Failed to open ALSA device "default": No such device or address
Mar 07 17:01 : player_thread: problems opening audio device while playing "04_-_Rock_And_Roll_Music_(2009_Digital_Remaster).flac"
Настройка ALSA под Gentoo
Поскольку ядро под alsa и нашу звуковуху в конкретно нашей материнке p5q-e настроено, а так же стоят библиотеки alsa - media-libs/alsa-lib, то теперь ставим утилиты, помогающие настраивать ALSA:
Добавляем их в автозапуск:
(это что-то типа драйверов настройки звука в Windows, иконка от которых висит в трее с часами, но я точно не уверен).
Так же можно подправить конфигурационный файл /etc/conf.d/alsasound.
Запускаем утилиты:
Для настройки ALSA запускаем:
Это поможет в графическом режиме настроить всё, и сгенерирует файл /etc/modprobe.d/alsa, который в принципе мы можем поправить руками.
Настроить громкость можно благодаря установленной нами ранее программы из набора утилит, выполнив:
Обратите внимание на рисунок. Причём, замъютить (отключить) тот или иной канал можно нажав клавишу m
Установка и настройка web-based клиента для MPD
Из всех клиентов, я поставил наиболее простой с понятным и светлым интерфейсом. ExtJS MPD - это клиент, который просто копируется в папку на веб сервере и тут же начинает работать "из коробки". Если у вас установлены специфические адрес и порт, которые слушает MPD, то вы можете указать их в файле mpd-control/configuration.php. Некоторые минусы у него есть, но вроде на первых порах нормально. Просто и работает "из коробки". Для себя я отметил ещё парочку клиентов для веб сервера на php. Первый из них и второй.
Добавляем защиту от произвольного доступа к клиенту
Для того, чтобы к нашему клиенту не подсоединились люди из вне (собственно им нечего делать там =) ), я ограничил доступ к web-based клиенту с помощью mod_rewrite из поставки Apache.
RewriteEngine on
RewriteBase /
RewriteCond %{REMOTE_ADDR} !^192\.168\..*\..*$
RewriteRule ^.*$ /index.php
Как видно из третьей строчки, я ограничил доступ по IP адресу. Только люди из 192.168.0.0\16 могут попасть в нужную папку на веб сервере, стальные переадресуются на файл index.php с обычным HTML кодом, выводящим сообщение типа: Access Denied!
Ссылки
Постарался собрать все полезные ссылки, упоминаемые в заметке.
- P5Q-e настройка под Gentoo.
ALSA
- ALSA под Gentoo по-русски и вот тут ALSA под Gentoo на английском.
- ALSA на Gentoo Wiki на английском.
MPD
USE Flags
- тут на Gentoo Portage
- Официальная wiki
TroubleShoot
- Официальная Wiki и раздел TroubleShoot.
- FAQ который надо прочитать очень внимательно!