Raspberry Pi + AirPlay

Raspberry Pi が余っていたので使い道を考えたところ、AirPlay化できるということが判明。
いつの間にか家にはApple製品が増えていて、AppleTVも必需品となりつつある我が家としては手軽に音楽を飛ばせるときっと便利。というわけでAirPlay化に挑戦。

と言っても、参考になるページが盛り沢山なので改めて記事にすることはないと思うが、少しハマったところの備忘録として残しておこうと思う。

元ネタは
https://github.com/mikebrady/shairport-sync
大変ありがたく使わせて頂いた。基本的にこのページの説明通りに進めればOK。

インストールを終えてshairport-syncの設定は以下のファイルで行う。

sudo vi  /etc/shairport-sync.conf

20190906>
shairport-syncをupdateしたら

/usr/local/etc/shairport-sync.conf

が読まれるようになっていたので注意。

まず、AirPlayの名前。interpolation設定。re-samplerが実装されているらしくそちらを有効に。re-sampleによる音質向上は期待できるが、CPU負荷は上がる模様。Raspiが余っていたくらいなのでAudio専用機にするつもりなのでCPU負荷はどうでもよい。ということでON。

general =
{
        name = “MyAirPi”;
        interpolation = “soxr”;
}
将来的には外部DACをつけようかなと思うが、とりあえずテストがてらRaspi内蔵の3.5φ Audio outを使用。defaultのボードから出力を選択。
alsa =
{
        output_device = “default”;
}
複数のApple製品から接続するときに割り込み強制接続を許可するかどうか。許可。defaultはoffになっている。
sessioncontrol =
{
        allow_session_interruption = “yes”;
}
shairport-syncのstart/stopコマンド
.conf編集 -> stop/start -> 確認 -> .conf編集 -> stop/start -> 確認 … みたいな感じでデバッグすると簡単かも。
sudo systemctl stop shairport-sync
sudo systemctl start shairport-sync

AirPlayは常時電源に繋いでおいてナンボなので、消費電力も一応計測してみた。
AirPlay中もidle中もあまり変わらず2W弱といったところ。(with Raspberry Pi 3 Model B+)
このぐらいの消費電力なら、高くても¥2/day, ¥60/monthくらい。まぁ常時ONで。
追記>
うまく動いていると思いきや、allow_session_interruption動作が怪しい。
iphoneなどで音楽再生中にmacから割り込む(逆も然り)などの動作でshairport-syncのサービスがkillされてしまう模様。無理矢理感もあるが、cronで以下scriptを30secに一度起動してshairport-sync のstatusを監視し、お亡くなりになっているようだったら再起動する。これでいちいちサーバが落ちた時に手動で対応する必要がなくなる。最大30secお茶を飲んでいれば自動再起動がかかる。

#!/bin/bash
if systemctl status shairport-sync | grep killed ; then
  echo “found error”
  sudo systemctl start shairport-sync
  exit 0
else
  #echo “false”
  exit 0
fi

もしかしたらwifiのpower management に関係ある事象かもしれない。
sudo iwconfig wlan0 power off
参照
https://github.com/mikebrady/shairport-sync/blob/master/TROUBLESHOOTING.md
-> この設定後、AirPlayが落ちる現象がなくなったので、ビンゴっぽい。

追記>
AirPlayで接続したらAmpの電源を自動的に入れたくなってきたので、
方法を探っていたら、shairport-sync.confに素晴らしい機能が実装されていた。

sessioncontrol =
{
        run_this_before_play_begins = “/home/pi/script_shairport-sync/amp_on.sh”;
        run_this_after_play_ends = “/home/pi/script_shairport-sync/amp_off.sh”;

begin, end時にスクリプトを走らせる。amp_on.sh, amp_off.shの内部は割愛するが、
とにかく赤外線でON/OFF信号をAmpに送るスクリプト。
AirPlay開始時にamp.on.shが呼ばれるのでAmpに電源が入り、終了する時も同様に
AmpをOFFしてくれる。これでまた一つ便利になった。

コメント

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