Делаем из старого усилителя многофункциональный медиа сервер с помощью Raspberry pi

    У кого из нас нет добротной техники из прошлого, которая работает так, как и не снилось множеству ширпотребных вещей из настоящего. Старые усилители, проигрыватели пластинок и радиолы. Да, было время, когда не умели делать хрупко и недолговечно в погоне за дешевизной. Эти вещи еще проработают долго. И звучание какого-нибудь старого усилителя будет радовать и нас и наших детей.

    Правда, в них отсутствует много всяких цифровых штучек. Разные flac и тому подобные форматы. Управление проигрыванием, музыкой и фильмами через телефон или компьютер. Возможность запустить музыку с Youtube, Last.fm или выбрать интернет радио. Удаленное проигрывание медиа через DLNA. Или просто возможность подключить ваш компьютер через Bluetooth и выводить весь звук через большие колонки. Или что там еще напридумывают нам в будущем для облегчения нашей аудиофильской жизни.

    Но что нам мешает использовать все эти технологии в старой технике? Да и почему обязательно в старой… У вас есть RCA, miniJack 3.5 или S/PDIF разъем на вашей магнитоле? Тогда мы идем к вам и … И делаем из старого усилителя многофункциональный медиа сервер с помощью Raspberry Pi. Подключаем нашу Raspberry Pi через RCA и обновляем нашу технику до "острия технологической атаки". Не обязательно использовать RCA. Найдите аналоговый или цифровой вход на своей технике и выберите нужную комплектацию вашей Raspberry Pi. Я буду рассматривать вопрос сугубо с практической точки зрения. Как настроить все быстро на Raspberry Pi? Ведь статей профессионалов об особенностях работы той или иной технологии достаточно, чтобы не останавливаться на этом. Я возьму в качестве примера Raspberry Pi и плату для цифровой обработки звука на основе чипа PCM 5102 A.

    Существует множество различных вариантов музыкальных DAC систем на любой вкус и цвет. Выбор — только за вами. Вот некоторые из них для Raspberry Pi. DAC — на русском ЦАП — цифро-аналоговый преобразователь. Я возьму один из самых недорогих аналогов данного устройства. Судя по различным отзывам на веб просторах, очень даже неплохо себя зарекомендовавшую PCM 5102 A . На ней 6 контактов, и мы с легкостью подключим ее к нашей Raspberry Pi через GPIO разъем. Причем, подойдет любая серия нашей Малинки. Ведь для проигрывания музыки производственных мощностей хватит и самой младшей из них — Raspberry Pi Zero. Хотя, без точных входных данных для любой поставленной задачи перед нашей Raspberry Pi, все относительно. И подобное утверждение является оценочным мнением автора. Далее для подключения к GPIO нашей платы используем следующую схему:

    BCK -> Pin 12 (GPIO18) 
    DATA(SCLK) -> Pin 40 (GPIO21)
    LRCK -> Pin 35 (GPIO19) 
    GND -> Pin 39 (GND)
    GND -> Pin 34 (GND) 
    VCC -> Pin 2 (5v) 

    И нам потребуется подключить драйвер устройства в config.txt :

    sudo nano /boot/config.txt

    меняем на:

    dtoverlay=hifiberry-dac 
    #dtparam=audio=on 

    Перезагрузимся у убедимся, что в журналах ядра все ок:

    dmesg |grep hifi

    И посмотрим нашу карточку через листинг доступных устройств alsa:

    aplay -l

    **** List of PLAYBACK Hardware Devices **** card 0: sndrpihifiberry [sndrpihifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 [HifiBerry DAC HiFi pcm5102a-hifi-0] Subdevices: 1/1 Subdevice #0: subdevice #0

    Если что-то пошло не так, включаем режим отладки:

    sudo nano /boot/config.txt dtdebug=1

    И смотрим, что происходит:

    sudo dmesg sudo vcdbg log msg

    И, по идее, запустив плеер, допустим, mplayer с каким-нибудь mp3, можно услышать музыку через канал на вашей аппаратуре, к которой вы подключились.

    Подключаем Bluetooth

    Технология Bluetooth не устаревает и активно развивается. Bluetooth передатчики постоянно обновляют версию. Слушать музыку через нее в HiEnd качестве можно. Она рождена для использования радио канала с большой загруженностью радио эфира. Это немаловажно при использовании ее в городе для передачи медиа контента. Правда, при использовании встроенного передатчика… на Малинке не все гладко. И помехи при прослушивании музыки через нее могут быть слышны. Как вариант — использовать внешнюю USB Bluetooth антенну. Она позволит избежать потерь, что, в общем-то, — отдельная тема, требующая изучения. И тем не менее, достаточно просто и быстро через Bluetooth пробрасывать звук. Скажем, с компьютера на Raspberry Pi и далее — через усилитель на колонки. Или с телефона подключаться в Raspberry и слушать музыку. Поэтому, запускаем Bluetooth на Малине. Для запуска нам понадобятся три компонента…

    Bluetooth сервер

    Pulse-audio

    Bluetooth клиент

    Это не обязательный набор, но, как показала практика, все три компонента позволяют быстро и прозрачно запускать Bluetooth на Raspberry Pi. В результате, мы должны получить три работающие службы:

    bluetooth.service

    bt-agent.service

    pulseaudio

    Первая используется как серверная часть, Bt-agent как блютуз клиент для обработки входящих запросов по авторизации. Это удобно для автоматизации процессов подключения без заморочек ручного подключения к нашему каналу. И pulse аудио как сервер, обрабатывающий звук, и как прозрачная прослойка для автоматического перенаправления его между устройствами. Установим необходимые пакеты: sudo apt-get install pulseaudio pulseaudio-module-bluetooth bluez-tools

    Bключим в группы pulse-access bluetooth пользователя pi:

    sudo usermod -a -G bluetooth pi

    sudo usermod -a -G pulse-access pi

    sudo adduser pi pulse-access

    Запускаем при старте аудио сервер pulseaudio:

    systemctl --user enable pulseaudio

    Для работы нашей Малины в режиме блютуз с постоянным обнаружением и с профилем A2DP приемника поправим конфигурацию:

    sudo nano /etc/bluetooth/main.conf

    и в нем:

     … 
    Class = 0x41C 
    … 
    DiscoverableTimeout = 0 A2DP

    Стандарт позволяет передавать звук стереосигналом и с определенными кодеками сжатия звука и согласованными параметрами по битрейту и частотой дискретизации. Класс устройства наглядно описан тут.

    И Class = 0x41C в соответствии с этим ресурсом соответствует параметрам:

    Major Device Class -> Audio/Video

    Minor device class -> Portable Audio

    Это те параметры, которые будут видны сканирующему Bluetooth устройству, чтобы разобраться, какие сервисы доступны через это устройство. В общем, можно не заморачиваться этими параметрами и выставить, например, Class = 0x20043C Что просто будет соответствовать большему количеству сервисов. Если вас вдруг не устраивает звук, тогда переходим к настройкам звука pulseaudio:

    sudo nano /etc/pulse/daemon.conf

    и смотрим "основные" настройки типа:

    ; resample-method = speex-float-1 
    ; default-sample-format = s16le
    ; default-sample-rate = 44100 
    ; alternate-sample-rate = 48000

    В качестве мануала по pulseaudio есть неплохой ресурс.

    Кто-то рекомендует resample-metod=ffmpeg или resample-metod=speex-float-9, решать вам, если услышите разницу. Выставляем нужные параметры и убираем ";" чтобы раскомментировать строчку.

    После изменений перезапускаем pulseaudio:

    pulseaudio -k && pulseaudio --start

    И не забываем посмотреть, сколько процессорного времени отъест pulseaudio при ваших Hi-Fi настройках:

    htop

    По загрузке процессора 3-ей Raspberry Pi с использованием ЦАП (DAC) аудио платы на основе микросхемы PCM5102 файл flac 24bit читается с загрузкой около :

    10-15% для resample-metod=speex-float-1

    30% для resample-metod=ffmpeg

    60% для resample-metod=speex-float-9

    Ну и напоследок, посмотрим теперь в сторону передачи звука через WiFi с помощью технологии DLNA.

    MiniDLNA сервер

    Если на вашей Raspberry Pi находится медиа сервер, то для того чтобы ваша коллекция музыки была видна на других устройствах, поддерживающих DLNA, вам необходимо установить DLNA server. Здесь все просто: sudo apt-get install minidlna. Рекомендую ознакомиться с возможностями Minidlna здесь.

    В файле конфигурации правим папку с нашей медиатекой:

    sudo nano /etc/minidlna.conf

    И там указываем правильно папку:

    media_dir=/home/pi/Music

    Права на папку должны быть следующими:

    sudo chmod -R 755 папка

    Проверяем командой:

    sudo -u minidlna ls -l папка

    Cтартуем сервис:

    sudo sevice minidlna start

    И теперь в нашем Проводнике в закладке Сеть должно быть что-то вроде:

    И, кликая на эту ссылку, открываем в браузере статус нашего сервиса:

    А проиграть файлы можно скажем через "проигрыватель Windows Media":

    Или запустить их на андроид с помощью "Hi-Fi Cast" приложения:

    Если задача обратная и мы хотим воспроизводить музыку и фильмы, просматривать фото, которые находятся где-то удаленно на сервере через нашу Raspberry Pi, то нам потребуется установить на нее dlna render. С устройства из приложения, позволяющего находить наш raspberry media render, мы будем перенаправлять медиа контент на Raspberry Pi.

    Я нашел два рендера прекрасно работающих на Raspberry Pi. У каждого из них есть свои плюсы.

    DLNA Render Gmediarenderer

    Проект развивается и полон последователей. Из основных возможностей стоит отметить, что этот рендер переключает устройства вывода, настраивает громкость и имеет уникальный идентификатор. Это позволит настроить в сети несколько подобных устройств. Есть более подробная статья про использование всех возможностей DLNA/UPnP как распределенной структуры устройств, взаимодействующих по этим протоколам и конкретно этого рендера.

    Инсталляция не должна вызвать сложностей. Проинсталлируем необходимые пакеты и gstreamer как движок для нашего рендера:

    sudo apt-get install autoconf automake libtool git
    sudo apt-get install libupnp-dev libgstreamer1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly  gstreamer1.0-libav
    sudo apt-get install gstreamer1.0-alsa sudo apt-get install gstreamer1.0-pulseaudio

    Возьмем копию проекта и соберем его:

    git clone https://github.com/hzeller/gmrender-resurrect.git 
    cd gmrender-resurrect 
    ./autogen.sh 
    ./configure 
    make 
    sudo make install

    и запускаем:

    gmediarenderer

    Найти и управлять нашим сетевым проигрывателем через Android устройство удаленно позволит программа типа DLNA Controller. Воспользуйтесь одной из подобных программ для этого: HiFi Cast, Airpincast, Bubbleupnpcast

    Rygel DLNA Рендер

    https://wiki.gnome.org/Projects/Rygel

    Проект представляет из себя не только dlna рендер. Это полноценный медиа сервер UpnPMedia Server, который позволит и расшаривать и перенаправлять музыку, видео и фото на любое UPnP/DLNA поддерживающее устройство. Из заявленных возможностей есть конвертация на лету записи в тот формат, который будет поддерживаться устройством воспроизведения. Взаимодействие со сторонними media плеерами, такими как Totem, Rhythmbox, VLC. Удаленные запросы UPnP конвертируются в MPRIS запросы и позволяют взаимодействовать с этими media проигрывателями. Пример такого взаимодействия Rygel и VLC рассказан на странице David Wiencer.

    Суть в том, что мы запускаем VLC плеер. Устанавливаем в конфигурационном файле mpris поддержку. И при работающем Rygel приложении vlc воспроизводит медиа контент, который мы посылаем ему через DLNA Rygel.

    Проинсталлируем Rygel и VLC:

    sudo apt-get install rygel vlc rygel-playbin

    Если у вас еще не стоят gstreamer библиотеки:

    sudo apt-get install libupnp-dev libgstreamer1.0-dev  gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly  gstreamer1.0-libav 

    Убедимся, что в конфигурации включена поддержка MPRIS:

    nano ~/.config/rygel.conf

    [general]
    upnp-enabled=true
    enable-transcoding=false
    [Tracker]
    enabled=false
    [MediaExport]
    enabled=false
    [Playbin]
    enabled=false
    [GstLaunch]
    enabled=false
    [MPRIS]
    enabled=true
    [External]
    enabled=false

    И далее, создаем скрипт David Wiesner, который запускает сначала VLC, затем Rygel:

    sudo nano rygel-vlc.sh

    И в нем:

    #!/bin/bash
    vlcCall="vlc – intf dummy – fullscreen – no-osd"
    function cleanup(){
    for pid in $(pgrep -f "$vlcCall"); do
    kill -9 $pid
    done
    killall rygel
    }
    function waitCpuDecrease(){
    pid=$1
    lastCpu="0.0"
    while true; do
    cpu=$(ps S -p $pid -o pcpu=)
    sleep 0.2
    [ $(bc <<< "$cpu < $lastCpu") == 1 ] && break
    lastCpu=$cpu
    done
    }
    killall rygel and vlc
    cleanup
    launch vlc in background
    $vlcCall &
    wait until vlc has done most stuff
    waitCpuDecrease $!
    start rygel
    rygel

    Запустим его в фоновом режиме:

    sudo ./rygel-vlc.sh &

    И проверим наш DLNA render также через Android с помощью: HiFi Cast, Airpincast, Bubbleupnpcast.

    И если вы не готовы экспериментировать с Linux , то в качестве собранных, готовых к работе "из коробки" Raspberry Pi с вышеописанным функционалом мы можем вам предложить наборы ViaMyBox "Музыка флер"!

    Дистрибутив и код вы можете найти здесь.

    https://github.com/viatc/viamybox

    Надеюсь со временем, мы увидим и рассмотрим новые интересные проекты для Raspberry Pi на эту тему!

    Комментарии 16

      0
      Вы прям как Apple, переизобрели старый усилитель с малинкой ))))
        0

        И какой смысл прикручивать к старому или новому, но качественному усилению столь убогий DAC? Ему хватит столь же убогого современного усилителя/бумбокса…
        Овчинка выделки не стоит..

          0
          ещё один «одинаковый» how-to со своими нюансами — в копилку ))
            0

            Что? Опять? Медиа сервер с малиной? Да сколько можно одно и то же

              +1
              Какая версия малинки? DLNA сервер без usb 3.0 портов по моему нет смысла подымать.
                0

                Из скорости доступа по sata?

                  0
                  На 4 малине c usb 3.0 все должно быть ok. На 3-шке если музыка, скажем flac, на microsd тоже не должно быть проблем. А кто сталкивался, в каком случае и какой формат будет проседать по скорости если usb2.0?
                    +1
                    usb 2.0 с обычными флешками выдает 4 Mегабайта в секунду.
                    Если раздавать по вифи, то бывают паузы до 20 секунд в трансфере потока. Другие устройства используют сеть тоже.
                    Допустим буфер на 30 секунд. Получается, что порцию нужно докачать в три быстрее.
                    Грубо проблемы могут быть c видео свыше 720p
                  +1

                  Yeah, well, I'm gonna go build my own theme park, with blackjack and hookers. In fact, forget the park!
                  Bender Bending Rodríguez

                    0
                    Надо добавить пакет shairport-sync для приёма любых звуков с Apple. Стрим с Андроида неудобен по факту, нельзя стримить из любого приложения без рута и долгих мучений с прошивками. UPnP renderer: upmpdcli, есть готовый в репозитории.

                    С Windows можно стримить с помощью Stream What You Hear.
                      0
                      Согласен, надо будет добавить shairport-sync. Но стрим с тел на андроиде сейчас не требует ничего, кроме разрешений приложения по доступу к контенту, и мне ни разу не потребовался root доступ или какое-либо шаманство. Если брать стрим как передачу фото, видео и музыки с тел на raspberry.
                        0
                        Так контент нужен, а где его брать? Файлы, что ли?

                        Также и shairport-sync, и upmpdcli наверняка не справятся с определением нужного устройства вывода звука, его надо будет прописать в их конфигах.
                        0
                        Даже когда был смарт с рутом не смог найти альтернативу AirPlay, если кто знает такие варианты — поделитесь.
                          0
                          AirMusic вроде
                        0
                          0

                          Раньше из старых проигрывателей делали усилители, а теперь из усилителей что-то придумывают) Прогресс не стоит на месте

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое