②の続き。
ラズパイ(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ドングル)も、BluetoothのA2DPに対応している(はず)なので、スマホで音楽を再生してみる。
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の場合は、以下のようになっていればよい。
もし「メディアの音声」が表示されないときは、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オーディオ変換ケーブルに差したマイク・スピーカーを使って、会話ができる。