Freitag, 24. August 2012

HomeAutomation SoundClients (Teil 3)


In den Server Wrapper Dateien konnte man bereits sehen, die Clients wurden einfach über den "$esdopt" Parameter angegeben. Ein Client ist ein beliebiges Gerät, auf dem der ESD Server läuft. Es gab mal für Windows einen virtuellen Soundkartentreiber, aktuell würde ich EsounD aus dem Cygwin Projekt verwenden. Allerdings gibt es bei uns zu Hause keinen stationären Rechner mehr, auf den es sich lohnen würde Audio auszugeben (früher in der WG liefen die Kisten noch ständig...) - deshalb geht es hier um dedizierte Clients.

Ich bin bei OpenWRT als "Distribution" meiner Wahl gelandet, weil es eine Vielzahl an Plattformen unterstützt. Auf der Homepage kann man unter "Supported Devices" eine umfangreiche Hardwareliste finden. Es sollte sich jeder Router eignen, solange er einen USB-Port besitzt, in den eine billige USB-Soundkarte kommt.
Schafft man gezielt Hardware an, helfen Preisvergleichsportale (mein Favorit ist geizhals.at/de), auf denen man teilweise bei den Router-Features auf "USB" und "OpenWRT" Filtern kann.


Ich bin ein Fan von Wiederverwendung alter Hardware, also nutze ich zwei NSLUs und einen Asus WL-500g Premium. Die Vorgehensweise ist aber ähnlich.

Bis die iGeräte aufkamen, waren die Clients reine ESD-Soundkarten, die die Streams des Servers ausgaben. Mit unserem ersten iPod Touch kam der Wunsch auf, auch direkt auf die Clients zu streamen. Mit shairport habe ich eine Software gefunden, die genau das tut!


Leider kommt man nicht umhin, eine eigene Build-Umgebung aufzusetzen, da man das EsounD Paket für den eigenen Router selbst übersetzen muss. Ich empfehle die aktuelle Backfire Version aus dem Repository auf dem Router zu installieren und nur die eigenen Pakete nachzuinstallieren.

Die Build-Root erhält man unter Linux als non-root Benutzer per:

mkdir openwrt
cd openwrt
svn co svn://svn.openwrt.org/openwrt/branches/backfire

Dazu das EsounD-Paket und noch ein paar Patches herunterladen:

wget http://loetzimmer.de/patches/openwrt_esound_src.tgz
wget http://loetzimmer.de/patches/openwrt_libao.patch
wget http://loetzimmer.de/patches/openwrt_shairport.patch
tar xfz openwrt_esound_src.tgz

Zunächst müssen die optionalen Paketquellen (feeds) konfiguriert (und ggf. gepatcht) werden:

cd backfire
cp feeds.conf.default feeds.conf
echo "src-link alex ../../private_feeds/" >> feeds.conf
echo "src-git jlars git://github.com/jlars/packages.git;master" >> feeds.conf
./scripts/feeds update -a
patch -p0 < ../openwrt_shairport.patch
patch -p0 < ../openwrt_libao.patch
./scripts/feeds update jlars
./scripts/feeds install esound
./scripts/feeds install shairport

Meine Patches fügen dem OpenWRT Makefile für Shairport u.A. noch Init-Scripte und Config-Dateien hinzu.
Da nur ein Prozess auf die Soundkarte zugreifen kann (Alsa DMIX ist zu aufwändig für die kleinen Kisten), erweitere ich das libao-Makefile um EsounD Support und füge eine Config bei, so dass das ESD-Plugin als Standard-Ausgabe auf den lokalen ESD per TCP/IP zugreift.

Jetzt geht es an die Einstellungen:

make menuconfig

Es muss zunächst die Target Platform ausgewählt werden. Alle Pakete sind mehr oder weniger optional und verlängern nur die notwendige Zeit zum Kompilieren (um Konfigurationsfehlern vorzubeugen, würde ich immer alle Pakete aus dem Repository laden - soweit vorhanden!).
Unter "Sound" gibt es nun die Pakete "EsounD" und "shairport", die man per "m"-Taste auswählen kann (nicht die Perl-Variante auswählen). Alle abhängigen Pakete werden automatisch gewählt.

Ein abschließendes "make" baut zunächst den Cross-Compiler für das gewählte Target, dann die einzelnen Pakete (und wahrscheinlich ein komplettes Image).
Uns interessieren zunächst aber nur die Pakete in

bin/<target-platform>/packages

Auf einem Web-Server abgelegt, können wir die benötigten Pakete ins "/tmp" Verzeichnis des Routers laden und per

opkg install <paket_target-platform>.ipk

installieren. Dabei werden alle Abhängigkeiten aufgelistet, so dass wir mit Sicherheit einige Pakete nachladen und ggf. vorher installieren müssen.

Experimentierfreudige finden meine kompilierten Pakete unter http://loetzimmer.de/openwrt/.

ACHTUNG: Die Images sind wahrscheinlich absolut unbrauchbar, da sie auf meine Bedürfnisse zugeschnitten sind! Mit den Paketen kann man sich zumindest nichts kaputt machen...