【音】ラズパイ2をBluetoothスピーカー化してみる
追記:問題点3/27
RaspberyPiを、Bluetoothレシーバー側にしてみようと思います。
ラズパイが、Bluetoothワイヤレススピーカー化するような感じです。スピーカーは別に必要ですけどね・・。
スマホ・タブレットやPCから、音声を飛ばして(Bluetooth)、ラズパイで受け、それをスピーカーで鳴らします(Bluetoothデバイスから、PulseAudioのLoopbackで音声に接続という流れ)
手順は、検索しても相当に少なくて、そもそもLinuxでのBluetoothの情報少ない・・という状況のようです。
ちなみに後遺症として、PulseAudioをシステムモード動作させるため、一部オーディオ系コマンドがエラーになってしまう場合があります。利用したい場合は、「sudo –u pulse コマンド」とかすればOKです。
また、「apt-x」での接続を確認していないので、昔ながらの0.5秒遅延アリアリな感じです。
こちらの「猫ぱんち」さんのブログを参考にしました。同じ様な内容で、リンク先の英語サイトを参考にされたようです。
http://d.hatena.ne.jp/penkoba/20130909/1378744109
ただ、このままではうまく出来ませんでした(;^ω^)
※素の状態でもダメでした
色々やってみて、やっと動作までこぎ着けました。備忘録となりますが、先の「猫パンチ」さんと共に参考にどうぞ。
※ほぼ同じです
なにかと面倒無いよう、通常の「pi」ユーザーでログインしておきます。
インストールするパッケージ
sudo apt-get install pulseaudio-module-bluetooth python-gobject python-gobject-2
Bluetooth関連ユーティリティ(無くても良い)
sudo aptitude install bluetooth bluez-utils bluez-compat
USBのBluetoothドングルを挿して、認識してるか調べます。
lsusb
Bus 001 Device 005: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
私のは安価なバッファロー製のこちらです。多分、何でも認識するかと思います。バッファローとアイ・オーは実績があるようです。
消費電力を意識するならVer4で、速度重視ならVer3のようです。
iBUFFALO Bluetooth USBアダプター 3.0+EDR対応 class2 ブラック BSHSBD04BK
pulseユーザーをlpグループに追加・・が、正直、ここは意味が分かりません。lpグループって何さ?w
sudo usermod -a -G lp pulse
/etc/init.d/pulseaudioを編集(startメソッド付近:39行目)
「–disallow-module-loading=$DISALLOW_MODULE_LOADING」という部分を削除します。
/etc/default/pulseaudioの編集(システムモードに変更)
PULSEAUDIO_SYSTEM_START=1
/etc/pulse/system.paの編集(Bluetoothモジュールのロード)
.ifexists module-bluetooth-discover.so
load-module module-bluetooth-discover
.endif
※末行に追加、ifexistsは無くてもいいけど
/etc/pulse/daemon.confの編集(サンプリング・レート対応)
resample-method = trivial
/etc/bluetooth/audio.confの編集(Bluetoothスタック)
Enable=Source,Sink,Headset,Gateway,Control,Socket,Media
※ここでBluetoothの対応スタックを選択します
/etc/bluetooth/main.confの編集(スタックID)
Class = 0x20041c
/var/lib/bluetooth/<BDADDR>/config の編集(合わせる)
class 0x20041c
フラグ値はよく知りません。そのまんま利用してます。あんまり意味無さそうな印象です。
BDADDRは、機器により違います。1個しかないかと思うので、それです。TAB押せばええ。
オーディオデバイスを表示(デバイス名の確認)
sudo -u pulse pactl list short sinks
※鳴らしたいデバイス名を、メモっておきましょう
別にUSB-DACデバイス(スピーカー)で鳴らしたい場合は、とても重要です。
/usr/lib/udev/bluetoothを新規作成(Bluetoothリンク時の動作)
Bluetoothが接続や切断をした際に呼び出されます。やっている事は、Bluetooth機器を探して、PulseAudioの出力にループバック接続してます。なので、事前にメモしたデバイス名を、以下の赤字に記述します。標準アナログ出力なら、この名称でしょう。
#!/bin/bash
AUDIOSINK="alsa_output.0.analog-stereo“
echo “Executing bluetooth script…|$ACTION|" >> /var/log/bluetooth_dev
ACTION=$(expr “$ACTION" : “\([a-zA-Z]\+\).*")
if [ “$ACTION" = “add" ]; then
# set volume level here, if necessary
amixer set Master 100%
pacmd set-sink-volume 0 65537
for dev in $(find /sys/devices/virtual/input/ -name input*); do
if [ -f “$dev/name" ]; then
mac=$(cat “$dev/name" | sed 's/:/_/g’)
bluez_dev=bluez_source.$mac
sleep 1
CONFIRM=`sudo -u pulse pactl list short | grep $bluez_dev`
if [ ! -z “$CONFIRM" ]; then
echo “Setting bluez_source to: $bluez_dev" >> /var/log/bluetooth_dev
echo pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0 >> /var/log/bluetooth_dev
sudo -u pulse pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0 >> /var/log/bluetooth_dev
fi
fi
done
fi
if [ “$ACTION" = “remove" ]; then
CONFIRM=`sudo -u pulse pactl list short | grep 'module-loopback\ssource=bluez_source’`
if [ ! -z “$CONFIRM" ]; then
module_id=`echo $CONFIRM | sed 's/\s.*//’`
echo pactl unload-module $module_id >> /var/log/bluetooth_dev
sudo -u pulse pactl unload-module $module_id >> /var/log/bluetooth_dev
fi
fi
水色のところは、無くてもOKです。コメントとか、ログ書き出しの部分です。ちなみに、ログは「/var/log/bluetooth_dev」です。
このファイルに実行権限を与えます。
chmod +x /usr/lib/udev/bluetooth
/etc/udev/rules.d/99-input.rulesの編集(追加)
上で追加したファイルを登録します。
KERNEL=="input[0-9]*", RUN+="/usr/lib/udev/bluetooth"
/etc/init.d/bluetooth-agentを新規作成(Bluetoothリンク待受)
参考のものをそのまんま利用です。デーモンとして動作します。
### BEGIN INIT INFO
# Provides: bluetooth-agent
# Required-Start: $remote_fs $syslog bluetooth pulseaudio
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Makes Bluetooth discoverable and connectable to 0000
# Description: Start Bluetooth-Agent at boot time.
### END INIT INFO
#! /bin/sh
# /etc/init.d/bluetooth-agent
USER=root
HOME=/root
export USER HOME
case “$1" in
start)
#echo “setting bluetooth discoverable"
sudo hciconfig hci0 pscan
start-stop-daemon -S -x /usr/bin/bluetooth-agent -b — 0000
echo “bluetooth-agent startet pw: 0000"
;;
stop)
echo “Stopping bluetooth-agent"
start-stop-daemon -K -x /usr/bin/bluetooth-agent
;;
*)
echo “Usage: /etc/init.d/bluetooth-agent {start|stop}"
exit 1
;;
esac
exit 0
実行権限を与えておきます。
chmod –x /etc/init.d/bluetooth-agent
デーモンとして登録
sudo update-rc.d bluetooth-agent defaults
Bluetoothサービスの再起動&エージェントを起動
sudo service bluetooth restart
sudo service bluetooth-agent start
ここまでやれば、Bluetoothのペアリンクが出来るはずなので、スマホなどから探してみてください(ホスト名に数字が付いたのが見えるはず)
ペアリンク時のコードは、上記スクリプトで「0000」とかしてますが、入力を要求されたらこれを入力、違う数字が表示された場合でも、そのまま「OK」して下さい。内部で、ちゃんとやり取りしてます。
この辺が、LinuxによるBluetoothの変なクセの一つなようです。
基本的なところは、ここで終了なのですが、もう一つ。
接続相手を自動接続にする(信用化)
hcitool scan
Bluetoothスキャンを掛けて、表示されたID(00:11:22:33みたいなやつ)をメモします。
sudo bluez-test-device trusted (ID) yes
で、信頼済みとします。次から、ペアリンク手順が不要になります。
・・が、機器によって、接続のタイミングがそれぞれ違うようで、スマホとかだとすぐ接続されますが、WindowsPCとかだと、いちいちBluetooth画面から、接続に手順をしないといけません。
※Bluetooth管理用ソフトによって、まちまち
Windows側で、起動時にアクティブになるような、機能とかあるんだろうか。別にプログラムを書かないといけないかもしれない。
遅延無しのapt-xで接続してみたいが敷居が高そう。
最後になりましたが、なんでこんな事をするかという点。
自分は、ソーラー発電&蓄電をしてまして、RaspberryPiやスマホの充電なんかを全て、ソーラー発電からまかなってます。
USBスピーカーも同様で、24時間通電しっぱなしです。
せっかくなので、常用パソコン用のスピーカーも、これで鳴らせれば、節電になるなぁ・・という事から実施してます。TVチューナー(Blurayレコーダ)の音声も、一緒に鳴らしたいんだけども。
※USBスピーカーで、入力が3つとかいう製品が無いしね・・
追記:3/27
しばらく運用してみたのですが、この方法で、ラズパイをBluetoothスピーカー化する事が可能です。
Windows PCなどから、再接続する手間を除けば、実用に耐えます。ま、これもWindows側或いは、ラズパイ側から再接続指示などが行えるかもしれません(Bluetooth仕様でしょう)
追記した理由は、自分の運用的に問題にぶち当たったからです。
PulseAudioをシステムモードON(非デフォ)としていますが、この性で、通常のオーディオ利用が出来なくなってしまいます。
sudo –u pulse mpg321 hogehoge.mp3
とかユーザー指定すれば、音声は鳴ってくれますが、バッチ処理内だとがっつりフリーズしてしまいます。
PulseAudioを、ちゃーんと理解していれば、対策も出来るのでしょうが、生半可な知識ではこれが限界(;´Д`)
他に時報とかメール着信・監視時とか鳴らしたいので、自分的には実験的段階で終了という運びとなりました。
ディスカッション
コメント一覧
まだ、コメントがありません