2018年8月13日月曜日

Raspberry PiをAirPlayレシーバにする

まるでニーズがないと思いますが、Raspberry PiとAVアンプを組み合わせてiPhoneの音楽をリモート再生する方法。

なぜそんな構成にしたのか

我が家のリビングはAVアンプのHDMI入力にAmazon Fire TV stickを挿しています。
出力はHDMIでプロジェクター。

Amazon Fire TV はアプリを入れるとAirPlayレシーバになるので、
iPhoneから音楽を飛ばしてAVアンプのスピーカーで音楽を鳴らすことができます。

ところが、AirPlayで飛ばした瞬間にAmazon Fire TV stick がスリープから起き上がってきます。
すると、プロジェクターが状態変化を自動的に検知して起動してしまいます。

音楽を聴きたいだけなのに、フルスペックで起きがってくるAV機器ども。

さすがにちょっと鬱陶しいので、Raspberry PiをAirPlayの音楽用レシーバに仕立てあげることにしました。
こうすると、Amazon Fire TV stickを使わないのでスリープから起き上がってきません。
また、Raspberry PiはAirPlayを受け取っても画面は切り替わらないのでプロジェクターにも影響ありません。

ただし、AVアンプも自動で入力切り替えしてくれなかったので、そのあたりはRaspberry Piでごにょごにょします。

Raspberry Piの音をHDMIで出力する

Raspberry PiはデフォルトではHDMIから音が出ないようです。
「/boot/config.txt」で次の行のコメントを外して再起動すればOK。
hdmi_drive=2

次のコマンドを実行して、HDMI出力先のスピーカーから音が出れば成功です。
$ speaker-test -t sine -f 600

Raspberry Piにshairport-syncをインストールする

shairport-syncというAirPlayレシーバをインストールします。
「shairport」というツールもあるようですが、全く別物らしいので注意。

まず、依存するパッケージをインストール。
$ sudo apt-get install -y build-essential git xmltoman autoconf automake libtool libdaemon-dev libasound2-dev libpopt-dev libconfig-dev avahi-daemon libavahi-client-dev libssl-dev libsoxr-dev

次に、gitからshairport-syncをcloneしてビルド。
$ git clone https://github.com/mikebrady/shairport-sync.git
$ autoreconf -i -f
$ ./configure --with-alsa --with-avahi --with-ssl=openssl --with-metadata --with-soxr --with-systemd
$ make
$ sudo make install

インストールできたら自動起動を設定します。
$ sudo systemctl enable shairport-sync

設定変更

ここまででiPhoneからAirPlayを飛ばせるようになりますが、音量が妙に小さいです。
そこで、iPhone側の音量を無視してRaspberry Pi側(正確には、Raspberry PiからHDMI出力したAVアンプ側)で音量設定できるようにします。

まず、音量を100%に設定。
$ sudo amixer cset numid=1 100%

shairpoint-sync の設定ファイルが「/usr/local/etc/sharepoint-sync.conf」にあります。
サンプルの設定ファイルから次の箇所を変更します。
コメントアウトされていた場合はコメントを外します。
general = {
    :
interpolation = "soxr";
ignore_volume_control = "yes";
interpolationをsoxrにした方が音質が良いらしいです。
ただし、Raspberry Pi Zero Wで有効にした場合、CPU処理が追いつかなくなって音飛びしました。
音飛びしてしまう場合はinterpolationの行をコメントアウトすればデフォルトに戻ります。

ignore_volume_control を yes にするとiPhoneの設定を無視するようになります。

AVアンプの設定を切り替える

AVアンプの機種によると思いますが、私が使っているものだと、Raspberry Piが音声をHDMI出力しても自動で音声入力が切り替わりませんでした。
そこで、AVアンプの赤外線リモコンコードを読み取って、Raspberry PiからHDMI入力を切り替える信号を送ります。
赤外線リモコンのコピーの仕方は以前掲載した説明をご参照ください。

問題はどのタイミングで赤外線信号を送るかです。
実は、sharepoint-sync.confの設定の中に用意されています。
次の行のコメントを外して設定値を記載します。
sessioncontrol = {
       :
        run_this_before_play_begins = "/usr/bin/irsend SEND_ONCE AV hdmi2"; 
        run_this_after_play_ends = "/usr/bin/irsend SEND_ONCE AV tv";

run_this_before_play_begins はiPhoneからAirPlayで送信先として指定したタイミングで実行されます。
run_this_after_play_ends はAirPlayの終了(音楽生成終了)の際に実行されます。

設定を変更したあと、サービスを再起動すれば反映されます。
$ sudo service shairport-sync restart

一通り設定が終わったら、iPhoneからAirplayでRaspberryPiに音楽を飛ばすと AVアンプの入力系統が自動的に切り替わって再生が始まります。

0 件のコメント:

コメントを投稿