Простейшая интернет радио колонка «Kodi» или спасение «Малинового» кирпича

в 20:51, , рубрики: bitbake, diy или сделай сам, kernel, kodi, linux, open source, openembedded, poky, yocto, звуковая, интернет, Интернет вещей, интернет вещей Iot, колонка, мультимедиа, подбор Wifi, Разработка на Raspberry Pi, центр
Простейшая интернет радио колонка «Kodi» или спасение «Малинового» кирпича - 1

Основные предпосылки:

  1. Есть старая неиспользуемая плата Raspberry Pi первого поколения;
  2. Плата лежит на шкафу мертвым грузом и не используется — плата «Кирпич»;

Что хотелось бы получить:

  1. В определенный момент времени (например по настроению)
    плата перестает быть «Кирпичом», и в нее вставляется волшебная карта памяти;
  2. К плате подключается Ethernet кабель и штекер от обычной бытовой колонки или наушников;
  3. После подачи питания бывший «Кирпич» — поет

Основная идея:

  1. Минимальное количество телодвижений для какой либо настройки, в самом идеальном случае, подключаем только «Ethernet» кабель, питание и колонки, и больше ничего не делаем, от слова «совсем»;
  2. Бывший «Кирпич» из коробки поддерживаем например 20 интернет радиостанций, переключение которых по кругу можно повесить на нажатие колесика мыши или же на определенный pin GPIO (подключить два провода и их замкнуть (моя мечта с детства));
  3. Управление осуществляется по радио каналу, и этим радио каналом может стать обычная радио мышь;
  4. Взять уже готовую систему, дистрибутив собрать в «Yocto Project»
    т.е. как обычно мы с вами ничего делать не будем, так как все уже сделано.
    (достаточно только поместить стороннего наблюдателя с другой стороны «Телевизора»);

Описание

Простейшая Интернет Радио колонка «KODI»
Сборка предназначена для старых Raspberry Pi 1 плат
(пылящихся где то на шкафу, но которые готовы еще поработать)

По умолчанию используется список m3u8 из 12 Интернет радиостанций.

Предполагается, что плата работает без HDMI выхода, и для ее выключения достаточно выдернуть адаптер питания из розетки. А в качестве ультра современного беспроводного пульта управления, вы можете использовать вашу супер радио мышь (ну или подключить обычную серую с хвостом).

При включении сетевой интерфейс по умолчанию настраивается через DHCP протокол и проигрывается последняя запомненная радиостанция из списка, управление громкостью воспроизведения осуществляется обычной мышью:
(назначьте наконец свою мышь «начальницей управления», и поздравьте ее, она это заслужила)

  колесико вперед  - увеличение громкости звука
  колесико назад   - уменьшение громкости звука
  длительное нажатие (3сек и более) на правую кнопку мыши
                   - выбор следующий радиостанции
  длительное нажатие (3сек и более) на левую кнопку мыши
                   - выбор предыдущей радиостанции

Для добавления собственного списка Интернет радиостанций
вы всегда можете подключить HDMI кабель от телевизора
и воспользоваться штатным графическим интерфейсом Kodi 17.6
(выключите плату, подключите HDMI и включите адаптер питания)

Основное меню Kodi => «Дополнения» => «Мои дополнения»
          => «Клиенты PVR» => «PVR IPTV Simple Client»

Первоначальная реализация

(возможная)
Изначально, когда я решил сделать «Интернет Радио колонку», я планировал следующее:

  • Минималистический консольный дистрибутив в Yocto Project;
  • Аудио поток проигрывается через GStreamer;
  • Сетевой интерфейс настраивается по DHCP;

И такое решение имеет ряд преимуществ:

  1. Достаточно быстрое (выход на рабочий режим от подачи питания 30-40сек);
  2. Достаточно надежное (меньше программ, меньше точек отказа);
  3. Консольный дистрибутив намного проще перевести в режим только чтение
    т.е. программы ничего не записывают в корневую в файловую систему
    (a файловая система на носителе SDHC является на мой взгляд первым кандидатом по отказам);

Примечание:

    В Yocto перевести корневую файловую систему (rootfs) 
    в режим только чтение можно сделать достаточно просто, 
    изменив один параметр во время сборки 

    Из коробки Yocto предлагает два варианта:
    1) Работа файловой системы в обычном режиме чтение/запись 
    (так работают все дистрибутивы общего назначения, например Ubuntu)
    2) Работа файловой системы в режиме только чтение
    (так работают специализированные дистрибутивы, например в маршрутизаторах)

    В режиме только чтение все каталоги, в которые обычно 
    записываются данные приложений и сервисов во время работы монтируются 
    в оперативную память (например каталог /var/log и т.п.)
    Данные актуальны только для текущего сеанса работы и после сброса питания
    данные теряются.

    Если в Yocto Project вы укажете при сборке использовать "read only", 
    то после сборки ваш дистрибутив будет настроен только на чтение, 
    но вы всегда можете добавить возможность динамического перевода 
    из "read only"  в "read/write", но это уже совсем другая история ...
    

И один главный недостаток:

«Его надо делать» т.е. мне необходимо потратить N количество вечеров
(обычно после работы, и это самое неэффективное время, в это время мозг, уже не думает, он обычно спит)

И еще, свою предыдущую статью на Хабре я писал про мультимедиа центр Kodi и Yocto project
и возможность продолжить в том же ключе, пересилила мой исследовательский порыв. Об этом в следующей главе.

Превращение Kodi в интернет радио колонку

Для внесения нужной мне функциональности, я добавлю еще один метод в рецепт сборки дистрибутива описанного в предыдущей статье см. файл berserk-image.bb

GUI_SETTINGS = "home/root/.kodi/userdata/guisettings.xml"

# конфигурация запуска последнего выбранного ТВ канала (1-фон 2-передний план)
F1_LINE = "<startlast default="true">0</startlast>"
R1_LINE = "<startlast>1</startlast>"
# конфигурация вывода звука, всегда подключен только аналоговый аудио выход
F2_LINE = "<audiodevice default="true">PI:HDMI</audiodevice>"
R2_LINE = "<audiodevice>PI:Analogue</audiodevice>"
# так как HDMI по умолчанию не используется отключаю автоматическое обновление
# а то может получиться что питание уехало, а данные остались не записанными
F3_LINE = "<addonupdates default="true">0</addonupdates>"
R3_LINE = "<addonupdates>2</addonupdates>"


# метод отвечает за добавление конфигурации:
# которая превращает "Умный телевизор" в "простую Интернет Радио колонку"
add_radio_guisettings() {
    sed -i "s|${F1_LINE}|${R1_LINE}|" ${IMAGE_ROOTFS}/${GUI_SETTINGS}
    sed -i "s|${F2_LINE}|${R2_LINE}|" ${IMAGE_ROOTFS}/${GUI_SETTINGS}
    sed -i "s|${F3_LINE}|${R3_LINE}|" ${IMAGE_ROOTFS}/${GUI_SETTINGS}
}


FIND_STR = "touch ./tmp/.FIRST_RUN."
SCRIPT_FIRST_RUN = "etc/init.d/first-run.sh"
# так как HDMI выход может не использоваться, 
# то необходимо отключить "стартовое приветствие"
off_kodi_welcome() {
    sed -i "s|${FIND_STR}|#&|" ${IMAGE_ROOTFS}/${SCRIPT_FIRST_RUN}
}

Методы предназначены для модификации корневой файловой системы перед формированием образа дистрибутива в виде одного raw файла, который записывается на карту памяти командой dd

Это делается таким образом:
ROOTFS_POSTPROCESS_COMMAND += «add_radio_guisettings; off_kodi_welcome;»

Если вкратце, то в основном файле конфигурации Kodi 17.6, меняются «три пункта»

  • Конфигурация запуска последнего выбранного ТВ канала;
  • Конфигурация вывода звука, всегда подключен только аналоговый аудио выход;
  • Отключение автоматического обновления;
  • Примечание:

        Единственное с чем у меня возникли сложности, 
        это то, что пришлось еще подтащить файл базы данных 
        в формате sqlite => TV29.db, в котором указывается 
        текущий проигрываемый ТВ канал 
        (так как по умолчанию никакой из каналов не выбран), 
        а через xml конфигурацию в Kodi этого не сделать.
        

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

1) Нажмите на значок «шестеренки» в левом верхнем углу экрана
и выберите пункт «Настройки PVR и ТВ» (изображение телевизора с двумя рожками)
далее в левой части меню, выберете пункт «Воспроизведение», а в центральной секции «Общие»
укажите в выпадающем списке «Продолжить с последнего канала при запуске»
выбрав настройку «Передний план»

или более наглядно:

      "Настройки PVR и ТВ" 
       => "Воспроизведение" 
       => "Продолжить с последнего канала при запуске" => "Передний план"

2) Нажмите на значок «шестеренки» в левом верхнем углу экрана и выберите пункт:

       "Системные настройки"  
       => "Дополнения" => "Обновления" => "Никогда не проверять обновления"

3) Нажмите на значок «шестеренки» в левом верхнем углу экрана и выберите пункт:

       "Системные настройки" 
       => "Аудио" => "Устройство вывода звука" => "PI: Analogue"

Как я два года неправильно смотрю телевизор.

Должен вам признаться, что я за два года так и не научился правильно смотреть телевизор.

Обычно я смотрю телевизор на кухне. К телевизору подключена плата Raspberry Pi 2B, а к плате Ethernet и HDMI разъемы. Питание платы подается через обычный USB кабель, который воткнут в USB порт телевизора т.е. по сути, включение телевизора с помощью штатного пульта дистанционного управления, подает питание и на плату Raspberry Pi, а отключение телевизора с пульта, также сразу сбрасывает питание и с платы Raspberry Pi.

Да я прекрасно осознаю, что так делать нельзя, потому что корневая файловая система мультимедиа центра Kodi (ext3), у меня функционирует в обычном режиме чтение/запись. Но я человек ленивый, и для начала я решил проверить насколько долго так можно выключать систему, до того момента, пока она совсем не перестанет грузиться, но к сожалению за два года мне этого так и не удалось сделать (возможно мне просто повезло, не знаю).

И на мой взгляд, если такой режим подошел для моего телевизора, то и для «простой Интернет Радио колонки» тоже подойдет, а так как я принудительно отключил автоматическое обновление плагинов Kodi, то и вероятность отказа файловой системы, станет еще меньше. Пока я проблемы с этим не вижу

Примечание:

    Но вы всегда при желании можете с помощью одной yocto команды 
    IMAGE_FEATURES += "read-only-rootfs"

    и определенной магии перевести ваш дистрибутив в режим "read only"
    

Дистрибутив «интернет радио колонки», описываемый в статье является бытовым, а что главное для бытового дистрибутива — это красивый GUI. На мой взгляд очень трудно или почти невозможно научить обычного пользователя вбивать какие либо непонятные магические команды в консоли, да он и слово то такого не знает. А вот GUI, это пожалуйста.

И это пожалуй мой главный аргумент в пользу не консольного дистрибутива. Теплый ламповый графический интерфейс пользователя Kodi, да он особо не нужен, но он есть.
(Еще я совсем забыл упомянуть, о том, что Kodi можно управлять дистанционно, например со смартфона, установив приложение «Yatse», и возможно для кого то, это будет плюсом)

Конфигурация Kodi, для управления мышью

а теперь Ракета

<keymap>
    <global>
        <mouse>
          <wheelup>VolumeUp</wheelup>
          <wheeldown>VolumeDown</wheeldown>
          <middleclick>ChannelDown</middleclick>
          <longclick id="0">ChannelDown</longclick>
          <longclick id="1">ChannelUp</longclick>
          <!-- конфигурационный rocket -->
        </mouse>
    </global>
</keymap>

Конфигурация переопределяет общие (global) события для следующих элементов:

  • прокрутка колеса мыши вперед
  • прокрутка колеса мыши назад
  • нажатие на среднюю кнопку мыши
  • обработка длительного нажатия мыши (3сек и более),
    0 идентификатор правой кнопки, 1 идентификатор левой кнопки

более подробная информацию по настройке событий мыши:

kodi.wiki/view/Alternative_keymaps_for_mice
kodi.wiki/view/Action_IDs
kodi.wiki/view/Window_IDs

Что делать если кабельная система к вам не пришла

«Но у меня дома нет свободных Ethernet портов (или никогда и не было)» — может воскликнуть часть счастливых обладателей старых плат Raspberry Pi 1 (возможно плата покупалась для исследования и так и осталась лежать на шкафу)

А так как на плате нет встроенного Wifi, то без Ethernet подключения, она не очень функциональна.

Конечно возможность использования платы Raspberry Pi 1 без Ethernet существует, но потребует от вас определенных усилий. Обычно такие вещи интересно выполнять только в рамках изучения чего то нового т.е. это не пользовательская работа.

Итак, рассмотрим гипотетический вариант использования платы без Ethernet:

Можно подключить внешний USB — Wifi адаптер, руководствуясь тем соображением,
что адаптер должен хорошо работать под Linux

Примечание:

    К сожалению часть WiFi адаптеров работать не будет, 
    это не особенность представленного в данной статье дистрибутива, 
    а скорее проблема конкретных драйверов WiFi адаптеров в ядре Linux. 
    Можно констатировать тот факт, что в настоящий момент вы не можете просто 
    пойти в магазин и купить любой WiFi адаптер. Скорее вы должны подобрать WiFi 
    адаптер из списка менее проблематичных и хорошо работающих под Linux.

    я проверял только следующии модели:
    - WiFi адаптер на чипсете Atheros D-Link DWA-126 802.11n (AR9271)
    - WiFi адаптер NetGear WNDA3200
    - WiFi адаптер NetGear WNA1100
    - WiFi адаптер TP-Link TL-WN722N (AR9271)
    - WiFi адаптер TL-WN322G v3
    - WiFi адаптер TL-WN422G
    - Wifi адаптер Asus USB-N53 chipset Ralink RT3572 
    

Если у вас уже есть usb Wifi адаптер, вы можете проверить хорошо ли он работает под Linux следующим образом:

  • Установите какой нибудь широко распространенный Linux дистрибутив
    общего назначения, например «Ubuntu Desktop»
  • Загрузите систему
  • Подключите ваш Wifi usb адаптер
  • Запустите сетевой менеджер, и попытайтесь подключиться к вашей WiFi точке доступа
  • Если все хорошо работает и ваше интернет соединение стабильное, значит ваш адаптер хорошо поддерживается и вы можете продолжить свою работу по подключению этого адаптера в специализированном дистрибутиве и возможно с другими версиями ядра
    (если нет, то нет, увы — лучше даже и не пытаться)

Поддержка внешнего Wifi адаптера в «Raspberry PI»

Для корректной работы WiFi адаптера в Linux: нам потребуется две вещи:
1) Поддержка Linux ядром определенного Wifi адаптера
2) Наличие в системе модуля ядра для определенного Wifi адаптера

Возьмем к примеру адаптер TP-Link TL-WN722N. У него просто великолепная антенка.
Найдем чипсет на котором плата работает — у меня это «AR9271»,

примечание:

    что самое интересное, это то, что для одной и той же модели
    одного и того же производителя, чипсет Wifi может отличаться.
    Я например сталкивался с тем, что для TL-WN722N версии 2, 
    используется уже другой чипсет Realtek RTL8188, а он уже 
    плохо работал под Linux (на тот момент), увы такие вот дела, 
    т.е. иногда нужно еще приглядываться к маленьким цифрам 
    версии на обратной (темной) стороне адаптера.    
    

Теперь найдем название параметра в конфигурации ядра отвечающую за драйвер чипсета AR9271, лучше всего поискать сочетание слов «AR9271 cateee.net»
     где «cateee.net» — классный сайт с описанием конфигураций модулей ядра Linux

Сразу находим название конфигурации ядра — CONFIG_ATH9K_HTC
и название нужного нам модуля ядра ath9k_htc

и далее достаточно указать название нужного модуля в файле фрагмента конфигурации
Linux ядра => recipes-kernel/linux/files/rbpi.cfg, добавьте строку:
CONFIG_ATH9K_HTC=m

Таким образом в дальнейшем вы можете подключить любое дополнительное оборудование к вашей системе (ну если конечно в Linux ядре оно уже поддерживается)

Что делать если вы хабра гик — конструктор

И создаете крутейшие вещи, например такие как здесь или вы студент и мечтаете создать, что то похожее.

То навскидку можно взять какой нибудь Touch Screen экран для RPI на aliexpress, там же заказать подходящую аккумуляторную батарею, подключить все это к плате Raspberry Pi 1,2 или 3 (лучше к 3, так как она со встроенным Wifi), выбрать тему оформления графического интерфейса в Kodi, рассчитанную на сенсорный экран и вуаля => у вас может получиться простой audio плейер. Конечно он будет достаточно громоздкий, но он будет вашим.

  Примечание:
  A для того, чтобы собрать Мультимедиа центр Kodi для самой бюджетной платы 
  Raspberry Pi Zero Wifi в yocto вам достаточно изменить две строки:

  конфигурационный файл => build/conf/local.conf
      MACHINE = 'raspberrypi0-wifi'

  рецепт сборки Kodi  => recipes-mediacentre/kodi/kodi_17.bbappend
      EXTRA_OECONF_append = "${@bb.utils.contains('MACHINE', 
                            'raspberrypi0-wifi', '${BS_RPI}',  '', d)}"

  Если отзывчивость GUI Kodi 17.6 
  из за одного процессорного ядра в Zero вам покажется 
  загадочной, то можно сделать финт ушами и собрать более старую, 
  но очень быструю версию, например Kodi 15.2, он в этом плане более 
  "дружелюбный" (иногда legacy решает все)

К сожалению платы у меня нет, поэтому проверить не могу, но по моим ощущениям это должно заработать.

Краткая инструкция по сборке

    1) Установите зависимости Yocto Project (например в Ubuntu): 
    sudo apt-get install -y --no-install-suggests --no-install-recommends 
        gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential 
        chrpath socat cpio python python3 python3-pip python3-pexpect 
        xz-utils debianutils iputils-ping python3-git python3-jinja2 
        libegl1-mesa libsdl1.2-dev xterm

    2) Скачайте и установите Repo:
        mkdir ~/bin
        curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
        chmod a+x ~/bin/repo

    3) Загрузите проект с github:
        PATH=${PATH}:~/bin
        mkdir radio
        cd radio
        repo init -u https://github.com/berserktv/bs-manifest 
                  -m raspberry/rocko/radio-rpi-0.2.8.xml
        repo sync

    4) Соберите проект:
        ./shell.sh
        bitbake berserk-image
        
    можно тоже самое собрать для плат Raspberry Pi 3B Plus, 3B и 2B:
    repo init -u https://github.com/berserktv/bs-manifest 
              -m raspberry/rocko/radio-0.2.8.xml
    

более подробную инструкцию по сборке
и записи на microSDHC карту см. в предыдущей статье

Постскриптум

Конечно идея Интернет радио колонки типовая, она всем известна и на хабре вы найдете немало статей по этому поводу, например здесь

И еще вы можете подумать, что я просто подогнал требования к готовому решению. На это я могу парировать и сказать, что нет, честно честно.

История мистера Эрви

    Хотите верьте, хотите нет, а дело было так:

    Наш рабочий офис граничит с фирмой по производству разного звукового
    оборудования, и однажды директор этой фирмы, назовем его мистер "Эрви"
    подошел к нашему заместителю директора филиала мистеру "Арсению"
    и спросил у него, насколько сложно повесить на плату Raspberry Pi 
    проигрывание звукового потока т.е. плата подключается к сети 
    и колонкам, и "слышен характерный звук".

    После этого мистер Арсений подошел к заместителю моего 
    начальника - мистеру "Борису" и переадресовал вопрос ему, 
    ну а я, как сторонний наблюдатель случайно эту идею запомнил
    и назвал ее "Задача трех начальников".

    В общем хотели как лучше, 
    а получилось, цитата - "Но мистер Эрви, как всегда, помог."

    Через некоторое время я поинтересовался у мистера "Бориса" 
    его мнением по поводу написания небольшой заметки на эту тему 
    на "Хабре", на что "Борис" ответил, что изменение 
    "трех пунктов меню" в Kodi, особо не привносит никакой 
    новой информации и не заслуживает отдельного упоминания. 
    Конечно я с ним полностью согласен и поэтому, я не расскажу ему, 
    что что-то написал по этому поводу.

    Статья написана исключительно для платы "Raspberry Pi 1" 
    взятой у мистера "Бориса" на время эксперимента, 
    совпадения со всеми другими платами "Raspberry Pi 1" случайны.
    

Побольше вам сборок хороших и разных, и пусть для вас в этом году даже бывший кирпич — поет.

Автор: Иваныч

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js