Pipewire: Latency instellen
Pipewire: Latency instellen

Pipewire: Latency instellen

Tux in space

Deze pagina ais voor het laatst ge-update 25 juni 2022

Ik heb nog veel problemen om helemaal goed te begrijpen hoe pipewire precies werkt. Het eerste wat ik uit moest zoeken is hoe ik de latency instel die pipewire moet gebruiken op mijn systeem. In dit geval mijn Laptop die ik vooral als pipewire testplatform gebruik (specificaties zijn te vinden op deze pagina).

Latency is belangrijk voor mij als iemand die veelal live instrumenten gebruikt. Een grote latency zorgt ervoor dat er veel tijd kan zitten tussen het produceren van een geluid en wanneer dat geluid uit de luidspreker van de computer komt. Die tijd tussen maken van geluid en het horen van dat geluid op de computer wil ik zo laag mogelijk houden.

Standaard staat PipeWire ingesteld om 1024 frames te gebruiken op met een sample rate van 48000Hz. Het is te complex om uit te leggen wat frames en sample rates en hoe ze van invloed zijn op het maken van opnames. Op deze pagina staat een redelijk beschrijving voor het afspelen van audio om een idee te krijgen. Dit geeft op mijn systeem een latency van ongeveer 24 milliseconden, dit levert een soort van echo effect op wat erg hinderlijk is.

TL;DR

In de eerste gebruik ik de volgende opdracht om Ardour te openen:

PIPEWIRE_LATENCY=128/48000 flatpak run org.ardour.Ardour

In de tweede gebruik ik de volgende opdracht om Carla te openen:

PIPEWIRE_LATENCY=128/48000 flatpak run studio.kx.carla

In de derde controleer ik of de instellingen zijn overgenomen door pipewire:

pw-top

Standaard manier:

De standaard instellingen van pipewire geven een latency van ongeveer 24 milleseconden op mijn systeem. Op mijn vorige Pulse/Jack/ALSA installatie kon ik betrouwbaar een latency van ongeveer 1 milliseconden bereiken, wat bijna niet hoor- of merkbaar was.

Ik geloof dat de door pipewire geprefereerde manier is om het hele systeem op de volgende manier in te stellen met een terminal command:

Om de sample rate in te stellen gebruik je:

pw-metadata -n settings 0 clock.force-rate 44100

Om frames (PipeWire gebruikt de term quantum’s) in te stellen gebruik je:

pw-metadata -n settings 0 clock.force

Deze methodiek geeft op mijn systeem echter veel problemen (waarschijnlijk dat ik zaken nog niet goed geconfigureerd heb). Zo beginnen sommige programma’s langzaam of snel audio af te spelen, of worden video’s vertraagd of versneld afgespeeld.

Mijn manier:

Persoonlijk kan ik het voorlopig alleen op de volgende manier, betrouwbaar, voor elkaar krijgen. Ik moet ieder programma wat ik opstart wat ik met een bepaalde frame/sample rate wil gebruiken apart opstarten met die instellingen. Erg terminal-lastig allemaal, jammer genoeg.

Ik gebruik(te) voor deze test de volgende PipeWire versie:

$ pipewire --version

pipewire
Compiled with libpipewire 0.3.51
Linked with libpipewire 0.3.51

Op het internet kwam ik de volgende methodiek tegen om individuele programma’s op te starten met een bepaalde pipewire latency instelling (als ik het goed begrepen heb gebruikt pipewire standaard 1024/48000):

PIPEWIRE_LATENCY=128/48000 Ardour

Dit werkt echter op mijn systeem niet omdat ik bijna alles overgezet heb naar flatpak’s, om flatpak’s op te starten in een terminal kan het volgende gebruikt worden:

flatpak run org.ardour.Ardour

Ik wist nog niet welke frame rate de audiochip op mijn laptop standaard gebruikt, dit is vaak 48000Hz, maar soms kan het 44100Hz zijn. Met de volgende terminal opdracht:

pactl list sinks

kreeg ik de volgende informatie:

Sink #1236
	State: SUSPENDED
	Name: alsa_output.pci-0000_06_00.6.analog-stereo
	Description: Family 17h (Models 10h-1fh) HD Audio Controller Analoog stereo
	Driver: PipeWire
	Sample Specification: s32le 2ch 48000Hz
	Channel Map: front-left,front-right
	Owner Module: 4294967295
	Mute: no
	Volume: front-left: 62912 /  96% / -1,06 dB,   front-right: 62912 /  96% / -1,06 dB
	        balance 0,00
	Base Volume: 65536 / 100% / 0,00 dB
	Monitor Source: alsa_output.pci-0000_06_00.6.analog-stereo.monitor
	Latency: 0 usec, configured 0 usec
	Flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY 
	Properties:
		alsa.card = "1"
		alsa.card_name = "HD-Audio Generic"
		alsa.class = "generic"
		alsa.device = "0"
		alsa.driver_name = "snd_hda_intel"
		alsa.id = "ALC274 Analog"
		alsa.long_card_name = "HD-Audio Generic at 0xfc5c0000 irq 107"
		alsa.name = "ALC274 Analog"
		alsa.resolution_bits = "16"
		alsa.subclass = "generic-mix"
		alsa.subdevice = "0"
		alsa.subdevice_name = "subdevice #0"
		api.alsa.card.longname = "HD-Audio Generic at 0xfc5c0000 irq 107"
		api.alsa.card.name = "HD-Audio Generic"
		api.alsa.path = "front:1"
		api.alsa.pcm.card = "1"
		api.alsa.pcm.stream = "playback"
		audio.channels = "2"
		audio.position = "FL,FR"
		card.profile.device = "3"
		device.api = "alsa"
		device.class = "sound"
		device.id = "100"
		device.profile.description = "Analoog stereo"
		device.profile.name = "analog-stereo"
		device.routes = "2"
		factory.name = "api.alsa.pcm.sink"
		media.class = "Audio/Sink"
		device.description = "Family 17h (Models 10h-1fh) HD Audio Controller Analoog stereo"
		node.name = "alsa_output.pci-0000_06_00.6.analog-stereo"
		node.nick = "ALC274 Analog"
		node.pause-on-idle = "false"
		object.path = "alsa:pcm:1:front:1:playback"
		priority.driver = "1009"
		priority.session = "1009"
		factory.id = "18"
		client.id = "34"
		clock.quantum-limit = "8192"
		node.driver = "true"
		factory.mode = "merge"
		audio.adapt.follower = ""
		library.name = "audioconvert/libspa-audioconvert"
		object.id = "46"
		object.serial = "1236"
		node.max-latency = "16384/48000"
	Ports:
		analog-output-speaker: Luidsprekers (
                  type: Speaker, 
                  priority: 10000, 
                  availability group: Legacy 3, 
                  availability unknown)
		analog-output-headphones: Analoge koptelefoon (
                  type: Headphones, 
                  priority: 9900, 
                  availability group: Legacy 4, 
                  not available)
	Active Port: analog-output-speaker
	Formats:
		pcm

Dan is de sample rate dus 48000Hz:

Sample Specification: s32le 2ch 48000Hz

Op een Pulse/Jack/ALSA systeem was ik gewent om dan met de sample rate in de hand goede instellingen op te zoeken die “veilig” waren om te gebruiken. Eén van die lijsten is hier te vinden op de website van Linux Musicians (onmisbaar als je audio produceert op een GNU / Linux systeem).

Ik ben van plan de volgde instellingen te gaan testen op mijn systeem:

  • 16 / 48000
  • 32 / 48000
  • 64 / 48000
  • 128 / 48000 (geeft in Ardour een latency van ongeveer 2,7ms op mijn systeem)
  • 256 / 48000
  • 512 / 48000
  • 1024 / 48000 (geeft in Ardour een latency van ongeveer 24 ms op mijn systeem)
  • 2048 / 48000

Om de systeem namen van flatpak’s te vinden gebruik ik de volgende terminal opdracht:

flatpak --user --columns=name,app list

Dit geeft de volgende output:

Name                                     Application ID
Arduino IDE                              cc.arduino.arduinoide
Metronome                                com.adrienplazas.Metronome
GitKraken                                com.axosoft.GitKraken
Discord                                  com.discordapp.Discord
Barrier                                  com.github.debauchee.barrier
Flatseal                                 com.github.tchx84.Flatseal
Nextcloud Desktop                        com.nextcloud.desktopclient.nextcloud
OBS Studio                               com.obsproject.Studio
Transmission                             com.transmissionbt.Transmission
Audio Sharing                            de.haeckerfelix.AudioSharing
HandBrake                                fr.handbrake.ghb
Ardour                                   org.ardour.Ardour
Audacity                                 org.audacityteam.Audacity
Codecs                                   org.audacityteam.Audacity.Codecs
Chromium Web Browser                     org.chromium.Chromium
Codecs                                   org.chromium.Chromium.Codecs
TAP-plugins                              org.freedesktop.LinuxAudio.Plugins.TAP
SWH                                      org.freedesktop.LinuxAudio.Plugins.swh
Freedesktop Platform                     org.freedesktop.Platform
Mesa                                     org.freedesktop.Platform.GL.default
Mesa                                     org.freedesktop.Platform.GL.default
nvidia-510-68-02                         org.freedesktop.Platform.GL.nvidia-510-68-02
ffmpeg-full                              org.freedesktop.Platform.ffmpeg-full
openh264                                 org.freedesktop.Platform.openh264
Freedesktop SDK                          org.freedesktop.Sdk
Fritzing                                 org.fritzing.Fritzing
GNU Image Manipulation Program           org.gimp.GIMP
Déjà Dup-back-ups                        org.gnome.DejaDup
Gnome Klotski                            org.gnome.Klotski
Logboeken                                org.gnome.Logs
Gnome Mijnenveger                        org.gnome.Mines
GNOME Application Platform version 40    org.gnome.Platform
GNOME Application Platform version 41    org.gnome.Platform
GNOME Application Platform version 42    org.gnome.Platform
Polari                                   org.gnome.Polari
Klok                                     org.gnome.clocks
gThumb-afbeeldingsweergave               org.gnome.gThumb
Pop Gtk theme                            org.gtk.Gtk3theme.Pop-dark
Inkscape                                 org.inkscape.Inkscape
Adwaita theme                            org.kde.KStyle.Adwaita
KDE Application Platform                 org.kde.Platform
QGnomePlatform                           org.kde.PlatformTheme.QGnomePlatform
QtSNI                                    org.kde.PlatformTheme.QtSNI
Kdenlive                                 org.kde.kdenlive
Krita                                    org.kde.krita
Mixxx DJ Software                        org.mixxx.Mixxx
Helvum                                   org.pipewire.Helvum
Signal Desktop                           org.signal.Signal
Telegram Desktop                         org.telegram.desktop
Telegram Desktop Webview Add-on          org.telegram.desktop.webview
VLC                                      org.videolan.VLC
Carla                                    studio.kx.carla

Met deze informatie kan ik de volgende opdracht samenstellen om Ardour op te starten in een terminal:

PIPEWIRE_LATENCY=128/48000 flatpak run org.ardour.Ardour

Dit geeft de volgende informatie in de terminal:

WARNING: Your system has a limit for maximum amount of locked memory!
         This might cause Ardour to run out of memory before your system runs
         out of memory. You can view the memory limit with 'ulimit -l', and it
         is normally controlled by /etc/security/limits.conf

WARNING: Could not check your glib-2.0 for mutex locking atomic operations.

Ardour6.9.0 (built using 6.9 and GCC version 11.2.0)
Ardour: [INFO]: Your system is configured to limit Ardour to 1048576 open files
Ardour: [INFO]: Loading system configuration file /app/etc/ardour6/system_config
Ardour: [INFO]: Loading user configuration file /home/remco/.var/app/org.ardour.Ardour/config/ardour6/config
Ardour: [INFO]: CPU vendor: AuthenticAMD
Ardour: [INFO]: AVX-capable processor
Ardour: [INFO]: AVX with FMA capable processor
Ardour: [INFO]: CPU brand: AMD Ryzen 7 5800H with Radeon Graphics         
Ardour: [INFO]: Using AVX and FMA optimized routines
Ardour: [INFO]: Loading plugin meta data file /app/share/ardour6/plugin_metadata/plugin_tags
Cannot xinstall SIGPIPE error handler
Ardour: [INFO]: Loading default ui configuration file /app/etc/ardour6/default_ui_config
Ardour: [INFO]: Loading user ui configuration file /home/remco/.var/app/org.ardour.Ardour/config/ardour6/ui_config
Ardour: [INFO]: Loading 452 MIDI patches from /app/share/ardour6/patchfiles
Gtk-Message: 12:00:08.693: Failed to load module "gail"
Gtk-Message: 12:00:08.693: Failed to load module "atk-bridge"
Gtk-Message: 12:00:08.693: Failed to load module "appmenu-gtk-module"
Gtk-Message: 12:00:08.696: Failed to load module "canberra-gtk-module"
Ardour: [INFO]: Loading color file /app/share/ardour6/themes/dark-ardour.colors
Ardour: [INFO]: Loading ui configuration file /app/etc/ardour6/clearlooks.rc
Ardour: [INFO]: Loading bindings from /app/etc/ardour6/ardour.keys
Loading ui configuration file /app/etc/ardour6/clearlooks.rc
Found nothing along /home/remco/.var/app/org.ardour.Ardour/config/ardour6/templates:/app/share/ardour6/templates
Scanning folders for bundled LV2s: /app/lib/ardour6/LV2
Set cursor set to default

Als het goed is, is nu ook Ardour geopend. Zolang Ardour goed werkt is er niet al te veel reden om te veel zorgen te hebben over de waarschuwingen in de terminal.

Deze instellingen geeft op mijn systeem de volgende latency in Ardour:

Ardour latency

Met een tweede terminal venster open ik Carla met dezelfde latency instellingen als Ardour (128/48000) om de audio sources/sinks met elkaar te kunnen verbinden. Ik gebruik Carla omdat ik dit programma ken. Het programma Helvum kan ook gebruikt worden, maar heeft zeer beperkte mogelijkheden. Er zijn nog een paar meer van dit soort programmaś voor pipewire te vinden. Er zal in de toekomst vast een artikel komen op deze website waar ik beschrijf dat ik ben afgestapt van Carla.

PIPEWIRE_LATENCY=128/48000 flatpak run studio.kx.carla

Geeft de volgende output:

LRDF Support not available (LADSPA-RDF will be disabled)
Gtk-Message: 12:11:34.927: Failed to load module "appmenu-gtk-module"
Gtk-Message: 12:11:34.971: Failed to load module "canberra-gtk-module"
Gtk-Message: 12:11:34.971: Failed to load module "canberra-gtk-module"
Qt: Session management error: Could not open network socket
Carla 2.4.3 started, status:
  Python version: 3.9.9
  Qt version:     5.15.3
  PyQt version:   5.15.6
  Binary dir:     /app/lib/carla
  Resources dir:  /app/share/carla/resources
Frontend pixel ratio is 1.0
libjack.so.0 loaded successfully!

Met de volgende opdracht kun je zien dat pipewire de instellingen heet overgenomen:

pw-top

geeft de volgende output:

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

nl_NLNederlands