Распределенный музыкальный плейер на Raspberry Pi
Давно собирался написать этот пост, но прогресс шел медленно. К ускорению темпа подтолкнул этот вопрос, где я имел неосторожность обмолвиться, что пишу такой пост, в результате чего он вызвал живой интерес, поэтому мне ничего не оставалось делать, как выполнять данное обещание, за что выражаю отдельную благодарность автору вопроса M03G, с чьей подачи и был получен мной этот ускоряющий пендель. А так как пост, похоже, увидит свет в пятницу, я позволил себе довольно вольный (извините, вышел каламбур невольный) стиль изложения. Надеюсь, все останутся довольны.
(Да, пост во многом пересекается с постом Распределенный аудиоплеер на Odroid U2, но чуть проще в настройке)
ПрологЯ начал мечтать о подобной системе году в 2003-м, как только начал жить в квартире с количеством комнат >1, и вопрос музыки на кухне (да и вообще по всей квартире) встал во весь рост. Ситуация усугублялась тем, что квартира была построена согласно архитектурному гению Никиты Сергеевича Хрущева, а компьютер помещался в “дальней” комнате, так что на кухне слышно было чуть более, чем совсем никак.
Время шло, квартиры менялись, обдумывались и отбрасывались различные варианты, мечта оставалась, то уходя в полнейший бэкграунд, то снова выплывая из глубин подсознания, но воз не двигался.
ПредысторияК тому моменту, как в широком доступе оказались замечательные одноплатные компьютеры Raspberry Pi, я сменил 3 места проживания, такое же количество работ, а также страну проживания, поэтому из-за обилия происходящего мечта не подала голоса даже слабого голоса, давно уснув летаргическим сном в пыльном чулане на задворках памяти. Малинку я, однако, все равно заказал. Зачем – еще сам не понимал, но устоять не смог: соотношение цена/потенциальные возможности все решило. “Это же в перспективе и NAS, и веб-сервер для экспериментов, и куча всего остального”, — думал я (ну, на NAS, как выясняется, она не тянет, но даже если бы я это тогда знал, меня бы все равно это не остановило).
Однако после того, как “малинка” таки попала ко мне в руки, у меня как раз организовался завал и на работе, и с личными проектами, поэтому “ягодка” легла на полку и пролежала несколько месяцев, так и не вкусив электричества.
Но однажды все изменилось.
ЗавязкаПлан созрел быстро: в usb-порт втыкаем внешний винт с музыкой, к аудиовыходу подключаем колонки, на малину ставим MPD и получаем отличный музыкальный плейер, доступный для контроля с любого компьютера в доме (благо клиентов полно под любую ОС). Итак, малинке наконец-то нашлось применение, она весело замигала разноцветными светодиодами, и это было хорошо.
Так и вышло… А шкаф так и остался неразобранным.
Поехали!Итак, поехали. Исходный материал: две или больше Raspberry Pi (одна будет сервером, на котором крутится MPD, остальные клиентами), такое же количество колонок для воспроизведения звука, чуть-чуть знания Linux, и вечер свободного времени. Ну и, разумеется, музыкальная коллекция с правильно прописанными тегами, т.к. MPD оперирует именно ими. Все это у меня в наличии было, поэтому я заранее известил жену о том, что ближайшим вечером меня нет, я заболел, изчез из дома, уехал в Ванкувер, и вообще эмигрировал нафиг с этой планеты, и что вернусь завтра к обеду, и с головой погрузился в гугл. Гугл не подвел.
Подготовительный этап (одинаковый для сервера и клиентов)Я не буду детально описывать процесс установки системы на Raspberry Pi, инструкций в интернете полно. Оговорюсь лишь, что я, как любитель Debian с 8-летним стажем, использовал Raspbian, поэтому все инструкции будут даны для него. В общем, качаем образ, прошиваем, втыкаем карту, грузимся. Первоначальная настройка тоже стандартна, перечислю то, что сделал я:
- задал пароль (разумеется)
- активировал ssh-сервер
- задал таймзону
- убрал загрузку иксов
- выставил объем видеопамяти на минимум (16 мегабайт), ибо незачем ее зря расходовать за неимением иксов.
Обязательный пункт: назначьте каждой “малинке” статический адрес в настройках вашего роутера (или в ее собственных сетевых настройках, без разницы) – впоследствии очень пригодится.
Ну что ж, приступим:
1. Первым делом обновим систему до свежего состояния и установим PulseAudio. Вообще, мы сейчас много чего будем делать от рута, поэтому перейдите под его учетку любимым вами способом (выбирайте на свой вкус):
2. Т.к. предполагается, что работать все будет сразу же после загрузки, в идеале – без иксов и логина юзера, нам нужно, чтобы PulseAudio работал в общесистемном режиме. Для этого отредактируем файл /etc/default/pulseaudio следующим образом:
3. Далее, чтобы все работало, нужно добавить юзера pi в группу pulse-access:
4. Теперь разрешим прием звука по сети. Для этого в файл /etc/pulse/system.pa добавим строку
Здесь мы авторизуем как “самого себя”, так и все устройства из локальной сети с адресами 192.168.1.* (если у вас диапазон адресов другой, поправьте соответствующим образом). В принципе, первая часть нужна только для сервера (чтобы играть на самом себе), а вторая — для клиентов (чтобы принимать из сети), но мы сделаем и то, и другое, чтобы в случае чего малинки были взаимозаменяемы с минимальными телодвижениями.
4. Собственно, запускаем сервис pulseaudio
На этом общая часть заканчивается. Перейдем к настройкам клиентов и сервера.
КлиентВозможно, кому-то это покажется странным, но “клиент уже готов”, и дополнительной настройки не требуется, поэтому далее двигаемся строго на сервер порядка 50 метров займемся сервером.
СерверВ первую очередь на сервер нужно установить MPD, и заодно консольный клиент (для первоначальной настройки):
Теперь редактируем конфиг /etc/mpd.conf. Он, как и многие другие конфиги в линуксе, отлично прокомментирован, поэтому я обозначу лишь основные необходимые правки:
Указываем путь к коллекции
Биндим на любой сетевой интерфейс:
На стандартный порт:
Авто-апдейтить коллекцию при изменении файлов:
И самое главное – конфигурируем аудиовыходы. Здесь мы создаем по одному выходу на каждую из клиентских “малин”, плюс один для самого сервера – он тоже будет выступать в роли равноправного клиента. Вот тут-то и пригодятся нам статические IP-адреса, которые мы назначили каждой из малин.
(и так далее, по количеству имеющихся клиентов)
Ну что ж, перезапустим MPD. Рутовую сессию на этом можно закончить.
Просканируем коллекцию для создании базы данных (это займет некоторое время, в зависимости от размера коллекции):
Собственно, на этом — все.
Рулим!Осталось всего ничего: как всем этим делом управлять. Тут ничего сложного, в нашем распоряжении вагон и маленькая тележка клиентов под всевозможные ОС. При выборе обязательно обращайте внимание на то, умеет ли клиент переключать выходные каналы (или, как они еще называются, Output Devices) – собственно, это именно та фича, которая позволяет включать/выключать того или иного клиента. Под Маком я остановился на Theremin, под Линуксом – на Gmpc, клиентами под Windows пользоваться не приходилось, поэтому ничего посоветовать не могу.
КульминацияДополнительные градусы душевного тепла генерировались от осознания факта, что никакой «rocket science» задействовано не было, и все было собрано буквально за вечер из «подручных материалов», и даже без единого куска синей изоленты. Я прислушался — из офиса наверху тоже доносился звук! Я залез в меню и снял галку с «Living Room» — звук из колонок в зале пропал, и остался только в офисе.