Linux Gaming: Knisternder/Knackender Ton

Einige Linux-Gamer haben sicherlich auch mit dem Problem zu kämpfen, dass manche Spiele – besonders die mit Unreal Engine 4 & 5 – ein Knistern/Knacken beim Ton haben. Dies ist u.a. darauf zurückzuführen, dass die Latenz von PulseAudio zu hoch ist. Anbei eine große Abhilfe.
Hinweis: Ich nutze eine Creative SoundBlaster X-Fi Fatal1ty Titanium. Der Hauptblog ist hauptsächlich für solche diskreten Soundkarten und hochwertige USB-Audio-DACs konzipiert. Ich werde allerdings für OnBoard-Lösungen auch noch eine extra Config anfügen.
Vorbereitung
Dies kann von Distribution zu Distribution unterschiedlich sein. In meinem Fall handelt es sich um Ubuntu 24.04.3 LTS, welches PulseAudio via PipeWire nutzt.
Um herauszufinden, was bei Euch läuft, gebt Ihr im Terminal einfach pactl info ein. Dann solltet Ihr sowas hier als Ausgabe bekommen:
johannes@johannes:~$ pactl info
Server-Zeichenkette: /run/user/1000/pulse/native
Bibliotheks-Protokollversion: 35
Server-Protokollversion: 35
ist lokal: ja
Client-Index: 1599
Tile-Größe: 65472
Name des Benutzers: johannes
Rechnername: johannes
Name des Servers: PulseAudio (on PipeWire 1.0.5)
Version des Servers: 15.0.0
Standard-Abtastwert-Angabe: float32le 2ch 48000Hz
Standard-Kanal-Zuordnung: front-left,front-right
Standard-Ziel: alsa_output.pci-0000_03_00.0.analog-stereo
Standard-Quelle: alsa_input.pci-0000_03_00.0.analog-stereo
Cookie: 2f04:6cbf
Code-Sprache: JavaScript (javascript)
Hier ist die Zeile Name des Servers: PulseAudio (on PipeWire 1.0.5) der Hinweis, dass PulseAudio über PipeWire läuft.
PipeWire-Config im Benutzer anlegen
Standardmäßig nutzt PipeWire die Konfigurationsdateien aus /usr/share/pipewire. Diese sollte man jedoch nicht bearbeiten, da diese Dateien durch Updates überschrieben werden. In dem Fall muss im Konfigurationsordner Deines Benutzerprofils, ein entsprechender Ordner angelegt werden.
mkdir -p ~/.config/pipewire/pipewire.conf.d/
mkdir -p ~/.config/pipewire/pipewire-pulse.conf.d/
Code-Sprache: JavaScript (javascript)
Nun müssen die Standard-Konfigurationsdateien rüberkopiert werden:
cp /usr/share/pipewire/pipewire.conf ~/.config/pipewire/
cp /usr/share/pipewire/pipewire-pulse.conf ~/.config/pipewire/
Code-Sprache: JavaScript (javascript)
pipewire-pulse.conf anpassen
Nun musst Du die Datei pipewire-pulse.conf in ~/.config/pipewire/ editieren. Das kannst Du mit nano im Terminal oder mit einem beliebigen Texteditor machen.
Änderungen im Bereich stream.properties:
resample.quality = 9
dither.noise = 1
- resample.quality = 9 schraubt die Resample Qualität auf die höchste Stufe. X-Fi profitiert davon, weil der Chip mit hochwertigem Input besser klingt.
- dither.noise = 1 verhindert Quantisierungsrauschen => satter, sauberer Klang, vor allem bei leisen Passagen. Das kannst Du so lassen, falls Du auch Musik hörst, oder auf 0 stellen, wenn nicht. Da ich auch Musik höre, will ich auch besseren Klang hier.
Änderungen im Bereich pulse.properties:
pulse.min.req = 512/48000
pulse.default.req = 1024/48000
pulse.min.quantum = 512/48000
pulse.idle.timeout = 0
pulse.default.format = F32
pulse.default.position = [ FL FR ]
pulse.min.quantum = 1024/48000
Code-Sprache: PHP (php)
- 512/48000 & 1024/48000: Das vor dem / ist die Puffergröße. Standard sind hier 128 und 960. Wir erhöhen somit die jeweiligen Puffergrößen, was dazu führt, dass das Knistern/Knacken aufhört. Das hinter dem / ist die maximale Abtastrate – also 48 kHz.
- pulse.idle.timeout = 0 sorgt dafür, dass sich die Soundkarte nicht einfach Schlafen legt.
- pulse.default.format = F32 sorgt dafür, dass die Soundkarte 32-Bit PCM perfekt verarbeitet.
- Die Puffererhöhung von pulse.min.quantum sorgt dafür, dass es keine Perioden-Unterläufe gibt.
- pulse.default.position = [ FL FR ] ist für die Stereo-Optimierung bei Kopfhörern bzw. Lautsprechern gedacht. Es gibt noch andere für Surround, sowie 5.1 und 7.1 usw.
Wenn Du dann alles abgeändert hast, dann einfach speichern und Datei schließen.
Überprüfe am besten, ob das RealTime-Kit bei Dir installiert ist:
johannes@johannes:~$ apt list rtkit
Auflistung… Fertig
rtkit/noble,now 0.13-5build1 amd64 [installiert]
Code-Sprache: PHP (php)
Wenn nicht, dann installiere es mit sudo apt install rtkit nach. Dieses „erlaubt“ Programmen, Audio-Threads in den sogenannten Echtzeit-Modus (Realtime Scheduling) zu setzen.
pipewire.conf anpassen
Hier kann man noch ein wenig mehr unter Linux selber tweaken. Einfach die pipewire.conf öffnen und folgende Einstellungen nutzen:
link.max-buffers = 64
default.clock.rate = 48000
default.clock.allowed-rates = [ 48000 ]
default.clock.quantum = 512
default.clock.min-quantum = 256
default.clock.max-quantum = 2048
mem.mlock-all = true
Code-Sprache: JavaScript (javascript)
- link.max-buffers = 64: Erhöht die maximale Puffergröße auf 64. Solltest Du Tonverzerrungen oder Plops feststellen, probiere 32 oder geh auf 16 zurück.
- default.clock.rate & default.clock.allowed-rates: Forciert hier 48 kHz (4800), sodass Apps nichts resampeln, was die Qualität erhöht.
- default.clock.quantum = 512 / default.clock.min-quantum = 256 / max-quantum = 2048: Sehr niedrige Latenz (256 Samples), aber mit großem Max-Puffer (2048) → kleine CPU-Spikes werden gepuffert, Audio bleibt stabil.
- mem.mlock-all = true: Sperrt alle Audio-Puffer im RAM → keine Knackser durch Swap / Memory-Latenzen. Empfiehlt sich nur zu setzen, wenn Du auch wirklich genügend RAM hast. Sollten mindestens schon 16 GB sein.
Hinweis: Sollte Deine PipeWire Version nicht höher 0.3.x sein, solltest Du bei link.max-buffers bei 16 bleiben. Vor allem, wenn Du ältere Wine-Spiele spielst, da es dann zu Problemen kommen könnte. Neuere Spiele sollten aber kein Problem machen. Proton z.B. nutzt eh dann die PulseAudio-Config. Welche PipeWire-Version Du hast, kannst Du mit pipewire --version erfahren.
Beachte, dass Du ein recht potentes System haben solltest. Muss jetzt kein aktueller High End Rechner sein, aber zumindest kein Pentium oder Celeron bzw. gleichwertiges AMD Pendant. Sollte schon was können. Ansonsten default.clock.quantum auf 256 setzen.
Wenn Du alles geändert hast, musst Du nur noch PipeWire neustarten und kannst dann testen.
systemctl --user restart pipewire pipewire-pulse wireplumber
Es hatte bei mir bei STAR WARS Jedi Survivor sofort funktioniert. Allerdings hat die Unreal Engine eine Eigenart, die dafür sorgt, dass es manchmal zu so kleinen Soundverzerrungen kommt. Tritt aber nicht all zu häufig auf.
Generell sollte man das auch auf neuere diskrete Soundkarten anwenden können. Da musst Du mal schauen, was Deine diskrete Soundkarte (nicht OnBoard!) oder Dein USB-Audio-DAC maximal kann.
OnBoard Soundchips
Änderungen im Bereich pulse.properties (pipewire-pulseaudio.conf):
pulse.min.req = 512/48000
pulse.default.req = 1024/48000
pulse.min.quantum = 512/48000
pulse.idle.timeout = 0
pulse.default.format = F32
Code-Sprache: PHP (php)
Im Bereich stream.properties ist es unterschiedlich. Da OnBoard-Soundchips hauptsächlich von der CPU speisen, kann resample.quality = 9 unter Umständen zu viel des Guten sein. Bei potenten Desktop-PCs kann man 9 nehmen. Auf Laptops oder älteren CPUs, wäre ein Wert von 5-7 zu empfehlen.
Während OnBoard-Soundchips mit einer Abtastrate von 48 kHz (48000) wunderbar zurecht kommen, könnten manche USB-Lösungen lieber 44 kHz (44000) wollen. Dies musst Du ausprobieren und dann entsprechend im pulse.properties Bereich anpassen. Dann ist es z.B. nicht 1024/48000 sondern 1024/44000.
Was das dither.noise aus dem stream.properties Bereich betrifft, sollte hier der Wert bei OnBoard-Lösungen auf 0 stehen. Die X-Fi arbeitet intern auf 24/32 Bit, wo das Dithering was bringt. Viele Onboard-Chips wandeln ohnehin so aggressiv runter, dass es egal ist.
Das rtkit sollte auch hier installiert sein.

Kommentare zu 'Linux Gaming: Knisternder/Knackender Ton' (0)
Kommentar-Feed