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スピーカーが見つかり接続、再生して音が鳴れば成功です。
起動時に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につなげて音楽が再生されれば成功です。
音量に注意
iTunesでAirPlay接続した際、ボリュームの設定がおかしくて爆音が鳴りびっくりしました。
Raspberry PiにログインしてalsamixerでdBゲインを調整しました。
alsamixer
# 下の画像のような画面がでます。
そしてiPhone / iTunesの音量はかなり抑えめで、ちょうどいい音量になりました。
arch linux Wikiに「サウンドの品質が悪い時は」の項でゲインを0にするといいよと書かれていますが、これは怖くてできない。
追記
iOS9でAirplayの仕様が変わったので、Shairportよりも[Shairport Syncを使うことをオススメ]({% post_url 2016-03-02-shairport-sync %})します。