Gentoo Music Player Daemon (MPD) and ALSA installing

Материал из AlexNook
Перейти к навигацииПерейти к поиску

Решил я как-то использовать свой gentoo server box для проигрывания музыки. Купил нужные провода для соединения с системой 5.1. Дальше встал вопрос - как проигрывать музыку удалённо, управляя сервером по SSH или как-то ещё. Потратил некоторое время для поиска консольного плеера, чтобы запускать его по ssh, но случайно наткрунлся на клиент-серверную программу MPD. Прочитал о программе, крайне понравилась идея и огромное количество клиентов подовсе ОС, и даже, веб клиенты, что мне особенно понравилось! Решено, надо установить эту замечательную штуку.

Утсновка Music Player Daemon под Gentoo

Сперва надо выполнить стандартный

emerge -v mpd

Обратите внимание на 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 (?)

Note: Для установки всех флагов их надо занести в
nano /etc/portage/package.use
Почитать о флагах MPD можно тут на Gentoo Portage) или вот тут на официальной вики MPD.

Проблема установки 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'а. Далее я открыл на правку файл, который и вызвал этот затык и внёс в него следующие коррективы:

vim /usr/portage/eclass/eutils.eclass
File: /usr/portage/eclass/eutils.eclass
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:

vim /etc/mpd.conf
File: /etc/mpd.conf
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"
Warning: Обратите внимание на выделенную строчку номер 6. Все файлы, указанные в конфигурационном файле mpd.conf должны принадлежать пользователю, указанному в строке №6! Все файлы должны существовать, группа у файлов должна быть audio, а пользователь должен иметь права на чтение и запись. На папки естественно и исполнение. Кроме файла socket.

Привер вывода команды

ls -l
-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:

/etc/init.d/mpd start

Добавляем MPD в автозагрузку:

rc-update add mpd default

Автоматизация сканирования базы песен

Для того, чтобы MPD сканировал автоматом при запуске папки с песнями и обновлял свой файл базы данных для этого надо добавить параметр в скрипт инициализации при запуске mpd.

nano /etc/init.d/mpd
File: /etc/mpd.conf
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
Note: Обратите внимание на последнюю опцию --create-db

. Она как раз и пересоздаёт базу данных песен. Если у вас как и у меня сервер, работающий постоянно, то часто перезапускать mpd вам не нужно, что не будет влиять на скорость запуска mpd. Кстати, сканирование всего моего много гигабайтного раздела с песнями и создание файла database занимает секунду.

После чего перезапускаем MPD:

/etc/init.d/mpd restart

Добавляем в базу с песнями папки с других носителей

У меня все мои файлы хранятся на других носителях, не там где установленна ситсема, а так же они имеют других владельцев и другую группу (не mpd и не audio). Да и хранить каталоги с песнями на сисетмном разделе в var/lib как-то не хорошо. Как быть?

Для этого добавлям пользователя mpd в нужную нам группу:

usermod -a -G GroupName mpd

Проверить изменения можно так:

id mpd

Затем создаём символическую ссылку внутри нашей папки musci, которая будет ссылаться на нужные нам папки с музыкой.

ln -s /home/ftp/.../AUDIO/ /var/lib/mpd/music/

Далее изменяем владельца на ссылку AUDIO, которую только что создали:

chown -R user:group music/

Мы добиваемся требуемого эффекта - символическая ссылка меняет владельца и группу с рута на нужные, но как побочный эффект, у нас меняются права на оригинальных папках на mpd:audio. Возвращаем всё назад:

chown user:group /home/ftp/.../AUDIO/
chown user:group /home/ftp/.../files/

Проблемы запуска MPD - TroubleShooting

В случае возникновения каких-либо сложностей, надо смотреть вот эту ссылку.

Причём крайне помогает команда

/usr/bin/mpd --stdout --no-daemon --verbose

или же занесения в конфиг /etc/mpd.conf строчки: log_level "verbose"

Так же можно посмтреть вот эту ссылку, которая описывает процесс установки и настройки (в кратце) под различные ОС, или вот процесс установки под ArchLinux.

И наконец, крайне важная ссылка - FAQ, который помогает в поиске ошибок. Очень полезная ссылка.

А вот пример одного из ответов на вопросы, который помог лично мне. Важно собрать MPD с нужными поддерживаемыми форматами, о поддержке которых можно узнать по команде

mpd --version

. В общем читать надо тут.

Процесс конфигурирования MPD описан на официальном вики вот тут. В частности подробно расмотрены варианты Audio device outputs.

Процесс установки под Gentoo на Gentoo Wiki Archive вот тут.

Посмотреть ошибки можно вот тут:

less /var/log/mpd/mpd.log

Установка ALSA под Gentoo

В качестве устройства вывода звука я решил использовать ALSA. Для её установки на свой компьютер, мне пришлось пересобрать ядро, вклчив поддержку ALSA, а так же необходимых драйверов под свою звуковую карту.

Найстройка ядра Gentoo для поддержки ALSA на P5Q-e

Для начала сразу скажу, что у меня в сервере стоит мать ASUS P5Q-e с слудующей звуковухой:

lspci -v | grep -i audio
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
Note: Причём очень важно обратить на то, что часть пунктов выбрано в виде модулей. ALSA не будет рабоать, если эти пункты итегрировать в ядро системы.

Почитать об этом можно вот тут. Если этого не делать, то выпадает следующая ошибка:

alsaconf
modinfo: could not find module snd
modinfo: could not find module snd
modinfo: could not find module snd


Теперь ставим библиотерки ALSA:

emerge media-libs/alsa-lib

Причём очень важно обратить внимание на то, что у нас активированны все ALSA_PCM_PLUGINS, возможно какие-то из них вам не потребуются, но разобраться в них очень сложно, они занимают малое места и практически все полезны.

Так что в файл /etc/make.conf добавляем следующую строчку:

File: /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"

Причём, если этого не сделать, то в логах выпадает следующая ошибка:

File: /var/log/mpd/mpd.log
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:

emerge alsa-utils

Добавляем в автозапуск:

rc-update add alsasound boot
Выключенные линии обозначены как MM, а включенные как OO

Так же можно подправить конфигурационный файл: /etc/conf.d/alsasound Запускаем

/etc/init.d/alsasound start

Для настройки запускаем:

alsaconf

Это поможет в графическом режиме настроить всё, и сгенерирует файл /etc/modprobe.d/alsa

Настроить громкость можно благодаря установленной нами ранее утилиты, выполнив:

alsamixer

Обратите внимание на рисунок. Причём, замъютить (отключить) тот или иной канал можно нажав клавишу m Посмотреть загруженные модули можно стандартной командой:

lsmod

Установка и настройка 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.

ALSA

  • ALSA под Gentoo по-русски и вот тут ALSA под Gentoo на английском.
  • ALSA на Gentoo Wiki на английском.

MPD

USE Flags