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

Als erstes installieren wir 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

Wenn Perl über das Paketzentrum der DiskStation später neu installiert oder aktualisiert wird, muss Net::SDP über die gleiche Weise erneut installiert werden.

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

Hinterlasse einen Kommentar

13 Kommentare auf "Multiroom-Audio: AirPlay über Logitech Media Server (DiskStation)"

Benachrichtige mich zu:
avatar
Christian
Gast
Christian

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

Lg
Christian

alex
Gast
alex

Hi, deine Anleitung hat genau einmal funktioniert und nach einem reboot dann nicht mehr.
der DBUS dienst startet nun nicht mehr richtig man kann ihn weder stoppen noch starten,
avahi meldet immer dbus wurde nicht gefunden

laut diesem eintrag https://bugs.launchpad.net/ubuntu/+source/dbus/+bug/811441
könnte es an den startscript liegen

alex
Gast
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.
alex
Gast
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

alex
Gast
alex

synology DSM 6.0.2-8451 Update 7

alex
Gast
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.
alex
Gast
alex

nein, der output war von einem manuellem Start

Hans
Gast
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?

wpDiscuz
Translate »