PulseAudioでRaspberry PiをBluetoothレシーバーにする

そもそものPulseAudioをどう設定したのか、かなり前に試行錯誤して記録を残し忘れてしまいました。
今はALSAを経由せず、shairport-sync(AirPlay)とgmrender-resurrect(DLNA/Upnp)はPluseAudio経由で使えています。
PulseAudioのおかげで、それぞれのアプリケーションがALSAのデバイスを開放されるのを待たずに利用できます。
ソフトウェアミキシングしているんでしょう。(その分、音が悪いということかもしれません。)

そこで、Bluetooth USBドングルを使って、Raspberry PiBluetoothレシーバーにします。
せっかくPulseAudioが使えているので、そのままPulseAudioをBluetooth対応にします。

参考にしたのはこのサイト
ifritjp.github.io

もう、このサイトの通りやればほぼできます。
が、いつくかハマりポイントが。

bluetoothctlで接続まででき、スマホで音楽再生もできるのですが、音は一切鳴りません。
pactl list sources shortを実行しても、bluezで始まる再生デバイスが表示されないのです。

# pactl list sources short
0	alsa_output.platform-bcm2835_audio.digital-stereo.monitor	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED
1	alsa_output.platform-bcm2835_audio.analog-stereo.monitor	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED
2	alsa_output.usb-VIA_Technologies_Inc._NFJ_USB_Audio-00.analog-stereo.monitor	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED

どうやら、bluetooth関連のモジュールがPulseAudioに組み込まれていないからのようです。
そこで、/etc/pulse/system.paの最下行にbluetooth関連のモジュールをロードする指示を記載して再起動します。

# nano /etc/pulse/system.pa

(中略)

### Bluetooth Audio
load-module module-bluetooth-policy
load-module module-bluetooth-discover

再起動することで、Bluetoothレシーバーとして音が鳴ります。
PulseAudioデバイスも表示されます。

# pactl list sources short
0	alsa_output.platform-bcm2835_audio.digital-stereo.monitor	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED
1	alsa_output.platform-bcm2835_audio.analog-stereo.monitor	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED
2	alsa_output.usb-VIA_Technologies_Inc._NFJ_USB_Audio-00.analog-stereo.monitor	module-alsa-card.c	s16le 2ch 44100Hz	IDLE
7	bluez_source.80_7B_3E_8D_82_25.a2dp_source	module-bluez5-device.c	s32le 2ch 44100Hz	RUNNING

ちなみに余談ですが、PulseAudioのデフォルト再生デバイスをUSB DACにしています。
上記デバイスリストのNo.2です。
これは、/etc/pulse/default.paでset-default-sinkにデバイス名を指定します。

# nano /etc/pulse/default.pa

(中略)

### Make some devices default
set-default-sink alsa_output.usb-VIA_Technologies_Inc._NFJ_USB_Audio-00.analog-stereo
#set-default-source input

さて、ここで再生されるのはBluetooth標準のSBCコーデックでの再生です。
安いDAC、安いデジタルアンプ、安いスピーカーでもSBCの音質はペラッペラのひどい音なのがわかります。
そこで、高音質コーデックをインストールします。

参考にしたのはこのサイト
www.labohyt.net

またもやこの通りにやると対応できちゃいます。
自分はAACコーデックは不要だったので、そこはスキップしました。

# apt install pulseaudio libpulse-dev libbluetooth-dev libdbus-1-dev libsbc-dev libavcodec-dev libavutil-dev dh-autoreconf git cmake
# mkdir src
# cd src
# git clone https://github.com/EHfive/ldacBT.git
# cd ldacBT/
# git submodule update --init
# mkdir build && cd build
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DINSTALL_LIBDIR=/usr/local/lib -DLDAC_SOFT_FLOAT=OFF ../
# make DESTDIR=$DEST_DIR install
# MODDIR=`pkg-config --variable=modlibexecdir libpulse`
# find $MODDIR -regex ".*\(bluez5\|bluetooth\).*\.so" -exec cp {} {}.bak \;
# 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 -DCODEC_APTX_FF=ON -DCODEC_APTX_HD_FF=ON -DCODEC_LDAC=ON ..
# make
# sudo make install
# ldconfig

違いは、AACに対応しないので、fdk-aacを導入しないのと、pulseaudio-modules-btのcmakeで-DCODEC_AAC_FDK=ONを記載していないことです。

Raspberry Piを再起動してスマホからBluetooth接続して音楽を再生すると、明らかに音がよくなりました。
ちなみに、LDACはデコードに対応していないので、Raspberry PiをはじめとするLinuxマシンをBluetoothレシーバーにすると、LDACコーデックは使えません。
aptX-HDを使っているのかな?と、思ってスマホの開発者モードから確認すると、aptXを使っていました。
なんと、私が使っているGalaxy S20はaptX-HDには対応していないと・・・。
まぁaptXでもSBCよりは十分音が良くなったので、これで良しとします。

LDACでデコードできるようにならないかなぁ・・・。