Raspberry Pi を AirPlay サーバとして利用する

Raspberry Pi の USB 端子で Kenwood のコンポ R-K731 の PC IN 端子と繋げて、Mac や iPhone の外部スピーカーとして BGM 再生に一役買っています。以下に設定などの手順を書きます。

以下に書くのは R-K731 での例ですが、USB 接続のサウンドカードであれば大体同じように設定できると思います。

# 環境
* モデル: Raspberry model B+
* OS: Raspbian Jessie

OS を MicroSD に書きこむ手順はこちらに書きました: [Mac で Raspbian Jessie を MicroSD に書き込んだ](http://qiita.com/ikai/items/f7f2f31a00cd2279f963)

USB ケーブルでオーディオデバイスと接続してから Raspberry の電源をつけ、ssh やローカルでログインしてからスタートします。

# 音声出力デバイスを確認する

```shell-session
% sudo aplay -l
[sudo] password for ikai:
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
  サブデバイス #7: subdevice #7
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: CODEC [USB Audio CODEC], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 0/1
  サブデバイス #0: subdevice #0
```

カード 1 が USB Audio ということで、R-K731 は無事認識されているよう。

カード 1 になっていますが、あとから設定する shairport では上の方のカードを優先して使うらしいので、USB Audio がカード 0 に来るようにします。

`/proc/asound/modules` を見て覚えておいて、

```shell-session
% cat /proc/asound/modules
 0 snd_bcm2835
 1 snd_usb_audio
```

以下の様に `/etc/modprobe.d/alsa-base.conf` を新規で作って書きます。

```shell-session
% sudo vi /etc/modprobe.d/alsa-base.conf
```

`options snd slots=` には上で覚えた `snd_` で始めるモジュールを列挙して、`options xxx index=x` で、`snd_usb_audio` を `index=0` にして書いて保存。

```shell-session:snd_usb_audioのindexを0にする
options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1
```

保存してからもう一度 `sudo aplay -l` を確認すると順番が変わっています。


```shell-session
% sudo aplay -l
[sudo] password for ikai:
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: CODEC [USB Audio CODEC], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 0/1
  サブデバイス #0: subdevice #0
カード 1: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
  サブデバイス #7: subdevice #7
カード 1: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```

# shairport をインストール

https://github.com/abrasive/shairport から clone してきて、必要なパッケージもインストール

```shell-session
git clone https://github.com/abrasive/shairport.git && apt-get install -y libssl-dev libavahi-client-dev libasound2-dev
```

clone してきたら普通にビルドします。少し時間がかかります

```shell-session
cd shairport && ./configure && make && sudo make install
```

終わったら、起動スクリプトなどをコピーしておきます。`shairport/scripts` 以下に osx, arch, systemd がありますが Raspberry は debian の分派なので、debian 以下を使います。

```shell-session
sudo cp scripts/debian/default/shairport /etc/default/
sudo cp scripts/debian/init.d/shairport /etc/init.d/
sudo cp scripts/debian/logrotate.d/shairport /etc/logrotate.d/
```

`/etc/default/` は起動スクリプト実行時に読まれる設定ファイル、`/etc/init.d` は起動スクリプト、 `/etc/logrotate.d/` はログファイルを定期的に削除するための設定ファイルです。

インストールが終わったら、 

```shell-session
shairport -a test
```

で起動してみます。`-a` の後ろに AirPlay 時の名前を指定します。iPhone や Mac の AirPlay で `test` を選択して、適当に音が鳴らせたら成功です。

毎度手動で起動させるのは面倒なので、OS 起動時に shairport も起動するようにしておきます。

```shell-session
sudo systemctl daemon-reload
sudo update-rc.d shairport defaults
```

これで Raspberry Pi も、電源をいれたら (ほとんど) すぐに使える AirPlay サーバに変身しました:v: 

Raspberry Pi を無線でつなげている為なのか、再生してから実際音が出るまで 1, 2 秒くらい間が空きます。なので、あくまで BGM 用でしょうか。ゲームとか動画には向かなそう。同期がとれるかは試していません。

再生は途切れず安定していて、USB 経由での再生なのでノイズも入らず、R-K731 の Supreme EX (高音質化モード?) も使えていい感じです。Raspberry Pi 便利ですね。