RaspberryPiをAirPlayのレシーバーにしてみる

おはこんばんちは。早々に2記事目を書く事になってしまった木村です。

 

弊社では日替わりで様々なジャンルのBGMが流れています。
会社によってBGMを流す方法は色々(USENとか)ですが、弊社は「スピーカーとMacを直接接続して出力」という方法を取っています。
手法自体は悪くないのですが、スピーカーとMacの位置関係により下記のような問題が発生していました。

 

  • スピーカーと通路を跨いで繋いでいるので危ない
  • いつも流している人(=スピーカーに近い人)がいないと、代替えのBGMを流すのが大変

 

いかにして解決するか考えた所、自宅に持て余していたRaspberry Pi 2があったのを思いだしました。
AirPlayレシーバー的な用途にできたはずなので、これを使って無線経由でBGMを再生できるよう(勝手に)構築しました。

使ったもの

  • Raspberry Pi 2(Model B) 本体
    • Pi 1 (Model B 256MB RAM)という初期モデルも持ってたのですが若干スペックとか耐久面に心配があったのでお留守番
  • microSDカード
    • 32GBぐらい?最近はすっかり安くなりましたね
  • USB-ACアダプタ(2A)
  • USB-DAC
    • FiiO E07Kを使用
    • 本体についてるジャックから出力するとノイズが入るという話があったので
  • 無線LANアダプタ
    • GW-USNano2を使用
    • 11n/b/gで2.4Ghzのみですが十分

大体の手順

Raspbianのセットアップ

今までの環境は無かった事にして、0からセットアップです。
microSDにNOOBSを書き込んで、NOOBS経由でRaspbianを利用できるようにします。

 

インストール後はGUIで立ち上がるので、raspi-configのBoot OptionsからConsoleかConsole Autologinにしてしまいます。

raspi-01

ついでにSSHを有効に(Advanced Options->SSH)。これでssh pi@raspberrypi.localで接続できます。
有線LANを使用している場合は、この時点でSSH経由の操作に切り替えても良いです。

raspi-02

これは有効にした後ですが・・・

apt-get update & apt-get upgradeも忘れずに。

無線LANの設定

続けて無線LANの設定を行います。
まずはlsusbでアダプタが認識されているのを確認します。

raspi-03

PLANEX GW-USNano2 802.11n Wireless Adapterの記述があるので上手く認識されています。
お次はcat /etc/network/interfacesで設定を確認します。

raspi-04

wlan0/etc/wpa_supplicant/wpa_supplicant.confに接続情報を設定するようなので、ここにSSIDやパスフレーズを書き込みます。
直で記述しても良いのですが、wpa_passphraseコマンドが使えるのでこれを使って書き込みます。

実行後にcat /etc/wpa_supplicant/wpa_supplicant.confすると、SSIDと暗号化されたパスフレーズ(と、暗号化されてない状態のパスフレーズ)が書き込まれているのが確認できます。

後はsudo ifdown wlan0の後sudo ifdown wlan0してインターフェースを再起動すれば接続されるはずです。
上手くいかない場合は再起動をして、それでもダメな場合は設定などを確認します。

 

iwconfigifconfigで接続されているかどうかやIPアドレスの割り振りを確認して、無事に接続できていれば完了です。

USB-DACの確認

USB-DACが認識されているかどうかの確認を行います。
無線LANの時も行いましたが、改めてlsusbを実行します。

raspi-03

ちょっと分かりにくいですが、GYROCOM C&C Co., LTDが多分それです。
ALSAから利用できるか確認するため、aplay -lで詳細の確認を行います。
(もしaplayが実行できない場合は、alsa-corealsa-utilsを入れる必要があります。最新のRaspbianだと両方入ってました。)

raspi-05

card 0は内蔵(device 0が3.5mmジャック、device 1がHDMI)で、card 1が接続したDACです。
上手く認識できているようです。

 

もしデフォルトのデバイスを内蔵からUSB-DACにしたい場合は、/etc/asound.confに次の記述を行います。

cardの数字は、aplay -lした時のcardの値を設定します。

shairport-syncの導入

AirPlayの実装は色々ありますが、今回はmikebrady/shairport-syncを導入します。
基本的にはREADMEにある通りに入れれば十分です。

 

依存関係のパッケージは下記のような感じです。
READMEにあるパッケージよりも少ないですが、Raspbianに最初から入っているのもある(build-essential, git, avahi-daemon)ので、その辺は除外しています。

その後は次の手順で、ソースを落としてビルドします。

インストールの前に、専用のユーザーとグループが必要なので作成しておきます。

作成したらインストールです。

shairport-syncの設定

インストールが完了したら設定を行います。
/etc/shairport-sync.confに設定をするのですが、中にサンプルやら説明が色々書いてあります。
説明を確認しつつお好みで設定すれば良いのですが、参考までに現在運用しているサンプルを載せておきます。

それぞれこんな感じです。

 

  • general.name … 表示される名前です。デフォルトの%hはホスト名を表示します。
  • general.interpolationsoxrを指定すると、SoX Resamplerを使用してリサンプリングします。CPUに負荷がかかるので、RaspberryPiがAirPlay専用でなければデフォルト(basic)のままが無難です。今回は折角なので有効にしてあります。
  • alsa.outputdevice / alsa.mixer_device … どのデバイスから出力するかや、どのデバイスをミキサーにするかを指定します。両方ともデフォルト値ですが、あえて明示的に指定してます。

 

alsa.outputdevicealsa.mixer_devicedefaultの場合、ALSAによって指定されているデフォルトのデバイスが使用されますが、異なるデバイスを使用したい場合は次のように値の調査/設定をします。

 

  1. aplay -lを実行し、出力したいデバイスのcardとdeviceの値をメモ
  2. alsa.outputdevicealsa.mixer_devicehw:[card],[device]`の書式で指定

 

例えば、先ほどのaplay -lの結果ではUDACはCard 2Device 0なので、hw:2,0となります。
deviceが0の場合は省略できるので、hw:2とも書けます。

起動

ここまで設定が終われば完了です。
最後にsudo systemctl start shairport-syncで起動し、iTunesやiOS機器でAirPlayの送信先として指定できるようになっていればサービスは立ち上がっています。

接続し、無事に音声が流れるようになっていれば成功です。お疲れさまでした。

おわり

という訳で、RaspberryPiをAirPlayレシーバー化できました。
出たばかりの頃のRaspbianってあまりこなれてなくて、ドライバの構築とかこつこつやってた気がするのですが、最近は差し込んだだけで認識されるので楽になりました。

 

ここまで苦労して言う事ではないのですが、正直、本家のAirMac Expressでも買ってそれにスピーカー繋いだ方が早い上に安定すると思います・・・。
DIY大好きな方は是非挑戦してみてはいかがでしょうか。

 

(多分)こんな感じで、書きたいことを今後書いていく事になるかと思います。
ので、どうぞよろしくお願いします。

 

現場からは以上です。

参考