Met de introductie van PipeWire is het Linux-audiosysteem aanzienlijk krachtiger geworden. Het is transparant voor de gewone gebruiker en maakt het voor de professionele gebruiker aanzienlijk eenvoudiger om meer audio-interfaces gelijktijdig te gebruiken.

Ton Valkenburgh

            

SoftwareBus

Dit artikel is eerder verschenen in SoftwareBus, het magazine van de Interessegroep CompUsers.

     

Audio onder Linux gaat veranderen. Zo worden een aantal beperkingen opgelost en wordt video-streaming gelijktijdig meegenomen. In dit artikel wordt het audio-gedeelte behandeld.

Degenen die onder Linux actief met muziek bezig zijn, hebben te maken met drie audio-systemen. In de Linux-kernel is ALSA (Advanced Audio Sound Architecture) geïntegreerd, daarbovenop is er PulseAudio voor de consumentenkant en Jack Audio Connection Kit (Jack) voor de professionals. Deze twee kunnen helaas niet gelijktijdig worden gebruikt.

PipeWire
Met de introductie van PipeWire (https://pipewire.org) wordt dit opgelost. PipeWire is een server en interface voor multimediatoepassingen en omvat streaming voor audio en video. PipeWire is een met Jack en PulseAudio compatibele oplossing die het leven van de musicus makkelijker maakt. Het vervangt dus PulseAudio en Jack. In afbeelding 1 zie je één en ander grafisch weergegeven. PipeWire is standaard in de distributie van Ubuntu 22.10.

afbeelding 1 pipewire 2

Afbeelding 1: Pipewire

Ubuntu Studio is voor de Linux-musicus het platform. De instellingen die je anders zelf allemaal moet aanbrengen, zijn voor je verzorgd. Sinds Ubuntu Studio naar de Plasma-desktop is overgegaan, is er ook de Ubuntu Studio Installer. Hiermee is Ubuntu Studio beschikbaar te maken onder willekeurige Ubuntu-varianten en dus ook onder Linux Mint Cinnamon. De Jack Audio Connection Kit wordt daarin echter nog steeds gebruikt. Met het installeren van PipeWire wordt het echter plezieriger werken met meer dan één audio-interface. Jack kun je na installatie van PipeWire verwijderen. Ubuntu Studio valt buiten het bestek van dit artikel en zullen we hier niet behandelen.

De ontwikkeling van PipeWire is  gestart met video-streaming. Later is meer aandacht aan audio-streaming besteed. De video-toepassingen zijn op zich heel interessant, met name voor webinars. In dit artikel zullen we ons echter beperken tot de audio-aspecten. Het gebruik bij video zullen we later in een artikel behandelen.

PipeWire installeren
PipeWire is bij Linux Mint Cinnamon 21.1 al geïnstalleerd. Helaas blijkt deze versie problemen te hebben met o.a. de interne audio-interface. We beginnen dus met het verwijderen van deze versie. Dat doen we door in Programmabeheer alle PipeWire-modules te verwijderen. Na het verwijderen hebben we een schone lei en kunnen we echt beginnen.

We moeten niet alleen PipeWire installeren (https://github.com/mikeroyal/PipeWire-Guide), maar ook extra bibliotheken om een aantal interfaces te kunnen gebruiken. We gaan eerst het Personal Package Archive (PPA) van PipeWire installeren. Geef het volgende commando in de terminal.

sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream

Installeer daarna PipeWire, de pipewire-audio-client-libraries en additionele bibliotheken voor het gebruik van bluetooth, GStreamer, of JACK-apparaten:

sudo apt update

sudo apt install pipewire pipewire-audio-client-libraries gstreamer1.0-pipewire
libpipewire-0.3-{0,dev,modules} libspa-0.2-{bluetooth,dev,jack,modules}
pipewire{,-{audio-client-libraries,pulse,media-session,bin,locales,tests}}

Na de installatie herladen we de daemon in systemd met het volgende commando:

systemctl --user daemon-reload

PulseAudio kunnen we nu uitschakelen, die hebben we niet langer nodig.
Daarvoor geven we het commando:

systemctl --user --now disable pulseaudio.service pulseaudio.socket

Je kunt PulseAudio altijd weer activeren met:

systemctl --user --now enable pipewire pipewire-pulse

Herstart de computer en test of het gelukt is met het commando:

pactl info

In het bericht moet dan op de regel Servernaam het volgende staan:
PulseAudio (on PipeWire 0.3...)

PipeWire is nu actief en is zowel voor PulseAudio- als Jack-toepassingen beschikbaar.

Het is echter handig om door middel van een grafische gebruikersinterface de benodigde verbindingen te kunnen leggen. Daarvoor is Qt PipeWire Graph (link ) een handig gereedschap.

 

Qt PipeWire Graph installeren
Je kunt Qt PipeWire Graph vinden in de repository. Start Programma beheer op en vul in het zoekveld in: qpwgraph. Kies als het is gevonden: Installeren.

Een alternatieve manier is het volgende: allereerst installeren we flatpak met het commando:

sudo apt install flatpak

Daarna geven we de volgende commando’s:

flatpak remote-add --if-not-exists flathub
https://flathub.org/repo/flathub.flatpakrepo

flatpak install flathub org.rncbc.qpwgraph

Je kunt qpwgraph starten via: Menu > Geluid & Video > qpwgraph. Je krijgt dan een grafisch overzicht van de aangesloten apparaten en eventuele toepassingen.

Als voorbeeld heb ik een USB MIDI-controller (Nektar LX 61+) aangesloten en het Digitaal Audio Station Ardour opgestart. Om eerlijk te zijn heb ik een aantal verbindingen verwijderd om het een beetje overzichtelijk te houden (zie afbeelding 2).

afbeelding 2 qt pipewire graph 2

Afbeelding 2: Ot Pipewire Graph

Je ziet dat de MIDI-controller LX61+ via een MIDI-brug met Ardour is verbonden. De Reasonable Synthesizer in Ardour is verbonden met de audio-playbackuitgangen. Normaal verbind je de synthesizer-uitgangen en de auditional-uitgangen met de master-ingangen. De master-uitgang gaat dan naar de audio-playbackuitgangen. Op die manier kun je de interne mixer van Ardour gebruiken. Deze door mij verwijderde verbindingen worden normaal automatisch gelegd.

Wat ik hier niet heb laten zien, is dat je meer audio-interfaces kunt aansluiten en gelijktijdig kunt gebruiken. Het plaatje zou dan nog voller en helemaal onleesbaar worden. Je kunt de weergave verbeteren door de modules te verplaatsen. Configuraties kunnen worden opgeslagen om later weer te gebruiken. Ardour bewaart zijn configuratie zelf. Dat was ook al het geval bij het gebruik van Jack.

Configureren
De instellingen (https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home) van PipeWire zijn in configuratiebestanden vastgelegd. Deze configuratiebestanden bevinden zich in /usr/share/pipewire/. Om de configuratie makkelijk te kunnen aanpassen, is het handig om de map pipewire te kopiëren naar ~/.config/. De punt (.) voor de mapnaam .config geeft aan dat het een verborgen bestand is. Verborgen bestanden maak je zichtbaar met de toetsencombinatie Ctrl + h. Je kunt ze ook weer verbergen met Ctrl + h.

Als we bijvoorbeeld het Jack.config-bestand openen, kunnen we o.a. de volgende regels vinden:

#node.latency       = 1024/48000
#node.rate          = 1/48000
#node.quantum       = 1024/48000

Achter de hash (#) staan de standaard ingestelde waarden. Rate is de bemonsteringssnelheid, quantum is de buffergrootte en node.latency geeft de buffergrootte aan bij een bepaalde bemonsteringssnelheid. Als de bemonsteringssnelheid wordt veranderd, wordt de buffergrootte mede aangepast. 

Om een lagere latency te verkrijgen, kun je de waarden aanpassen door bijvoorbeeld het volgende in te vullen zonder hash (#). We hebben gelijk de bemonsteringsfrequentie aangepast naar 44.100 Hz.

node.latency       = 256/44100
node.rate          = 1/44100

We hebben nu dus ingesteld op een buffer van 256 bij een bemonsteringsfrequentie van 44.100 Hz. Ook hebben we de bemonsteringsfrequentie op de cd-kwaliteit van 44.100 Hz gezet door node.rate. Je kunt de waarden opvragen met in de terminal het commando:

pw-metadata -n settings

Je kunt echter ook de standaardinstellingen wijzigen naar bijvoorbeeld 48000 Hz met het commando:

pw-metadata -n settings 0 clock.rate 48000

Tijdelijk kunnen we de instelling wijzigen naar bijvoorbeeld 44.100 Hz met:

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

Zowel de DSP-processor als apparaten zullen direct naar de nieuwe waarden overschakelen. Actieve streams zullen worden herbemonsterd om overeen te komen met de nieuwe waarde.

De standaard buffergrootte kun je op bijvoorbeeld 1024 instellen met:

pw-metadata -n settings 0 clock.quantum 1024

Tijdelijk een vaste buffergrootte instellen naar bijvoorbeeld 256 gaat met het commando:

pw-metadata -n settings 0 clock.force-quantum 256

Om terug te gaan naar de standaardwaarden, gebruik  je de commando’s:

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

Als we daarna de instellingen opvragen, zien we:

deelnemer@WS2:~$ pw-metadata -n settings
Found "settings" metadata 30
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:'0'
update: id:0 key:'clock.min-quantum' value:'16' type:''
update: id:0 key:'clock.max-quantum' value:'2048' type:''
update: id:0 key:'clock.force-quantum' value:'256' type:''
update: id:0 key:'clock.force-rate' value:'44100' type:''
deelnemer@WS2:~$

Eigenlijk zou dit met een grafische interface mogelijk moeten zijn. Er is dus nog wel wat ontwikkelingswerk te doen. Het feit echter dat we nu deze instellingen dynamisch kunnen wijzigen, is een grote vooruitgang ten opzichte hoe het ging bij Jack. Toen moesten we Jack herstarten en dus ook de actieve toepassing.

Tot slot
De functies voor video-streaming heb ik dus niet laten zien en zal in een ander artikel worden besproken. Met PipeWire kunnen ook verbindingen via het netwerk worden aangelegd en dat is ook een mooi onderwerp voor een volgend artikel.