Делаем из старого усилителя многофункциональный медиа сервер с помощью 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 [snd_rpi_hifiberry_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 стандарт позволяет передавать звук стереосигналом и с определенными кодеками сжатия звука и согласованными параметрами по битрейту и частотой дискретизации.
Класс устройства наглядно описан тут.

http://domoticx.com/bluetooth-class-of-device-lijst-cod/

И 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 есть неплохой ресурс:
https://wiki.archlinux.org/index.php/PulseAudio_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)

Кто-то рекомендует 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 здесь:
http://itadept.ru/linux-dlna-server-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

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

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

А проиграть файлы можно скажем через “проигрыватель 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 : https://davidwiesner.github.io/posts/using-vlc-as-upnp-renderer-with-rygel/

Суть в том, что мы запускаем 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.

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

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

Оставайтесь с нами!