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 и на этом остановилась с ошибкой:
* 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!
Ссылки
Постарался собрать все полезные ссылки, упоминаемые в заметке.
- P5Q-e настройка под Gentoo.