Gentoo Music Player Daemon (MPD) and ALSA installing
Решил использовать свой gentoo server box для проигрывания музыки. Купил нужные провода для соединения с системой 5.1. Дальше встал вопрос - как проигрывать музыку удалённо, управляя сервером. ПОтратил некоторое время для поиска консольного плеера, чтобы запускать его по ssh, но случайно наткрунлся на клиент-серверную программу MPD. Прочитал о программе, крайне понравилась идея и огромное количество клиентов подовсе ОС, и даже, веб клиенты, что мне особенно понравилось! Решено, надо установить эту замечательную штуку.
Утсновка Music Player Daemon под Gentoo
Сперва надо выполнить стандартный
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 и на этом остановилась с ошибкой:
* 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:
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
После этого запускаем 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 и не audio). Как быть?
Для этого добавлям пользователя mpd в нужную нам группу:
Проверить изменения можно как:
Затем создаём символическую ссылку внутри нашей папки musci, которая будет ссылаться на нужные нам папки с музыкой.
Далее даём изменяем владельца на ссылку AUDIO, которую только что создали:
Мы добиваемся требуемого эффекта - символическая ссылка меняем владельца и группу с рута на нужные, но как побочный эффект, у нас меняются права на оригинальных папках на mpd:audio. Возвращаем всё назад:
Проблемы запуска MPD - TroubleShooting
В случае возникновения каких-либо сложностей, надо смотреть вот эту ссылку.
Причём крайне помогает команда
или же занесения в конфиг /etc/mpd.conf строчки: log_level "verbose"
Так же можно посмтреть вот эту ссылку, которая описывает процесс установки и настройки (в кратце) под различные ОС, или вот процесс установки под ArchLinux.
И наконец, крайне важная ссылка - FAQ, который помогает в поиске ошибок. Очень полезная ссылка.
А вот пример одного из ответов на вопросы, который помог лично мне. Важно собрать MPD с нужными поддерживаемыми форматами, о поддержке которых можно узнать по команде
. В общем читать надо тут.
Процесс конфигурирования MPD описан на официальном вики вот тут. В частности подробно расмотрены варианты Audio device outputs.
Процесс установки под Gentoo на Gentoo Wiki Archive вот тут.
Посмотреть ошибки можно вот тут:
Установка 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 |
Почитать об этом можно вот тут. Если этого не делать, то выпадает следующая ошибка:
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:
Добавляем в автозапуск:
Так же можно подправить конфигурационный файл: /etc/conf.d/alsasound Запускаем
Для настройки запускаем:
Это поможет в графическом режиме настроить всё, и сгенерирует файл /etc/modprobe.d/alsa
Настроить громкость можно благодаря установленной нами ранее утилиты, выполнив:
Обратите внимание на рисунок. Причём, замъютить (отключить) тот или иной канал можно нажав клавишу m Посмотреть загруженные модули можно стандартной командой:
Установка и настройка web-based клиента для MPD
Из всех клиентов, я поставил наиболее простой с понятным и светлым интерфейсом. ExtJS MPD - это клиент, который просто копируется в папку на веб сервере и тут же начинает работать "из коробки". Если у вас установлены специфические адрес и порт, которые слушает MPD, то вы можете указать их в файле mpd-control/configuration.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!