エンジニアらしき人のひとりごと

100人中100人は興味を示さなくても、100万人居たら1人くらいは面白いと思ってくれそうな、重箱の隅をほじくってみるブログ。

黒電話をスマホの子機(Bluetoothヘッドセット)に!③

②の続き。
ラズパイ(Raspberry Pi)を使って、黒電話をスマホのヘッドセットにしようと工作してます。
tokieng.hatenablog.com
tokieng.hatenablog.com

PulseAudioのインストール

今回は、バージョン10をインストールしてみる。
なぜ10なのかは、前回の記事を参照のこと。

apt-getコマンドでインストールできるバイナリは公開されていないので、Linux(UNIX)らしくソースコードをダウンロードして、自分でビルドする必要がある。
ちなみに、以下のやり方で必ずうまくいく、というわけではない(メモ片手に書いてるだけで、あんまりちゃんと確認してない)ので、ご注意を。

ビルド

ここで公開されている。
https://www.freedesktop.org/wiki/Software/PulseAudio/

News
Jan 2017
2017-01-19: PulseAudio 10.0 has been released. (Changes)
1) ソースコードを持ってくる。tar.xz形式で圧縮されているので、展開する。
$ wget https://www.freedesktop.org/software/pulseaudio/releases/pulseaudio-10.0.tar.xz
$ tar xf pulseaudio-10.0.tar.xz
$ cd pulseaudo-10.0

※念のため書いておくと、最初の "$" は、シェルのプロンプトを表すので入力しないこと。

2) 必要なライブラリをインストールする
$ sudo apt install libtool intltool libcap-dev libsndfile1-dev libspeexdsp-dev libsbc-dev libcap-dev libssl-dev libasound2-dev libsamplerate0-dev liborc-0.4-dev libwebrtc-audio-processing-dev
3) いよいよビルド
$ ./bootstrap.sh ←いらないかも?
$ ./configure --sysconfdir=/etc --localstatedir=/var --disable-bluez4
$ make -j 4

makeコマンドに "-j 4" をつけると、ラズパイ2とかラズパイ3では、ビルドが少し早くなる。
エラーが出たら、必要なライブラリがないとかが原因なので、なんとかして解決する。

4) 既にインストールされているものを削除する

既にPulseAudioがインストールされている状態なので、インストール済みのものを消す。入っているものを探してみた。

$ apt list --installed | grep pulse

そしたら以下のものが出てきた。

libpulse-mainloop-glib0/stable,now 5.0-13 armhf [インストール済み、自動]
libpulse0/stable,now 5.0-13 armhf [インストール済み、自動]
libpulsedsp/stable,now 5.0-13 armhf [インストール済み、自動]
pulseaudio/stable,now 5.0-13 armhf [インストール済み、自動]
pulseaudio-module-bluetooth/stable,now 5.0-13 armhf [インストール済み]
pulseaudio-module-x11/stable,now 5.0-13 armhf [インストール済み、自動]
pulseaudio-utils/stable,now 5.0-13 armhf [インストール済み、自動]

あと、pavucontrolも。

ひたすら消す。
あ、libpulse0 は、消そうとするといろんなものがついでに消されてしまうので、とりあえず残しておいた。

$ sudo apt-get remove libpulse-mainloop-glib0 libpulsedsp pulseaudio pulseaudio-module-bluetooth pulseaudio-module-x11 pulseaudio-utils pavucontrol
5) インストールする
$ make install

起動してみる

PulseAudioをデーモン起動させる。
初期状態では時々勝手にPulseAudioが終了してしまうので、
/etc/pulse/daemon.conf に、
 exit-idle-time = -1
を追記しておく。

$ pulseaudio -D

"-D" をつけることで、デーモンとして起動する。(バックグランドで起動しつづけている)

起動に成功しているかどうかを確認する。数秒経ってから、以下を実行する。

$ ps aux|grep pulseaudio
  • PulseAudioが起動しているとき
$ ps aux|grep pulseaudio
pi        1044  0.4  1.9 109148  8448 ?        S<l  07:43   0:01 pulseaudio -D
pi        1069  0.0  0.4   3768  2036 pts/0    S+   07:49   0:00 grep --color=auto pulseaudio
# ↑pulseaudioのプロセス(1行目)が出力されているので、PulseAudioは起動中
$
  • PulseAudioが起動していないとき
% ps aux|grep pulseaudio
pi        1085  0.0  0.4   3768  2036 pts/0    S+   07:49   0:00 grep --color=auto pulseaudio
$ # ↑PulseAudioのプロセスが出力されず、grepのプロセスのみ出力されているので、PulseAudioは起動していない

ちなみに、PulseAudioデーモンを停止させるには、以下のコマンドを実行する。

$ pulseaudio -k

動作確認

まず、USBオーディオの設定

USBオーディオ変換ケーブルをラズパイに差している状態では、ラズパイからの音声出力先として、以下の3つが存在することになる。

  • 本体内蔵のHDMI端子から
  • 本体内蔵のアナログ出力端子(ヘッドフォン端子)から
  • USBに接続したオーディオ変換ケーブル出力端子から

なので、どこから出力するかを指定する必要がある。
どうやってやるのか忘れたw(おいおい)
思い出したら、追記しよう・・・。

音を鳴らしてみる。wavファイルが入っているので、それをpaplayコマンドで鳴らす。

$ paplay /usr/share/sounds/alsa/Front_Center.wav

音が鳴らなかったら、オーディオ出力先を再度確認するとともに、PulseAudioが起動中であることを確認すること。

スマホとラズパイをペアリングして、スマホの音を鳴らす

スマホもラズパイ(USB Bluetoothドングル)も、BluetoothA2DPに対応している(はず)なので、スマホで音楽を再生してみる。
A2DPは、音楽などをヘッドフォンで鳴らすためのプロファイル。

まずはスマホとラズパイをペアリングする。
GUIで操作してもよいが、ここではbluetoothctlを使ってみる。

$ bluetoothctl
[bluetooth]#

このときに、bluetoothctlのコマンドを入力する。どんなコマンドがあるかは、helpコマンド。

[bluetooth]# help

では早速、ペアリングしてみる。

[bluetoothctl]# discoverable on
[bluetoothctl]# pairable on
# ラズパイをペアリング可能なモードにする。
# ここでスマホのBluetooth設定画面に、ラズパイが出てくるはず。
# その画面で、ラズパイを選択すると、ラズパイ側では以下のような出力がされる。
[NEW] Device XX:XX:XX:XX:XX:XX Xperia XZ
# ↑ ラズパイがスマホ(ここではXperia XZ)を見つけた。
# XX:XX:XX:XX:XX:XX は、スマホのBluetoothアドレスなので、コピーしておく。
# ラズパイに「このデバイスと接続してもよいよ、信用して!」と伝えるために、以下のコマンドを実行する。
# (XX:XX:XX:XX:XX:XXの部分は、実際には上で検出された実際のBluetoothアドレスを入力する。さきほどコピーしたのをペーストする。
[bluetoothctl]# trust XX:XX:XX:XX:XX:XX
# うまくいくと、下の2行が表示される。
[CHG] Device XX:XX:XX:XX:XX:XX Trusted: yes
Changing XX:XX:XX:XX:XX:XX trust succeeded

Androidの場合は、以下のようになっていればよい。
f:id:tokieng:20170913224521p:plain
もし「メディアの音声」が表示されないときは、PulseAudioが起動中かどうかを確認して、再度試してみる。

ofonoのインストール

apt-getでは、ofono-devでもAPI入らないっぽい?
ということで、 ofono も buildする。

ビルド

# 1) まず必要なライブラリをインストール
$ sudo apt install libudev-dev libdbus-glib-1-dev mobile-broadband-provider-info
# 2) ソースコードを持ってくる。tar.xz形式で圧縮されているので、展開する。
$ wget https://www.kernel.org/pub/linux/network/ofono/ofono-1.20.tar.xz
$ tar xz ofono-1.20.tar.xz
# 3) 展開先に移動して、ビルド実行
$ cd ofono-1.20
$ ./configure --sysconfdir=/etc --localstatedir=/var --enable-test --enable-tools
$ make -j 4
# 4) うまくいったらインストール
$ sudo make install
# 5) サービスとして自動起動するように設定する
$ sudo systemctl enable ofono
$ sudo systemctl start ofono

ちなみに、configureコマンドのオプションに --enable-test を入れているのは、動作確認用のスクリプトもインストールしておきたいので。

PulseAudioの設定

ofonoを使うよ、とPulseAudioに伝える必要がある。
/etc/pulse/default.pa の以下の行を書き換える。
load-module module-bluetooth-discover
 ↓
load-module module-bluetooth-discover headset=ofono

書き換えたら、PulseAudioを停止させて、再度起動させる。

ofonoの動作確認

先ほどのインストール手順で、動作確認用のスクリプトもインストールしておいた。このスクリプトは /usr/local/lib/ofono/test/ に存在する。
このスクリプトはPython3で記述されていて、いくつかのライブラリが必要なので、まずそれらをインストールする。

$ sudo pip3 install dbus-python
  • /usr/local/lib/ofono/test/monitor-ofono
  • /usr/local/lib/ofono/test/dial-number
  • /usr/local/lib/ofono/test/answer-calls

monitor-ofonoは、Bluetoothのイベントを表示するもの。このスクリプトを実行すると、スマホの着信や発信などのイベントが表示される。
dial-numberは、スマホに発信させるスクリプト。例えば「117」(時報)とか「03177」(東京地方の天気予報)とかにかけてみる。
answer-callsは、スマホにかかってきた電話を取るスクリプト

うまくいけば、dial-number、answer-callsを使って、スマホでの発信・着信操作が行える。通話状態になったら、ラズパイのUSBオーディオ変換ケーブルに差したマイク・スピーカーを使って、会話ができる。

次回予告

うまくいったら、次はいよいよ黒電話の改造だ!



ちなみに、本シリーズの記事一覧はこちらからどうぞ!
tokieng.hatenablog.com