Mein Logitech Media Server (LMS) ist so konfiguriert, dass er für alle Player im Multiroom-Audio-System ein AirPlay-Target bereit stellt. Auf jeden Player, den ich im System auswählen und mit Musik versorgen kann, kann ich auch direkt vom iPhone, iPad oder Mac streamen – per AirPlay.
Dass das über den LMS läuft, statt über eine Shairport-Instanz auf dem Lautsprecher, hat ein paar Vorteile:
- Bei meinen selbstgebauten WLAN-Lautsprechern wird der eingebaute Verstärker nur eingeschaltet, wenn Musik läuft. Dazu wird der LMS abgefragt. Wenn der AirPlay-Stream nun über den LMS läuft, bekommt er das auch mit und sorgt dafür, dass der Verstärker ein- und ausgeschaltet wird.
- Die AirPlay-Implementierung der Raspberry Pi-Images ist nicht besonders flexibel, da sie unter bestimmten Umständen mit Squeezelite, der eigentlichen Software zum Abspielen von Musik, kollidiert.
- Es gibt Player, die von selbst kein AirPlay unterstützen. Auch diese sind nun in der Lage, einen AirPlay-Stream wiederzugeben.
Möglich macht das das Plugin „ShairTunes“. Die Installation und Einrichtung beschreibe ich anhand meiner Synology DS214Play mit DSM 5.0-4493 Update 3, auf der bei mir der Logitech Media Server installiert ist.
Inhalt
Voraussetzungen
Um alles hier Beschriebene umsetzen zu können, benötigt wir:
- Den fertig konfigurierten Logitech Media Server (Anleitung)
- Eine funktionierende iPKG-Installation (Anleitung)
- Den Editor nano (Anleitung), zur Not geht auch vi
Benötigte Pakete/Software laden
Perl
über das Paketzentrum der DiskStation später neu installiert oder aktualisiert wird, muss Net::SDP
erneut installiert werden. Dazu wählt Ihr am besten den Gleichen weg, wie Ihr ihn jetzt begeht. Net::SDP über CPAN installieren
Per SSH verbinden wir uns auf die DiskStation und setzen auf der Kommandozeile folgenden Befehl ab:
DS> /usr/bin/perl -MCPAN -e shell
Es öffnet sich CPAN – ein Installer für Perl-Bibliotheken. Hier installieren wir das benötigte Paket:
cpan[1]> install Net::SDP
Die Installation läuft voll automatisch ab, sodass es hier nichts weiter zu beachten gibt. Nach Abschluss der Installation verlassen wir CPAN mit folgendem Befehl:
cpan[2]> exit
Net::SDP – der klassische Weg
Falls die vorherige Variante nicht Funktionen wählen wir den klassischen Weg. Hier installieren wir als erstes Git. Das geht am einfachsten über das Paketzentrum. Dazu loggen wir uns als Admin auf der Weboberfläche (DSM) des NAS ein und steuern das Paketzentrum an. Im oberen Bereich des Fensters klicken wir auf die Schaltfläche „Einstellungen“.
Dann fügen wir im Tab „Paketquellen“, falls noch nicht vorhanden, die Quelle SynoCommunity mit der Adresse http://packages.synocommunity.com
hinzu und verlassen dieses Fenster mit der Schaltfläche OK. Zurück im Paketzentrum-Hauptfenster wechseln wir in den Community-Bereich, suchen das Paket Git und installieren es.
Anschließend verbinden wir uns per SSH auf die DiskStation, wechseln in das home
-Verzeichnis vom root
…
DS> cd ~
… erzeugen uns ein tmp-Verzeichnis und wechseln direkt hinein:
DS> mkdir tmp
DS> cd tmp
Mit dem zuvor installierten Git holen wir uns die benötigte Bibliotheken Net::SDP
für Perl
:
DS> git clone https://github.com/njh/perl-net-sdp.git perl-net-sdp
DS> /volume1/@appstore/git/bin/git clone https://github.com/njh/perl-net-sdp.git perl-net-sdp
Jetzt noch installieren:
DS> cd perl-net-sdp
DS> ./Build
DS> ./Build test
DS> ./Build install
AirPlay-Plugin „ShairTunes“ einbinden
Wir bewegen uns nun in die Weboberfläche des Logitech Media Servers, klicken auf „Einstellungen“ und bewegen uns zum Tab „Plugins“. Ganz unten fügen wir in das Feld „Zusätzliche Repositories“ die Adresse zum Plugin ein: http://raw.github.com/StuartUSA/shairport_plugin/master/public.xml
und klicken auf die Schaltfläche „Übernehmen“ (nicht Enter drücken!).
Es erscheint eine Abfrage, dass der LMS neu gestartet werden will. Die bestätigen wir und lassen den Server neu starten. Nach kurzer Dauer ist der Server wieder da und bietet an, das soeben installierte Plugin zu aktiveren. Wir betätigen das Häkchen und warten erneut den Neustart des Servers ab.
Als nächstes müssen wir noch eine zusätzlich benötigte Bibliothek an den richtigen Ort bringen. Dazu verbinden wir uns wieder per SSH auf die DiskStation und navigieren in das Verzeichnis mit den Bibliotheken:
DS> cd /volume1/@appstore/SqueezeCenter/Cache/InstalledPlugins/Plugins/ShairTunes/shairport_helper/pre-compiled
Dort suchen wir uns die zum NAS-Prozessor passende Architektur heraus.
DS> ls
shairport_helper-armel
shairport_helper-armel-static
shairport_helper-armhf
shairport_helper-armhf-static
shairport_helper-x64-static
Die für uns passende kopieren wir nach /usr/local/bin
und benennen sie um in shairport_helper
. Beispiel:
DS> cp shairport_helper-x64-static /usr/local/bin/shairport_helper
Die Sache hat zwei kleine Stolpersteine:
- Man muss die richtige Bibliothek für sein System identifizieren. Dazu hilft vielleicht ein Blick in den entsprechenden Beitrag im Synology-Wiki. Alternativ kann man das auch durch Probieren herausfinden.
- Eventuell ist für Euer Gerät garnicht die richtige Bibliothek dabei. So war es auch bei mir, denn meine DS214Play besitzt einen x86-Prozessor (32 Bit). Hier habe ich mich der Bibliothek
shairport_helper-i386-linux
vonshairport2
bedient (Downloadlink). Dazu einfach die ZIP-Datei downloaden, entpacken und aus dem Unterordner/helperBinaries
die passende Datei angeln. Die dann auf den NAS kopieren und wie oben beschrieben umbenennen und in das richtige Verzeichnis verschieben.
shairport2
-Plugin soll eigentlich genau dieses Problem mit dem manuellen Kopieren der Bibliotheken beheben, jedoch habe ich es bisher nicht auf meiner DS214Play zum Laufen bekommen. avahi und dbus installieren
Für den korrekten Betrieb benötigen wir noch eine spezielle Version von avahi
und dbus
, die wir mit folgenden Befehlen auf der Kommandozeile installieren:
DS> addgroup netdev
DS> adduser avahi
(Sollten hier Fehlermeldungen auftreten: einfach ignorieren)
DS> ipkg install avahi
DS> ipkg install dbus
Um die Installation von avahi
zu testen, stoppen wir den bereits vorinstallierten Standard-avahi
-Dienst…
DS> /usr/syno/etc/rc.d/S99avahi.sh stop
…und starten dbus
und den soeben installierten speziellen avahi
-Dienst:
DS> /opt/etc/init.d/S20dbus start
DS> /opt/sbin/avahi-daemon &
Mit dem Befehl…
DS> avahi-browse -a
…lassen wir uns ein paar netzwerkbezogene Daten ins Terminal schreiben. Funktioniert das, war die Installation erfolgreich.
Zuletzt löschen (oder umbenennen) wir die Datei /usr/syno/etc/rc.d/S99avahi.sh
um sicherzustellen, dass bei einem Neustart nicht versehentlich der falsche Dienst gestartet wird.
DS> mv /usr/syno/etc/rc.d/S99avahi.sh /usr/syno/etc/rc.d/S99avahi_sh.bak
avahi konfigurieren
Damit alles richtig funktioniert, müssen wir noch ein paar Einstellungen vornehmen. Dazu öffnen wir uns die entsprechende Konfigurationsdatei…
DS> nano /opt/etc/avahi/avahi-daemon.conf
…und passen sie wie nachfolgend aufgeführt an:
# This file is part of avahi. # # avahi is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # avahi is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public # License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with avahi; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA. # See avahi-daemon.conf(5) for more information on this configuration # file! [server] #host-name=foo #domain-name=local #browse-domains=0pointer.de, zeroconf.org use-ipv4=yes use-ipv6=yes #allow-interfaces=eth0 #deny-interfaces=eth1 #check-response-ttl=no #use-iff-running=no #enable-dbus=yes #disallow-other-stacks=no #allow-point-to-point=no #cache-entries-max=4096 #clients-max=4096 #objects-per-client-max=1024 #entries-per-entry-group-max=32 ratelimit-interval-usec=1000000 ratelimit-burst=1000 [wide-area] enable-wide-area=yes [publish] #disable-publishing=no #disable-user-service-publishing=no #add-service-cookie=no #publish-addresses=yes #publish-hinfo=yes #publish-workstation=yes #publish-domain=yes #publish-dns-servers=192.168.50.1, 192.168.50.2 #publish-resolv-conf-dns-servers=yes publish-aaaa-on-ipv4=no publish-a-on-ipv6=no [reflector] #enable-reflector=no #reflect-ipv=no [rlimits] #rlimit-as= rlimit-core=0 rlimit-data=4194304 rlimit-fsize=0 rlimit-nofile=300 rlimit-stack=4194304 rlimit-nproc=3
Wir verlassen den Editor und speichern die Änderungen.
Erster Test: Manuell Starten
Jetzt können wir ausprobieren, ob alles geklappt hat. Dazu beenden wir zuerst den LMS…
DS> /var/packages/SqueezeCenter/scripts/start-stop-status stop
…starten als nächstes dbus
…
DS> /opt/etc/init.d/S20dbus start
…anschließend avahi
…
DS> /opt/sbin/avahi-daemon &
gefolgt vom LMS:
DS> /var/packages/SqueezeCenter/scripts/start-stop-status start
Wenn alles gut gegangen ist, zeigen Eure Apple-Geräte nun das AirPlay-Symbol und ein Druck/Klick darauf offenbart alle verfügbaren Player.
Alles automatisch starten
Bei einem Neustart wollen wir natürlich nicht immer Hand anlegen müssen, sodass wir uns nun an den Autostart machen.
Bereits vorhanden ist die Datei /opt/etc/init.d/S20dbus
, an der wir auch keine Änderungen vornehmen wollen. Neu hinzu kommt das Start/Stop-Script für avahi
…
DS> nano /opt/etc/init.d/S21avahi
…das wir mit folgendem Inhalt befüllen:
#!/bin/sh # S99avahi.sh # start avahi daemon on startup # and stop on shutdown/reboot case $1 in start) /opt/sbin/avahi-daemon & ;; stop) /opt/sbin/avahi-daemon -k ;; *) echo "Usage: $0 [start|stop]" ;; esac
Die Scripte werden übrigens in alphanumerischer Reihenfolge abgearbeitet. S20...
wird also vor S21...
ausgeführt.
Als nächstes muss der Logitech Media Server gestartet werden. Allerdings müssen wir an dieser Stelle davon ausgehen, dass er schon läuft, weil er über das Paketzentrum auf „Ausführen“ gestellt ist, und beim Hochfahren der DiskStation eventuell schon vor dbus
und avahi
gestartet wurde. Man könnte natürlich diesen Dienst über das Paketzentrum stoppen und dort generell ausgeschaltet lassen. Das schützt jedoch nicht davor, dass man bei Wartungsarbeiten den Dienst eventuell doch mal vom Paketzentrum aus startet und sich beim nächsten Neustart dann wundert, dass AirPlay plötzlich nicht mehr funktioniert.
Viel zu unsicher und der WAF sinkt schlagartig. Also machen wir einen kleinen Umweg. Beim Hochfahren des NAS werden die Scripte unter /opt/etc/init.d
mit den Zusatzparameter start
ausgeführt. Also legen wir uns ein Script an, dass auch bei Übergabe des Parameters start
den LMS stoppt:
DS> nano /opt/etc/init.d/S98LMSstop
#!/bin/sh case $1 in start) /var/packages/SqueezeCenter/scripts/start-stop-status stop ;; stop) /var/packages/SqueezeCenter/scripts/start-stop-status stop ;; *) echo "Usage: $0 [start|stop]" ;; esac
Das letzte Glied in der Reihe ist unser eigentliches Start/Stop-Script:
$ nano/opt/etc/init.d/S99LMSstart
#!/bin/sh case $1 in start) /var/packages/SqueezeCenter/scripts/start-stop-status start ;; stop) /var/packages/SqueezeCenter/scripts/start-stop-status stop ;; *) echo "Usage: $0 [start|stop]" ;; esac
Zusammengefasst stellt sich Ablauf bei einem Neustart der DiskStation so dar:
S20dbus
: startetdbus
S21avahi
: startetavahi
S98LMSstop
: stoppt den LMS, falls er denn laufen sollteS99LMSstart
: startet den LMS wieder, und wir können uns sicher sein, dassdbus
undavahi
vorher gestartet wurden
Problembehandlung ShairTunes-Plugin
Sollte trotz dessen, dass Ihr diese Anleitung korrekt befolgt habt, kein AirPlay-Target auftauchen, könnte Euch das gleiche Problem wie mich ereilt haben. Der Witz bei der Sache ist, dass ich das alles schon vor längerer Zeit mal zum Testen in Betrieb genommen habe und es anstandslos funktioniert hat. Zwei Monate später, ohne irgendein zwischenzeitliches Update, funktionierte es „plötzlich“ nicht mehr.
Der LMS meldet, dass das Plugin nicht aktiviert werden konnte und ein Blick ins Logfile bringt dann folgendes zu Tage:
[16-05-30 15:32:47.3864] Slim::bootstrap::tryModuleLoad (287) Warning: Module [Plugins ::ShairTunes::Plugin] failed to load: Can't locate Net/SDP.pm in @INC (you may need to install the Net::SDP module) (@INC co ntains: /volume1/@appstore/SqueezeCenter/Cache/InstalledPlugins /volume1/@appstore/Squ eezeCenter/CPAN/arch/5.18/i386-linux /volume1/@appstore/SqueezeCenter/CPAN/arch/5.18/i 386-linux/auto /volume1/@appstore/SqueezeCenter/CPAN/arch/5.18.4/i686-linux /volume1/@ appstore/SqueezeCenter/CPAN/arch/5.18.4/i686-linux/auto /volume1/@appstore/SqueezeCent er/CPAN/arch/5.18/i686-linux /volume1/@appstore/SqueezeCenter/CPAN/arch/5.18/i686-linu x/auto /volume1/@appstore/SqueezeCenter/CPAN/arch/i686-linux /volume1/@appstore/Squeez eCenter/lib /volume1/@appstore/SqueezeCenter/CPAN /volume1/@appstore/SqueezeCenter/CPA N/auto /volume1/@appstore/SqueezeCenter /volume1/@appstore/SqueezeCenter /usr/lib/perl 5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/ven dor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl .) at /volume1/@appstore/ SqueezeCenter/Cache/InstalledPlugins/Plugins/ShairTunes/Plugin.pm line 13. BEGIN failed--compilation aborted at /volume1/@appstore/SqueezeCenter/Cache/InstalledP lugins/Plugins/ShairTunes/Plugin.pm line 13. Compilation failed in require at (eval 1159) line 1. BEGIN failed--compilation aborted at(eval 1159) line 1.
Die Ursache ist schnell klar und die Lösung schnell gefunden:
Net-SDP
wurde nicht gefunden, obwohl wir das zuvor ja installiert hatten. Beim Installieren von Net-SDP
kam folgende Ausgabe:
root@DiskStation ~/tmp/perl-net-sdp $ ./Build install Building Net-SDP Installing /usr/share/man/man1/sdp2rat.1 Installing /usr/share/perl5/site_perl/Net/SDP.pm Installing /usr/share/perl5/site_perl/Net/SDP/Time.pm Installing /usr/share/perl5/site_perl/Net/SDP/Media.pm Installing /usr/share/man/man3/Net::SDP::Time.3 Installing /usr/share/man/man3/Net::SDP::Media.3 Installing /usr/share/man/man3/Net::SDP.3 Installing /usr/bin/sdp2rat root@DiskStation ~/tmp/perl-net-sdp $
Also machen wir das Verzeichnis global verfügbar:
DS> nano /root/.profile
Hier ergänzen wir den Eintrag der Variable PATH
mit /usr/share:
(der Doppelpunkt gehört dazu):
PATH=/usr/share:/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin
Nach einem Neustart sollte nun alles funktionieren.
- Proxmox: „Failed to connect to Server“ mit Safari auf MacOS - 28. Januar 2023
- Loxone: Benachrichtigung per Telegram - 15. Januar 2022
- Telegram: Nachrichten per Bot von der Heimautomation aufs Handy - 2. Januar 2022
13 Comments