Multiroom-Audio: AirPlay über Logitech Media Server (DiskStation)

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.

Voraussetzungen

Um alles hier Beschriebene umsetzen zu können, benötigt wir:

  1. Den fertig konfigurierten Logitech Media Server (Anleitung)
  2. Eine funktionierende iPKG-Installation (Anleitung)
  3. Den Editor nano (Anleitung), zur Not geht auch vi

Benötigte Pakete/Software laden

Wenn 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“.

Synology DiskStation: Paketquellen hinzufügen

Synology DiskStation: Paketquellen hinzufügen

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

Sollte bei euch die Fehlermeldung kommen, dass Git nicht gefunden werden konnte, müsst Ihr den kompletten Pfad zu Git angeben. Bei mir dann so:

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!).

Logitech Media Server: Zusätzliche Repositories laden

Logitech Media Server: Zusätzliche Repositories laden

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:

  1. 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.
  2. 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 von shairport2 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.
Das 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.

Multiroom-Audio: Player werden als AirPlay-Targets angezeigt

Multiroom-Audio: Player werden als AirPlay-Targets angezeigt

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:

  1. S20dbus: startet dbus
  2. S21avahi: startet avahi
  3. S98LMSstop: stoppt den LMS, falls er denn laufen sollte
  4. S99LMSstart: startet den LMS wieder, und wir können uns sicher sein, dass dbus und avahi 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.

Sebastian

Sebastian

...ist staatlich geprüfter Techniker für Elektrotechnik, Schwerpunkt Prozessautomatisierung und Energietechnik. Die Themen Automatisierung und Programmierung haben es ihm besonders angetan.
Außerdem ist er für jede technische Spielerei zu haben 😉
Sebastian

Letzte Artikel von Sebastian (Alle anzeigen)

13 Comments

  1. Antworten Christian

    Mit welcher Version vom DSM hast du dies gemacht? Klappt bei mir nicht, LMS startet danach nicht mehr richtig…

    Lg
    Christian

    • Sebastian
      Antworten Sebastian

      Hi Alex,
      bei mir war das damals auch ein ganz schönes Gefrickel und im Moment weiß ich auch nicht, wie ich Dich Unterstützen kann. Aber wenn es schonmal funktioniert hat, bekommst Du es sicher auch ein zweites mal hin.
      Vielleicht kannst Du uns ja noch deine DSM-Version und Deinen Lösungsweg mitteilen, wenn es bei Dir läuft.

  2. Antworten alex

    wenn ich ‚rm -rf /opt/var/run/dbus‘ und dann ‚/opt/etc/init.d/S20dbus start‘ eingebe kann ich auch den avahi wieder starten und nach einem restart des LMS klappt auch die verbindung mit AirPlay

    dann hab ich mal versucht die startscripts manuell zu starten
    da kam das

    /var/packages/SqueezeCenter/scripts/start-stop-status: line 61: [: too many arguments
    /var/packages/SqueezeCenter/scripts/start-stop-status: line 64: [: too many arguments
    ln: invalid option -- '>'
    Try `ln --help' for more information.
  3. Antworten alex

    also dbus als sudo starten
    dann avahi als sudo starten
    dann slimeserver starten

    so bekomme ich eine laufende airplay umgebung, die aber nach einem reboot wieder weg ist
    keine ahnung wie ich den dbus und avahi als sudo beim booten starten kann

    • Sebastian
      Antworten Sebastian

      Hi Alex,
      du bist auf einem guten Weg. Es gibt verschiedene Wege, Scripte beim Systemstart automatisch ausführen zu lassen.
      Besondere Rechte muss man hier meist nicht beachten, da in aller Regel alles als Root ausgeführt wird.
      Ein häufiger Fehler ist jedoch, dass Pfade nicht vollständig in den Scripten angegeben werden. Der Benutzer, mit dem man das testet, hat den Pfad vielleicht in seiner Pfadvariable, deswegen funktioniert es beim Test und beim Systemstart dann nicht mehr. Über genau dieses Verhalten stolpern auch viele bei Cron.

      Welches System benutzt Du eigentlich?

  4. Antworten alex

    also das avahi script geht

    admin@Networkspace1:/usr/local/etc/rc.d$ sudo ./S21avahi start
    admin@Networkspace1:/usr/local/etc/rc.d$ Found user 'avahi' (UID 84) and group 'avahi' (GID 84).
    Successfully dropped root privileges.
    avahi-daemon 0.6.30 starting up.
    WARNING: No NSS support for mDNS detected, consider installing nss-mdns!
    Loading service file /opt/etc/avahi/services/sftp-ssh.service.
    Loading service file /opt/etc/avahi/services/ssh.service.
    Joining mDNS multicast group on interface eth0.IPv4 with address 192.168.100.74.
    New relevant interface eth0.IPv4 for mDNS.
    Network interface enumeration completed.
    Registering new address record for 2003:c5:e3c1:1a11:211:32ff:fe46:1e82 on eth0.*.
    Registering new address record for 192.168.100.74 on eth0.IPv4.
    Registering HINFO record with values 'ARMV7L'/'LINUX'.
    Server startup complete. Host name is Networkspace1.local. Local service cookie is 1015105915.
    Service "Networkspace1" (/opt/etc/avahi/services/ssh.service) successfully established.
    Service "Networkspace1" (/opt/etc/avahi/services/sftp-ssh.service) successfully established.

    aber die beiden anderen machen komische sachen

    admin@Networkspace1:/usr/local/etc/rc.d$ sudo ./S98LMSstop start
    /var/packages/SqueezeCenter/scripts/start-stop-status: line 30: [: too many arguments
    /var/packages/SqueezeCenter/scripts/start-stop-status: line 76: [: too many arguments
    rm: cannot remove `/usr/syno/synoman/webman/3rdparty/SqueezeCenter': No such file or directory
    kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
    sleep: invalid time interval `1'
    Try `sleep --help' for more information.
    sleep: invalid time interval `1'
    Try `sleep --help' for more information.
    sleep: invalid time interval `1'
    Try `sleep --help' for more information.
    sleep: invalid time interval `1'
    Try `sleep --help' for more information.
    sleep: invalid time interval `1'
    Try `sleep --help' for more information.
    sleep: invalid time interval `1'
    Try `sleep --help' for more information.
    sleep: invalid time interval `1'
    Try `sleep --help' for more information.
    sleep: invalid time interval `1'
    Try `sleep --help' for more information.
    sleep: invalid time interval `1'
    Try `sleep --help' for more information.
    sleep: invalid time interval `1'
    

    und das hier

    admin@Networkspace1:/usr/local/etc/rc.d$ sudo ./S99LMSstart start
    sudo: lrwxrwxrwx: command not found
    
    /var/packages/SqueezeCenter/scripts/start-stop-status: line 61: [: too many arguments
    /var/packages/SqueezeCenter/scripts/start-stop-status: line 64: [: too many arguments
    ln: invalid option -- '>'
    Try `ln --help' for more information.
    
  5. Antworten Hans

    Ich habe das über max2play eingerichtet, das waren ein paar Klicks und hat ca. drei Minuten gedauert.

    Eine Frage:
    Ist es möglich, vom iPad auf mehrere Player zu streamen?

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Translate »