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 ffmpeg flac id3 ipv6 lame mad mikmod network ogg sqlite unicode vorbis wavpack wildmidi zip -ao -avahi -cdio -debug -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 и на этом остановилась с ошибкой:

  1.  * ERROR: media-sound/mpd-0.15.15 failed.
  2.  * Call stack:
  3.  * ebuild.sh, line 49: Called pkg_setup
  4.  * mpd-0.15.15.ebuild, line 60: Called enewuser 'mpd' '' '' '/var/lib/mpd' 'audio'
  5.  * eutils.eclass, line 726: Called die
  6.  * The specific snippet of code:
  7.  * useradd -r ${opts} \
  8.  * -c "added by portage for ${PN}" \
  9.  * ${euser} \
  10.  * || die "enewuser failed"
  11.  * The die message:
  12.  * enewuser failed

Подтверждение этой ошибки я нашёл вот тут. Если прочитать ошибку, то видно, что проблема в невозможности создать пользователя для mpd, чтобы он не запускался от root'а. Далее я открыл на правку файл, который и вызвал этот затык и внёс в него следующие коррективы:

vim /usr/portage/eclass/eutils.eclass
File: /usr/portage/eclass/eutils.eclass
  1. if [[ -z $@ ]] ; then
  2.         useradd  ${opts} \
  3.         -c "added by portage for ${PN}" \
  4.                 ${euser} \
  5.                 || die "enewuser failed"
  6. else
  7.         einfo " - Extra: $@"
  8.         useradd -r ${opts} "$@" \
  9.                 ${euser} \
  10.                 || die "enewuser failed"
  11. fi

На выделенной 730-й строчке я убрал параметр -r у команды useradd. Ещё раз пробуем пересобрать mpd. Всё должно сработать.

Настройка MPD под Gentoo

Теперь приступаем к настройке конфигурационнго файла MPD:

vim /etc/mpd.conf
File: /etc/mpd.conf
  1. music_directory         "/var/lib/mpd/music"
  2. playlist_directory      "/var/lib/mpd/playlists"
  3. db_file                 "/var/lib/mpd/database"
  4. log_file                "/var/log/mpd/mpd.log"
  5. state_file              "/var/lib/mpd/state"
  6. user                    "mpd"
  7. bind_to_address         "localhost"
  8. bind_to_address         "/var/lib/mpd/socket"
  9. port                            "6600"
  10. log_level                       "default"
  11.  
  12. input {
  13.         plugin "curl"
  14. #       proxy "proxy.isp.com:8080"
  15. #       proxy_user "user"
  16. #       proxy_password "password"
  17. }
  18.  
  19. audio_output {
  20.         type            "alsa"
  21.         name            "P5Q-E ALSA Device"
  22. #       device          "hw:0,0"        # optional
  23. #       format          "44100:16:2"    # optional
  24. #       mixer_device    "default"       # optional
  25. #       mixer_control   "PCM"           # optional
  26. #       mixer_index     "0"             # optional
  27. }
  28.  
  29. filesystem_charset "UTF-8"
Warning: Обратите внимание на выделенную строчку номер 6. Все файлы, указанные в конфигурационном файле mpd.conf должны принадлежать пользователю, указанному в строке №6! Все файлы должны существовать, группа у файлов должна быть audio, а пользователь должен иметь права на чтение и запись. На папки естественно и исполнение. Кроме файла socket.
Привер вывода команды
ls -l
  1. -rw-r--r-- 1 mpd  audio 2532 Mar  7 19:53 database
  2. drwxr-xr-x 2 mpd  audio 4096 Mar  7 19:35 music
  3. drwxr-xr-x 2 mpd  audio 4096 Mar  7 19:41 playlists
  4. srw-rw-rw- 1 root root     0 Mar  7 19:53 socket
  5. -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

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

Warning: Опция --create-db была упразднена из программы и больше не поддерживается, однако, если файл обнулить и перезапустить 1-2 раза демон, он заполнит файл базы данных информацией о песнях.

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

nano /etc/init.d/mpd
File: /etc/init.d/mpd
  1. start() {
  2.                 checkconfig || return 1
  3.                 ebegin "Starting Music Player Daemon"
  4.                 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

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

Причём для отладки крайне помогает следующая команда запуска mpd

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

Того же эффекта можно добится, если занести в конфиг /etc/mpd.conf строчку: log_level "verbose". Теперь в наших логах будет содержаться подробный отчёт обовсех событиях и ошибках. Посмотреть ошибки можно вот тут /var/log/mpd/mpd.log

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

MPD не видит файлы в папке music

Если у вас в папке /var/lib/mpd/music лежат аудиофайлы, но mpd их не добавляет в базу данных, то как правило проблема вызвана правами на папки и файлы. Проверьте всё десять раз! Даже, если вы уверены 100%, надо проверить всё ещё раз, чтобы быть уверенным на 200%. Однако, такой эффект вполне может быть вызван и тем, что MPD не поддерживает ваши аудио форматы. Важно собрать MPD с нужными поддерживаемыми форматами. О том, какие форматы на данный момент поддерживает ваша сборка mpd, можно узнать по команде:

mpd --version

В общем подробнее об этом можно прочитать вот тут.

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

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

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

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

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

Почитать об этом можно вот тут.

Узнал я намёк, что проблема вся в том, что нет модулей при запуске конфигуратора alsa. При запуске конфигуратора выпадает следующая ошибка, которую реально заметить крайне сложно, т.к. она выпадает всего на полсекунды:

alsaconf
  1. modinfo: could not find module snd
  2. modinfo: could not find module snd
  3. modinfo: could not find module snd

Посмотреть загруженные модули можно стандартной командой:

lsmod

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

emerge media-libs/alsa-lib

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

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

File: /etc/make.conf
  1. 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
  1. Mar 07 17:01 : decoder: audio_format=44100:24:2, seekable=true
  2. ALSA lib dlmisc.c:121:(snd_dlsym_verify) unable to verify version for symbol _snd_pcm_empty_open
  3. ALSA lib pcm.c:2175:(snd_pcm_open_conf) symbol _snd_pcm_empty_open is not defined inside [builtin]
  4. Mar 07 17:01 : output: Failed to open "P5Q-E ALSA Device" [alsa]: Failed to open ALSA device "default": No such device or address
  5. 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:

emerge alsa-utils

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

rc-update add alsasound boot

(это что-то типа драйверов настройки звука в Windows, иконка от которых висит в трее с часами, но я точно не уверен).

Выключенные линии обозначены как MM, а включенные как OO

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

Запускаем утилиты:

/etc/init.d/alsasound start

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

alsaconf

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

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

alsamixer

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

Установка и настройка web-based клиента для MPD

Из всех клиентов, я поставил наиболее простой с понятным и светлым интерфейсом. ExtJS MPD - это клиент, который просто копируется в папку на веб сервере и тут же начинает работать "из коробки". Если у вас установлены специфические адрес и порт, которые слушает MPD, то вы можете указать их в файле mpd-control/configuration.php. Некоторые минусы у него есть, но вроде на первых порах нормально. Просто и работает "из коробки". Для себя я отметил ещё парочку клиентов для веб сервера на php. Первый из них и второй.

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

Для того, чтобы к нашему клиенту не подсоединились люди из вне (собственно им нечего делать там =) ), я ограничил доступ к web-based клиенту с помощью mod_rewrite из поставки Apache.

  1. RewriteEngine on
  2. RewriteBase /
  3. RewriteCond %{REMOTE_ADDR} !^192\.168\..*\..*$
  4. 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

TroubleShoot

  • Официальная Wiki и раздел TroubleShoot.
  • FAQ который надо прочитать очень внимательно!

Установка и настройка

  • Процесс конфигурирования MPD на официальном вики. В частности подробно расмотрены варианты Audio device outputs.
  • Процесс установки на Gentoo Wiki Archive.
  • Установка и настройки под различные ОС
  • Установка под ArchLinux.

Список клиентов для MPD

  • Список клиентов на официальном Wiki/