Ubuntu Server 18.04 で pulseaudio-bluetooth server 備忘録です.内容としては,以前の記事
の続きとなります.Volumio を pulseaudio に対応させることができましたので,ネットワークで音を転送し,Bluetooth スピーカーで聞いてみたいというのが目標です.
メリットはあるの?
まず,注意として,今回ご紹介する方法は,Volumio との組み合わせだけだと
知的好奇心を満たす以上のメリットはない!
です.実際,Volumio を Bluetooth スピーカー等に対応させたいだけであれば,Volumio plugin を用いた
や,GENKI Bluetooth を用いた
の方法の方が色々な面で便利だからです.
いちおう,今回の方法だといままで対応できなかった高音質と呼ばれている LDAC コーデックが使えるようになりはします.しかし,LDAC に対応させたいなら,素直に Sony の NW-A50 系か NW-A40 系 WALKMAN を買って,GENKI Bluetooth と同じように Volumio に USB 音源として接続する方が安定性も音質も良いと思います.
なぜ Ubuntu Server なのか?
現在の Volumio はもともと Raspbian を元に開発されているものでしすし,Raspbian は Debian の Raspberry pi 向けディストリビューションです.だから,わざわざ他の OS を使わず,
Volumio を直接 pulseaudio-bluetooth に対応させるべきでは?
って考えるのは当然だと思います.もちろん私も最初はその方向で考えたんですが,次の理由で諦めました.
- 現在の Volumio が Raspbian Jessie を元にしていて,Jessie だと,pulseaudio ver.5 が標準なこと(pulseaudio-bluetooth は ver.11 系列から対応)
- Volumio のアップデートに追従しにくくなる
要するに,大工事になりすぎる訳です.だから,Volumio になるべく手を入れずにすむ別サーバーで試すことにし,できればなるべく容量が小さい方が良いので,最小構成でのインストールが良いよなぁ……と考え,Ubuntu だと(経験的に)色々なハードウェアに対応しやすいはずだよなぁ……という流れで Ubuntu Server を選びました.
レシピ (Recipi)
最終的にまとめてみると簡単です.まず,最小構成で Ubuntu Server 18.04.3 LTS をインストールします.
私は VMWare ESXi で作られた仮想環境に導入しました.ESXi で Bluetooth のパススルーがうまくいかない場合は,
にある内容を試してみて下さい.
次に,素の Ubuntu Server に puseaudio-bluetooth を導入するのですが,ディストリビューション付属のものだと,LDAC とか AAC とかのコーデックに対応していません.
にこれらのコーデックに対応するためのコードが公開されていますが,対応する Ubuntu のパッケージを以下のように簡単に導入することができます.
$ sudo add-apt-repository ppa:eh5/pulseaudio-a2dp $ sudo apt-get update $ sudo apt-get install pulseaudio libavcodec58 libldac pulseaudio-modules-bt
ただし,このままだと一般ユーザーの権限で Bluetooth が使えません.Ubuntu Server に登録した一般ユーザー hyt から Bluetooth を利用するには以下の作業を行う必要があります.
$ sudo gpasswd -a hyt bluetooth $ sudo gpasswd -a hyt pulse-access $ sudo reboot
また,ネットワーク経由で音を転送するには,以下のような設定を /etc/pulse/default.pa に追加する必要があります.
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24 auth-anonymous=1
再起動すれば終了です.
使い方(テスト)
使い方は以下の通りです.まず,コンソールにログインしておきます(今回は一般ユーザー hyt でログインしているとします).
まず,pulseaudio server を起動します.
$ pulseaudio --start
次に,Bluetooth スピーカーを接続します.初めて接続する場合は以下のような感じになります.なお,ubts は Ubuntu Server のサーバー名です.
$ bluetoothctl [NEW] Controller AA:D3:B0:AA:AA:DD ubts [default] Agent registered [bluetooth]# scan on Discovery started [CHG] Controller AA:D3:B0:AA:AA:DD Discovering: yes .... [NEW] Device E0:37:BF:AA:AA:AA hear go 2 ....
Bluetooth デバイスの探索モードに scan on で切り替わりますので,あらかじめ Bluetooth スピーカーをペアリングモードにしておけば,しばらく待てば該当のスピーカーが発見されるはずです.今回の場合は Sony の hear go 2 (SRS-HG10) が発見されたことが分かります.
いったん見つかれば,scan off にした方が良いと思います.そうでないとその後もずっと探索が行われ,下手をするとつなぎたいデバイスがどれかわからなくなってしまいます.
# scan off Discovery stopped [CHG] Controller AA:D3:B0:AA:AA:DD Discovering: no ....
次に,Bluetooth スピーカを接続します.一般には pair でペアリングして,connect で接続するという手順だと思いますが,いきなり connect でも大丈夫のようです.
[bluetooth]# pair E0:37:BF:AA:AA:AA Attempting to pair with E0:37:BF:AA:AA:AA [CHG] Device E0:37:BF:AA:AA:AA Connected: yes [CHG] Device E0:37:BF:AA:AA:AA Paired: yes Pairing successful [CHG] Device E0:37:BF:AA:AA:AA Connected: no [bluetooth]# connect E0:37:BF:AA:AA:AA Attempting to connect to E0:37:BF:AA:AA:AA [CHG] Device E0:37:BF:AA:AA:AA Connected: yes Connection successful [CHG] Device E0:37:BF:AA:AA:AA ServicesResolved: yes [hear go 2]# exit Agent unregistered [DEL] Controller AA:D3:B0:AA:AA:DD ubts [default]
接続に失敗する場合は pulseaudio がきちんと起動できていないことが多いです.この場合は,
$ pulseaudio -k $ pulseaudio --start
のようにして pulseaudio を起動し直したあと,再びスピーカーの接続作業を行って下さい.
なお,Bluetooth スピーカーの信頼(trust) は勧めません.信頼すると,Bluetooth が有効な場合,Bluetooth スピーカーの発見と同時に接続が試行されますが,pulseaudio が起動していないと接続に失敗し続けることになってしまうからです(pulseaudio をサービスとして起動すれば良いのかも知れませんが,これは推奨されていません).一応,サービスとして起動するには,/etc/systemd/system/pulseaudio.service を
# systemd service spec for pulseaudio running in system mode -- not recommended though! # on arch, put it under /etc/systemd/system/pulseaudio.service # start with: systemctl start pulseaudio.service # enable on boot: systemctl enable pulseaudio.service [Unit] Description=Pulseaudio sound server [Service] Type=forking ExecStart=/usr/bin/pulseaudio --realtime --no-cpu-limit --system --disallow-exit --daemon ExecReload=/bin/pkill pulseaudio [Install] WantedBy=multi-user.target
のように記述し,
$ sudo systemctl start pulseaudio.service $ sudo systemctl enable pulseaudio.service
のようにすれば,ユーザー pulse で pulseaudio が起動(/etc/dbus-1/system.d/pulseaudio-system.conf 参照)します.また,system.pa を適当に書き換えれば pulseaudio-bt プラグインも有効にできますが,あまりメリットはないと思います.Bluetooth 機器の接続操作のためにサーバーにログインしないといけないので,それならばそのログインユーザーの権限で pulseaudio を起動すれば良いだろってなるからです.
最後に,実際に音が鳴るかどうかは以下のようにして試すことができます.
$ wget https://www.kozco.com/tech/LRMonoPhase4.wav $ paplay LRMonoPhase4.wav
接続コーデックのチェック
今回使っている pulseaudio-bt プラグインは現状,HWA を除く全てのコーデックに対応しているものなのですが,実際にどのコーデックが使われているのかは接続後,以下のようにpactl コマンドを使えば簡単に確かめることができます.
$ pactl list sinks Sink #3 State: SUSPENDED Name: bluez_sink.E0_37_BF_AA_AA_AA.a2dp_sink Description: hear go 2 Driver: module-bluez5-device.c Sample Specification: s16le 2ch 44100Hz Channel Map: front-left,front-right Owner Module: 27 Mute: no Volume: front-left: 65536 / 100% / 0.00 dB, front-right: 65536 / 100% / 0.00 dB balance 0.00 Base Volume: 65536 / 100% / 0.00 dB Monitor Source: bluez_sink.E0_37_BF_21_88_A1.a2dp_sink.monitor Latency: 0 usec, configured 0 usec Flags: HARDWARE DECIBEL_VOLUME LATENCY Properties: bluetooth.protocol = "a2dp_sink" bluetooth.a2dp_codec = "LDAC" device.description = "hear go 2" device.string = "E0:37:BF:AA:AA:AA" device.api = "bluez" device.class = "sound" device.bus = "bluetooth" device.form_factor = "speaker" bluez.path = "/org/bluez/hci0/dev_E0_37_BF_21_88_A1" bluez.class = "0x240414" bluez.alias = "hear go 2" device.icon_name = "audio-speakers-bluetooth" Ports: speaker-output: Speaker (priority: 0) Active Port: speaker-output Formats: pcm
bluetooth.a2dp_codec = “LDAC” とありますので,期待通り LDAC で接続されていることが分かります.
どのような順番でコーデックが選択されているのかが知りたい場合は,以下のように hcidump コマンドが使うことで分かります.
なお,hcidump コマンドは,Ubuntu の場合,bluz-hcidump に含まれています.したがって,実際に使う場合は以下のようにします.
$ sudo apt install bluez-hcidump $ sudo hcidump avdtp
音量の調整
音量の調整も pactl コマンドで行えます.以下の通りです.
$ pactl set-sink-volume 3 60%
ここで,set-sink-volume 3 としているのは,上で示した pactl list sinks で hear go 2 の sink が3番だからです.
Volumio との接続
これは以前の記事
を参考にしてください.
まとめ(雑感)
ここまでの内容を見ると分かると思いますが,要するにこれ,ネットワーク経由で使えるpulseaudio-bluetooth サーバーです.つまり,ネットワーク経由で汎用的に使える Bluetooth スピーカーに出力できるミキサーを作ったってことです.Volumio はこのサーバーに音を出力している(出力できる)ってだけ.
で,実際,作ってみると,
意外と遅延しない
ですし,
Bluetooth スピーカーとサーバーの位置が意外と離れてても大丈夫
です.
もちろん遅延については組み合わせる Bluetooth スピーカーによると思いますし,ゲームができるほどではもちろんないんですが,Volumio と組み合わせて使う場合だと,再生ボタンを押したのとほぼ同時に曲の再生が始まります.
また,スピーカーとサーバーの位置についても使われている Bluetooth 機器の ver. とか家の構造によると思いますが(実際,使っているのは NUC7PJYH なので,Bluetooth の ver. は 5 と最新),自宅1階の居間からほぼ家中どこにでも届きます.
こういう製品,意外とあるようでない.もちろんいまのままだとコマンドラインでしか制御できないので,一般的に使えるようなものじゃないですけど,これは Web インターフェースを被せれば良いだけの話で……あっても良いんじゃ無いのかなぁ……こういう製品,って思うんですが,なんで無いんでしょうねぇ?
以上