Ubuntu Server 18.04 で pulseaudio-bluetooth server 備忘録

Gadget
Photo by hyt.

Ubuntu Server 18.04 で pulseaudio-bluetooth server 備忘録です.内容としては,以前の記事

Volumio を pulseaudio に対応させる備忘録
Volumio を pulseaudio に対応させる備忘録です.なんで対応させたいの?技術として興味があると言ってしまえばそれで終わりなので,いちおう言い訳しておきます.Volumio って,基本的な中身は mpd (Music Play...

の続きとなります.Volumio を pulseaudio に対応させることができましたので,ネットワークで音を転送し,Bluetooth スピーカーで聞いてみたいというのが目標です.

メリットはあるの?

まず,注意として,今回ご紹介する方法は,Volumio との組み合わせだけだと

知的好奇心を満たす以上のメリットはない!

です.実際,Volumio を Bluetooth スピーカー等に対応させたいだけであれば,Volumio plugin を用いた

Volumio2 on Raspberry pi で Bluetooth スピーカーとストリーミング再生を両立させる備忘録
そのまんま,Volumio2 on Raspberry pi で Bluetooth スピーカーとストリーミング再生を両立させる備忘録です.Volumio2 Bluetooth Device プラグイン手持ちの Bluetooth スピーカ...

や,GENKI Bluetooth を用いた

GENKI Bluetooth を Volumio2 で使ってみた備忘録
GENKI Bluetooth を Volumio2 で使ってみた備忘録です.前置きVolumio2 を使う動機ってのは,安価かつ手軽に音の良い音楽視聴環境を作れるってとこだと思います.しかし,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 に対応させるべきでは?

って考えるのは当然だと思います.もちろん私も最初はその方向で考えたんですが,次の理由で諦めました.

  1. 現在の Volumio が Raspbian Jessie を元にしていて,Jessie だと,pulseaudio ver.5 が標準なこと(pulseaudio-bluetooth は ver.11 系列から対応)
  2. Volumio のアップデートに追従しにくくなる

要するに,大工事になりすぎる訳です.だから,Volumio になるべく手を入れずにすむ別サーバーで試すことにし,できればなるべく容量が小さい方が良いので,最小構成でのインストールが良いよなぁ……と考え,Ubuntu だと(経験的に)色々なハードウェアに対応しやすいはずだよなぁ……という流れで Ubuntu Server を選びました.

レシピ (Recipi)

最終的にまとめてみると簡単です.まず,最小構成で Ubuntu Server 18.04.3 LTS をインストールします.

Ubuntuを入手する | Ubuntu
Ubuntuは、スマートフォン、タブレット端末、PCからサーバー、クラウドまであらゆる環境で動作するオープンソースのソフトウェアプラットフォームです。

私は VMWare ESXi で作られた仮想環境に導入しました.ESXi で Bluetooth のパススルーがうまくいかない場合は,

ESXi6.7 で Bluetooth をパススルー備忘録
ESXi6.7 で Bluetooth をパススルーしてみた備忘録です.結論から言うと,いちおう出来るみたいです.検証環境基本となる仮想環境は以下の通りです.ESXi6.7 on Intel NUC7PJYH見ての通り Intel の NU...

にある内容を試してみて下さい.

次に,素の Ubuntu Server に puseaudio-bluetooth を導入するのですが,ディストリビューション付属のものだと,LDAC とか AAC とかのコーデックに対応していません.

GitHub - EHfive/pulseaudio-modules-bt: [Deprecated, see https://github.com/EHfive/pulseaudio-modules-bt/issues/154] Adds Sony LDAC, aptX, aptX HD, AAC codecs (A2DP Audio) support to PulseAudio on Linux
Adds Sony LDAC, aptX, aptX HD, AAC codecs (A2DP Audio) support to PulseAudio on Linux - EHfive/pulseaudio-modules-bt

にこれらのコーデックに対応するためのコードが公開されていますが,対応する 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 コマンドが使うことで分かります.

BluetoothヘッドホンがA2DPで対応しているコーデックを調べる - うならぼ
手持ちのBluetoothヘッドホンがA2DPプロファイルで使えるコーデックのうち、どのコーデックに対応しているのかをWiresharkで調べたお話。

なお,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 との接続

これは以前の記事

Volumio を pulseaudio に対応させる備忘録
Volumio を pulseaudio に対応させる備忘録です.なんで対応させたいの?技術として興味があると言ってしまえばそれで終わりなので,いちおう言い訳しておきます.Volumio って,基本的な中身は mpd (Music Play...

を参考にしてください.

まとめ(雑感)

ここまでの内容を見ると分かると思いますが,要するにこれ,ネットワーク経由で使えるpulseaudio-bluetooth サーバーです.つまり,ネットワーク経由で汎用的に使える Bluetooth スピーカーに出力できるミキサーを作ったってことです.Volumio はこのサーバーに音を出力している(出力できる)ってだけ.

で,実際,作ってみると,

意外と遅延しない

ですし,

Bluetooth スピーカーとサーバーの位置が意外と離れてても大丈夫

です.

もちろん遅延については組み合わせる Bluetooth スピーカーによると思いますし,ゲームができるほどではもちろんないんですが,Volumio と組み合わせて使う場合だと,再生ボタンを押したのとほぼ同時に曲の再生が始まります.

また,スピーカーとサーバーの位置についても使われている Bluetooth 機器の ver. とか家の構造によると思いますが(実際,使っているのは NUC7PJYH なので,Bluetooth の ver. は 5 と最新),自宅1階の居間からほぼ家中どこにでも届きます.

こういう製品,意外とあるようでない.もちろんいまのままだとコマンドラインでしか制御できないので,一般的に使えるようなものじゃないですけど,これは Web インターフェースを被せれば良いだけの話で……あっても良いんじゃ無いのかなぁ……こういう製品,って思うんですが,なんで無いんでしょうねぇ?

以上

 

タイトルとURLをコピーしました