LinuxでWF-1000XM4のハイレゾ再生を利用する方法

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接続を選択することができる。

github.com

メジャーなディストリビューションなら概ねパッケージが提供されているので、それでインストールできる。

利用する前に、最初に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やその他のプレイヤーを利用して音楽を聞くのがメインならこちらの方が良い。

github.com

これもメジャーなディストリビューションなら大体パッケージがあるはず。

パッケージからインストールしたら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 -La2dpの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"
}