Pipewire Latenz mit pw-metadata setzen

Wenn du Musikproduktion mit einer DAW z.B. Bitwig unter Linux machst, dann ist für dich das Thema Latenz sehr wichtig.

Was ist Latenz?

  1. Die Latenz (Verzögerung/Puffer) ist wichtig im Zusammenspiel zwischen dem Computer und dem Audiointerface (Audio und Midi).
  2. Je niedriger die Latenz, desto höher wird die CPU belastet, weil sie in sehr kurzen Abständen die Datenpakete verarbeiten muss. Je größer die Latenz, desto mehr Zeit darf vergehen, bis sich die CPU wieder um die Datenpakete kümmern muss.
  3. Wenn ausschließlich nur im Computer produziert wird, kann die Latenz ohne Probleme hoch sein.
  4. Ein guter Startwert ist schon mal 1024 Samples (21.3ms) – bei 48kHz.
  5. Erst wenn hier störende Verzögerungen bemerkbar sind, z.B. beim Spielen auf einem Controller oder Synthesizer und der Umsetzung auf den Computer, macht es Sinn diesen Wert zu verkleinern. Zum Beispiel wenn der Tastendruck und das Ertönen eines Sounds spürbar verzögert sind.

Eventuell interessiert dich noch der Artikel zum Thema Pipewire Realtime Konfiguration „Pipewire modul-rt Konfiguration“ , um deine Audio/Videoanwendungen noch performanter zu machen

Pipewire Metadaten lesen mit pw-metadata

Der Befehl lautet pw-metadata und kann folgendermaßen benutzt werden

pw-metadata [options] [ id [ key [ value [ type ] ] ] ]
  -h, --help     Show this help
      --version  Show version
  -r, --remote   Remote daemon name
  -l, --list     List available metadata
  -m, --monitor  Monitor metadata
  -d, --delete   Delete metadata
  -n, --name     Metadata name (default: "default")

Die ID mit pw-metadata rausfinden

pw-metadataohne weitere Angaben ergibt so eine Ausgabe, die je nach Hardware natürlich unterschiedlich ist. Die ID steht hier immer weit links id:0

odo@computer~$ pw-metadata

update: id:0 key:'default.configured.audio.sink' value:'{"name":"alsa_output.usb-SOOPERAUDIOCARD_192k-00.pro-output-0"}' type:'Spa:String:JSON'
update: id:0 key:'default.configured.audio.source' value:'{"name":"alsa_input.usb-SOOPERAUDIOCARD_192k-00.pro-input-0"}' type:'Spa:String:JSON'
update: id:0 key:'default.audio.sink' value:'{"name":"alsa_output.usb-SOOPERAUDIOCARD_192k-00.pro-output-0"}' type:'Spa:String:JSON'
update: id:0 key:'default.audio.source' value:'{"name":"alsa_input.usb-SOOPERAUDIOCARD_192k-00.pro-input-0"}' type:'Spa:String:JSON'
update: id:0 key:'default.video.source' value:'{"name":"v4l2_input.pci-0000_00_14.0-usb-0_7_1.0"}' type:'Spa:String:JSON'

Alle verfügbaren Metadaten mit pw-metadata -l anzeigen lassen

odo@computer~$ pw-metadata -l

Found "settings" metadata 32
Found "default" metadata 40
Found "route-settings" metadata 41

Alle verfügbaren settings mit pw-metadata -n settings anzeigen lassen

odo@computer~$ pw-metada -n settings

Found "settings" metadata 32  
update: id:0 key:'log.level' value:'2' type:''  
update: id:0 key:'clock.rate' value:'48000' type:''  
update: id:0 key:'clock.allowed-rates' value:'[ 48000 ]' type:''  
update: id:0 key:'clock.quantum' value:'1024' type:''  
update: id:0 key:'clock.min-quantum' value:'32' type:''  
update: id:0 key:'clock.max-quantum' value:'2048' type:''  
update: id:32 key:'clock.force-quantum' value:'64' type:'(null)'  
update: id:64 key:'clock.force-quantum' value:'64' type:'(null)'

Settings temporär setzen mit pw-metadata -n settings id key value type

Hier werden nun Samplefrequenz auf 48kHz und die Samples auf 1024 gestellt, so dass 1024/48000 = 0,021333 als 21,3 Millisekunden Latenz raus kommen.
Soll es eine niedrigere Latenz bei einer Samplefrequenz von 48kHz sein, müssen die 1024 Samples herunter gesetzt werden. z.B. 768 (16ms) , 512 (10,6ms), 256 (5,3ms), 128 (2,6ms), 64 (1,33ms), 32 (0,68ms).

pw-metadata -n settings 0 clock.rate 48000
pw-metadata -n settings 0 clock.quantum 1024

Die Konfiguration permanent machen. Auch nach einem Reboot.

Folgende Datei im folgenden Verzeichnis erstellen ~/.config/pipewire/pipewire.conf.d/choppy-under-load.conf. Sie sollte z.B. diesen Inhalt enthalten. Wenn andere Werte ausgewählt wurden, dann natürlich die anderen Werte.

context.properties = {
   default.clock.rate = 48000
   default.clock.quantum = 1024
}
Quellen
  1. Pipewire Module-rt https://docs.pipewire.org/page_module_rt.html
  2. Pipewire Docs https://docs.pipewire.org/index.html
  3. Pipewire Configuration https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PipeWire
  4. pw-metadata https://docs.pipewire.org/page_man_pw_metadata_1.html
  5. pw-top https://docs.pipewire.org/page_man_pw_top_1.html
  6. Troubleshooting & XRuns https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Troubleshooting#xruns
  7. Pipewire Ubuntuusers https://wiki.ubuntuusers.de/Pipewire/
  8. Pipewire Home https://pipewire.org/