パスワードを忘れた? アカウント作成
14231367 journal
入力デバイス

hixの日記: Raspberry Pi 4のBluetoothから音を鳴らす呪い

日記 by hix
Raspberry Pi 4 を使って音楽を聴いている。

プレーヤーや機材の構成は後のエントリで改めて記載するとして、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とすると、グラフィカルな音量調整画面が出る。

とりあえず、ここまで。

.

typodupeerror

192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり

読み込み中...