Serienverzeichnis
- Einleitung
- Latenz (das ist dieser Artikel)
- Wirering
- Remote
- Erfahrungen
Beim Titel fiel mir nicht besseres ein; vielleicht hätte ich diese Serienfolge "Grundlagen" nennen sollen. Egal - in der Einleitung habe ich erklärt, worum es in dieser Serie geht. Nun möchte ich die Grundlagen für dieses Vorhaben erklären, was viel mit dem Thema Latenz zu tun hat. Doch dazu später mehr.
Grundlagen
Hierbei geht es darum, den Audio-Stack des eigenen Computers zu verstehen. Dazu verweise ich erneut auf diesen Artikel, und ich habe ein Bild gezeichnet:
Am Computer sind mehrere Geräte angeschlossen. Im Beispiel sind es zwei Einganggeräte (Gitarre und Mikrofon) und ein Ausgabegeräte (Kopfhörer). Im Computer sorgen die Audio-Treiber des Kernels dafür, dass mit den Geräten kommuniziert werden kann. Um die Bereitstellung auf einer Software-Ebene kümmert sich dann die Advanced Linux Sound Architecture (ALSA). Dann folgt die Feinverteilung der verschiedenen Eingabe- und Ausgabekanäle. Früher wurde dafür PulseAudio verwendet, doch in aktuellen Distributionen erledigt PipeWire diese Aufgabe.
Wenn ihr wissen möchtet, wo bei euch die Musik spielt, könnt ihr im Terminal das eingeben:
inxi -A
Audio:
Device-1: Intel Cannon Lake PCH cAVS driver: snd_hda_intel
Device-2: Actions Spark MINI USB driver: hid-generic,snd-usb-audio,usbhid, type: USB
Device-3: Focusrite-Novation Focusrite Scarlett 2i2 2nd Gen, driver: snd-usb-audio type: USB
API: ALSA v: k6.6.75-2-MANJARO status: kernel-api
Server-1: PipeWire v: 1.2.7 status: active
Falls ihr Inxi nicht kennt, schaut hier nach.
Die Ausgabe spiegelt genau das wider, was ich im Diagramm gezeichnet habe:
- Der Kernel-Treiber bedient die Intel Standard Audio Hardware
- Es werden zwei weitere Geräte erkannt:
- Die Gitarre am Spark-Verstärker
- Das Mikrofon am Scarlett-Interface
- ALSA dient als API (Schnittstelle)
- und PipeWire kümmert sich um die Details
Wenn man die vollständige Übersicht aus der Perspektive von PipeWire haben möchte, gibt man das ein:
wpctl status
PipeWire 'pipewire-0' [1.2.7, ralf@ralf, cookie:2139605919]
└─ Clients:
32. gnome-shell [1.2.7, ralf@ralf, pid:1448]
33. WirePlumber [1.2.7, ralf@ralf, pid:1907]
37. pipewire [1.2.7, ralf@ralf, pid:1910]
47. WirePlumber [export] [1.2.7, ralf@ralf, pid:1907]
48. GNOME Shell Volume Control [1.2.7, ralf@ralf, pid:1448]
49. GNOME Volume Control Media Keys [1.2.7, ralf@ralf, pid:1567]
78. xdg-desktop-portal [1.2.7, ralf@ralf, pid:1813]
79. wpctl [1.2.7, ralf@ralf, pid:3070]
Audio
├─ Devices:
│ 50. Spark MINI USB [alsa]
│ 51. Focusrite Scarlett 2i2 2nd Gen [alsa]
│ 52. Internes Audio [alsa]
│
├─ Sinks:
│ * 45. Internes Audio Analog Stereo [vol: 0.40]
│ 59. Spark MINI USB Analog Stereo [vol: 0.40]
│ 106. Focusrite Scarlett 2i2 2nd Gen Direct Scarlett 2i2 USB [vol: 0.40]
│
└─ Sources:
43. Internes Audio Analog Stereo [vol: 1.00]
60. Spark MINI USB Mono [vol: 1.00]
* 105. Focusrite Scarlett 2i2 2nd Gen Direct Scarlett 2i2 USB [vol: 1.00]
Settings
└─ Default Configured Devices:
0. Audio/Sink alsa_output.pci-0000_00_1f.3.analog-stereo
1. Audio/Source alsa_input.usb-Focusrite_Scarlett_2i2_USB-00.Direct__Direct__source
Audioserver
Wenn es um die Audioserver geht, stehen drei zur Debatte: PulseAudio, PipeWire und JACK, bzw. JACK2. Aktuelle Distributionen haben PulseAudio durch PipeWire ersetzt, und dafür gibt es gute Gründe. Mit ALSA alleine kommt man nicht weit, weil es kein Hardware-Multiplexing unterstützt. Um es vereinfacht zu sagen, ALSA kann nicht mehrere Geräte zur gleichen Zeit bündeln. Aus diesem Grund benötigen wir einen Audioserver wie PulseAudio, PipeWire oder JACK.
- PulseAudio ist eine ältere Software, die schlechte Latenz bietet und bekannt für ihren Ressourcenhunger ist.
- PipeWire ist bei vielen Distributionen der Ersatz/Nachfolger für PulseAudio. Es bietet eine ähnliche Latenz wie JACK. PipeWire ist eine vollständige Implementation eines JACK-Servers.
- JACK, bzw. JACK2 ist als Audioserver im Profibereich bekannt, bietet niedrige Latenz, ist jedoch auch für seine schwierige Konfiguration bekannt.
Da PipeWire die neuere Software ist und sowohl PulseAudio als auch JACK ersetzen kann, ist meine Entscheidung klar: Ich führe diesen Versuch mit PipeWire fort. Damit PipeWire eine JACK-ähnliche Latenz abliefert, muss das Paket pipewire-jack installiert sein. Wenn ihr in eurer Packetverwaltung nach "pipewire" sucht, seht ihr, welche diesbezüglichen Pakete installiert sind. Bei mir gehörte pipewire-jack nicht dazu, sodass ich es nachinstalliert habe.
Latenz
Die Latenz (Reaktionszeit) beschreibt die Zeit zwischen einem Befehl und der erwarteten Reaktion. Dabei kommt es immer zu einer Verzögerung, verursacht durch unterschiedlichste Faktoren. Grundsätzlich gilt, dass eine niedrige Latenz bzw. Verzögerung erstrebenswert ist. Das gilt besonders im Kontext dieser Artikelserie. Für das Musizieren mit verschiedenen Instrumenten und Musikern ist eine Latenz unter 50 Millisekunden wichtig (30 ms sind besser). Bei höheren Verzögerungen kann man nicht zusammen spielen, weil die Töne zeitlich zu sehr versetzt sind.
Um die Latenz zu messen, kann der PipeWire-Befehl pw-top verwendet werden. Wenn ihr "top" lest, könnt ihr euch vorstellen, was dieser Befehl macht.
Damit dieser Screenshot möglich war, musste ist zuerst einmal dagegen treten. Beim ersten Aufruf standen alle Geräte auf stopped (S), nichts war running (R) oder idle (I). Ob I wirklich idle heisst, weiss ich nicht. Ausserdem wurden viel weniger Geräte angezeigt, als man im Screenshot sehen kann. Nachdem ich die Gnome-Audioeinstellungen geöffnet und ein wenig zwischen den Geräten hin und her geklickt hatte, zeigte pw-top plötzlich Ausschläge. Das wirkt alles ziemlich unausgereift und instabil.
Von der Ausgabe interessieren die beiden Werte QUANT und RATE. Was es mit der Quantisierung und der Audio-Rate auf sich hat, werde ich näher erklären. Wir sind hier nicht im ersten Semester des Physikstudiums. Nun nimmt man für das entsprechende Gerät diese beiden Werte und rechnet:
Latenz in ms = QUANT / RATE * 1000
Der Screenshot zeigt drei running Geräte:
- Die E-Gitarre am Spark-Interface
- Die Kopfhörer-Ausgabe
- Das Mikrofon am Scarlett-Interface
Die Werte für QUANT und RATE sind für alle die gleichen. 1024 / 48000 * 1000 ergibt eine Latenz von 21.3 ms, was ein guter Wert ist und mich hoffen lässt.
Schwierigkeiten
Während dieses Artikels bin ich auf einige Probleme gestossen, die teilweise ungelöst sind:
- Bei einem meiner Tests für diese Serie habe ich mir PipeWire zerschossen und auf PulseAudio zurückgesetzt. Bei der Neuinstallation des Metapakets manjaro-pipewire bockte der Paketmanager, weil eine Abhängigkeit zu pulse-bluetooth im Wege stand. Diesen Konflikt musste ich von Hand auflösen. Das ist nichts für Anfänger:innen.
- Obwohl PipeWire meinen Gitarren-Verstärker erkennt, konnte ich ihm bisher keinen Laut entlocken. Dieses Problem ist nicht gelöst.
- pw-top zeigt zuerst nur Null-Werte für QUANT und RATE an. Werte kamen erst nach Rumgeklicke in den Gnome-Audioeinstellungen.
Ich bin gespannt, ob ich diese Herausforderungen bis zur nächsten Folge dieser Serie lösen kann. Denn im nächsten Artikel werden die Schwierigkeiten erst richtig anfangen. Dann geht es um die Bündelung von mehreren Eingaben auf eine Ausgabe.
Titelbild: https://pixabay.com/photos/mixer-dj-music-controller-buttons-4197733/
Quellen:
https://de.wikipedia.org/wiki/Verz%C3%B6gerung_(Telekommunikation)
https://gnulinux.ch/pipewire-braucht-kein-pulseaudio
https://de.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture
https://gnulinux.ch/inxi-liefert-umfassende-systeminformationen
https://www.freedesktop.org/wiki/Software/PulseAudio/
https://gist.github.com/cidkidnix/86a01ecf82f54eec39f27a9807b90a1b