Bluetooth und HiFi sind zwei so Begriffe, die, zusammen in einem Satz ausgesprochen, Audio Enthusiasten gerne einen Schauer den Rücken runter laufen lassen. Der Grund ist trivial. Bluetooth hat zu wenig Bandbreite um Audio in hoher Auflösung unkomprimiert durch die Luft zu übertragen. Für den Headset Betrieb (synchroner Betriebsmodus für Telefonie) reicht es so gerade. Dabei ist die Qualität aber auch auf GSM-Codec Niveau und für Musik gar nicht zu gebrauchen.

Modulare A2DP Protokollerweiterung

Seiner Zeit wurde eine Protokollerweiterung namens A2DP (Advanced Audio Distribution Profile) für Musik eingeführt. Mittels SBC-Codec kann so ressourcenschonend qualitativ hochwertigeres Audio übertragen werden. Ressourcenschonend vor allem für die CPUs üblicher Bluetooth-fähiger Telefone und Abspielgeräte. Dass hier Abstriche in Qualität in Kauf genommen werden müssen, dürfte klar sein. Ab Version 2.0 (EDR – Enhanced Data Rate) ermöglicht Bluetooth höhere Übertragungsraten. Eine höhere Bitrate verbessert die Qualität etwas. Aber die Schwächen des SBC-Codecs bleiben natürlich.

Echtes HiFi mit AAC, aptX, aptX HD, LDAC

Seit einiger Zeit tut sich hier aber wirklich etwas. Und dies verspricht tatsächlich drahtlosen HiFi Musikgenuss. Die Rede ist von den Codecs AAC, aptX, aptX HD und LDAC. Diese zeichnen sich durch eine Vielzahl unterschiedlicher Qualitäten aus.

Die beste Quelle zu Verfügbarkeit, Qualität, Bitrate etc., die ich finden konnte, ist diese hier: Audio over Bluetooth: most detailed information about profiles, codecs, and devices (Englisch).

Man kann es wie folgt zusammenfassen:

SBCkann jedes sendende/empfangende Device, Qualität mittelmäßig
AACbeherrscht von Android/iPhone/Windows und vielen Empfangsgeräten, verlustbehaftet
aptX / aptX HDalter, propietärer Standard, mit höheren Bitraten / Abtastraten, HD Variante verlustfrei
LDACfreier, verlustfreier Standard von Sony mit hohen Bitraten / Abtastraten und dynamischer Datenrate

Wenn die eigenen Geräte es unterstützen, will man also vermutlich LDAC verwenden. Leider beherrschen meine Bose Quiet Comfort 35 II nur AAC. Also muss ich mich daran halten.

Linux-Support für die erweiterten Codecs

Pulseaudio kann A2DP Audio schon länger, viele Distributionen liefern bislang aber nur den SBC Codec mit aus. Unter Fedora ist dies im Paket ‘pulseaudio-module-bluetooth’ verpackt. Seit Version 30 ist im RPMFusion Repository auch das Paket ‘pulseaudio-module-bluetooth-freeworld‘ vorhanden. Dieses liefert alle genannten Codecs – außer AAC

Das begründet sich natürlich mit Lizenzbeschränkungen. Man kann die Module aber selbst einkompilieren. Die notwendigen Abhängigkeiten sind in Fedora vorhanden. Der Quellcode für die benötigten Module findet sich in diesem GitHub Repository. Ebenfalls dort finden sich auch Installationsinstruktionen, auf denen auch meine Anleitung basiert.

HiFi Module aus den Quellen kompilieren

Zuerst installieren wir benötigte Abhängigkeiten:

sudo dnf install fdk-aac-devel libldac-devel cmake ffmpeg libtool-ltdl-devel pkg-config libsbc-devel

Originale Dateien sichern

MODDIR=`pkg-config --variable=modlibexecdir libpulse`
sudo find $MODDIR -regex ".*\(bluez5\|bluetooth\).*\.so" -exec cp {} {}.bak \;

Quellcode auschecken

git clone https://github.com/EHfive/pulseaudio-modules-bt.git
cd pulseaudio-modules-bt
git submodule update --init

Zur pulseaudio Version passende Module kompilieren

git -C pa/ checkout v`pkg-config libpulse --modversion|sed 's/[^0-9.]*\([0-9.]*\).*/\1/'`

mkdir build && cd build
cmake ..
make
sudo make install

Module laden

pulseaudio -k

# wenn pulseaudio nicht automatisch neustartet, folgendes ausführen
pulseaudio --start

Kopfhörer verbinden und Profil auswählen

Nun kann man den Kopfhörer mittels Bluetooth (wieder)verbinden und das gewünschte A2DP HiFi Profil auswählen.

Bluetooth Gerätedialog

Dazu geht man in die Gnome-Einstellungen und verbindet das Gerät im Bluetooth Reiter. Der Knopf “Klangeinstellungen” führt zu den Gnome Audioeinstellungen. Hier stehen nun alle (neuen) Profile zur Auswahl.

Bluetooth Profilauswahl

Funktion überprüfen

Das genutzte Profil lässt sich mit pactl überprüfen.

pactl list
Karte #5
	Name: bluez_card.2C_41_A1_4E_FB_FE
	Treiber: module-bluez5-device.c
	Owner-Modul: 26
	Eigenschaften:
		device.description = "Matrix"
		device.string = "2C:41:A1:4E:FB:FE"
		device.api = "bluez"
		device.class = "sound"
		device.bus = "bluetooth"
		device.form_factor = "headphone"
		bluez.path = "/org/bluez/hci0/dev_2C_41_A1_4E_FB_FE"
		bluez.class = "0x240418"
		bluez.alias = "Matrix"
		device.icon_name = "audio-headphones-bluetooth"
	Profile:
		headset_head_unit: Headset Head Unit (HSP/HFP) (Ziele: 1, Quellen: 1, Priorität: 30, verfügbar: ja)
		a2dp_sink_sbc: High Fidelity Playback (A2DP Sink: SBC) (Ziele: 1, Quellen: 0, Priorität: 40, verfügbar: nein)
		a2dp_sink_aac: High Fidelity Playback (A2DP Sink: AAC) (Ziele: 1, Quellen: 0, Priorität: 40, verfügbar: ja)
		a2dp_sink_aptx: High Fidelity Playback (A2DP Sink: aptX) (Ziele: 1, Quellen: 0, Priorität: 40, verfügbar: nein)
		a2dp_sink_aptx_hd: High Fidelity Playback (A2DP Sink: aptX HD) (Ziele: 1, Quellen: 0, Priorität: 40, verfügbar: nein)
		a2dp_sink_ldac: High Fidelity Playback (A2DP Sink: LDAC) (Ziele: 1, Quellen: 0, Priorität: 40, verfügbar: nein)
		off: Off (Ziele: 0, Quellen: 0, Priorität: 0, verfügbar: ja)
	Aktives Profil: a2dp_sink_aac
	Ports:
		headphone-output: Headphone (priority: 0, latency offset: 0 usec, available)
			Teil der/des Profil(s): headset_head_unit, a2dp_sink_sbc, a2dp_sink_aac, a2dp_sink_aptx, a2dp_sink_aptx_hd, a2dp_sink_ldac
		headphone-input: Bluetooth Input (priority: 0, latency offset: 0 usec)
			Teil der/des Profil(s): headset_head_unit