初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

Raspberry Pi 3とポタアンで音楽を再生するネットワークオーディオプレーヤーを作った(Bluetooth編)

えっ?BTってBUCK-TICKじゃないの?

前回、iOSデバイスからRaspberry Pi 3(RPi3)にAirPlay経由で音楽配信アプリの音声を再生するようにしたのだが…

osa030.hatenablog.com

前回の実験に用いたiOSデバイスは息子氏の所有物でオッサンiOSデバイス持ってません。

ということで、前回途中で挫折したBluetooth経由での再生にチャレンジだ。

構成

こんな感じ。

f:id:osa030:20160909214917j:plain

デスクトップ環境構築

色々と試してみたところ、Bluetooth経由でRPi3に音声を再生させるにはどうもデスクトップ環境が必要っぽい*1。今回ベースにしている「Raspbian Jessie LITE」はGUI環境がインストールされていないので、必要最小限を手動でインストールしていく。ということで、最初から「Raspbian Jessie」をSDカードに書き込んでいる人は不要。

以降の手順は次の記事を参考に今回やりたいための必要最低限の手順を記載したもの。

[GUIDE] Raspbian Lite with RPD/LXDE/XFCE/MATE/i3/Openbox/X11 GUI - Raspberry Pi Forums

SDカード領域拡張

$ sudo raspi-config

"1 Expand Filesystem"->"Ok"->"Finish"->"Yes"でリブート

各種パッケージ導入

$ sudo apt-get install --no-install-recommends xserver-xorg
$ sudo apt-get install --no-install-recommends xinit
$ sudo apt-get install mate-desktop-environment-core
$ sudo apt-get install lightdm

今回はデスクトップ環境として「MATE Desktop Environment (MATE)」を選択した。

自動ログイン設定

$ sudo raspi-config

"3 Boot Options" -> "B4 Desktop Autologin Desktop GUI"->"Finish"->"Yes"でリブート

これをしないとどうも上手くいかなかった。

A2DP設定

続いては、Bluetooth経由で音楽を再生するA2DP(Advanced Audio Distribution Profile)の設定。

Bluetooth有効化

当初Bluetoothなんて使う予定がなかったので無効化したのだが、今回有効化してやらないといけない。無効化してない人は以下の手順は不要。

$ sudo systemctl enable hciuart
$ sudo systemctl enable bluetooth
$ sudo vi /boot/config.txt
  • /boot/config.txt
# Dsiable bluetooth
#dtoverlay=pi3-disable-bt
$ sudo reboot

以降の手順は次の記事を参考に試行錯誤した結果。

A2DP audio streaming using Raspberry PI (Raspbian Jessie) · GitHub

各種パッケージ導入

$ sudo apt-get install bluez-tools pulseaudio-module-bluetooth python-gobject python-gobject-2
$ sudo usermod -a -G lp pi

PulseAudio設定

Bluetooth経由で受信した音声データをUSB-DACに出力する設定。

$ sudo vi /etc/pulse/daemon.conf
  • /etc/pulse/daemon.conf
resample-method = trivial
default-sample-rate = 48000
enable-remixing = no
enable-lfe-remixing = no
default-sample-format = s32le
default-sample-channels = 2
exit-idle-time = -1

上記記事のままの設定だとノイズがのるのでパラメータを適当に変えている。ここの設定を変更すると音質が変わるらしいが、DA-10に任せるので今回はこだわらない。

Bluetooth設定

Androidデバイス(Bluetoothで接続してくる機器)から、A2DPデバイスとして検出される為の設定。

$ sudo vi /etc/bluetooth/audio.conf
  • /etc/bluetooth/audio.conf
[General]
Class = 0x20041C
Enable = Source,Sink,Media,Socket

ファイルを新規作成して上記を記載。

$ sudo vi /etc/bluetooth/main.conf
  • /etc/bluetooth/main.conf
Name = raspberrypi
Class = 0x20041C

上記内容を末尾に追記。

$ sudo reboot

ここまででリブート。

この時点でBluetoothでRPi3をA2DPデバイスとして検出できるようになった。あと、起動すると自動的にログインもしている。

f:id:osa030:20160909220243j:plain

ペアリング登録

いよいよAndroidデバイスとのBluetooth接続設定。

$ bluetoothctl

以降はbluetoothctlのコマンド操作となる。"[bluetooth]# "がbluetoothctlの入力プロンプトだ。

[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# scan on

これでBluetoothデバイスからスキャンすると発見できるようになる。

f:id:osa030:20160909220257j:plain

[NEW] Device XX:XX:XX:XX:XX:XX Xperia Z3
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes (←入力)
Request confirmation
[agent] Confirm passkey 043906 (yes/no): yes
Authorize service 0000110d-0000-1000-8000-00805f9b34fb (yes/no): yes  (←入力)

初めて接続する機器はペアリング認証が必要になるので「yes」を入力する。同様に、接続する機器側でも認証を行う。

f:id:osa030:20160909220315j:plain

この後、接続シーケンスが始まるが、許可を求められるのでRPi3側で「yes」を入力する。

f:id:osa030:20160909220322j:plain

これで繋がるようになるのだが、ペアリング後もBluetooth接続時に毎回許可を求められるのは非常に面倒なので、信頼するデバイスとして登録する。

[bluetooth]# trust XX:XX:XX:XX:XX:XX (←今までに出力された接続対象機器のMACアドレス)
[CHG] Device XX:XX:XX:XX:XX:XX Trusted: yes
Changing XX:XX:XX:XX:XX:XX trust succeeded
[bluetooth]# exit

これで登録済の機器側で登録解除しない解除しないかぎりは自動接続となる。

音声出力設定

RPi3と認証済機器がBluetooth接続後に、音声デバイスと紐付けることによってはじめてBluetooth経由で音が出力されるようになる。以下はその為の設定。

$ sudo vi /etc/udev/rules.d/99-input.rules
KERNEL=="input[0-9]*", RUN+="/home/pi/a2dp-autoconnect"

これでBluetooth接続時に"/home/pi/a2dp-autoconnect"が実行されるようになる。

$ vi /home/pi/a2dp-autoconnect

以下のリンク先のファイルを基に実行スクリプトを作成する。

A2DP audio streaming using Raspberry PI (Raspbian Jessie) · GitHub

# Find the right sink with `pactl list sources short`.
-PA_SINK="alsa_output.0.analog-stereo"
+PA_SINK="alsa_output.usb-D___M_Holdings_Inc._DA-10-00-DA10.analog-stereo.monitor"

接続先の音声デバイス名に「pactl list sources short」で表示される名称を指定する。

$ chmod +x /home/pi/a2dp-autoconnect

最後に実行権限を付与すれば完了だ。

$ sudo reboot

接続してみる

Bluetooth接続をして、AmazonMusicを起動。

f:id:osa030:20160909221350j:plain

ガガ様が歌声がRPi3経由で聴こえてまいりました。

このように、通常のBluetooth接続のヘッドホンやスピーカーと同じく、Androidデバイス上のサウンドを全てRPi3で再生できるので
Bluetooth最強。

なお、肝心の音質であるが、DLNA経由でRPi3側で再生させるのよりも音質はよろしくない。が、手持ちの音源と同じ環境で手持ちでない音源(Youtubeも含む)をラジオ感覚でシームレスに楽しめることができるので充分満足だ。

Raspberry Pi Raspberry Pi3 ModelB

Raspberry Pi Raspberry Pi3 ModelB

*1:PulseAudio関連だと思われる