Heute geht es also um das Soundsystem pipewire und um Kopfhörer. Der Text ist etwas länger geworden als ich wollte, aber ich habe versucht alle notwendigen Schritte nicht nur zu beschreiben sondern auch im Teil Durchführung in Codezeilen zu packen, damit es sich mit möglichst wenig Aufwand ausprobieren lässt – ich hoffe das ist geglückt.
Einleitung
Kopfhörer
Fangen wir mit den Kopfhörern an. Beim normalen Hören von Stereomaterial mit Kopfhörern, hört das linke Ohr so gut wie nur den linken Kanal und das rechte Ohr nur den rechten.
Normale Stereoaufnahmen sind allerdings darauf ausgerichtet, mit Lautsprechern wiedergegeben zu werden und da hören beide Ohren frequenzabhängig gedämpft und verzögert auch den jeweils anderen Kanal und obendrein noch jede Menge Reflexionen, die wichtig für einen räumlichen Klangeindruck sind. Deswegen hat man bei Kopfhörern oft das Gefühl, die Töne kämen aus dem eigenen Kopf.
Das Audiosignal ändert sich also auf dem Weg zum Ohr und die Funktion, die diese Änderung beschreibt, nennt man head related transfer function (HRTF oder auf deutsch kopfbasierte Übertragungsfunktion). Kopfbasiert, weil sie sehr stark von der Form des Kopfes, besonders von Frisur, Hinterkopf und Nase, abhängt.
Es gibt mehrere Wege wie man das bei der Wiedergabe nachbilden kann. Am besten funktioniert es, sich in jedes Ohr ein Mikrofon zu stecken und mit einem Testsignal über gute Lautsprecher in einen klanglich guten Raum aufzunehmen was beim Ohr ankommt und es gibt auch tatsächlich Enthusiasten, die genau das machen. So kommt man zu Impulsantworten (IR, impulse responses), die man analog zu den HRTF auch HRIR nennt.
Schneller kommt man mit fertigen HRIR-Dateien bereits erstellt haben zu einem Ergebnis. Auch nett ist, dass die meisten HRIR-Dateien nicht nur den Klang von zwei, also einem Paar Stereolautsprechern beschreiben sondern typischerweise gleich von einem 5.x oder 7.x Surroundsetup, gut geeignet um Filme oder dergleichen zu genießen.
pipewire.
Wie viele vielleicht schon mitbekommen haben dürften, ist Pipewire gerade dabei Pulseaudio zu verdrängen und es funktioniert bereits unter stable (bullseye) recht gut, erst recht mit den Backports und im aktuellen unstable und testing (bookworm). Pipewire bietet auch die Softwareschnittstellen von Alsa, Pulseaudio und Jack an, damit wirklich so ziemliche jede Anwendung den Ton auch über Pipewire ausgeben kann.
Wie sich der virtuelle Surround mit Pulseaudio umsetzen lässt habe ich bereits im Wiki-Artikel Audiokonfiguration geschildert, aber mit pipewire funktioniert es meiner Einschätzung nach noch etwas bequemer.
Nachdem ich für pipewire keine aus meiner Sicht brauchbare Anleitung gefunden habe, versuche ich mich heute an einer solchen Anleitung.
Durchführung
pipewire
Zuerst einmal muss pipewire das verwendete Soundsystem sein. Unter bullseye würde ich die Backports empfehlen, dann sollte es genauso wie unter einem aktuellen testing oder unstable, genügen Pulseaudio zu deinstallieren oder deaktivieren, wireplumber, pipewire-pulse und für Bluetooth-Audiogeräte libspa-0.2-bluetooth zu installieren und wireplumber als Benutzerdienst zu aktiveren.
Wenn bei bullseye die Backports bereits in den Paketquellen stehen oder testing/unstable verwendet wird, sollte das ungefähr so klappen:
Code: Alles auswählen
# apt install wireplumber pipewire-pulse
Code: Alles auswählen
$ systemctl --user mask pulseaudio.service
$ systemctl --user enable wireplumber.service
Dann brauchen wir eine passende HRIR-Datei. Die Auswahl im Netz an auf unterschiedliche Weise aufgenommenen HRIR-Dateien von Universitäten, Kopfhörerherstellern oder von begeisterten Klangbastlern selbst erzeugten Impulsantworten ist sehr groß.
Ich beschränke mich hier der Einfachheit halber erst einmal auf HRIRs, die Davi Carvalho [3] im Rahmen seiner Bachelorarbeit mit Matlab erzeugt und freundlicherweise veröffentlicht hat [2]. Gemeint ist die Datei »EAC_HRIRs_48kHz.wav«, die wir unter »~/.config/pipewire/hrir.wav« speichern:
Code: Alles auswählen
$ mkdir -p ~/.config/pipewire/pipewire.conf.d
$ wget -O ~/.config/pipewire/hrir.wav "https://sourceforge.net/p/hesuvi/discussion/general/thread/df9b0f231c/91c9/attachment/EAC_HRIRs_48kHz.wav"
Was wir wollen nennt sich unter Pipewire filter chain. Eine Vorlage für die passenden Änderungen habe ich im Quellcodearchive von pipewire gefunden [1], nur die Pfade zur HRIR-Datei müssen angepasst werden (in der Konfigurationsdatei sind das relative Pfade »hrir_hesuvi/hrir.wav« mit einem mir unbekannten Startpunkt, daher ersetzen wir die im folgenden durch den absoluten Pfad zur eben heruntergeladenen wav-Datei »${HOME}/.config/pipewire/hrir.wav«):
Code: Alles auswählen
$ wget -O ~/.config/pipewire/pipewire.conf.d/virtual-surround.conf "https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/src/daemon/filter-chain/sink-virtual-surround-7.1-hesuvi.conf?inline=false"
$ sed -i "s|hrir_hesuvi|${HOME}/.config/pipewire|g" ~/.config/pipewire/pipewire.conf.d/virtual-surround.conf
Verwendung des neuen virtuellen Ausgabegeräts
Nach diesen Schritten sollte in pipewire, nach dem nächsten Neustart (ich habe es zumindest unter Gnome nicht immer problemlos geschafft, pipewire neu zu starten) ein neues virtuelles Ausgabegerät namens „Virtual Surround Sink“ zur Verfügung stehen.
Bevor man das zur Wiedergabe auswählt, muss man das hardwaremäßig gewünschte Gerät und den richtigen Audioausgang zur Wiedergabe ausgewählt haben, denn an dieses neue virtuelle Ausgabegerät leitet die Wiedergabe an das bisherige Wiedergabegerät weiter. Das kann in den Einstellungesdialogen der Desktopumgebung, in pavucontrol oder auch in der Kommandozeile mit pactl oder auch mit pulsemixer erledigt werden.
Und noch ein kleiner Hinweis. Will man sich einen Film oder andere Material mit mehr als 2 Kanälen ansehen, sollte man die Audiogeräteumschaltereien erledigen bevor man die Wiedergabe startet.
Andernfalls kann es passieren, dass die Wiedergabe mangels der Surroundfähigkeit des Audiogeräts mit Stereowiedergabe startet und auch nichts daran ändert, wenn man später auf den virtuellen Surround umschaltet.
weitere, „bessere“ HRIR-Dateien
Welche HRIR-Dateien wie gut funktionieren ist individuell verschieden und es erfordert auch etwas Gewöhnung mit Kopfhörern mehr wie mit Lautsprechern zu hören, aber es gibt viele HRIRs, das gilt möglicherweise auch für andere.
Zu beachten ist nur, dass wenn man andere HRIRs sucht, dass sie wie die hier verwendeten 14 Kanäle haben (die Konfigurationsdatei ist für 7.x ausgelegt und man braucht und es gibt von den 7 Kanälen für jedes Ohr die passende Impulsantwort → 14 Kanäle), andernfalls muss man entweder die Konfiguration anpassen oder die HRIR-Dateien bearbeiten und es wird sehr schnell sehr aufwändig, wenn man aus hunderten HRIRs die beste ermitteln will und die meisten davon auch noch in irgendeiner Form anpassen, sich zum Beispiel aus hunderten von Kanälen die passenden 14 heraussuchen muss.
Eine einfachere Variante ist da noch sich etwas fertiges zu suchen, das andere im Internet hochgeladen haben, so wurden etwa HRIRs mit Hilfe von Geräten erstellt, die „Dolby Atmos for Headphones“ unterstützen, aber ohne es zu wissen befürchte ich, dass man sich da zumindest in einem rechtlichen Graubereich bewegt, daher halte ich mich mit Links zurück.
Wenn ihr euch selbst auf die Suche machen wollt, könnt ihr nach HRIR und „HeSuVi“ suchen, letzteres ist ein Tool, das unter Windows dasselbe macht, wie wir hier und für das sich viele HRIRs oder sogar HRIR-Sammlungen finden, die wenn sie für 7.x sind, auch mit unserer Konfiguration hier funktionieren.
Sonst lassen sich mit der Software vom oben erwähnten Davi Carvalho auch noch möglicherweise bessere HRIRs erzeugen. Mir gefällt zum Beispiel die so erzeugte »EAC_Default.wav« aus diesem Verzeichnis recht gut:
https://mega.nz/folder/uWZFzBDQ#EuwFR9pdEtUG11fw5RiRNw
(Es genügt sie wie oben als »~/.config/pipewire/hrir.wav« zu speichern.)
Zum Testen wie gut besonders die vorne/hinten-Lokalisation funktioniert, bieten sich Testdateien an. Auf dieser Seite [4] ganz unten gibt es 7.1-Testdateien. Bei der Wiedergabe im Browser wurde die bei mir allerdings immer auf Stereo heruntergemixt, deswegen empfehle ich die Datei herunterzuladen und dann mit einem geeigneten Player, z. B. mpv abzuspielen.
[1] https://gitlab.freedesktop.org/pipewire ... esuvi.conf
[2] https://sourceforge.net/p/hesuvi/discus ... f9b0f231c/
[3] https://github.com/davircarvalho/Indivi ... _Synthesis
[4] https://www2.iis.fraunhofer.de/AAC/multichannel.html