Multiroom Audio: Difference between revisions

From Chaosdorf Wiki
No edit summary
No edit summary
 
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
Im Dorf gibt es aktuell ein rudimentäres Multiroom Audio System, aufgebaut auf Snapcast. Ich hatte noch nicht genug Zeit um alle In- & Outputs einzubauen, deshalb aktuell noch <sup>beta</sup>.
Snapcast ist nur für das Routing und die Synchronisation von Audio verantwortlich, der Input wird durch andere Systeme generiert (siehe Musik rein).
{{Project
{{Project
|name=Multiroom Audio
|name=Multiroom Audio
Line 9: Line 5:
|location=Neues Dorf
|location=Neues Dorf
|image=5968845.png
|image=5968845.png
|status=beta
|status=obsolete
|people={{U|cyaniccerulean}}
|people={{U|cyaniccerulean}}
|source=https://github.com/badaix/snapcast
|source=https://github.com/badaix/snapcast
}}
}}
'''DEPRECATED'''
Im Dorf gibt es aktuell ein rudimentäres Multiroom Audio System, aufgebaut auf Snapcast. Ich hatte noch nicht genug Zeit um alle In- & Outputs einzubauen, deshalb aktuell noch <sup>beta</sup>.
Snapcast ist nur für das Routing und die Synchronisation von Audio verantwortlich, der Input wird durch andere Systeme generiert (siehe [[Multiroom Audio#Musik rein|Musik rein]]).


== Musik rein ==
== Musik rein ==


=== Generisch ===
=== TCP ===
Der Snapserver stellt 4 TCP-Ports und server.snapcast.chaosdorf.space zu Verfügung. An Port ''4951'', ''4952'', ''4953'' und ''4954'' (auch so im Webinterface als Stream benannt, siehe unten) kann jemensch PCM-Audiopakete (48kHz, 16 Bit, Stereo) schicken.
Der Snapserver stellt 4 TCP-Ports und server.snapcast.chaosdorf.space zu Verfügung. An Port ''4951'', ''4952'', ''4953'' und ''4954'' (auch so im Webinterface als Stream benannt, siehe unten) kann jemensch PCM-Audiopakete (48kHz, 16 Bit, Stereo) schicken.


Line 24: Line 27:
=== Web ===
=== Web ===
Unter mopidy.chaosdorf.space findet sich ein Webinterface, dass es möglich macht Online-Radio und den Sound von YouTube Videos direkt an Snapcast zu streamen, ohne das ein Gerät im Hintergrund weiterlaufen muss.
Unter mopidy.chaosdorf.space findet sich ein Webinterface, dass es möglich macht Online-Radio und den Sound von YouTube Videos direkt an Snapcast zu streamen, ohne das ein Gerät im Hintergrund weiterlaufen muss.
=== Bluetooth ===
Im ELab findet sich ein Bluetooth-Receiver ("Snapcast BT ELab"). Die PIN ist 0000, sobald Musik abgespielt wird, ist sie im Snapcast-Web-Interface unter "elab-bt" verfügbar und kann im ganzen Dorf abgespielt werden.


=== Linux ===
=== Linux ===
Linux kann Audio direkt per Loopback Souddevice an den Snapserver schicken (siehe Abschnitt Generisch). Das klappt z.B. mit ffmpeg oder pw-cat. Mehr Infos folgen.
Linux kann Audio direkt per Loopback Souddevice an den Snapserver schicken (siehe Abschnitt Generisch). Das klappt z.B. mit ffmpeg oder pw-cat. Mehr Infos folgen.


Windows
==== ''pw-cat'' ====
Mit dem CLI-Tool ''pw-cat'' lässt sich ein simpler PipeWire-Client erzeugen, der ein Signal von PipeWire empfangen und dann über ''stdout'' (mit optionalem Resampling) an den ''stdin'' eines beliebigen Prozesses weitergeben kann. In Kombination mit ''netcat'' (siehe "Generisch") lässt sich dann ein einfacher TCP-Streamer bauen.
 
Der einfachste Befehl, um das zu implementieren wäre wohl folgender:
pw-cat -r - | nc server.snapcast.chaosdorf.space $zielport
 
Hierbei ganz praktisch ist, dass die Defaults von ''pw-cat'' (Samplerate, Bittiefe, Channelcount) genau den Werten entsprechen, die der ''snapserver'' auf seinen Sockets erwartet, sodass da nichts extra konfiguriert werden muss. Der ''$zielport'' ist aus der Liste von Ports im Abschnitt "Generisch" zu wählen.
 
Eine Tücke an dieser Lösung ist, dass sich ''pw-cat'' per Default an das Mikrofon als Eingabestream koppelt. Hier muss dann z.B. mit einem Patchbay wie [https://gitlab.freedesktop.org/pipewire/helvum helvum] nachgeholfen werden, um die gewünschte Soundquelle an den ''pw-cat''-Prozess anzubinden.
 
Alternativ kann auch ''pw-cat --target $target'' verwendet werden, um direkt beim Start die richtige Quelle zu binden. Folgender Befehl sollte z.B. Spotify auf Stream ''4591'' abspielen:
pw-cat -r --target "spotify" - | nc server.snapcast.chaosdorf.space 4591
 
=== Windows ===


=== macOS, iOS ===
=== macOS, iOS ===
Line 39: Line 58:
Aktuell stehen zwei Streaming-Clients permanent zu Verfügung, im ''E-Lab'' und in der ''Lounge''.  
Aktuell stehen zwei Streaming-Clients permanent zu Verfügung, im ''E-Lab'' und in der ''Lounge''.  


Um die Musik zu routen (siehe Musik rein), einfach auf snapcast.chaosdorf.space den jeweiligen Input-Stream einem Ausgangsgerät zuweisen. Wer auch auf einem eigenen Gerät mithören will, kann oben rechts im Webinterface den Play-Button klicken, dann taucht der Browser als zusätzliches Ausgabegerät im Interface aus und kann zugeordnet werden. Dazu muss der Browser aber FLAC abspielen können.  
Um die Musik zu routen (siehe [[Multiroom Audio#Musik rein|Musik rein]]), einfach auf snapcast.chaosdorf.space den jeweiligen Input-Stream einem Ausgangsgerät zuweisen. Wer auch auf einem eigenen Gerät mithören will, kann oben rechts im Webinterface den Play-Button klicken, dann taucht der Browser als zusätzliches Ausgabegerät im Interface aus und kann zugeordnet werden. Dazu muss der Browser aber FLAC abspielen können.  


Für Android-Geräte gibt es auch eine "Snapcast" App [https://f-droid.org/en/packages/de.badaix.snapcast/ auf F-Droid] oder [https://play.google.com/store/apps/details?id=de.badaix.snapcast im Play Store]. Die App kann das System fernsteuern und kann auch als zusätliches Ausgabegerät genutzt werden.  
Für Android-Geräte gibt es auch eine "Snapcast" App [https://f-droid.org/en/packages/de.badaix.snapcast/ auf F-Droid] oder [https://play.google.com/store/apps/details?id=de.badaix.snapcast im Play Store]. Die App kann das System fernsteuern und kann auch als zusätliches Ausgabegerät genutzt werden.  


== Infrastruktur ==
== Infrastruktur ==
Die beiden Raspberry Pis für das E-Lab und die Lounge sind unter elab.local und lounge.local per mDNS erreichbar. SSH ist aktiviert (snapcast:snapcast) und die SD-Karte ist read-only, die Pis können also ohne Probleme vom Strom getrennt werden.
<syntaxhighlight lang="markdown">
                                                                    +------------+
+------------------------------+    PCM    +-------------+    +----| snapclient |
|Audio-Quelle                  |----------->|snapserver  |----+    +------------+
|(PCM, BT, Chromecast, Airplay)|----------->|(im Cluster) |----+    +------------+
+------------------------------+            +-------------+    +----| snapclient |
                                                                    +------------+
</syntaxhighlight>Die beiden Raspberry Pis für das E-Lab und die Lounge sind unter elab.local und lounge.local per mDNS erreichbar. SSH ist aktiviert (snapcast:snapcast) und die SD-Karte ist read-only, die Pis können also ohne Probleme vom Strom getrennt werden.
 
* Pi ELab (Snapcast Client), USB-Lautsprecher, "elab", elab.local
* Pi ELab (Bluetooth Empfänger), elab-bt.local
* Pi Lounge (Snapcast Client), am Audio-Board, lounge.local


Der Server ist im Kubernetes-Cluster deployed, und die Konfiguration ist im Repo [https://github.com/chaosdorf/flux/tree/main/apps/snapcast-server chaosdorf/flux] zu finden. Das Helm-Chart ist liegt in [https://github.com/lukasklinger/snapcast-server-k8s lukasklinger/snapcast-server-k8s].
Der Server ist im Kubernetes-Cluster deployed, und die Konfiguration ist im Repo [https://github.com/chaosdorf/flux/tree/main/apps/snapcast-server chaosdorf/flux] zu finden. Das Helm-Chart ist liegt in [https://github.com/lukasklinger/snapcast-server-k8s lukasklinger/snapcast-server-k8s].
== Playback ==
Der Snapcast-Server im Kubernetes-Cluster stellt vier verschiedene TCP-Endpoints zur Verfuegung, an die einfach PCM-Samples geschickt werden koennen. Die Adressen lauten `10.8.0.1:4591`, `10.8.0.1:4592`, `10.8.0.1:4593`, `10.8.0.1:4594` und lassen sich bei bedarf [https://github.com/lukasklinger/snapcast-server-k8s/blob/main/charts/snapcast-server/values.yaml#L132 diesem Helm-Chart] entnehmen.
Ob das funktioniert, laesst sich z.B. mit Netcat einfach testen (sollte auf dem Snapclient in der Lounge rauschen):
nc 10.8.0.1 4951 < /dev/urandom

Latest revision as of 21:54, 14 February 2024

Multiroom Audio obsolete
5968845.png
Multiroom Audio mit Snapcast im Dorf
Ort Neues Dorf
Beteiligt cyaniccerulean
Quelltext https://github.com/badaix/snapcast

DEPRECATED

Im Dorf gibt es aktuell ein rudimentäres Multiroom Audio System, aufgebaut auf Snapcast. Ich hatte noch nicht genug Zeit um alle In- & Outputs einzubauen, deshalb aktuell noch beta.

Snapcast ist nur für das Routing und die Synchronisation von Audio verantwortlich, der Input wird durch andere Systeme generiert (siehe Musik rein).


Musik rein[edit | edit source]

TCP[edit | edit source]

Der Snapserver stellt 4 TCP-Ports und server.snapcast.chaosdorf.space zu Verfügung. An Port 4951, 4952, 4953 und 4954 (auch so im Webinterface als Stream benannt, siehe unten) kann jemensch PCM-Audiopakete (48kHz, 16 Bit, Stereo) schicken.

Ob das funktioniert, lässt sich z.B. mit Netcat einfach testen (sollte auf dem Snapclient in der Lounge rauschen):

nc server.snapcast.chaosdorf.space 4951 < /dev/urandom

Web[edit | edit source]

Unter mopidy.chaosdorf.space findet sich ein Webinterface, dass es möglich macht Online-Radio und den Sound von YouTube Videos direkt an Snapcast zu streamen, ohne das ein Gerät im Hintergrund weiterlaufen muss.

Bluetooth[edit | edit source]

Im ELab findet sich ein Bluetooth-Receiver ("Snapcast BT ELab"). Die PIN ist 0000, sobald Musik abgespielt wird, ist sie im Snapcast-Web-Interface unter "elab-bt" verfügbar und kann im ganzen Dorf abgespielt werden.

Linux[edit | edit source]

Linux kann Audio direkt per Loopback Souddevice an den Snapserver schicken (siehe Abschnitt Generisch). Das klappt z.B. mit ffmpeg oder pw-cat. Mehr Infos folgen.

pw-cat[edit | edit source]

Mit dem CLI-Tool pw-cat lässt sich ein simpler PipeWire-Client erzeugen, der ein Signal von PipeWire empfangen und dann über stdout (mit optionalem Resampling) an den stdin eines beliebigen Prozesses weitergeben kann. In Kombination mit netcat (siehe "Generisch") lässt sich dann ein einfacher TCP-Streamer bauen.

Der einfachste Befehl, um das zu implementieren wäre wohl folgender:

pw-cat -r - | nc server.snapcast.chaosdorf.space $zielport

Hierbei ganz praktisch ist, dass die Defaults von pw-cat (Samplerate, Bittiefe, Channelcount) genau den Werten entsprechen, die der snapserver auf seinen Sockets erwartet, sodass da nichts extra konfiguriert werden muss. Der $zielport ist aus der Liste von Ports im Abschnitt "Generisch" zu wählen.

Eine Tücke an dieser Lösung ist, dass sich pw-cat per Default an das Mikrofon als Eingabestream koppelt. Hier muss dann z.B. mit einem Patchbay wie helvum nachgeholfen werden, um die gewünschte Soundquelle an den pw-cat-Prozess anzubinden.

Alternativ kann auch pw-cat --target $target verwendet werden, um direkt beim Start die richtige Quelle zu binden. Folgender Befehl sollte z.B. Spotify auf Stream 4591 abspielen:

pw-cat -r --target "spotify" - | nc server.snapcast.chaosdorf.space 4591

Windows[edit | edit source]

macOS, iOS[edit | edit source]

Für macOS und iOS ist AirPlay aktuell geplant, da muss aber noch dran gebastelt werden.

Android[edit | edit source]

Für Android ist Chromecast als Input geplant.

Musik raus[edit | edit source]

Aktuell stehen zwei Streaming-Clients permanent zu Verfügung, im E-Lab und in der Lounge.

Um die Musik zu routen (siehe Musik rein), einfach auf snapcast.chaosdorf.space den jeweiligen Input-Stream einem Ausgangsgerät zuweisen. Wer auch auf einem eigenen Gerät mithören will, kann oben rechts im Webinterface den Play-Button klicken, dann taucht der Browser als zusätzliches Ausgabegerät im Interface aus und kann zugeordnet werden. Dazu muss der Browser aber FLAC abspielen können.

Für Android-Geräte gibt es auch eine "Snapcast" App auf F-Droid oder im Play Store. Die App kann das System fernsteuern und kann auch als zusätliches Ausgabegerät genutzt werden.

Infrastruktur[edit | edit source]

                                                                    +------------+
+------------------------------+    PCM     +-------------+    +----| snapclient |
|Audio-Quelle                  |----------->|snapserver   |----+    +------------+
|(PCM, BT, Chromecast, Airplay)|----------->|(im Cluster) |----+    +------------+
+------------------------------+            +-------------+    +----| snapclient |
                                                                    +------------+

Die beiden Raspberry Pis für das E-Lab und die Lounge sind unter elab.local und lounge.local per mDNS erreichbar. SSH ist aktiviert (snapcast:snapcast) und die SD-Karte ist read-only, die Pis können also ohne Probleme vom Strom getrennt werden.

  • Pi ELab (Snapcast Client), USB-Lautsprecher, "elab", elab.local
  • Pi ELab (Bluetooth Empfänger), elab-bt.local
  • Pi Lounge (Snapcast Client), am Audio-Board, lounge.local

Der Server ist im Kubernetes-Cluster deployed, und die Konfiguration ist im Repo chaosdorf/flux zu finden. Das Helm-Chart ist liegt in lukasklinger/snapcast-server-k8s.