おはこんばんちは。早々に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にしてしまいます。
ついでにSSHを有効に(Advanced Options->SSH)。これでssh pi@raspberrypi.local
で接続できます。
有線LANを使用している場合は、この時点でSSH経由の操作に切り替えても良いです。
apt-get update & apt-get upgrade
も忘れずに。
無線LANの設定
続けて無線LANの設定を行います。
まずはlsusb
でアダプタが認識されているのを確認します。
PLANEX GW-USNano2 802.11n Wireless Adapter
の記述があるので上手く認識されています。
お次はcat /etc/network/interfaces
で設定を確認します。
wlan0
は/etc/wpa_supplicant/wpa_supplicant.conf
に接続情報を設定するようなので、ここにSSIDやパスフレーズを書き込みます。
直で記述しても良いのですが、wpa_passphraseコマンドが使えるのでこれを使って書き込みます。
1 |
$ sudo sh -c "sudo wpa_passphrase SSID passphrase >> /etc/wpa_supplicant/wpa_supplicant.conf" |
実行後にcat /etc/wpa_supplicant/wpa_supplicant.conf
すると、SSIDと暗号化されたパスフレーズ(と、暗号化されてない状態のパスフレーズ)が書き込まれているのが確認できます。
1 2 3 4 5 |
network={ ssid="SSID" #psk="暗号化されてないパスフレーズ" psk=暗号化されたパスフレーズ } |
後はsudo ifdown wlan0
の後sudo ifdown wlan0
してインターフェースを再起動すれば接続されるはずです。
上手くいかない場合は再起動をして、それでもダメな場合は設定などを確認します。
iwconfig
やifconfig
で接続されているかどうかやIPアドレスの割り振りを確認して、無事に接続できていれば完了です。
USB-DACの確認
USB-DACが認識されているかどうかの確認を行います。
無線LANの時も行いましたが、改めてlsusb
を実行します。
ちょっと分かりにくいですが、GYROCOM C&C Co., LTD
が多分それです。
ALSAから利用できるか確認するため、aplay -l
で詳細の確認を行います。
(もしaplay
が実行できない場合は、alsa-core
とalsa-utils
を入れる必要があります。最新のRaspbianだと両方入ってました。)
card 0
は内蔵(device 0
が3.5mmジャック、device 1
がHDMI)で、card 1
が接続したDACです。
上手く認識できているようです。
もしデフォルトのデバイスを内蔵からUSB-DACにしたい場合は、/etc/asound.conf
に次の記述を行います。
1 2 3 4 5 6 7 8 |
pcm.!default { type hw card 1 } ctl.!default { type hw card 1 } |
cardの数字は、aplay -l
した時のcard
の値を設定します。
shairport-syncの導入
AirPlayの実装は色々ありますが、今回はmikebrady/shairport-syncを導入します。
基本的にはREADMEにある通りに入れれば十分です。
依存関係のパッケージは下記のような感じです。
READMEにあるパッケージよりも少ないですが、Raspbianに最初から入っているのもある(build-essential
, git
, avahi-daemon
)ので、その辺は除外しています。
1 |
$ sudo apt-get install autoconf automake libtool libdaemon-dev libasound2-dev libpopt-dev libconfig-dev libavahi-client-dev libssl-dev libsoxr-dev |
その後は次の手順で、ソースを落としてビルドします。
1 2 3 4 |
$ git clone https://github.com/mikebrady/shairport-sync.git $ cd shairport-sync $ autoreconf -i -f $ ./configure --with-alsa --with-avahi --with-ssl=openssl --with-metadata --with-soxr --with-systemd |
インストールの前に、専用のユーザーとグループが必要なので作成しておきます。
1 2 |
$ getent group shairport-sync &>/dev/null || sudo groupadd -r shairport-sync >/dev/null $ getent passwd shairport-sync &> /dev/null || sudo useradd -r -M -g shairport-sync -s /usr/bin/nologin -G audio shairport-sync >/dev/null |
作成したらインストールです。
1 |
$ sudo make install |
shairport-syncの設定
インストールが完了したら設定を行います。
/etc/shairport-sync.conf
に設定をするのですが、中にサンプルやら説明が色々書いてあります。
説明を確認しつつお好みで設定すれば良いのですが、参考までに現在運用しているサンプルを載せておきます。
1 2 3 4 5 6 7 8 9 10 11 |
general = { name = "AirPi" interpolation = "soxr" } alsa = { outputdevice = "default" mixer_control_name = "PCM" mixer_device = "default" } |
それぞれこんな感じです。
general.name
… 表示される名前です。デフォルトの%h
はホスト名を表示します。general.interpolation
…soxr
を指定すると、SoX Resamplerを使用してリサンプリングします。CPUに負荷がかかるので、RaspberryPiがAirPlay専用でなければデフォルト(basic)のままが無難です。今回は折角なので有効にしてあります。alsa.outputdevice
/alsa.mixer_device
… どのデバイスから出力するかや、どのデバイスをミキサーにするかを指定します。両方ともデフォルト値ですが、あえて明示的に指定してます。
alsa.outputdevice
とalsa.mixer_device
がdefault
の場合、ALSAによって指定されているデフォルトのデバイスが使用されますが、異なるデバイスを使用したい場合は次のように値の調査/設定をします。
aplay -l
を実行し、出力したいデバイスのcardとdeviceの値をメモalsa.outputdevice
とalsa.mixer_device
にhw:[card],[device]
`の書式で指定
例えば、先ほどのaplay -l
の結果ではUDACはCard 2
のDevice 0
なので、hw:2,0
となります。
deviceが0の場合は省略できるので、hw:2
とも書けます。
1 2 3 4 5 6 |
alsa = { outputdevice = "hw:2,0" mixer_control_name = "PCM" mixer_device = "hw2,0" } |
起動
ここまで設定が終われば完了です。
最後にsudo systemctl start shairport-sync
で起動し、iTunesやiOS機器でAirPlayの送信先として指定できるようになっていればサービスは立ち上がっています。
接続し、無事に音声が流れるようになっていれば成功です。お疲れさまでした。
おわり
という訳で、RaspberryPiをAirPlayレシーバー化できました。
出たばかりの頃のRaspbianってあまりこなれてなくて、ドライバの構築とかこつこつやってた気がするのですが、最近は差し込んだだけで認識されるので楽になりました。
ここまで苦労して言う事ではないのですが、正直、本家のAirMac Expressでも買ってそれにスピーカー繋いだ方が早い上に安定すると思います・・・。
DIY大好きな方は是非挑戦してみてはいかがでしょうか。
(多分)こんな感じで、書きたいことを今後書いていく事になるかと思います。
ので、どうぞよろしくお願いします。
現場からは以上です。