Linuxでワイヤレスイヤホンの実力を発揮！pulseaudio-modules-btを導入する

:::note warn
2023/08/09 追記
このモジュールが持つ機能はPulseAudio 15で統合されました。
現在リポジトリはアーカイブされており、PulseAudio 15を使用することが推奨されています。
(この記事のような設定は不要です)
:::

LinuxではPulseAudioと連携して動くBlueZと拡張モジュールのおかげでワイヤレスイヤホンが使えます。

標準ではSBCという基本のコーデックしかサポートされていないため、WindowsやMacでさえaptXをサポートしているのに対して劣っています。

そこで、有志が開発した「pulseaudio-modules-bt」というモジュールを入れることで高音質コーデックがLinuxでも使えるようになります。

# 対応表
|コーデック|送信|受信|
|---------|-------|-------|
|SBC|〇|〇|
|AAC|〇|〇|
|aptX|〇|〇|
|aptX HD|〇|〇|
|LDAC|〇|-|

# ビルド
環境はUbuntu 20.04を前提に進めていきます。

まずはじめにビルドに必要なパッケージをインストールします。

```shell
$ sudo apt install build-essentials gcc cmake pkg-config ffmpeg git libfdk-aac-dev libavcodec-dev libpulse-dev libdbus-1-dev libsbc-dev libltdl-dev libbluetooth-dev
```
## libldac
libldacを最初にビルドします。
GitHubからクローンしてビルドします。

```shell
$ git clone https://github.com/EHfive/ldacBT.git
$ cd ldacBT
$ git submodule update --init
$ mkdir build && cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr -DINSTALL_DIR=/usr/lib -DLDAC_SOFT_FLOAT=OFF ..
$ sudo make DEST_DIR=$DEST_DIR install
```

## pulseaudio-modules-bt
ビルドする前にオリジナルのモジュール(pulseaudio-modules-bluetooth)をバックアップします。

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

それからGitHubからクローンしてビルドします。

```shell
$ cd
$ git clone https://github.com/EHfive/pulseaudio-modules-bt.git
$ cd pulseaudio-modules-bt
$ git submodule update --init
$ 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
```

# モジュールの設定
設定をいじるとさらにコーデックの品質を上げられます。

項目がいろいろありますが、とりあえずおすすめの設定を入れます。

`/etc/pulse/default.pa` を編集します。
70行目あたりに `.ifexists module-bluetooth-discover.so` という行があります。
その次の行の `load-module...` の行を編集します。下の内容で書き換えます。

```plaintext:default.pa
load-module module-bluetooth-discover a2dp_config="ldac_eqmid=hq ldac_fmt=s32 sbc_min_bp=53 sbc_max_bp=53 sbc_freq=44k sbc_sband=8 aac_afterburner=on aac_bitrate_mode=5"
```

ここではこのような設定をしています。

|Key|Value|備考|
|-----------|-----------|-----------|
|ldac_eqmid|hq|LDACのビットレートモード: 最高(990kbps)|
|ldac_fmt|s32|LDACのビット深度: 32ビット|
|sbc_min_bp|53|SBCの最低許容ビットプール値: 53 (328kbps)|
|sbc_max_bp|53|SBCの最大許容ビットプール値: 53 (328kbps)|
|sbc_sbands|8|SBCのサブバンド数: 8|
|sbc_freq|44k|SBCのサンプリング周波数: 44.1kHz|
|aac_afterburner|on|AACのAfterBurnerエンコード機能: 有効|
|aac_bitrate_mode|5|AACのビットレートモード: VBR(5)|

※SBCのビットプール値は小さくなるほどビットレートが高くなる。32=192kbps, 41=256kbps, 53=328kbps。
※AfterBurnerエンコード機能はlibfdk-aacの機能で、より精度を上げてエンコードするオプション。

もしLDAC使用時に音が途切れる場合は **ldac_eqmid**を **sq** または **auto** にしてください。
SBC使用時に音が途切れる場合は **sbc_min_bp** を **53以下** の値にして 調節してみてください。

# PulseAudioの再起動
最後にデーモンを再起動してモジュールを読み込ませます。

```shell
$ pulseaudio -k
$ pulseaudio --start
```

# 試聴する
デーモンを再起動するとワイヤレスイヤホンとの接続が解除されるので、あらかじめ接続しておきます。
何か音楽ファイルを再生して、再生できれば成功です。
現在使われているコーデックは以下のコマンドで確認できます。

```shell
$ pacmd list-sinks | grep bluetooth.a2dp_codec
                bluetooth.a2dp_codec = "AAC"
```

何も出てこない場合はモジュールがうまく読み込めていない可能性があるので何回かデーモンを再起動してください。

# 使ってみた感想
ビットレートはかなり高めになっているのでワイヤレスイヤホンの実力が十分に発揮できます。
もしかすると、AndroidやiOSで使っているときよりも音質が高い可能性があります。

普段使いはWI-C310ですが、Androidでは44.1kHzでしか使えなかったものがLinuxでは48kHzで使えています。ぜひお試しください！

# リンク
pulseaudio-modules-bt

https://github.com/EHfive/pulseaudio-modules-bt

ldacBT

https://github.com/EHfive/ldacBT