SonyのフルワイヤレスイヤフォンであるWF-1000XM4は最大で96khzに対応しており、ハイレゾ対応であることを売りの一つにしているが、それを利用するためにはBluetoothのデータ転送codecとしてLDACというcodecを使う必要がある。
まず前提としてデフォルトのWF-1000XM4は接続性を優先する設定になっていてLDAC接続が利用できなくなっているので、スマホと接続する等してSonyのHeadphonesアプリから音質優先モードに設定を変更しておく必要がある。(ちなみにiPhoneはそもそもLDACに対応していないので音質優先モードにしてもLDACは使えない)
LinuxでLDAC接続する方法
pulseaudio-modules-bt
Linuxであれば、pulseaudio-modules-btがインストールされていれば、pulseaudioの接続プロファイルの選択でLDAC接続を選択することができる。
メジャーなディストリビューションなら概ねパッケージが提供されているので、それでインストールできる。
利用する前に、最初にbluezを使ってイヤフォンとペアリングしておく必要があるが、以降は普通にpulseaudioのsink interfaceとして利用できる。
ただpulseaudioはデフォルトの設定だと、一旦ソフトウェアレベルで再サンプリングされて44100hzか48000hzに落とされるはずなので、avoid-resampling
を有効にしてsample-rateの設定を変更しておく必要がある。
この辺りをちゃんと意識しておかないと、結局44100hzで再生されているという様な状態になるのでpulseaudioを利用する時には再サンプリングの存在を意識しないとハイレゾ再生できなくなってしまう。
結構設定がややこしいので、正直音楽を聞くならpulseaudioを使うのは余りオススメしないが、普通にシステムの音声出力として利用するならこちらの方が手軽だろう。リサンプリングの有無に関わらず、LDAC接続の方が明らかに音が良い。
bluez-alsa
pulseaudioを使わずにALSAから直接デバイスを触りたい場合はbluez-alsaを利用できる。ALSAから直接触れる様になると、再サンプリング無しで直接LDACでエンコードしてBluetoothに流すことが容易なので、mpdやその他のプレイヤーを利用して音楽を聞くのがメインならこちらの方が良い。
これもメジャーなディストリビューションなら大体パッケージがあるはず。
パッケージからインストールしたらsystemdのunitファイルも一緒にインストールされるはずなので、それを使ってbluealsaのデーモンを起動する。
後はREADMEに従って、ALSAのconfigファイルである.asoundrcに以下の内容になる様に設定を記述する。
$ cat ~/.asoundrc # 以下が設定ファイルの内容 defaults.bluealsa.service "org.bluealsa" defaults.bluealsa.device "XX:XX:XX:XX:XX:XX" defaults.bluealsa.profile "a2dp" defaults.bluealsa.delay 10000
後はbluetoothctlやその他のフロントエンドを使ってWF-1000XM4とペアリングし接続するとbluealsaがALSAから利用できるオーディオデバイスを追加してくれる。
接続が上手くいけば、以下のコマンドでデバイスが確認できる。(XX_XX_XX_XX_XXはデバイスアドレスなので各環境で読み替える)
$ bluealsa-cli list-pcms /org/bluealsa/hci0/dev_XX_XX_XX_XX_XX/hspag/sink /org/bluealsa/hci0/dev_XX_XX_XX_XX_XX/hspag/source /org/bluealsa/hci0/dev_XX_XX_XX_XX_XX/a2dpsrc/sink
もしくは
$ bluealsa-aplay -L bluealsa:SRV=org.bluealsa,DEV=XX:XX:XX:XX:XXPROFILE=sco WF-1000XM4, trusted audio-card, playback SCO (CVSD): S16_LE 1 channel 8000 Hz bluealsa:SRV=org.bluealsa,DEV=XX:XX:XX:XX:XX,PROFILE=sco WF-1000XM4, trusted audio-card, capture SCO (CVSD): S16_LE 1 channel 8000 Hz bluealsa:SRV=org.bluealsa,DEV=XX:XX:XX:XX:XX,PROFILE=a2dp WF-1000XM4, trusted audio-card, playback A2DP (LDAC): S32_LE 2 channels 96000 Hz
しかしデフォルトでの接続設定だとAACが伝送codecになっているので、設定の変更が必要になる。上記のbluealsa-aplay -L
でa2dpのcodec情報がLDACではなくAACになっているはず。
設定の変更はbluealsa-cliで行う。まず利用可能なcodecを確認する。
$ bluealsa-cli info /org/bluealsa/hci0/dev_XX_XX_XX_XX_XX/a2dpsrc/sink Device: /org/bluez/hci0/dev_XX_XX_XX_XX_XX Sequence: 0 Transport: A2DP-source Mode: sink Format: S32_LE Channels: 2 Sampling: 96000 Hz Available codecs: SBC AAC LDAC Selected codec: LDAC Delay: 200.0 ms SoftVolume: Y Volume: L: 127 R: 127 Muted: L: N R: N
$ bluealsa-cli codec /org/bluealsa/hci0/dev_XX_XX_XX_XX_XX/a2dpsrc/sink LDAC
これでselected codecがLDACになっていればOK。接続しなおしてサンプリングレートが96khzになっていることを確認する。
後は通常のalsaを利用した再生設定を各プレイヤーに追加すればハイレゾ再生が可能になる。
mpdの設定なら以下の様になる。
audio_output { type "alsa" name "WF-1000XM4" device "bluealsa" # alsaのbluealsaに関するデフォルト設定をそのまま利用するという意味 mixer_type "none" auto_resample "no" auto_format "no" auto_channels "no" }