LAHA und die Latenzfalle

Kleines Update zu LAHA, dem Multiroom Sound und PulseAudio.

Stand der Dinge

Wie man es drehen und wenden will, die fertigen Tools zum Abspielen von PCM Sound haben alle irgendeine Macke.

PAPLAY benutzt PulseAudio. Das ist praktisch ein Todesurteil für eine stabile Latenz.
APLAY   benutzt Alsa, das defaultmäßig … PulseAudio benutzt. Siehe erstens 🙂
*JACK*  nun Jack möchte gern alleine tätig sein, ohne Konkurrenz. Fällt auch aus.

Da APLAY und PAPLAY per Default einen PA Stream zum Abspielen benutzen, haben beide in der Form das gleiche Problem: Die Audiolatenz des Playstreams steigt mit der Zeit an. d.b. alle anderen Geräte müßten mitwandern. Blöd nur, das Androids gar keine Latenzwanderung haben und selbst wenn Sie es hätten, wäre das eine blödsinnige Lösung. Jetzt fragt Ihr Euch natürlich: was labbert der da? Da muß man jetzt weiiiiiit ausholen.

Also, wenn man mit PAPLAY Sound ausgibt, geht PAPLAY zum PAServer und sagt dem, das DER eine Latenz wählen soll. Das macht der dann auch, nachdem die ersten Daten geflossen sind und die pegelt sich mit 16Bit Stereo und 48000″hz“ bei rund 1,9s ein. Richtig gelesen 1,9 Sekunden. Nach 40 Minuten sind wir bei knappen 5 Sekunden, wenns dumm läuft. Wenns gut läuft bei 2,4s . Das entscheidet PA selbst, ich nehme an, nach internen Fehlberechnungen aller gestarteten, gestoppten, bewegten etc. Streams die auf dem System drauf sind. Ich hab es noch nicht im Source gefunden. Es ist eigentlich das Ziel eines Audioservers die Latenz niedrig zu halten, aus irgendeinem Grund, ist dem PA-Latenzalgorithmus das egal.

Wenn man jetzt denkt, daß der Befehl ja eine OPTION für die gewünschte Latenz hat und sich schon freut, daß die dann ja als Ziel eingehalten wird .. ähm ja, also wie soll ich das Schreiben ohne verklagt zu werden??? Lieber nicht, hier ein Beispiel: 500ms angegeben, Latenz beginnt bei 320ms und wandert pö-â-pö so Richtung 500ms, durchbricht den Median, und verschwindet alsbald jenseits von Gut und Böse im Sekundenbereich.

Wenn man auf die glorreiche Idee kommt, da das anzugeben, was der Algo vorher selbst ausgerechnet hat, dann bekommt man nicht 1,9s , nö, mehr so 1s+- und dann kommt das gleiche Spiel wie vorher bei 500ms.
Ja, man könnte jetzt die PAPLAY-Routine kapern, den anderen Geräten die Latenzen mitteilen und denen somit zu einem Sync verhelfen. ABER.. die Latenz wird ja immer größer, was bedeutet, daß bei jedem neuen Sync mehr Zeit vergeht, bis man was hört. Also auch mal 5 Sekunden schwarzes nichts. Das ist hochgradig Inakzeptabel.

Bugreports sind raus, werden nicht helfen, weil (C) endet 2006 . Sieht nicht so aus, als wenn da wer dran arbeitet.

Kommen wir zu ALSA

APLAY kann ALSA-Devices direkt ansprechen. Warum nutzen wir dann nicht APLAY, statt PAPLAY ? Gesagt, getan. Versuchts mal, viel Glück dabei. Das geht mit etwas Glück genau einmal und auch nur auf einem Device, aus das PA grade nichts ausgibt. Ist auch klar, weil PA ja ALSA als Unterbau hat. Wir erinnern uns, daß PAPLAY 1,9s Latenz hatte. APLAY, wenn man ein Device findet, das geht, hat 0ms und das Startdelay ist nicht ganz so funktional, wie sich APLAY das wünscht aka. auch buggy. ABER, 0ms sind cool, weil Android auch 0ms haben kann, ohne dabei drauf zu gehen. Der Lesezugriff für Netzwerkdaten für „16 Bit Stereo 48k“ auf einem Android liegt bei 1ms. d.b. nimmt man ALSA als Player und bekommt das Device frei, hat man eine echt geile Latenz von 1-2ms und das hört man nicht!

Der Resync

Jetzt gibt es allerlei Hürden, die man umschiffen muß. Androids fliegt das eigene Multitasking um die Ohren, da fängt der Ton dann an zu stottern. Vorwarnung : keine. Gegenmaßnahmen: derzeit unbekannt.Das funktioniert auf dem Desktop etwas besser.

Bei 0ms Latenz ist der Resync instant, da könnte man versucht sein, einfach pauschal alle paar Sekunden mal helfend durch einen Socket.close();Socket.connect() einzugreifen. Könnte klappen, muß nicht.Ist aber eine Option, wenn der Wiedergabetask das nicht merkt. Geheimtip: Vorsicht vor doppelten Daten im AudioBuffer. Vergleicht mal, ob Ihr nach dem connect()+read() einen Teil davon schon habt und schmeißt den raus.

LAHA

Unser ControllCenter steuert jetzt bereits beliebig viele Devices, kann Audiostreams von laufenden Apps kapern, z.b. MPV, FireFox etc. , hat diverse Backends zum Abspielen auf dem Desktop, könnte verschiedene Musikplayer als Quelle nutzen und damit auch Last.FM, Spotify etc. realisieren. Er verschiebt Metadaten, findet neue Geräte im Netz, erlaubt Endgeräten mit Screen ihn fernzusteuern und hat bereits erfolgreich ein Handy als Drahtloskopfhörer für Videos laufen gehabt. Dank MPVs negativer Latenz und der frei einstellbaren Endgeräte Latenz, kann man alles perfekt ausrichten 🙂

Wir sind also auf dem richtigen Weg. Ob das allerdings vor Weihnachten 100% zuverlässig läuft, kann ich nicht garantieren. Trotz des ganzen Frustes mit den Bugs der Anderen, hat das Projekt endlich mal wieder Spaß beim Programmieren beschert. Und das ist doch, weswegen man es tut, oder nicht 😀

JackD – Der Störenfried

Völlig überraschend kam heute für mich ein Ausfall des Hauptaudiodevices im Pulseaudio, nämlich das Interne Audio Device vom Mainboard. Das Mainboard ging aber noch und ansonsten gab es auch kaum interessantes zu melden, außer, daß die Programme die Audio benutzen wollten alle im Mixer festhingen.

Was konnte also die Ursache sein ?

In solchen Fällen wird es hilfreich sein,  also-info.sh zu starten und mal einen Blick in die Ausgabe zu werfen. Gedacht, getan:

!!Sound Servers on this system
!!----------------------------

Pulseaudio:
      Installed - Yes (/usr/bin/pulseaudio)
      Running - Yes

Jack:
      Installed - Yes (/usr/bin/jackd)
      Running - Yes

Was zum Geier ist Jack ?

Der Gedanke kam mir zwar nicht, aber wer es nicht weiß, unter Linux Audiosystemen gibt es die großen drei Alsa, Jack und Pulseaudio. Auf Fedorasystemen ist die Kombination aus Alsa und Pulseaudio im Desktopbereich normal. Jack führt eher so ein Nischendasein, was aber einige Tools nicht davon abhält auf Jackkomponenten zuzugreifen z.B. Calf , weswegen es auf einem Desktop durchaus vorhanden ist.

Ok, es war da, aber was hat das mit dem Ausfall zu tun ?

Wie wir oben sehen können, liefen zwei SoundServer und das kann nicht klappen, wenn man nicht jedem der Server sagt, für welches Device er zuständig sein soll. Könnte ja sein, daß man eine SpezialSoundkarte im Einsatz hat mit der man professionell Musik machen will, da könnte das schon Sinn machen, diese von Jack verwalten zu lassen, besonders da Calf auf Jack aufbaut.

Durch ein ungünstiges Zusammenwirken vom „Dicken-Finger-Syndrom“, „Hast“, „Tippfehler“ und „Cinnamon“ wurde versehenlich Calf gestartet, was ich noch nie gesehen hatte und auch nie wieder sehen will, denn es hat einen lausigen ersten Eindruck gemacht 😉 Der Start von Calf führte zum Start von Jack und da Jack dumm wie Stroh zu sein scheint, griff sich der Soundserver die Interne Soundkarte von Mainboard und mein Sound war weg.

Abhilfe schafft …

einfach mit „killall jackd“ als Root töten und danach Calf und Flowblade deinstallieren. Problem solved 😉

PulseAudio 9.0 erschienen

PulseAudio 9 ist da und lang ersehnte Änderungen wurden umgesetzt.

Sampleraten bis zu 384 kHz möglich

Bislang hat PulseAudio die Sampleraten auf 192kHz begrenzt, was ok ist, wenn man Hifi als Standard nimmt. Mit 384 kHz kann man endlich richtig gute FLAC Aufnahmen wiedergeben, wenn die Audiohardware mitmacht. ALSA, die Advanced Linux Sound Architecture, und Grundlage für Audio auf so fast jeder Linux Distro, braucht die 384 KHz, wenn es Mehrkanaldatenströme abspielen will. Die Macher von PulseAudio weisen darauf hin, daß diese MehrKanaldatenströme noch nicht unterstützt werden, die 384 kHz aber die Voraussetzung sind, es später zu tun. Hoffen wir auf das baldige erscheinen.

Vorgehensweise für Auto-Detection verbessert

PA9 verbessert das logische Verhalten vom Mixxer, wenn Wiedergabegeräte im laufenden Betrieb verschwinden, z.b. weil jemand den Kopfhörer rauszieht, den HDMI Monitor ausschaltet usw.
Kommt so ein Device wieder zurück, ohne das der Benutzer in der Zwischenzeit am Mixxer etwas anderes eingestellt hatte, merkt sich PA9 die alten Einstellungen und stellt Sie wieder her, was meint, daß z,B. besagter Kopfhörer wieder reingesteckt wird und die Wiedergabe sofort dahin umgeleitet wird, weil es vorher auch schon so war.

Beamforming

Was ist Beamforming ? 😀 Ok, wenn man ein ganzes Rudel von Mikros hat, kann man die nun auf einen Punkt ausrichten und das, was alle Mikros laut aufnehmen, wird noch lauter, und alles andere wird leiser. Damit kann man z.b. unerwünschte Nebengeräusche dämpfen und die Sprecher auf einem Podium hervorheben. Das fällt wohl unter Studiotechnik und wird ganz sicher hier im Blog nochmal vorgestellt. Ganz sicher 🙂

Corking

PA9 verbessert den Umgang mit Datenströmen die spezielle Rollen haben. Ein Datenstrom von Skype z.b. ist als „Voice“ getaggt und dementsprechend hat er Vorrang z.b. vor Musik, eine lästige Voreinstellung der man üblicherweise den gar ausmacht, sobald man das mal gefunden hat 😉 Jedenfalls kann man mit PA9 auch Ströme ohne besondere Rolle in seine Konfiguration mit einbeziehen.
Jemand der hier Änderungen vornimmt, hat schon sehr spezielle Vorstellungen von seinem Audiosystem.

LFE remixing wieder abgeschaltet

LFE, das sind besonders tiefe Frequenzen für Subwoofer, und da der LFE Filter nicht richtig funktioniert, ist er defaultmäßig in PA9 abgeschaltet, was Euren Subwooferausgang stumm schaltet. Also nicht vergessen: nach dem Update wieder einschalten.

Es gibt noch mehr Änderungen, aber die sind sehr spezielle und für „Benutzer“ wohl eher uninteressant. Wer es nachlesen will, hier ist der Link.

Wann PulseAudio 9 in Fedora einziehen wird, werden wir sehen.

… und plötzlich ist der Sound weg.

Die Advanced Linux Sound Architecture (ALSA) ist ein mächtiges Werkzeug, was Audiowiedergabe unter Linux betrifft. Leider kann es vorkommen, daß mittendrin einfach mal der Ton ausfällt. Dies geschieht z.b. des öfteren mit Skype, praktischerweise noch vor dem eigentlichen Anruf, so daß man sich nicht ganz blamiert.

Will man dieses Problem schnell wieder in den Griff bekommen hat man meistens verloren, da sich dies nur mit Tools machen läßt, die per Default gar nicht installiert werden. PAMAN z.b. der PulseAudioManager. Mit diesem graphischen Tool kann man alles wissenswerte über seinen PulseAudio SoundServer erfahren. (Fedora: yum install paman) .  Ein guter Start um Probleme zu diagnostizieren:

 

PulseAudioManager

 

PulseAudioManager2

Wichtig sind hier die Sinks, das sind nämlich die eingebauten Soundkarten. Wenn die nicht passend zu dem was man in Rechner  hat auftauchen, dann hat meistens der Treiber das Device nicht gefunden oder der Devicetreiberteil ist grade gestorben. Ein Reboot könnte im letzteren Fall schon helfen. Wenn der Treiber gar nicht erst das Device findet, wird es Zeit einen neuen zu installieren. Wie das geht, steht an anderer Stelle und soll hier heute nicht behandelt werden.

Ist mit den Sinks auf den ersten Blick alles ok, wenden wir uns dem echten PulseAudio Mixer zu, nicht dem der im Gnome verbaut ist, der kann nämlich nix. PAVUcontrol heißt das Tool und muß auch installiert werden  ( Fedora :  yum install pavucontrol )

pavucontrol1

Dieser Systemmixer klärt dann auch mal schnell auf, ob der Sound überhaupt bei PulseAudio ankommt oder nicht.

Im obigen Bild hat QMMP ( WinAmp Kopie für Linux ) via Alsa-Plugin erfolgreich einen Datenstrom zum PulseAudioserver aufgebaut, mit anderen Worten, es müßte was zu hören sein. Wenn man nichts hört, könnte das am Audioausgabedevice liegen und das dies on-the-fly von irgendeinem Programm oder Audioevent auf ein anderes Ausgabemedium umgeleitet/stellt wurde. Besonders beliebt ist hierbei das HDMI Ausgabedevice, daß den Ton an einen mit Lautsprechern ausgestatteten Monitor (aka. Fernseher ) umleitet.

pavucontrol3

In der obigen Ansicht kann man nun ganz leicht über den grünen Knopf festlegen, daß eben nicht mehr HDMI Default ist, sondern die interne Audiohardware. Mit dem kleinen Lautsprechersymbol daneben ( mit dem kleinen X ) kann man das Audiodevice gleich abschalten, was zukünftig hoffentlich solche Fehler verhinder.t.

Kleiner Tipp: Den Fehler kann man leicht daran erkennen, daß man mit „aplay“ und dem „alsamixer“ so absolut gar nichts an seiner Situation verändern kann.

Für alle die mal wissen wollten, was Alsa so auf dem Kasten hat :

 

Alsa1

Ich habe nicht mal geahnt, daß ich ein REAR und ein FRONT Micro habe 🙂  Die einzige Stelle wo man das lästige Auto-Mute abstellen kann, ist übrigens hier. Dazu mit dem Cursor und den Cursorsteuertasten nach rechts auf Auto-Mute gehen und mit Cursor-Rauf abschalten. Alsamixer läuft nur im Terminal, da könnte man auch mal eine GUI zu machen.

Wenn Ihr noch Fragen habt, einfach anmailen.