WaveInput Eigenes Squeezeserver / Logitech-Media-Server / LMS-Image mit WaveInput-Plugin erzeugen

Wäre es nicht schön, wenn man Music von einem Android Smartphone auf jede Squeezebox im Haus zu streamen?
Auch das geht!

Um ein Docker-Image mit einem LMS mit WaveInput-Plugin zu erstellen wird folgendes benötigt

Das Chromecast Audio wurde leider von Google eingestellt und ist daher nur noch sehr schwer zu beschaffen. Alternativ kann man aber auch einen hochwertigen Bluetooth-Audio-Adapter verwenden.

Am Dockerfile müssen nur wenige Änderungen zum einfachen LMS-Image vorgenommen werden. Die Änderungen habe ich markiert.
Der Hauptunterschied liegt in der Erzeugung des Docker-Containers und bei der Konfiguration der Soundkarte und des LMS. Ich habe hier alles anhand einer TERRATEC Aureon 5.1 USB Soundkarte beschrieben.

Und wie immer: Die Veröffentlichung dieses Howtos erfolgt in der Hoffnung, dass es dem Ein oder Anderen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK.

Schnittstellen des LMS-Images

Der Logitech-Media-Server benötigt folgende Volumes:

  1. /config
  2. /music
  3. /playlists

Diese Volumes werden beim Erzeugen eines Containers auf lokale Verzeichnisse außerhalb des Containers gemappt. Ich glaube der Zweck für die Verzeichnisse ist erkennbar!? Auf jeden Fall ist auf die Zugriffrechet zu achten, da der LMS mit einem eigenen Benutzer arbeitet (ID 101).

Erzeugen des LMS-Image

Als erstes wird ein Verzeichnis angelegt, in dem alles bearbeitet wird:

mkdir lms-image
cd lms-image 

In diesem Verzeichnis wird eine Datei mit dem Namen "Dockerfile" angelegt. Diese hat den folgenden Inhalt:

FROM "raspbian-buster"
COPY logitechmediaserver.deb /logitechmediaserver.deb
COPY waveinput.zip /waveinput.zip
ENV LC_ALL="C.UTF-8" LANG="de_DE.UTF-8" LANGUAGE="de_DE.UTF-8"
RUN \
  apt-get update -qq && \
  apt-get install -qy libalgorithm-diff-perl \
    libalgorithm-diff-xs-perl \
    libalgorithm-merge-perl \
    libdpkg-perl \
    libexif12 \
    libfile-fcntllock-perl \
    libgif7 \
    libio-socket-ssl-perl \
    libjpeg8 \
    libnet-libidn-perl \
    libnet-ssleay-perl \
    libperl5.28 \
    libpng12-0 \
    perl \
    perl-modules-5.28 \
    perl-openssl-defaults \
    alsa-utils \
    unzip \
    ca-certificates && \
  apt-get clean -qy && \
  rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN /bin/bash -c '\
  export DEBIAN_FRONTEND="noninteractive" && \
  dpkg -i /logitechmediaserver.deb && \
  rm /logitechmediaserver.deb \
  unzip /waveinput.zip -d /var/lib/squeezeboxserver/Plugins && \
  rm /waveinput.zip \
  '
RUN \
  mkdir /config /music /playlists && \
  chown squeezeboxserver:nogroup /config /music /playlists
VOLUME /config /music /playlists
EXPOSE 3483 3483/udp 9000 9090
USER squeezeboxserver
ENTRYPOINT ["squeezeboxserver"]
CMD ["--prefsdir", "/config/prefs", "--logdir", "/config/logs", "--cachedir", "/config/cache"]

Zeile 02

Kopieren des heruntergeladenen LMS-Installationspaketes in das Image.

Zeile 03

Kopieren des heruntergeladenen WaveInput-Plugins in das Image.

Zeile 04

Setzen der Umgebungsvariable.

Zeilen 05 - 25

Installation notwendiger Pakete.

Zeilen 26 - 27

Aufräumen von "apt-get".

Zeilen 28 - 31

Installieren des Logitech Media Servers und löschen des Installationspaketes.

Zeilen 32 - 34

Installieren des WaveInput-Plugin und löschen des Installationspaketes.

Zeilen 35 - 38

Erzeugen der Arbeitsverzeichnisse und der Volumes als Schnittstellen zur Außenwelt.

Zeile 39

Festlegen der außen verfügbaren Ports.

Zeile 40

Festlegen des Benutzers.

Zeilen 41 - 42

Der Startbefehl des LMS.


Nun muss noch sicher gestellt werden, dass das heruntergeladene LMS-Installationspaket in das Verzeichnis "lms-image" abgelegt wird. Hierbei ist es wichtig, dass der Name des Paketes auf "logitechmediaserver.deb" abgeändert wird.
Nur wenn es im selben Verzeichnis wie das Dockerfile und mit genau diesem Namen abgelegt ist kann es beim Erzeugen des Docker Images eingelesen werden.
Gleiches gilt für das WaveInput-Plugin, der Name muss hierbei auf waveinput.zip geändert werden


Um das eigentliche Image zu erzeugen wird der folgende Befehl ausgeführt. Dabei ist zu beachten, dass der Befehl im Verzeichnis der Datei "Dockerfile" ausgeführt wird.

docker build -t docker-lms .

Erzeugen und Starten des LMS-Containers

Bevor wir den eigentlichen Container erzeugen und starten müssen einige Verzeichnisse angelegt werden.

/root/docker/lms-image/Music

In diesem Verzeichnis wird die Musiksammlung abgelegt.

mkdir /root/docker/lms-image/Music
chown 101:65534  /root/docker/lms-image/Music

/root/docker/lms-image/Playlists

Hier landen die Wiedergabelisten.

mkdir /root/docker/lms-image/Playlists
chown 101:65534  /root/docker/lms-image/Playlists

/root/docker/lms-image/Config

In diesem Verzeichnis legt der LMS seine Veränderlichen Daten an.

mkdir /root/docker/lms-image/Config
chown 101:65534  /root/docker/lms-image/Config


Nun wird es Zeit, aus dem gerade erzeugten Image einen Container zu erstellen. Dies kann aus der Kommandozeile oder aber auch durch ein Skript erfolgen.

docker run -d \
  --name="logitechmediaserver" \
  --restart=always \
  --device /dev/snd \
  -e PULSE_SERVER=unix:${XDG_RUNTIME_DIR}/pulse/native \
  -v ${XDG_RUNTIME_DIR}/pulse/native:${XDG_RUNTIME_DIR}/pulse/native \
  -v ~/.config/pulse/cookie:/root/.config/pulse/cookie \
  --group-add $(getent group audio | cut -d: -f3) \
  -p 3483:3483 \
  -p 3483:3483/udp \
  -p 9000:9000 \
  -p 9090:9090 \
  -v /etc/localtime:/etc/localtime:ro \
  -v /root/docker/lms-image/Config:/config \
  -v /root/docker/lms-image/Music:/music:ro \
  -v /root/docker/lms-image/Playlists:/playlists \
  docker-lms

Zeile 02

Hier wird der zukünftige Name des Docker Containers angegeben.

Zeile 03

In dieser Zeile wird das Restartverhalten angegeben. Ich stelle es so ein, dass der Container nicht automatisch neu gestartet wird. Der Grund wird nachfolgend noch beschrieben.

Zeilen 04 - 08

Konfiguration für den Zugriff auf die Soundkarte.

Zeilen 09 - 12

Mappen der externen zu den internen TCP-/UDP-Ports.

Zeilen 13 - 16

Mappen der Volumes zu lokalen Verzeichnissen.

Zeile 17

Das Image das als Grundlage für diesen Container verwendet wird.

Konfiguration der Soundkarte auf dem Host

Damit der LMS auf die Soundkarte zugreifen kann muss diese auf dem Host vorhanden sein. Uns interessiert hierbei vor allem die Eingangsseite. Überprüft werden kann dies mit dem Befehl "arecord -l", dessen Ausgabe im Falle einer TERRATEC Aureon 5.1 USB Soundkarte wie folgt ausschaut:

root@test-pi:~# arecord -l
**** Liste der Hardware-Geräte (CAPTURE) ****
Karte 1: Aureon51MkII [Aureon5.1MkII], Gerät 0: USB Audio [USB Audio] 
 Sub-Geräte: 1/1
 Sub-Gerät #0: subdevice #0

Wichtig ist hier die Kartennummer. Diese wird bei der Konfiguration des WaveInput-Plugin benötigt.

In diesem Beispiel möchte ich den optischen Eingang der Soundkarte verwenden. Dieser ist aber in der Regel ausgeschaltet und muss zuvor eingeschaltet werden.
Hierzu wird der Befehl "alsamixer" verwendet:

Mit der Taste "F5" wird die Ansicht auf "Alle" umgestellt und mit der Taste "F6" die Soundkarte "Aureon5.1MkII" ausgewählt.
Anschließend wird mit den Cursor-Tasten der Kanal "S/PDIF In" ausgewählt und durch drücken der Leertaste eingeschaltet:

Danach kann die Konfiguration mit der Taste "ESC" verlassen werden.

Konfiguration der Soundkarte im Docker Container

Die Einstellungen auf dem Host sind auch nach einem Neustart vorhanden. Im Docker Container selbst muss nichts konfiguriert werden. Es ist aber sinnvoll nachzuschauen ob die Soundkarte im Container vorhanden ist.

Mit dem folgenden Befehl kann eine Bash im laufenden Container geöffnet werden:

docker exec -it logitechmediaserver /bin/bash

Nun könne wiederum mit dem Befehl "arecord -l" die vorhandenen Aufnahmegeräte innerhalb des Docker Containers angezeigt werden:

squeezeboxserver@38c1da2ea2ec:/$ arecord -l
**** Liste der Hardware-Geräte (CAPTURE) ****
Karte 1: Aureon51MkII [Aureon5.1MkII], Gerät 0: USB Audio [USB Audio] 
 Sub-Geräte: 1/1
 Sub-Gerät #0: subdevice #0

Der Docker Container kann mit "exit" wieder verlassen werden.

Einrichtungsdialog des LMS

Nachdem der LMS gestartet wurde kann nun der Einrichtungsdialog durchlaufen werden. Hier muss eigentlich nur festgelegt werden in welchem Verzeichnis die Musik (Verzeichnis "/music" ) liegt und wo die Wiedergabelisten (Verzeichnis "/playlists" ) abgelegt werden.
Hierzu wird die GUI des LMS unter <http://<IP des Raspberry PI>:9000> geöffnet und der Dialog startet automatisch.

Ach ja! Die erste Abfrage nach dem Online-Konto kann übersprungen werden.

Konfiguration des WaveInput-Plugin

Das WaveInput-Plugin selbst benötigt keine weitere Konfiguration. Damit der Eingang der Soundkarte von den Squeezeboxen ausgewählt werden kann, sind Konfigurationen innerhalb des LMS notwendig.

Zunächst sollte man Sicher stellen, dass das WaveInput-Plugin aktiv ist.

Hierzu öffnet man die GUI des LMS <http://<IP des Raspberry PI>:9000> und öffnet die Einstellungen unten rechts.
Im neuen Fenster "Server-Einstellungen" muss im Register "Plugins" das WaveInput-Plugin aufgelistet und aktiviert sein.

Der Zugriff auf den Eingang der Soundkarte erfolgt über die Favoriten. Um nun den Favorit für den Eingang der Soundkarte anzulegen wird wie folgt vorgegangen:

Favoriten bearbeiten:

Neuen Favoriten anlegen:

Namen und Quelle eingeben:

Als Quelle wird "wavin:plughw:<Kartennummer>" eingegeben. Die Kartennummer ist die Nummer, welche mit "arecord -l" ermittelt wurde.

Auswahl des neuen Favoriten: