# Netzwerk-Audio mit Raspberry Pi als Retrofit Lösung ## Dokumentlinks - die [Entscheidung zwischen Buildroot und Raspberry Pi OS](./docs/buildroot-vs-rpios.md) - die [Testspezifikation](docs/test-specs.md) ## Produkt-Backlog | ID | Priorität | User Story | Schätzung Zeitaufwand \[h\] | |---|---|---|---| | 0 | 1 | Ich als Anwender möchte über das eingebettete System ein analoges Tonsignal ausgeben, um über ein angeschlossenes analoges Wiedergabegerät das Tonsignal abspielen zu können. | 2 | | 1 | 2 | Ich als Anwender möchte eine Bluetooth-Verbindung zum eingebetteten System herstellen, um Bluetooth als Audio-Quelle zu verwenden. | 3 | | 2 | 1 | Ich als Anwender möchte eine Spotify-Connect-Verbindung zum eingebetteten System herstellen, um Spotify Connect als Audio-Quelle zu verwenden. | 2 | | 3 | 2 | Ich als Anwender möchte eine UPnP-Verbindung zum eingebetteten System herstellen, um mit Hilfe von UPnP MP3-Dateien wiederzugeben. | 3 | | 4 | 8 | Ich als Anwender möchte das eingebettete System schnell über ein angepasstes Betriebssystem-Image auf die microSD-Karte des eingebetteten Systems bereitstellen können, um es leicht vervielfältigen zu können. | 8 | | 5 | 4 | Ich als Anwender möchte das eingebettete System durch eine LAN- oder WLAN-Verbindung in ein Netzwerk integrieren, um über UPnP und Spotify Connect Audio wiederzugeben. | 8 | | 6 | 7 | Ich als Bastler möchte zwischen dem HiFiBerry DAC 2 Pro und dem internen DAC wechseln können, um das System auf meine individuellen Bedürfnisse anzupassen. | 8 | | 7 | 6 | Ich als Anwender möchte Software-Updates von Betriebssystem und verwendeten Software-Bibliotheken automatisch erhalten, um von den neuesten Software-Versionen zu profitieren. | 3 | | 8 | 3 | Ich als Anwender möchte eine Schnellstartanleitung erhalten, um über die erforderlichen Einstellungen informiert zu sein. | 4 | | 9 | 8 | Als Anwender möchte ich die Lautstärke über eine App auf meinem Android-Telefon steuern können, um nicht auf die Steuerung der Musik-Anlage und der Kommandozeile der Lösung angewiesen zu sein. | 20 | | 10 | 6 | Als Anwender möchte ich das eingebettete System nicht manuell herunterfahren möchten, sondern mit Hilfe eines Schreibschutzes des internen Datenträgers ohne Schädigung des Systems zum Ausschalten die Spannungsversorgung trennen können | 3 | ## Technische Spezifikationen zu Produkt-Backlog ### Wiedergabe eines analogen Tonsignals Referenz zu User-Story-ID: 0 - es erfolgt eine Ausgabe eines analogen Tonsignals über die auf dem DAC vorhandenen Ausgabeports - für das HiFiBerry DAC2 Pro: Stereo 3,5 mm Klinkenanschluss oder Stereo Cinch - für den Raspberry Pi integrierten DAC: Stereo 3,5 mm Klinkenanschluss - Die Linux-Komponente [ALSA](https://de.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture) steuert den Treiber des DACs an, um ein digitales Tonsignal daran zu senden ### Herstellen einer Bluetooth-Verbindung Referenz zu User-Story-ID: 1 - mit Hilfe von Bluetooth-fähigen Android-, IOS-, Linux- und Windows-Endgeräten soll ein digitales Tonsignal an das eingebettete System gesendet werden können - das eingebettete System kann in den Kopplungsmodus wechseln, um neue Geräte zu koppeln - das eingebettete System speichert bereits gekoppelte Geräte ab, um diese erneut zu verbinden - es sollte nur maximal ein Gerät gleichzeitig mit dem eingebetteten System verbunden sein - das eingehende digitale Audiosignal wird mit Hilfe des PulseAudio Bluetooth Moduls verabeitet ### Herstellen einer Spotify-Connect-Verbindung Referenz zu User-Story-ID: 2 - Wiedergabequelle und das eingebettete System befinden sich im gleichen Subnetz ohne Netzwerkrestriktionen des LAN-zu-LAN-Verkehrs - Verbindung zwischen Wiedergabequelle und dem eingebetteten System wird aufgebaut - für die Verwendung von Spotify Connect ist eine Internet-Verbindung notwendig, um zu den Spotify-Servern zu verbinden und Musik zu streamen ### Herstellen einer UPnP-Verbindung Referenz zu User-Story-ID: 3 - Wiedergabequelle und das eingebettete System befinden sich im gleichen Subnetz ohne Netzwerkrestriktionen des LAN-zu-LAN-Verkehrs - Verbindung zwischen Wiedergabequelle und dem eingebetteten System wird aufgebaut ### Bereitstellung des angepassten Betriebssystem-Images Referenz zu User-Story-ID: 4 - das eingebettete System soll über ein Image bereitgestellt werden können - das Image soll als IMG-Datei abliegen - das Image enthält alle Partitionen und den Bootsektor, der für den Betrieb nötig ist - das Image wird mit Hilfe des Tools ``dd`` erzeugt - das Image soll sowohl mit Hilfe von Linux oder Windows auf die microSD-Karte geflasht werden können ### Netzwerkverbindung des eingebetteten Systems Referenz zu User-Story-ID: 5 - das eingebettete System soll per LAN oder WLAN mit einem IP-Netzwerk verbunden werden können - das eingebettete System soll eine automatische IP-Konfiguration per DHCP erhalten ### Wechsel des DACs Referenz zu User-Story-ID: 6 - ein Wechsel des DACs soll durch Interaktion des Anwenders über eine Software-Schnittstelle möglich sein - grundsätzlich wird die Wahl eines geeigneten Treibers dem Linux-Kernel überlassen - es kann notwendig sein, über ein Device-Tree-Overlay einen Treiber zu inkludieren, der möglicherweise mit anderen Treibern im Konflikt steht - eine solche Situation ensteht zum Beispiel zwischen dem internen DAC des Raspberry Pis und einem HiFiBerry-DAC - in diesem Fall soll die o.g. Software-Schnittstelle die notwendigen Änderungen an der Datei ``/boot/config.txt`` des eingebetteten Systems durchführen ### Update-Installation des eingebetetteten Systems Referenz zu User-Story-ID: 7 - beim Systemstart sollen periodisch, sofern eine Internetverbindung besteht, Updates gesucht und installiert werden - alle durch den Paketmanager verwalteten Pakete sollen dabei aktualisiert werden - der Schreibschutz soll während der Update-Installation temporär deaktiviert werden ### Schnellstartanleitung Referenz zu User-Story-ID: 8 - in einer Schnellstartanleitung sollen für den Anwender alle erforderlichen Schritte enthalten sein, um das eingebettete System in Betrieb nehmen zu können - die Verbindungsmöglichkeiten sollen an Hand eines Beispiels dargestellt werden ### Lautstärkeregelung mit Hilfe einer Android-App Referenz zu User-Story-ID: 9 - es wird eine Android-App zur Verfügung gestellt, welche mit Hilfe einer REST-API Zugriff auf die Lautstärke-Regelung, Bluetooth-Regelung (An-/Ausschalten, Pairing-Modus) und das Einleiten eines System-Neustarts bereitstellt - die REST-API wird mit Hilfe einer Flask-Anwendung auf dem eingebetteten System bereitgestellt ### Schreibschutz Referenz zu User-Story-ID: 10 - das System soll durch Stecken und Ziehen, beziehungsweise Ein- und Ausschalten der Spannungsversorgung, ein- und ausgeschaltet werden - um einen inkonsistenten Zustand des Speichermediums des eingebetteten Systems zu vermeiden, soll dieses schreibgeschützt sein - es soll die Möglichkeit bestehen, für das Koppeln neuer Bluetooth-Geräte und dem Installieren von Software-Updates den Schreibschutz temporär zu deaktivieren ## Meilensteine Wir benutzen die Github Milestones Funktion [hier](https://github.com/importPI19fromDHGE/emb3-gulla-kerst/milestones?with_issues=no). ## Bestellliste | ID | Artikel | Menge | Quelle | Einzelpreis | Händler | | -: | ------- | ----- | ------ | ----------- | ------- | | 0 | Raspberry Pi 4B 4GB Elementary Kit | 1 | https://www.berrybase.de/raspberry-pi/raspberry-pi-computer/kits/raspberry-pi-4-computer-modell-b-4gb-elementary-kit | 69,50€ | BerryBase | | 1 | SanDisk MicroSD-Karte 32GB | 1 | https://www.berrybase.de/raspberry-pi/raspberry-pi-computer/speicherkarten/sandisk-extreme-micro-sdhc-a1-uhs-i-u3-speicherkarte-43-adapter-32gb?c=183 | 8,85€ | BerryBase | | 2 | HiFiBerry DAC2 Pro | 1 | https://www.hifiberry.com/shop/boards/hifiberry-dac2-pro/ | 39,90€ | HiFiBerry | | 3 | Gehäuse für Raspberry Pi 4 mit HiFiBerry DAC | 1 | Yannis | *nach Vereinbarung*<!--1 Kasten Bier--> | Yannis | ## Orga: Git-Submodule Dieses Projekt enthält Git Submodule. Diese erfordern ein gesondertes Vorgehen verglichen mit den restlichen Inhalten dieses Repos: - sollen beim Auschecken gleich alle Submodule mit ausgecheckt werden, muss rekursiv geklont werden: ``git clone --recurse-submodules <repo-url>`` - Um lustige Konflikte in Git zu vermeiden, sind alle Änderungen an den Submodulen bitte in ihren jeweiligen Haupt-Repos durchzuführen und hier zu pullen Wenn Git Submodule bisher gänzlich unbekannt sind, ist ein Blick auf die [Dokumentation](https://git-scm.com/book/en/v2/Git-Tools-Submodules) empfehlenswert.