徒然なる日々を送るソフトウェアデベロッパーの記録(2)

技術上思ったことや感じたことを気ままに記録していくブログです。さくらから移設しました。

Raspberry Pi3 で bluetooth スピーカーを使う(はまった)

連休中に衝動買いした Raspberry Pi3 と Creative の
bluetooth スピーカーを接続しようとしたら、思い切り嵌ってしまったので
備忘録がてらメモ。

とりあえず、search→pairing までは成功したものの、connect しようと
すると

[bluetooth]# connect xx:yy:zz:ww:vv:uu
Attempting to connect to xx:yy:zz:ww:vv:uu
Failed to connect: org.bluez.Error.Failed

のようなエラーが出て先に進まない。

  • 対策1:モジュールが足りない?

Bluetooth ヘッドセット - ArchWiki
を読むと、これは pulseaudio のモジュールの一部が足りないからだと
書いてある。うーん、インストールしたはずなのになあ...
(ただし、piでは pulseaudio-module-bluetooth になっている。)

  • 対策2:audio, lp ユーザグループに自分を登録する必要あり?

どこかのサイトにこれがないと鳴らないと書いてあったので、追加してみる。
ついでに pulse, pulse-access にも登録しておく。

  • 事実3:bluez5 から ALSA がサポートから外れた。

なので、mplayer -ao alsa:device=bluetooth とやっても
ライブラリが足りないと言って怒られる。
ということは pulseaudio のデフォルトデバイスにしないと
bluetooth から鳴らないということ??

  • 対策4:pulseaudio 系コマンドは X 接続を要求する

従って Windows からアクセスする場合は Xming Server
のような X サーバソフトが必須となる。Teratermputty
X プロトコルを中継するように設定しよう。

  • 対策5:一部 root にならないと設定できない箇所がある。

bluetoothctl は root にならないと ^c 以外のキー入力を
受け付けない。しかし sudo すると X の認証が通らず pulseaudio
系のコマンド入力が失敗してしまう。
仕方がないので、今回は kdesudo をインストールして誤魔化した。

kdesudo xterm &

で root 化した xterm 上で以下のスクリプトを実行する。
でもその前に xterm 上で "xhost +" を実行した方がいいかも。

#!/bin/sh
pactl load-module module-bluetooth-discover
su minosys -c 'pulseaudio --start'
echo "power on" | bluetoothctl -a
echo "connect xx:yy:zz:ww:vv:uu" | bluetoothctl -a
su minosys -c 'echo "set-default-sink 1" | pacmd'
su minosys -c 'mplayer -playlist http://yp.shoutcast.com/sbin/tunein-station.pls?id=709809'

pactl は正直効いていない気がする。
なお、pairing→connect→trust まで1回走らせてあります。
最後の mplayer コマンドはお好みで変えてください。
どのコマンドの実行も失敗するように見えるが、実際にはこれで音が
鳴ります。

納得いかない...