![入力デバイス 入力デバイス](https://srad.jp/static/topics/inputdev_64.png)
hixの日記: Raspberry Pi 4のBluetoothから音を鳴らす呪い
プレーヤーや機材の構成は後のエントリで改めて記載するとして、bluetooth周りがややこしかったので、その部分をこちらにまとめてみる。
書いているうちに物凄く長くなった。「詳しくはwebを検索」みたいな書き方もできたが、あちこち漁るのに本当にうんざりしたので、 後日検索で辿り着くかもしれない人々の苦労に免じて、長いのはご容赦頂きたく。
やや時期を逸した感もあるが、自宅籠城している人々の環境改善の手助けになれば。
CUI中心の構成。Raspberry Pi の設定でブートをデスクトップからCUIに切り替えてはいないが、sshでターミナルしか繋いでいない。
3種の構成を試した。メインで稼働しているヤツと、駄目だった状態からなんとか動くところまで持っていったヤツと、OSインストール直後のまっさらな状態から試したヤツ。
最後のまっさら状態からなら、当然ながらそれほど困ったことにはならないように思う。
必要そうなパッケージは、bluez と alsa-utils。
Raspberry Pi OS(或はRaspbian)の全部入り(with desktop and recommended software)なら標準で入っている。
bluetooth オーディオ関連でwebを漁るとPulseAudioの情報が引っかかってくるが、これは必須ではない。 わたくしの場合は、構成の複雑さが助長されただけであった。なんならアンインストールした。
PulseAudioが何者なのかは ざっくりとALSAとPulseAudioの関係 が参考になる。
以下の対処についてBluetooth, BlueALSA and Busterを参考にした。
まず、sudo systemctl status bluetooth.serviceでBluetooth Service のステータスを確認。
ここで、
Sap driver initialization failed.
sap-server: Operation not permitted (1)
のエラーが出ていれば、/lib/systemd/system/bluetooth.serviceを編集。
..略..
[Service]
Type=dbus
BusName=org.bluez
#ExecStart=/usr/lib/bluetooth/bluetoothd
ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=sap
..略..
(ExecStart に引数 --noplugin=sap を追加する)
systemctl daemon-reloadで反映らしいのだが、ステータスを見た時にいつの情報か解りにくいので、リブートが手っ取り早いと思う。
「SAP」とはBluetoothプロファイル
によれば、SIM アクセス プロファイルとの事。
このエラーが出ていてもオーディオには影響が無いだろうが、SIMなんて差さないので黙らせておいたほうが良いと思う。
余談だが
Unable to get Hands-Free Voice gateway SDP record: Host is down
のエラーも出ているが、こちらは無視している。
bluetoothの操作は、sudo bluetoothctl。
実行するとプロンプトが現れるので、コマンドを入力してインタラクティブに(対話的に)操作する。
とりあえず help を見よう(この手のコマンドの定番)。
主に使うコマンドは下記。
scan on
pair <dev>
scan off
paired-devices
connect <dev>
info [<dev>]
scan onとすると、デバイス側で電源を入れたりペアリングの操作などを行えば、何かがずらずらと表示される。
コマンドの引数に指定するデバイスアドレス(MACアドレスっぽい6バイトの16進数)がここに表示されるが、例えば pair と打って[Tab]を押せば補完されるので、コピー&ペーストなどは不要であろう。
pairの前後あたりで、scan off として静かにさせたほうが良い。
ペアリングしただけで使えるようになるのが殆どだと思うが connect が必要だったり、毎回 connect が必要な場合も有る。何の違いでそうなるか不明。
connect は、
[CHG] Device デバイスアドレス ServicesResolved: yes
が表示されれば正常(駄目な場合が有るので後述)。
続いて、amixer -D bluealsa scontrols
Simple mixer control 'DR-BT140Q - SCO',0
Simple mixer control 'DR-BT140Q | Battery',0
出力中に「- A2DP」が無くて「- SCO」しか無い、上記のような状態ならば /lib/systemd/system/bluealsa.serviceを編集。
..略..
[Service]
Type=simple
User=root
#ExecStart=/usr/bin/bluealsa
ExecStart=/usr/bin/bluealsa -S -p a2dp-source -p a2dp-sink
(ExecStart に引数 -S -p a2dp-source -p a2dp-sink を追加する)
追加する引数については /usr/bin/bluealsa --helpで内容が確認できる。helpの末尾に
By default only output profiles are enabled, which includes A2DP Source and
HSP/HFP Audio Gateways. If one wants to enable other set of profiles, it is
required to explicitly specify all of them using `-p NAME` options.
とあるので、引数 -p の追加は多分 A2DPの物に限定して起動するという事だと思われる。-Sはsyslogへの出力。
SCOとA2DPの違いは通信用語の基礎知識を参照。
わたくしの環境だけか否か解らないけれど amixer -D bluealsa によれば、SCO はモノラル再生になってしまっていた。
Simple mixer control 'DR-BT140Q - SCO',0
Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined
Playback channels: Mono
Capture channels: Mono
Limits: Playback 0 - 15 Capture 0 - 15
Mono: Playback 15 [100%] [on] Capture 15 [100%] [on]
Simple mixer control 'DR-BT140Q | Battery',0
Capabilities: pvolume pvolume-joined
Playback channels: Mono
Limits: Playback 0 - 100
Mono: Playback 255 [255%]
A2DPでの amixer -D bluealsa によればちゃんとステレオ再生する模様。
Simple mixer control 'DR-BT140Q - A2DP',0
Capabilities: pvolume pswitch
Playback channels: Front Left - Front Right
Limits: Playback 0 - 127
Mono:
Front Left: Playback 127 [100%] [on]
Front Right: Playback 127 [100%] [on]
ハナシは前後するが、sudo bluetoothctl にて、connect デバイスアドレス として、
Attempting to connect to デバイスアドレス
Failed to connect: org.bluez.Error.Failed
と出力され syslogに
a2dp-sink profile connect failed for デバイスアドレス: Protocol not available
が出ている場合は、構成や設定の不足ではなく、機器の電源の入り切りで直る場合があるので、まずはそれを試す。
(参考資料 DebianのWiki BluetoothUser a2dp。
この文章にはPulseaudioの記載が有るが、何か変な物を既に掴んだと解釈した)
音を出そう。
aplay -D bluealsa:DEV=デバイスアドレス /usr/share/sounds/alsa/Noise.wav
再生中 WAVE '/usr/share/sounds/alsa/Noise.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
上記のような引数を付けないと、どっか別の何かで再生される。本体のオーディオジャックかも知れないし(プラグを検出するから違うかも)、HDMIで繋がっているモニタかも知れない。
~/.asoundrc または /etc/asound.conf を下記の内容で作成すると引数無しで、Bluetooth側で再生される。
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "output"
}
}
pcm.output {
type bluealsa
device "デバイスアドレス"
profile "a2dp"
}
ctl.!default {
type bluealsa
}
(もっとシンプルな内容がありそうなのだが、見つけられなかった)
alsamixerとすると、グラフィカルな音量調整画面が出る。
とりあえず、ここまで。
.
Raspberry Pi 4のBluetoothから音を鳴らす呪い More ログイン