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