Samstag, 28. Januar 2017

HomeAutomation and multi-room audio revisited

In älteren Beiträgen hatte ich bereits meine Begeisterung über Multi-Room Audio und dessen Bedeutung für die HomeAutomation geteilt.
Inzwischen gibt es viele neue Entwicklungen, die den Möglichkeiten eines SONOS Systems etwas näher kommen.

Ich nutze nach wie vor kleine Router mit USB-Soundkarte auf OpenWRT Basis als Netzwerklautsprecher in jedem Raum. Es gibt drei Möglichkeiten, Sound auf diese Geräte zu schicken, wobei ich auf den letzten Punkt insbesonders eingehen möchte:
  1. AirPlay (iPhone, iPad, iPod touch)
  2. DLNA / UPNP-AV (Android)
  3. EsounD/PulseAudio (HomeAutomation Server)

AirPlay mit ShairPort-Sync

Auch wenn man AirPlay als geschlossenes System verachten müsste, es funktioniert einfach! Mit der neuen Implementierung des ShairPort Dienstes ist es kinderleicht Audio-Inhalte über mehrere Räume synchronisiert abzuspielen - selbst über WLAN.
Wer nur Apple Zuspieler besitzt, kommt hiermit am besten zum Ziel.

DLNA/UPNP-AV

Ich hatte mich mit meinem Blog-Post gefeiert, als ich mit Rygel nach jahrelanger Suche endlich einen DLNA Renderer für OpenWRT kompiliert bekam.
Für aktuelle OpenWRT Releases klappt das aufgrund der neuen GStreamer Version leider nicht mehr, so dass ich mich nach Alternativen umgesehen habe.
Eine ordentliche Lösung ist der GMRender-Resurrect, der deutlich mehr Meta-Daten Unterstützung liefert als mein alter Rygel (Installation auf OpenWRT). Abhängigkeiten in GStreamer - die ich nicht ganz durchschaue - führen leider dazu, dass das PlayBin Modul für MP3-Files einen komplizierten Abspielpfad wählt (ohne MadPlay), welcher zu einem stotternden Ergebnis führt.

In einem Kommentar zu meinem alten Post hat ein Benutzer UPMPDCLI als Weg für seine Lösung gefunden. Zumindest für MP3 Dateien sollte die MPD-basierte Lösung gut funktionieren.

EsounD/PulseAudio

Bei mir verrichtet ein kleines WD Mybook Live NAS seinen Dienst als HomeAutomation Server. Neben der Heizungs- und Lichtsteuerung ist auch Multi-Room Audio eine wichtige Aufgabe davon. Ich nutze seltener mein iPod/Handy um per Airplay/DLNA eine Playlist zusammenzustellen, sondern setze vielmehr auf Event-gesteuerte Aktionen (nach Hause kommen/ morgens aufstehen). Daher favorisiere ich einen Server-basierten Ansatz und hier kommt PulseAudio ins Spiel.

Inzwischen gibt es PulseAudio auch als Paket zum nachinstallieren für OpenWRT. Früher nutzte ich gern EsounD wegen des sehr geringen Footprints und minimalen Abhängigkeiten. Da PulseAudio das alte EsounD Protokoll unterstützt, lassen sich weiterhin alte EsounD Anwendungen nutzen.

Für die Netzwerkübertragung (Server zu Client) gibt es bei PulseAudio drei Möglichkeiten (Protokolle):

load-module module-esound-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16 auth-anonymous=1
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16
load-module module-rtp-recv

Während sich das module-esound-protocol wie ein alter EsounD ESD-Server verhält, ist das module-native-protocol sozusagen dessen moderner Nachfolger mit deutlich besserem Puffer-Verhalten.
Auf dem Server lassen sich auf diese Weise mit paplay/pacat/padsp Streams direkt auf die Netzwerkplayer schicken.
Alternativ kann man auf dem Server aber auch virtuelle Lautsprecher einrichten (mein NAS hat nichtmal einen USB-Port, geschweige denn eine Soundkarte). Dazu nutzt man dort:

load-module module-tunnel-sink server=<OpenWRT-ClientIP> sink_name=openwrt

Um auf mehrere Clients den gleichen Stream zu schicken, fasst man diese zu einer virtuellen Soundkarte zusammen:

load-module module-combine-sink sink_name=all slaves=openwrt1,openwrt2 adjust_time=2

Die Qualität ist ausreichend aber nicht überragend. Besser geeignet wäre ein Multicast Verfahren.
Um auf alle Empfänger mit geladenem module-rtp-recv zu spielen, benutzt man im Server:

load-module module-null-sink sink_name=rtp
load-module module-rtp-send source=rtp.monitor mtu=16384

Leider führt Multicast im WLAN zu einer Bandbreitensättigung, so dass an den Clients meistens nur ein Stottern ankommt