Neues aus der Linuxwerkstatt: Pipewire verantwortlich?

An manchen Tagen komme ich mir vor, als wenn ich eine Linuxwerkstatt hätte, statt einen PC mit einer Stableversion von Fedora. Da bin ich öfters im Redhat Bugtracker als auf meiner eigenen Webseite.

Neues aus der Linuxwerkstatt: Pipewire verantwortlich?

Der.. nein, sagen wir lieber „ein“ aktueller Fall in der Werkstatt ist das Unvermögen von Firefox Netflix über Wochen sauber abzuspielen ohne Probleme auf die oder andere Art zu produzieren.

Was war geschehen?

Am 2. Mai hatte Firefox beschlossen, daß ich zwar von Netflix den Ton hören dürfte, aber das Video wäre jetzt Privatsache vom Videodecoder. Die Bilder stockten also, insgesamt war alles im Firefox zäh wie Sirup. Die Probleme mit Netflix dauerten auch bis in den nächsten Tag an, wobei auch Webseiten sirupartig waren. Auf einem Ryzen 5600 mit RTX 4060 ist das eher kein Hardwareproblem.

Der Verdacht lag nahe, daß Firefox statt die GPU zu verwenden beschlossen hatte die CPU die ganzen bunten Dinge berechnen zu lassen, was zu immensen Performanceproblemen führen würde. Nach ein paar Stunden des selben Tages gab sich das Problem, was aber nicht an Firefox lag wie sich rausstellte.

Da es ein gstreamer Update gab, daß zeitlich korrelierte, habe ich mal ein Ticket im Bugzilla von Redhat aufgemacht, prompt hat sich da ein anderer User gemeldet, der ähnliche Probleme mit Firefoxplayback auf einer AMD RT 6800 hatte.

Die Zeit vergeht… alle sind ratlos

Die zeit vergeht, alle sind ratlos, dann schlägt das Schicksal erneut gnadenlos zu: Letzte Nacht stoppt Netflix mit dem gleichen Problem während ich ein Video mit OpenShot geschnitten habe. Also erstmal Firefox neugestartet, aber das half nichts. Dann gesagt: „nicht so wichtig“ und mich ums Video gekümmert. Das habe ich mir mit Celluloid ansehen wollen und was muß ich feststellen? Kein Videoplayback, nur Ton. „Oh oh“

Nichts geht mehr

Celluloid, MPV, Totem produzierten ALLE das gleiche Muster, nicht mal die Fortschritte auf den Zeitskalen wurden durchgezählt, die Videos zeigten nur das erste Bild vom Video was üblicherweise Schwarz ist, so daß man das nciht direkt merkt. Zum Glück hatte ich ein anderes Video das direkt ein Bild da hatte. Skippe man im Video rum, kamen auch anderen Standbilder raus.

Um Kernelprobleme auszuschließen habe ich rebooted, aber das half rein gar nichts. Alle Videoplayer zeigten das gleiche Bild ( sprichwörtlich ) … „wirklich alle?“ Nein, ein kleiner, oft völlig unbedachter Videoplayer trotzte dem Problem und spielte weiterhin alle Videos perfekt ab. Und an dem Punkt geht einem ein Licht auf.

Der Player war FFPLAY from FFMPEG Paket. Das heißt, alle anderen Videoplayer und Firefox müssen etwas gemeinsam haben: Pulseaudioplayback.

Der Workaround

Ums Kurz zu machen: sobald jemand via Pulseaudio auf das den HDMI Ausgang meiner Nvidiakarte wollte, stockte das Video, aber der Ton ging sauber durch, was  völlig GAGA ist, weil das kein bisschen was mit Grafiken zu tun hat.

Ich denke folgendes ist passiert: Pipewire läuft ja unter der Haube von Pulse und ist für Video und Audio zuständig. Das hat ein Problem mit dem HDMI Device gehabt. Das muß aber in der User-Config persistent gespeichert sein, also quasi blanker Unsinn im State File oder so etwas in der Art, weil es ja rebootfest war und das geht nur, wenn sich jemand den „Zustand“ von dem Device irgendwo auf der Platte merkt!

Ich habe dann einfach mal das Device via PulseAudio-Lautstärkeregler abgeschaltet, so daß alle Audiostreams über das Mainboard liefen und was soll ich sagen : 100% alle Probleme verschwunden. Alle Player funktionierten wieder 1a.

Nach dem das Ausgabegerät wieder auf dem selben Weg eingeschaltet wurde, liefen die Player auch mit dem HDMI Gerät wieder einwandfrei.

Im Bugtracker wird fleißig am Problem gearbeitet, sollte also bald gefixt sein.

Ups: Automatischen Microphone Gain aktiviert?

Erfüllt Euch euer spracherkennender Assistent nicht mehr jeden Wunsch? Melden die Kollegen im Videochat vielleicht, daß Ihr schon wieder mal so leise seid, dabei hattet Ihr das erst gestern richtig eingestellt? Glückwunsch, entweder Ihr seid Opfer von „wir wissen es besser“ Idioten geworden die AGC eingebaut haben oder Euch hat ein Pipewire-Glitch  erwischt.

Ups: Automatischen Microphone Gain aktiviert?

Alle paar Jahre muß man sich gegen einen dieser Trottel zur Wehr setzen, die es für eine total geniale Idee halten, daß andere Menschen zu blöd sind Ihre Mikrofoneinstellungen richtig zu machen und bauen dann AGC ein (Automatic Gain Control) . Das dachte ich natürlich zu erst auch und habe hier einen nicht ganz erst gemeinten Rant geschrieben, der sich gewaschen hatte 🙂 was wirklich schade ist, daß Ihr den jetzt leider verpasst, ehrlich 😉 Aber es war halt nur ein komischer Bug.

Was ist passiert?

Das Eingabegerät meiner Webcam, das hier das Mikro mimt, fing wilde an, die Pegel von selbst anzupassen, je nachdem wie man gesprochen hat. AMGC halt. Chromium machte das auch mal eine Weile, zum Glück nur für sich, war trotzdem in der Videokonferenz eine Vollkatastrophe, weil man es nicht abschalten konnte. Pipewire ist zum Glück nicht Chromium.

Den Glitch beheben geht so:

Macht mal den PulseAudio Lautstärkeregler auf -> Konfiguration

Das Konfigurationfesnter vom Pulseaudiolautstärkeregler. Wir sehen eine Auswahlbox für den normalen Treiber und den PRO AUDIO Treiber! PRO AUDIO ist ausgewählt als FixDann stellt Euren Treiber auf Pro Audio um und Fertig. AGC gibt es für PRO AUDIO Experten nicht 🙂 Die Aufnahmeeinstellungen für Carola und andere Apps reagieren teilweise ganz übel darauf, daß das Device neu initialisiert wird, deswegen kann es sein, daß Ihr die Anwendungen, die das Geräte währenddessen benutzen, neu starten müßt.

Wer es noch nicht gemerkt hat, das mit den Profis war natürlich nur ein Wortspiel 🙂 Mehr Infos zu PRO AUDIO gibt es hier.

Hat das auch Nachteile?

Ja, jetzt müssen alle Apps Ihren Pegel selbst regeln. Eure Carola lässt Euch da nicht im Stich, die Spracherkennung macht das schon. Andere Anwendungen wie Firefox könnten aber jetzt andere Pegel brauchen und müßten das selbst setzen. Das kann in die Hose gehen. Zum Glück musste es so nicht bleiben!

Aber, wie das Leben so spielt 😀

Am Ende half das:

  • Auf PRO AUDIO umstellen,
    Apps neustarten,
    auf „Analog Stereo-Eingabe“ umstellen,
    Apps nochmal starten.

AGC war deaktiviert. Es lohnt sich also den Ärger herunterzuschlucken, außer man hat ein Blog, und einfach mal zu schauen, ob es nicht doch einfach nur ein kleiner Initialisierungsbug war 😉 Natürlich wird jetzt wieder jemand fragen, wieso das Pipewires Schuld war, das offenbart der Fix, weil „PRO AUDIO“ und „Analog Stereo-Eingaben“ sogenannte Pipewireprofile sind, die das Gerät konfigurieren. Wenn man AGC mit einem Wechsel abschalten kann, war es wohl offensichtlich Pipewire selbst. Ich vermute ein skuriller Glitch beim Init des Gerätes. Mehr werden wir nie erfahren.

PVA: Clusterplugin für Carola

Ihr habt es wahrscheinlich schon immer gewusst: Computer wollen die Welt erobern 😉 Die Welteroberungspläne von Carola sind da eher bescheiden, sie will nur Eure Wohnung kontrollieren 😀

PVA: Clusterplugin für Carola

Am Dienstagabend war es soweit, das neue Clusterplugin für Carola hatte Premiere bei Linux am Dienstag. Natürlich ist Carola eine von den netten und will euch nur besser dienen und da kam Ihr die Idee, sich doch auf alle brauchbaren Geräte im Heimnetz auszudehnen. Dafür brauchen wir Pipewire, denn das macht es möglich, den Lautsprecher und das Mikro eines anderen Linuxcomputers zu benutzen.

Wir brauchen Pipewiretunnel

Damit Ihr versteht was Carola hinter den Kulissen macht, werden wir das in Handarbeit durchgehen.

Zuerst brauchen wir einen TCP-Server. Dazu loggt man sich z.b. per SSH auf dem Clienten in die Desktopsession ein. Diese ist zwangsweise notwendig, weil ohne eine Desktopsession gibt es keinen Pipewireservice. Der Desktop muß nicht offen sein, der Screensafer kann ruhig an sein.

DEV=wlp2s0
IP=$(ip -h -f inet a show dev $DEV | grep inet | awk ‚{print $2;}‘ | sed -e „s/\/.*$//“|head -n 1)
pactl load-module module-native-protocol-tcp port=4656 listen=$IP
pactl load-module module-native-protocol-tcp port=4657 listen=$IP

Die Anweisungen oben extrahieren die IPv4 Adresse des PCs, solange das Device stimmt. Aber da Ihr die IP kennt, weil Ihr sonst nicht auf den Computer einloggen könntet, kann man sich eine automatische Ermittlung auch schenken. Vielleicht möchte ja jemand das beim Desktopstart automatisch machen, dann wäre es ganz hilfreich. In jedem Fall muß es eine extern erreichbare IP sein und es darf keine Firewall im Weg sein.

Wir brauchen zwei Tunnelports, einen für den Lautsprecher (4656) und einen für das Mikrofon(4657). In der neuesten Pluginversion kann man die Ports frei wählen, was es am Ende erlaubt, daß mehrere Instanzen von Carola auf verschiedenen PCs laufen können. Bevor jetzt jemand feuchte Träume bekommt, daß alle Clienten auch eine Kontrollinstanz sein können, davon würde ich dringend abraten, weil so ein Kreislauf nur zu totalen Fails führen wird.

Wofür ist es dann gedacht?

Wenn Ihr z.b. einen Heimautomatisierungsserver habt, der sich ganz speziell nur um Fenster, Türen, Steckdosen usw. kümmern soll, dann möchte man dem ja vielleicht auch von überall aus Anweisungen geben können. Das Mediacenter kann sich auf Video und Ton spezialisieren und der Rechner mit der KI-GPU auf was auch immer der tun soll 🙂 Solange jede Kontrollinstanz auf andere Keywords reagiert, ist das völlig unproblematisch, solange keine der erzeugten Antworten Triggerworte für andere Instanzen enthalten. Ihr seid gewarnt worden!

Als nächstes erstellen wir den Tunnel:

pactl load-module module-tunnel-sink server=tcp:192.168.0.109:4656 source_name=Küche
pactl load-module module-tunnel-source server=tcp:192.168.0.109:4657 source_name=Küche

Und schon ist Euer Tunnel fertig.

Kleiner Tip: auf beiden Seiten des Tunnels muß Wireplumber als Pipewire-Sessionmanager laufen, sonst funktioniert es nicht. Das wurde auf schmerzliche Weise klar, daß es mit dem Pinephone genau deswegen nicht ging. Das Paket „pipewire-pulse“ wäre auch hilfreich.

Und wie spielt man da jetzt Musik ein?

Damit durch den Tunnel Musik gesendet wird, können wir den Tunnel entweder im Pulseaudio-Lautstärkeregler als Ziel der Musikapp auswählen, oder wir verdrahten das auch in der Konsole. Eure Entscheidung!

pw-link qmmp:output_FL „Tunnel to tcp:192.168.0.109:4656/:playback_FL“
pw-link qmmp:output_FR „Tunnel to tcp:192.168.0.109:4656/:playback_FR“

Im Beispiel ist das jetzt für QMMP. Gleicher Befehl mit -d Option entfernt den Link wieder.  Das war es, wenn man das per Hand machen will. Noch einige hilfreiche Befehle:

pactl list short modules
pactl list short sinks
pactl list short sources
pactl unload-module ID

wobei die ID für das Unload bei der Liste als erste Spalte angezeigt wird.

Was macht Carola jetzt alles automatisch?

Da es ja um einen Cluster geht, gehen wir mal davon aus, daß es mehrere Geräte gibt und die nicht immer erreichbar sind. Carola detektiert also automatisch, ob ein Client erreichbar ist, ob der schon im Live-Clustersetup drin ist oder ob der nicht mehr erreichbar ist. Entsprechend dem Ergebnisses wirft sie alle toten Clienten raus und nimmt sie wieder auf, wenn sie wieder da sind. Wegen Update rebooten ist also absolut kein Problem 😉

Sollte Carola selbst neugestartet werden, detektiert sie den Ist-Zustand und hat danach wieder die volle Kontrolle. Die Tunnel brechen also nicht zusammen, wenn man den Assistenten neustartet.

Damit der Ton wirklich an alle Clienten rausgeht und man nicht jede einzelne App immer direkt verdrahten muß, wo Carola ja auch gar nicht weiß, welche überhaupt in die Clusternodes sollen, gibt es zwei „öffentliche“ Sinks: ALLTUNNEL und ALLMICS. Ist denke ich, selbsterklärend. Die Tunnel werden also nicht mit der App, sondern mit ALL* verbunden und die App gibt dann den Ton auf diese Node aus.

Das sieht dann so aus:

jede menge Verbindungen zwischen den Sinks und Sources

Oben das lokale Mikrofon, die Tunnelmikros und das Sammelsink ALLMICS, unten dann das entsprechende Lautsprechersetup. QMMP gibt hier den Ton erst an EASYEFFECTS aus, das leitet den dann an ALLTUNNEL weiter (Links im Bild). Das gesamte Bild paßt leider nicht in den Artikel, dafür ist es zu breit aufgestellt.

Ihr könnt Euch jetzt sicher denken, daß das mit beliebig vielen Tunneln funktioniert. Ich hatte heute mal den Lautsprecher meiner Eltern über einen SSH Tunnel + Pipewiretunnel angebunden und der Ton kam problemlos dort an.

Es kann aber zum Stottereffekt kommen. Das Pinephone leidet auch dadrunter. Was es genau auslöst, kann nur vermutet werden. Pipewire berichtet dann von einem Bufferunderrun, also das nicht genug Daten in den Tunnel geschoben werden konnten, was bedeutet würde, daß das Netz oder das Pine zu lahm waren. I.d.R. regelt sich das aber nach 1-2 Minuten wieder ein. Gerade jetzt habe ich ein Tablet und ein Pinephone drin (sieht man oben) und die laufen beide perfekt.

Ein Wort zu Latenzen

Ihr habt ein Netzwerk zwischen Eurem PC und dem Lautsprecher im Gerät, das geht nicht latenzfrei an der Musik vorbei. Da es sich aber um ein Multi-Room-Setup handelt, wo jedes Gerät in einem eigenen Zimmer steht, ist das nicht dramatisch, da es sich bei Gigabit nur um Millisekunden handelt. Man kann es aber deutlich wahrnehmen, da wir im Gehör nur maximal 4ms ausgleichen können. Also stellt die Geräte einfach nicht nebeneinander, dann ist alles gut 🙂

Dank Pipewires Geschwindigkeitsvorteil gegenüber Pulseaudio, sind es nur wenig mehr als 4 ms. Beim Wandern durch die Wohnung wird es nicht negativ auffallen.

Was kann man als nächstes erwarten kann

Der nächste Schritt wird dann sein, daß auf Geräte die das unterstützen, ein Videostream gesendet werden kann. Da wäre es natürlich natürlich extrem hilfreich wenn man auch einen Bildschirm dran hätte, der nicht nur die Sperrseite anzeigt.

Auch Apps auf den Endgeräten zu starten, sollte kein Problem darstellen. Mir schwebt da z.b. Netflix vor, was sich ja anbietet. Wenn das Netflixplugin dann z.b. die Anweisung „Carola spiele Netflix Enterprise in der Küche“ bekommt, könnte das den nötigen Befehl an den Cluster übergeben, der das dann an den richtigen Clienten sendet.

Möglich wäre auch, das man ein RTMP Streaming vom PC zum Clienten macht, mit MPV am Ende ist das selbst auf einem Pine 2G kein Problem, wenn die Netzwerkanbindung mitspielt.

Source: PVA@Github
Repo:  https://github.com/Cyborgscode/Personal-Voice-Assistent#how-to-install