Raspberry PiでUSBスピーカーをAirPlay対応する

本屋でヘッドフォンアンプ搭載Bluetoothユニットが付録についている「Olasonic完全読本」という本を見かけました。買いそうになったけど、我が家のOlasonicはUSBスピーカー。本の付録は使えない。というわけでRaspberry Piを使ってAirPlay対応を試しました。

材料

  • Raspberry Pi Model B 512MB OSはRaspberianで電源はAnker 40W 5ポート USB急速充電器 ACアダプタ を使っています。
  • USBスピーカー Olsasonic TW-S5W DAC内臓のUSBパWordスピーカー。いい音だします。 この記事のテーマを覆してしまいますが、 Bluetooth版があります。

USBスピーカーを接続する

Raspberry PiがUSBスピーカーを認識するか接続して確認します。幸いなことに認識されました。

pi@raspberrypi ~ $ aplay -l
**** ハードウェアデバイス 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: DAC [USB Audio DAC], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

USBスピーカーをデフォルトのオーディオデバイスにします。

wheezyの場合

sudo vi /etc/modprobe.d/alsa-base.conf

# 以下のようにコメントする

options snd-usb-audio index=-2
  ↓
# options snd-usb-audio index=-2

jessieの場合

sudo vi /usr/share/alsa/alsa.conf

# 以下の行を書き換える。数字はaplay -lで表示されるUSBスピーカーの番号

defaults.ctl.card 1
defaults.pcm.card 1

再起動して設定を反映させます。

sudo reboot

shaiportをインストール

shairportはAirTunesのエミュレータです。これが肝です。パッケージで提供されていないので、ソースコードからビルドします。

Raspberry Piにはビルドに必要なbuild-essentialは予めインストールされているはずです。

その他必要なパッケージをインストールします。

sudo apt-get install git libssl-dev libavahi-client-dev libasound2-dev

ソースを落としてきてビルドします。

git clone https://github.com/abrasive/shairport.git
cd shairport/
./configure
make

# ビルドされたshairportを実行。-aオプションで名前はご自由に。
./shairport -a "RasPi"

Raspberry Piと同じLANに接続しているiPhone、iTunesからRasPiという名前のAirPlayスピーカーが見つかり接続、再生して音が鳴れば成功です。

iTunesでAirPlayに接続

起動時にshairportを起動する(daemon化)

毎回手動でスクリプトを実行するのは面倒なので、daemon化します。

すでにビルド済みなのでmake install/usr/local/bin/にshairportをインストールします。

cd shairport
sudo make install

続いてshairportのscriptsフォルダに起動スクリプトがあるので、コピーして使います。

sudo cp ~/shairport/scripts/debian/default/shairport /etc/default/
sudo cp ~/shairport/scripts/debian/init.d/shairport /etc/init.d/

/etc/default/shairportを編集してAirPlayで表示される名前を編集します。名前を指定しない場合はホスト名が使われます。

sudo vi /etc/default/shairport

AP_NAME='RasPi'

コピーした/etc/init.d/shairportの中身を見るとユーザー追加のコマンドを実行してねと書かれていたので、ユーザーshairportをaudioグループに追加します。

sudo useradd -g audio shairport

起動時にshairportが動くようにupdate-rc.dに登録します。そして再起動します。

sudo update-rc.d shairport defaults
sudo reboot

再起動後、AirPlayにつなげて音楽が再生されれば成功です。

iPhoneでAirPlayに接続

音量に注意

iTunesでAirPlay接続した際、ボリュームの設定がおかしくて爆音が鳴りびっくりしました。

Raspberry PiにログインしてalsamixerでdBゲインを調整しました。

alsamixer
# 下の画像のような画面がでます。

alsamixerでdBゲインを調整

そしてiPhone / iTunesの音量はかなり抑えめで、ちょうどいい音量になりました。

arch linux Wikiに「サウンドの品質が悪い時は」の項でゲインを0にするといいよと書かれていますが、これは怖くてできない。

追記

iOS9でAirplayの仕様が変わったので、Shairportよりも[Shairport Syncを使うことをオススメ]({% post_url 2016-03-02-shairport-sync %})します。

一覧へ戻る