Slaughthammer
10.01.2022, 23:35
Moin,
ich habe dieses Wochenende den RaspberryPi in meiner mobilen Anlage mit einem neuen Betriebssystem versehen, und das wollte ich euch nicht vorenthalten. Da hat sich in den letzten Jahren doch einiges getan.
Verwendete Hardware: RaspberryPi 3B Rev1.2, Logilink UA0099 7.1 USB Sound Box
Verwendete Software: rAudio1 (https://github.com/rern/rAudio-1), ein fork von runeaudio.
Das Image bringt von sich aus schon ziemlich vieles mit was ich mir vorher mühsam in ein Raspbian eingehackt habe: MPD, Bluetooth reciever, Webinterface, macht automatisch nen WLAN Accespoint auf, wenn kein bekanntes Netzwerk da ist... dazu noch viele Goodies, die ich bisher nicht hatte/brauchte wie: Spotify, Airplay, Snapcast, UPnP... Das einzige was eigentlich noch fehlt ist der DSP-Kram. Und damit man das Nachrüsten davon hier mal an einer Stelle immer wiederfindet dokumentiere ich das hier jetzt.
Also erstmal das Image flashen und die initiale config machen. Das ist erstaunlich komfortabel geworden, der macht einfach seinen AP auf, kurz mit dem Handy reinverbinden, Webinterface aufrufen und ins lokale WLAN einpflegen, alles so wie man es von gekauften Geräten auch gewöhnt ist. Aber keine Angst, die gefürchtete Konsole kommt jetzt als nächstes. Nicht vergessen das initiale Update im Webinterface unter Addons - Update zu machen!
Erstmal müssen wir die Audiosignale irgendwo abgreifen um die in die DSP-Sektion zu füttern. Zum Glück hat ALSA dafür gleich das richtige Werkzeug an Bord: Das Loopback Device. Um das zu spezifizieren brauchen wir zwei config files, die wir auf dem Pi erstellen müssen. Dazu also erstmal aus der eigenen Konsole (ich nutze Powershell) per ssh verbinden. Im Webinterface wird die dafür nötige Adresse freundlicherweise gleich angezeigt. Falls man einen halbwegs kompetentes WLAN hat sollte man sich mit "ssh raudio.local -l root" einloggen können. Das geforderte Passwort ist "ros". Das sollte man auch gleich ändern mit dem Befehl "passwd root". Dann mit dem Befehl
nano /etc/modprobe.d/alsa-aloop.conf
die Datei "alsa-aloop.conf" in dem angegebenen Verzeichnis erstellen und im Editor öffnen. Dort dann
options snd-aloop enable=1 index=2 pcm_substreams=1 id=Loopback
eingeben und strg+x beenden, mit y bestätigen dass man die Änderung speichern will und mit Enter bestätigen dass man die gerade erstellte leere Datei überschreiben möchte. Jetzt ist definiert, wie das Loopback device ungefähr aussehen soll.
Dann müssen wir dem System nur noch sagen, dass das auch beim boot automatisch geladen werden soll. Dazu erstellen wir wieder eine Datei:
nano /etc/modules-load.d/snd_aloop.conf
und schreiben hinein
snd_aloop
wieder schließen und speichern. Beim nächsten Neustart ist das Loopback Device dann da.
Leider hat der Schöpfer dieser Software was gegen Loopbacks und die aus der Liste der wählbaren Outputs ausgefiltert! Das sind aber nur zwei Scripte die nicht kompiliert werden müssen und man einfach so ändern kann. In der Datei /srv/http/bash/player.sh steht in Zeile 170
devices+=$'\n\n<bll># aplay -l | grep ^card</bll>\n'$( aplay -l | grep ^card | grep -v Loopback )
Das ändern wir jetzt in
devices+=$'\n\n<bll># aplay -l | grep ^card</bll>\n'$( aplay -l | grep ^card )
genauso ändern wir in /srv/http/bash/mpd-devices.sh in Zeile 16
aplay=$( aplay -l 2> /dev/null | grep '^card' | grep -v Loopback )
in
aplay=$( aplay -l 2> /dev/null | grep '^card' )
Kann man in nano ("nano /srv/http/bash/player.sh") direkt in der Konsole machen. Zeile 170 suchen geht mit strg+/
Jetzt die Kiste einmal neustarten falls das nach dem erstellen des loopbacks nicht gemacht wurde. Dann kann man im Webinterface auf einmal auf das Loopback als Output auswählen. Diese Änderungen werden möglicherweise durch ein update von rAudio über das Webinterface wieder zurückgefahren, also am besten nicht mehr updaten.
Jetzt noch die DSP-Funktionalität installieren. Ich mache das nach Richard Taylor mit ecasound (https://rtaylor.sites.tru.ca/2013/06/25/digital-crossovereq-with-open-source-software-howto/)
Dazu also erstmal ecasound installieren, ist zum Glück im Repository.
pacman -S ecasound
und wieder die Nachfrage mit y bestätigen. Die praktischen Plugins, die der Taylor nutzt sind leider nicht so einfach verfügbar, die muss man sich aus den Scourcen selber bauen. Da runeaudio möglichst schlank gehalten wurde müssen wir dafür erst die nötige Infrastruktur installieren:
pacman -S ladspa
pacman -S cmake
pacman -S make
pacman -S base-devel
jeweils immer die Installation bestätigen.
Als nächstes brauchen wir die scourcen von den rt-plugins, also mit wget herunterladen und mit tar entpacken:
wget https://faculty.tru.ca/rtaylor/rt-plugins/rt-plugins-0.0.6.tar.gz
tar -xf rt-plugins-0.0.6.tar.gz
Den Rest kann man dann auch vom Entwickler selber abtippen:
Enter the build folder: cd rt-plugins-x.x.x/build/
Run cmake: cmake ..
Maybe edit the Makefile (you probably don't need to)
Compile the code: make
Install it: sudo make install
Damit die Plugins dann von ecasound beim aufrufen auch gefunden werden, müssen wir dem System noch sagen wo es danach suchen soll:
export LADSPA_PATH=/usr/local/lib/ladspa:/usr/lib/ladspa
Um ecasound nun zu starten müssen wir den recht länglichen Befehl, der gleichzeitig das komplette Setup definiert in die Konsole eingeben. Da man das nicht nach jeden neustrart machen möchte, habe ich mir das als Service automatisiert. Dazu erstellen wir die Datei:
nano /etc/systemd/system/ecasound.service
und schreiben hinein:
[Unit]
Description=ecasound
[Service]
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=ecasound # without any quote
Environment="LADSPA_PATH=/usr/local/lib/ladspa:/usr/lib/ladspa"
ExecStart=-/usr/bin/ecasound -D -z:mixmode,sum -x -a:pre -i:alsahw,2,1,0 -pf:home/pi/.config/ecasound/pre.ecp -o:loop,1 -a:subL,subR,mid,tweeter
-i:loop,1 -a:subL -pf:/home/pi/.config/ecasound/Sub.ecp -ea:50 -chorder:1,0,0,0,0,0 -a:subR -pf:/home/pi/.config/ecasound/Sub.ecp -ea:50
-chorder:2,0,0,0,0,0 -a:mid -pf:/home/pi/.config/ecasound/Mid.ecp -chorder:0,0,1,0,2,0 -a:tweeter -pf:/home/pi/.config/ecasound/Tweeter.ecp
-chorder:0,0,0,1,0,2 -a:subL,subR,mid,tweeter -f:16,6,44100 -o:alsa,surround51:ICUSBAUDIO7D -B:rtlowlatency -tl -r:SCHED_FIFO -b:768
[Install]
WantedBy=default.target
Das was da hinter 'ExecStart=-/usr/bin' steht ist die komplette konfiguration von ecasound! (der darf keine Zeilenschaltungen enthalten, ich hab die hier nur eingefügt damit das Layout nicht kaputt geht) Nur die einzelnen Filter habe ich in externe Dateien ausgelagert damit der Befehl nicht noch länger wird. Den Anfang "ecasound -D -z:mixmode,sum -x -a:pre -i:alsahw,2,1,0" und das Ende "-f:16,6,44100 -o:alsa,surround51:ICUSBAUDIO7D -B:rtlowlatency -tl -r:SCHED_FIFO -b:768" sollte man hier einfach übernehmen, zumindest wenn man maximal 6 ausgangskanäle braucht. Ansonsten entsprechend anpassen. Die 6 in "-f:16,6,44100" steht für die Anzahl der Kanäle, und die 51 in "o:alsa,surround51:ICUSBAUDIO7D" steht dafür, dass ALSA die Soundkarte mit einem 5.1 mapping öffnet. Wenn man alle 8 Kanäle braucht also entsprechend auf "-f:16,8,44100" und "o:alsa,surround71:ICUSBAUDIO7D" ändern. "ICUSBAUDIO7D" ist der Name der Logilink 7.1 USB Sound Box in diesem System. Wer ne andere Soundkarte nutzt kann unter "aplay -l" nachgucken wie die heißt und das da entsprechend ändern. Wie man den Teil dazwischen ermittelt, da verweise ich einfach mal auf die schon genannte Anleitung von Richard Taylor (https://rtaylor.sites.tru.ca/2013/06/25/digital-crossovereq-with-open-source-software-howto/). Er verlinkt da auch auf seine Plugins die wir vorhin schon gebaut und installiert haben. Im wesentlichen sind die sehr ähnlich wie die Filter in EqualizerAPO zu benutzen, die Syntax ist etwas anders, funktiionalität aber vergleichbar. Wenn ich Hoch/tiefpässe höherer Ordnung brauche gucke ich immer hier (https://www.earlevel.com/main/2016/09/29/cascading-filters/) nach wie ich die kaskadieren muss (ein LR-Filter n-ter Ordnung sind auch nur zwei BW-Filter n/2-ter Ordnung hintereinander). Und LR4 Filter sind ja sogar inklusive.
Ich empfehele es sich diesen Befehl irgendwo handlich abzuspeichern und dann zuerst einfach so in der Konsole zu testen ob er wirklich das tut was er soll. Einen Testlauf bricht man strg+c wieder ab, der läuft sonst endlos weiter. Dann wenn alles läuft also diesen Befehl in besagte Datei "/etc/systemd/system/ecasound.service" eintragen. Jetzt müssen wir den Service nur noch aktivieren:
systemctl enable ecasound.service
Um zu testen ob alles geklappt hat starte ich den Service dann manuell:
systemctl start ecasound
und gucke ob alles in Ordnung ist
systemctl status ecasound
Da sollte dann in grün was von active stehen. Wenn man jetzt noch was an der Datei ecasound.service verändern muss, hinterher mit einem kurzen "systemctl daemon-reload" diese änderungen auch übernehmen
Wenn das jetzt läuft sollte sich das ganze System sich bei jedem Start von alleine in diesen Zustand bringen, dass alles an Audiowiedergabe über das Loopback Device durch ecasound auf die spezifizierte Soundkarte geleitet wird.
Ich hoffe das hilft irgendjemandem mal. Im Zweifelsfall mir selbst, wenn ich das alles beim nächsten Bastelanfall wieder vergessen habe.
Gruß, Onno
ich habe dieses Wochenende den RaspberryPi in meiner mobilen Anlage mit einem neuen Betriebssystem versehen, und das wollte ich euch nicht vorenthalten. Da hat sich in den letzten Jahren doch einiges getan.
Verwendete Hardware: RaspberryPi 3B Rev1.2, Logilink UA0099 7.1 USB Sound Box
Verwendete Software: rAudio1 (https://github.com/rern/rAudio-1), ein fork von runeaudio.
Das Image bringt von sich aus schon ziemlich vieles mit was ich mir vorher mühsam in ein Raspbian eingehackt habe: MPD, Bluetooth reciever, Webinterface, macht automatisch nen WLAN Accespoint auf, wenn kein bekanntes Netzwerk da ist... dazu noch viele Goodies, die ich bisher nicht hatte/brauchte wie: Spotify, Airplay, Snapcast, UPnP... Das einzige was eigentlich noch fehlt ist der DSP-Kram. Und damit man das Nachrüsten davon hier mal an einer Stelle immer wiederfindet dokumentiere ich das hier jetzt.
Also erstmal das Image flashen und die initiale config machen. Das ist erstaunlich komfortabel geworden, der macht einfach seinen AP auf, kurz mit dem Handy reinverbinden, Webinterface aufrufen und ins lokale WLAN einpflegen, alles so wie man es von gekauften Geräten auch gewöhnt ist. Aber keine Angst, die gefürchtete Konsole kommt jetzt als nächstes. Nicht vergessen das initiale Update im Webinterface unter Addons - Update zu machen!
Erstmal müssen wir die Audiosignale irgendwo abgreifen um die in die DSP-Sektion zu füttern. Zum Glück hat ALSA dafür gleich das richtige Werkzeug an Bord: Das Loopback Device. Um das zu spezifizieren brauchen wir zwei config files, die wir auf dem Pi erstellen müssen. Dazu also erstmal aus der eigenen Konsole (ich nutze Powershell) per ssh verbinden. Im Webinterface wird die dafür nötige Adresse freundlicherweise gleich angezeigt. Falls man einen halbwegs kompetentes WLAN hat sollte man sich mit "ssh raudio.local -l root" einloggen können. Das geforderte Passwort ist "ros". Das sollte man auch gleich ändern mit dem Befehl "passwd root". Dann mit dem Befehl
nano /etc/modprobe.d/alsa-aloop.conf
die Datei "alsa-aloop.conf" in dem angegebenen Verzeichnis erstellen und im Editor öffnen. Dort dann
options snd-aloop enable=1 index=2 pcm_substreams=1 id=Loopback
eingeben und strg+x beenden, mit y bestätigen dass man die Änderung speichern will und mit Enter bestätigen dass man die gerade erstellte leere Datei überschreiben möchte. Jetzt ist definiert, wie das Loopback device ungefähr aussehen soll.
Dann müssen wir dem System nur noch sagen, dass das auch beim boot automatisch geladen werden soll. Dazu erstellen wir wieder eine Datei:
nano /etc/modules-load.d/snd_aloop.conf
und schreiben hinein
snd_aloop
wieder schließen und speichern. Beim nächsten Neustart ist das Loopback Device dann da.
Leider hat der Schöpfer dieser Software was gegen Loopbacks und die aus der Liste der wählbaren Outputs ausgefiltert! Das sind aber nur zwei Scripte die nicht kompiliert werden müssen und man einfach so ändern kann. In der Datei /srv/http/bash/player.sh steht in Zeile 170
devices+=$'\n\n<bll># aplay -l | grep ^card</bll>\n'$( aplay -l | grep ^card | grep -v Loopback )
Das ändern wir jetzt in
devices+=$'\n\n<bll># aplay -l | grep ^card</bll>\n'$( aplay -l | grep ^card )
genauso ändern wir in /srv/http/bash/mpd-devices.sh in Zeile 16
aplay=$( aplay -l 2> /dev/null | grep '^card' | grep -v Loopback )
in
aplay=$( aplay -l 2> /dev/null | grep '^card' )
Kann man in nano ("nano /srv/http/bash/player.sh") direkt in der Konsole machen. Zeile 170 suchen geht mit strg+/
Jetzt die Kiste einmal neustarten falls das nach dem erstellen des loopbacks nicht gemacht wurde. Dann kann man im Webinterface auf einmal auf das Loopback als Output auswählen. Diese Änderungen werden möglicherweise durch ein update von rAudio über das Webinterface wieder zurückgefahren, also am besten nicht mehr updaten.
Jetzt noch die DSP-Funktionalität installieren. Ich mache das nach Richard Taylor mit ecasound (https://rtaylor.sites.tru.ca/2013/06/25/digital-crossovereq-with-open-source-software-howto/)
Dazu also erstmal ecasound installieren, ist zum Glück im Repository.
pacman -S ecasound
und wieder die Nachfrage mit y bestätigen. Die praktischen Plugins, die der Taylor nutzt sind leider nicht so einfach verfügbar, die muss man sich aus den Scourcen selber bauen. Da runeaudio möglichst schlank gehalten wurde müssen wir dafür erst die nötige Infrastruktur installieren:
pacman -S ladspa
pacman -S cmake
pacman -S make
pacman -S base-devel
jeweils immer die Installation bestätigen.
Als nächstes brauchen wir die scourcen von den rt-plugins, also mit wget herunterladen und mit tar entpacken:
wget https://faculty.tru.ca/rtaylor/rt-plugins/rt-plugins-0.0.6.tar.gz
tar -xf rt-plugins-0.0.6.tar.gz
Den Rest kann man dann auch vom Entwickler selber abtippen:
Enter the build folder: cd rt-plugins-x.x.x/build/
Run cmake: cmake ..
Maybe edit the Makefile (you probably don't need to)
Compile the code: make
Install it: sudo make install
Damit die Plugins dann von ecasound beim aufrufen auch gefunden werden, müssen wir dem System noch sagen wo es danach suchen soll:
export LADSPA_PATH=/usr/local/lib/ladspa:/usr/lib/ladspa
Um ecasound nun zu starten müssen wir den recht länglichen Befehl, der gleichzeitig das komplette Setup definiert in die Konsole eingeben. Da man das nicht nach jeden neustrart machen möchte, habe ich mir das als Service automatisiert. Dazu erstellen wir die Datei:
nano /etc/systemd/system/ecasound.service
und schreiben hinein:
[Unit]
Description=ecasound
[Service]
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=ecasound # without any quote
Environment="LADSPA_PATH=/usr/local/lib/ladspa:/usr/lib/ladspa"
ExecStart=-/usr/bin/ecasound -D -z:mixmode,sum -x -a:pre -i:alsahw,2,1,0 -pf:home/pi/.config/ecasound/pre.ecp -o:loop,1 -a:subL,subR,mid,tweeter
-i:loop,1 -a:subL -pf:/home/pi/.config/ecasound/Sub.ecp -ea:50 -chorder:1,0,0,0,0,0 -a:subR -pf:/home/pi/.config/ecasound/Sub.ecp -ea:50
-chorder:2,0,0,0,0,0 -a:mid -pf:/home/pi/.config/ecasound/Mid.ecp -chorder:0,0,1,0,2,0 -a:tweeter -pf:/home/pi/.config/ecasound/Tweeter.ecp
-chorder:0,0,0,1,0,2 -a:subL,subR,mid,tweeter -f:16,6,44100 -o:alsa,surround51:ICUSBAUDIO7D -B:rtlowlatency -tl -r:SCHED_FIFO -b:768
[Install]
WantedBy=default.target
Das was da hinter 'ExecStart=-/usr/bin' steht ist die komplette konfiguration von ecasound! (der darf keine Zeilenschaltungen enthalten, ich hab die hier nur eingefügt damit das Layout nicht kaputt geht) Nur die einzelnen Filter habe ich in externe Dateien ausgelagert damit der Befehl nicht noch länger wird. Den Anfang "ecasound -D -z:mixmode,sum -x -a:pre -i:alsahw,2,1,0" und das Ende "-f:16,6,44100 -o:alsa,surround51:ICUSBAUDIO7D -B:rtlowlatency -tl -r:SCHED_FIFO -b:768" sollte man hier einfach übernehmen, zumindest wenn man maximal 6 ausgangskanäle braucht. Ansonsten entsprechend anpassen. Die 6 in "-f:16,6,44100" steht für die Anzahl der Kanäle, und die 51 in "o:alsa,surround51:ICUSBAUDIO7D" steht dafür, dass ALSA die Soundkarte mit einem 5.1 mapping öffnet. Wenn man alle 8 Kanäle braucht also entsprechend auf "-f:16,8,44100" und "o:alsa,surround71:ICUSBAUDIO7D" ändern. "ICUSBAUDIO7D" ist der Name der Logilink 7.1 USB Sound Box in diesem System. Wer ne andere Soundkarte nutzt kann unter "aplay -l" nachgucken wie die heißt und das da entsprechend ändern. Wie man den Teil dazwischen ermittelt, da verweise ich einfach mal auf die schon genannte Anleitung von Richard Taylor (https://rtaylor.sites.tru.ca/2013/06/25/digital-crossovereq-with-open-source-software-howto/). Er verlinkt da auch auf seine Plugins die wir vorhin schon gebaut und installiert haben. Im wesentlichen sind die sehr ähnlich wie die Filter in EqualizerAPO zu benutzen, die Syntax ist etwas anders, funktiionalität aber vergleichbar. Wenn ich Hoch/tiefpässe höherer Ordnung brauche gucke ich immer hier (https://www.earlevel.com/main/2016/09/29/cascading-filters/) nach wie ich die kaskadieren muss (ein LR-Filter n-ter Ordnung sind auch nur zwei BW-Filter n/2-ter Ordnung hintereinander). Und LR4 Filter sind ja sogar inklusive.
Ich empfehele es sich diesen Befehl irgendwo handlich abzuspeichern und dann zuerst einfach so in der Konsole zu testen ob er wirklich das tut was er soll. Einen Testlauf bricht man strg+c wieder ab, der läuft sonst endlos weiter. Dann wenn alles läuft also diesen Befehl in besagte Datei "/etc/systemd/system/ecasound.service" eintragen. Jetzt müssen wir den Service nur noch aktivieren:
systemctl enable ecasound.service
Um zu testen ob alles geklappt hat starte ich den Service dann manuell:
systemctl start ecasound
und gucke ob alles in Ordnung ist
systemctl status ecasound
Da sollte dann in grün was von active stehen. Wenn man jetzt noch was an der Datei ecasound.service verändern muss, hinterher mit einem kurzen "systemctl daemon-reload" diese änderungen auch übernehmen
Wenn das jetzt läuft sollte sich das ganze System sich bei jedem Start von alleine in diesen Zustand bringen, dass alles an Audiowiedergabe über das Loopback Device durch ecasound auf die spezifizierte Soundkarte geleitet wird.
Ich hoffe das hilft irgendjemandem mal. Im Zweifelsfall mir selbst, wenn ich das alles beim nächsten Bastelanfall wieder vergessen habe.
Gruß, Onno