気の向くままに辿るIT/ICT/IoT
システム開発

Debian bookwormでPulseAudioからPipeWireへ移行

ホーム前へ次へ
*BSD/PC-UNIX/Linuxって?

Debian bookwormでPulseAudioからPipeWireへ移行

Debian bookwormでPulseAudioからPipeWireへ移行

2023/07/27

 Bluetoothイヤホン内蔵マイクがスマホでは使えるのにLinuxパソコンで使えない...と思ったらPulseAudioがヘッドセットのマイクに未対応だかららしい、PulseAudioのまま対応させる方法もあるにはある模様も、ここは標準対応してるというPipeWireにしてみよっとと移行してみた話。

  1. 経緯
  2. Debian bookwormにPipeWireをインストール
  3. PipeWireならLinuxパソコンでもワイヤレスイヤホンのマイクも認識される
  4. ただし、入出力共に自動設定されず、手動設定が必要
  5. ワイヤレスイヤホン&内蔵マイク自動設定スクリプト
  6. ただし、A2DPとHSP/HFPの微妙な切り替え問題が残る
  7. 備考

経緯

 検証にも使ったダイソー500円BluetoothイヤホンBT005で内蔵マイクも使ってみたら、スマホではペアリングさえしておけば、他に何もしなくてもハンズフリーで電話やオンラインミーティングに使える一方、パソコンだとBluetoothイヤホンの内蔵マイクをマイクと認識してくれないことに気づく。

 調べてみると自身が使っているLinuxパソコンについては、PulseAudioがBluetoothのハンズフリー用プロファイルHFP、ヘッドセット用プロファイルHSPに未対応であることが原因と判明。

 一方、Linuxにおいて次世代標準と名高く、PulseAudio、JACK、Alsa、GStreamer等々を代替したり、これらを完全サポートするというPipeWireはHSP/HFPにも対応しているとのこと。

 というわけでDebian GNU/Linuxを使っている自身は、PipeWire debian wikiを参照、bullseyeより、bookwormの方が簡単スムースなようなので先日アップグレードしてDebian bookwormなdynabookのPulseAudioをPipeWireへ移行してみた次第。

Debian bookwormにPipeWireをインストール

Linux+PulseAudioではHFP/HSPが利用不可/サンプル:ダイソー500円BluetoothイヤホンBT005

 移行前の[PulseAudio音量調節]パネルの[設定]タブにおける今回検証で使用のBluetoothイヤホンの選択肢は、音源聴取・再生プロファイルである[ハイファイ再生(A2DPシンク)]と[ヘッドセットヘッドヘッドユニット(HSP/HFP)]のみで後者に至っては、unavailable(利用不可)。

 写真はRaspberry Pi OS bullseye+[PulseAudio音量調節]パネル(移行前のDebian bookwormにおける[PulseAudio音量調節]パネルの撮影を忘れたので)。

debian:~$ sudo apt install pipewire-audio pipewire-pulse pipewire-alsa libspa-0.2-bluetooth wireplumber pipewire-media-session-
...
debian:~$ systemctl --user --now enable wireplumber.service
debian:~$ pactl info | grep '^Server Name'
Server Name: PulseAudio (on PipeWire 0.3.65)
debian:~$ sudo reboot

 そこでPulseAudioでは未対応な模様のワイヤレスイヤホン内蔵マイクをマイクとして認識してもらうべく、PipeWireをインストール。

 PipeWire#Debian 12と同ページ冒頭のDebian 12の説明を加味し、まとめて必要なものをインストールし、次回起動時、PipeWireが自動起動するようsystemctlでenable設定。

 この時、従前使用していたPulseAudioは削除されたとあり、確認してみると確かにシステムから削除されたようです。

 また、移行完了確認としてpactl infoコマンドを実行するとPipeWireの文字があるので正常に移行できたようです。(再起動が先だったかも?)

 ありがたいことに、いとも簡単。

 尚、PulseAudioからPipeWireに移行する際の既知の問題としてpacmdは使えなくなる、が、pactlで凌げるはずとのこと。

 ここで一応、マシンを再起動。

Linux+PipeWireでは選択肢も増えHFP/HSPほか利用可/サンプル:ダイソー500円BluetoothイヤホンBT005

 注釈がありますが、再起動後、特に何をすることなく、Bluetoothイヤホンのマイクが認識され、(実態はPipeWireである)[PulseAudio音量調節]パネルの[設定]タブにおける設定項目も増えつつ、有効になりました。

 尚、今回使用のBluetoothイヤホン対応コーデックはSBCのみということで当該Bluetoothイヤホン内蔵マイクの場合、[Headset Head Unit(HSP/HFP,codec mSBC)]、Codec:には、[mSBC]を選択。

PipeWireならLinuxパソコンでもワイヤレスイヤホンのマイクも認識されるが...

 PipeWireを使うとパソコン上でもオンラインミーティング時のマイクの選択肢に当該Bluetoothイヤホンの内蔵マイクも列挙され使用できるようになりました。

 また、パソコン上での電話については、例えば、Linphoneを使うと当該Bluetoothイヤホンによる通話も可能です。

ただし、入出力共に自動設定されず、手動設定が必要

 今回、Jitsi Meetを使ったLinuxパソコンでのリモート会議においてもLinphoneを使った電話においてもワイヤレスイヤホン内蔵マイクは、何れのアプリでも選択肢にはあるものの、自動設定はされないので手動で切り替える必要がありました。

 また、Jitsi Meetはブラウザで利用するのでなんですが、少なくともLinphoneによる電話の場合は、一度設定すれば、アプリを終了するまでは設定が有効なので次に電話する場合もワイヤレスイヤホン及び内蔵マイクで通話できますが、アプリを終了すると次回起動時は、システムでデフォルトのマイク&スピーカーが設定された状態となります。

 これは、ワイヤレスイヤホンの接続が、Linphone起動の前後何れでも同様です。

 ただ、自動設定するスクリプトを使うという手はあります。

ワイヤレスイヤホン&内蔵マイク自動設定スクリプト

#!/bin/bash
 
# .force_source_sink_bt005_as_default_setting.sh
 
a=`/bin/echo info **:**:**:**:**:** | /bin/bluetoothctl | /bin/grep Connected | /bin/awk -F" " '{print $2}'`
if [ $a=="no" ];then
 /bin/echo connect **:**:**:**:**:** | /bin/bluetoothctl
 /bin/echo "try connect first"
 /bin/sleep 10
fi
b=`/bin/echo info **:**:**:**:**:** | /bin/bluetoothctl | /bin/grep Connected | /bin/awk -F" " '{print $2}'`
/bin/echo "try comfirm second"
/bin/sleep 15
if [ $a == "no" && $b == "yes" ];then
 /bin/echo "connected first"
 /bin/pactl set-default-source bluez_input.**_**_**_**_**_**.0
 /bin/pactl set-default-sink bluez_output.**_**_**_**_**_**.1
 /bin/pactl set-sink-volume bluez_output.**_**_**_**_**_**.1 70%
else
 /bin/echo "Configured or Power OFF"
fi

 例えば、スクリプトをこんな風に書くとBluetoothヘッドセット|内蔵マイク付きBluetoothイヤホンなどBluetooth機器がペアリング・接続された時にシステムデフォルトとなり、各種アプリ起動時もこれがデフォルトになるはずです。

 尚、[**:**:**:**:**:**]や[**_**_**_**_**_**]を使用するBluetooth機器のMACアドレスに変更する必要あり。

 PulseAudio+Bluetoothスピーカーとほぼ同様ですが、PipeWireでは、sinkやsourceの名称など(命名規則)が若干異なるので注意。

 尤もBluetoothイヤホン接続中でも、アプリによって等、これの使用を強制したくないケースもあるかもしれませんが。

 もし、そういうケースがあるとすると元々これを自動でやってくれるAndroidスマホの場合、お手上げ?

ただし、A2DPとHSP/HFPの微妙な切り替え問題が残る

 ただし、Linuxパソコンにおいて自動スクリプトでワイヤレスイヤホンをデフォルトに設定したとしても、そういうものなのか、何かおかしいのか、HSP/HFPに設定されている場合、A2DPにも対応してくれますが、A2DP設定されているとワイヤレスイヤホンで通話ができませんでした。

 どういうことかと言うと、PipeWire移行後の[PulseAudio音量調節]パネルの[設定]タブにおけるワイヤレスイヤホンの選択肢が[Headset Head Unit(HSP/HFP,codec mSBC)]の状態でもA2DPプロファイルが対応する再生した音楽もワイヤレスイヤホンで聴くことができました。

 また、HSP/HFPとして設定されている場合、音楽を聴いている(A2DPプロファイル)最中に電話の着信を受けると(相手には聞こえないながら)音楽の聴取は継続されつつ、通話を同時に行なう状況になり(、そのままBGMとして聴いていても良いですが、そうでないなら音源を停止させる必要があり)ます。

 ただ、このようにHSP/HFP設定されている場合、何れのケースでも音源聴取中、割と長い間隔ながら音がブツッ、ブツッと途切れ途切れになるので音楽は明示的にそうはならないA2DP設定にして聴くのが賢明です。

 一方、A2DP(音源を聴くプロファイル)設定になっている場合、仮に電話アプリの入出力が共に当該ワイヤレスイヤホンに設定されている状態であっても、電話の着信があった場合、ワイヤレスイヤホンでの通話ができませんでした、よって通話が必要な場合は、HSP/HFP設定にしておく必要があります。

 このようにLinuxパソコンにおいて内蔵マイクのあるBluetoothヘッドセットやイヤホンでA2DPとHSP/HFPを同時に使う可能性のある状況だと痛し痒しな状況になります。

 更にGUIでこれらを切り替える場合、PulseAudioから移行した今回の場合、通話に使うアプリではなく、PipeWireベースの[PulseAudio音量調節]パネルの[設定]タブの当該Bluetoothデバイス名横のセレクトボックスで選択するしかなさそうで、そうだとすると運用上、微妙です。

 もしかするとオンラインミーティングや電話のアプリに特定のものを使うのであれば、pactlを駆使することで、自動的にそれらを検出して場合分けができるのかもしれません。

 が、ブラウザを使うアプリなどの場合、検出できなさそう?だったり、先の状況からして仮に通話が必要な場合は、音源聴取を行わない・停止することができたとして通話用アプリが起動中だと音源聴取を再開するタイミングが判断が難しい可能性や何かと条件が複雑になりそうで試していません。

 Androidスマホで試してみたところ、ワイヤレスイヤホンで音源聴取中に着信があった場合、失敗したり、若干不安定になることもありつつ、音源再生中の着信・通話中は、音源聴取が一時的に停止され、通話終了後、音源聴取が自動的に再開されました。

 画面の切り替え(画面のハンドル)も判定しているのでしょうかね。

 他方、そういう操作はまずすることはないでしょうが、ワイヤレスイヤホンで通話中に音源再生を開始した場合、継続して通話はできますが、通話を終了しても再生中ながら音源聴取はできず、改めて音源再生をし直す必要がありました。

 スマホとパソコンで微妙に異なる点があるのは気になるものの、少なくとも前者についてはパソコンでも対応できなくもないんでしょうが。

備考

 Bluetooth登場から久しいですが、仕様が統一しきれてなさそう?

 尚、PipeWire移行以前の音源や動画の視聴状況については、移行後も、何の違和感もなく、良好です。

 ちなみに気のせいではないと思うのですが、同じBluetoothイヤホンでもパソコンよりAndroidスマホの方が、特に話し始めにおいて、より遅延があるように感じました。

LINK

ホーム前へ次へ