image Как известно, нет предела совершенству. Даже для самодельной портативной акустики, чья аудитория пользователей включает только одного человека. Весьма требовательного и местами маниакально упорного человека. После выхода первого поста про Pi-Sonos прошло почти 5 месяцев. За это время софт внутри этой акустики успел дважды кардинально поменяться. Поводом для изменений послужили как полезные советы хабравчан, так и собственный UX.

Немного истории для тех, кому лень читать или кто уже забыл первую статью
Pi-Sonos – это самодельная компактная акустика, на создание которой меня вдохновила Sonos Play 1. Задача этой акустики, прежде всего, была в том, чтобы воспроизводить музыку из интернет-радиостанций. При ее создании я поставил во главу угла минимализм и удобство: воткнул в розетку, а дальше в любом месте дома управляй музыкой со смартфона/компа/планшета.

О чем эта статья
Прежде всего, об упорстве и любознательности на пути к идеалу. Под катом, username, не будет ни решения какой-то глобальной проблемы, ни описания новой уникальной технологии. В статье, всего лишь, излагается сравнение популярных медиа-центров для Raspberry Pi, раскрываются их достоинства и недостатки, а также мое персональное видение оптимального фреймворка для интернет-радиоприемника. По сути, прорабатывая собственный софт для колонки, я всего лишь частично повторил путь создателей Volumio, просто реализовав с нуля всего одну из его функций (читай: “изобрел очередной велосипед”).
Несмотря на то, что статья затрагивает тему разработки ПО, кода в ней нет, потому что цель статьи описать идею и функционал, а не процесс его реализации. Если тема кода будет интересна хабравчанам, я постараюсь осилить отдельную статью с описанием процесса разработки.

Изначально софтовой начинкой акустики был OSMC, но мудрые люди в комментариях обратили внимание на то, что Kodi (aka OSMC) – слишком жирно в качестве «мозгов» для интернет-радио станции. Слишком он умный и большой, только для аудио-проектов лучше подойдет Volumio. Собственно, все так и оказалось. Volumio легче, заточен под веб-интерфейс и имеет более продвинутый и удобный в разработке API. Также отпала необходимость в торчащем сзади кабеле HDMI, поскольку Volumio полностью настраивается в любом браузере.

Однако, и у Volumio обнаружилась пара важных недостатков, подвигнувших меня на дальнейшее исследование. Это, во-первых, время загрузки, и во-вторых, отсутствие автовоспроизведения. После изучения официальной документации (из которой можно понять, что Volumio — это надстройка над mpd (Music Player Daemon)), я решил, что пришло время написать на js собственную обертку под названием RPi-Radio, которая решала бы эти проблемы. Серверная ее часть работает на Node.js, а клиентская часть (GUI), использующая React.js, была готова еще со времен использования OSMC, ее нужно было только немного подправить. Так это выглядит на экране смартфона в настоящее время:


Ниже приведена табличка, наглядно показывающая недостатки и преимущества каждого из фреймворков.
Критерий OSMC Volumio RPi-Radio
Время загрузки 35 сек 45 сек 20 сек
Автовоспроизведение при запуске нет* нет* да
Кол-во тапов из главного экрана «родного» GUI на смартфоне для выбора радиостанции из списка Favorite** 5+1 скролл 4 1
Необходимость в мониторе, клавиатуре и мыши*** да нет нет
Веб-управление частичное полное частичное
Редактирование списка станций так себе норм так себе
Удобство первоначальной настройки так себе отлично средненько
Интеграция с моим GUI для управления со смартфона с костылями с костылями из коробки
Удобство ежедневного использования ? ?? ???
* на самом деле да, но надо делать костыль и подсовывать его автозагрузку Raspbian; в случае с OSMC костыль пишется на python, а в случае с Volumio — на js или bash. Но в обоих случаях оно все равно работает не так, как бы хотелось.
** для OSMC и Volumio это очень важные параметры, ведь все эти тапы-скроллы необходимо делать каждый раз при включении колонки. Для RPi-Radio этот параметр хоть и минимален, но все равно не так важен, поскольку колонка начинает играть сама при включении.
*** имеется ввиду физическое подключение монитора, клавиатуры и мыши к самой Raspberry Pi, т.е. те случаи, когда нет возможности обойтись встроенным веб-интерфейсом или подключением по ssh.

Под этим спойлером спрятано подробное пояснение каждого из пунктов сравнения.
Время загрузки 20 секунд – это, по моему мнению, минимум, который можно достичь, не погружаясь в дебри оптимизации Raspbian под этот проект. Именно столько времени требуется «малинке», чтобы загрузить ОС и запустить сервис mpd. Вероятно, этот результат может быть улучшен, если заменить microSDHC на microSDXC с большей скоростью чтения/записи (проверю при возможности). Удивительно, но Volumio, притворяющийся легким и шустрым, грузится дольше монстра-комбайна OSMC. 45 секунд ожидания находятся за порогом комфортной эксплуатации, и это было основной причиной ухода от Volumio.

Автовоспроизведение присутствует в mpd из коробки, мне не пришлось ничего делать для его активации – удобно! В Volumio, хотя он и является оберткой mpd, эту функцию придушили ради красивого звука приветствия. Как я уже писал, можно сделать скрипт и положить его в автозагрузку. Аналогичная ситуация и у OSMC.

У OSMC большая часть взаимодействия с пользователем происходит через монитор: есть красивый интерфейс, возможность смотреть видео, картинки, читать новости и смотреть погоду – много всего, чего моя колонка никогда в жизни делать не будет.

А вот веб-управление у OSMC очень ограниченно, и удаленно даже нельзя настроить список любимых станций в плагине Radio – только через монитор. У Volumio – наоборот, все только через веб-интерфейс. Редактировать список станций удобнее всего в браузере на десктопе/лэптопе, но можно и на смартфоне при желании. У RPi-Radio через веб-интерфейс можно только выбирать станцию и регулировать звук. Список станций, да и вообще все остальное надо делать через консоль по ssh. Со списком станций сложнее всего: если у OSMC и Volumio есть свои обширные библиотеки интернет-радиостанций, то в RPi-Radio мне пришлось забивать адреса своих любимых станций вручную в формате JSON. Неудобно, но всего один (или несколько) раз в жизни.

С первоначальной настройкой хуже всего у OSMC. Сначала надо подключить к «малине» монитор и настроить плагин Radio, потом надо еще через консоль или по ssh настроить вывод звука на внешний ЦАП IQAudio (тот, что у платы Suptronics X400). У RPi-Radio настройка ЦАП такая же, но хотя бы все остальное делается тоже по ssh. Лидер в этой номинации, безусловно, Volumio – для вывода звука через внешний ЦАП надо просто в меню настроек выбрать соответствующий пункт из выпадающего списка. Сравнение есть даже на официальном сайте Suptronics (http://www.suptronics.com/xseries/x400.html)

GUI в RPi-Radio представляет собой простенькую веб-страничку, реализованную на React.js. Серверная часть, отвечающая за взаимодействие между клиентским GUI и mpd, работает на Node.js и представляет собой простенький HTTP- и WebSocket- сервер на базе связки Socket.io + http + express. Она запускается на Raspbian в качестве сервиса при включении системы сразу после старта сервиса mpd и для управления mpd использует модуль mpc-js. Клиентский GUI доступен любому браузеру в моей домашней сети просто по ip или hostname «малинки». Идеально.

Исходники RPi-Radio опубликованы на Github. В том же репозитории, в соответствующих бранчах, можно найти обе адаптации GUI для работы с OSMC и Volumio.

Результат моих экзерсисов, RPi-Radio, выходит за рамки простого дополнения к какой-то колонке, существующей в единственном экземпляре. Это в своем роде готовое решение, которое превращает в интернет-радиоприемник не только Raspberry Pi, но и любое устройство с аудио-выходом, доступом в Интернет и возможностью запуска mpd и Node.js. Основным достоинством такой системы является отсутствие всего лишнего. Собственно, как это сделано и в Sonos, в том идеале, который я стремлюсь достичь.

Комментарии (19)


  1. dernuss
    07.02.2018 22:27

    Интересно, такое возможно поднять на esp32 ?


    1. kAIST
      08.02.2018 01:11

      Да, есть проекты, как на esp32, так и обычный esp8266 тянет с отдельным модулем декодера mp3 (стоит копейки).


      1. bellerofonte Автор
        08.02.2018 09:53

        Да. 5 минут гугления выдают проект на github для воспроизведения интернет-радио и еще один проект для работы веб-сервера. Очевидно, что то и то можно совместить.


  1. claymen
    07.02.2018 23:58

    Интересно есть проекты совместимые с sonos, скажем эмулятор соноса?


    1. bellerofonte Автор
      08.02.2018 09:55

      Кастомный Sonos-клиент где-то мне попадался, а вот эмулятора колонки я не видел.


      1. claymen
        08.02.2018 10:20

        Есть у них такой девайс Sonos Connect собственно говоря простой проигрыватель с линейным выходом, почему то «глючит» иногда по железу, перегревается, wi-fi b/g, в общем расбери с внешней звуковушкой ничуть не хуже, вот вопрос в ПО. Почему сонос, потому что есть колонки и надо подключить встроенную в стену старую акустику, покупать по Соносу на каждую колонку да еще с такими проблемами экономически не хочется… и большой он.


        1. bellerofonte Автор
          08.02.2018 10:31

          Правильно ли я понимаю, что Вы хотите на каждую колонку повесить по raspberry и «эмулятором sonos» синхронизировать воспроизведение с них?


          1. claymen
            08.02.2018 10:55

            Всё верно. Колонки встроены в потолок, в разных комнатах, давняя конструкция. И есть уже работающие колонки несколько штук, экономика важна. Обыскался похоже никто не сделал такой эмулятор. Все прекрасно понимаю что сонос может менять протокол, прошивки и все такое, но пока игра стоит свеч.


            1. bellerofonte Автор
              08.02.2018 11:02

              в комментариях к первому посту рекомендовали shairport-sync попробовать для синхронизации. Но, как понимаете, это только AirPlay. Готовое решение в голову не приходит.


  1. sinyaya_boroda
    08.02.2018 09:57

    А что лучше норм или средненько?


    1. bellerofonte Автор
      08.02.2018 10:06

      И то и то означает «не идеально, можно лучше/быстрее/удобнее». Это как сравнивать зубную боль и боль от удара мизинцем о шкаф. Лучше не испытывать ни то, ни другое.


  1. past
    08.02.2018 11:47

    Пытались сделать через https://github.com/masmu/pulseaudio-dlna?


    1. bellerofonte Автор
      08.02.2018 11:59

      Не совсем понимаю, зачем мне DLNA? или это относится к теме комментария claymen?


  1. past
    08.02.2018 12:21
    +1

    Да, я про " на каждую колонку повесить по raspberry и «эмулятором sonos» синхронизировать воспроизведение"
    Синхронизировать можно через pulseaudio, а в сети выглядеть как один dlna media renderer.


    1. bellerofonte Автор
      08.02.2018 12:30

      рабочий вариант


      1. claymen
        08.02.2018 14:08

        А с телефона через приложение Sonos управляется?


        1. bellerofonte Автор
          08.02.2018 14:16

          уверен, что ничего от Sonos в этом варианте вообще присутствовать не будет. past, я прав?


          1. past
            08.02.2018 14:59

            Да, только идея.
            Контент в телефоне. "Стандартными" средствами плеера выбираете играть на рендерере.


  1. pistoletov
    09.02.2018 08:55
    +1

    Я сделал мультирум радио на связке от логитеч. В сердце кубиборд на а10 и два аудиоустройства. Могут работать как отдельно так и синхронно. На кубике стоит LMS и squuezelite по одному на устройство. Управление с ios сторонним клиентом ipeng (платный но красивый).