iPodとPCの音声出力をRaspberry Piに丸投げするまでの作業ログ

iPod touchとノートPC(ubuntu)の音声出力をワイヤレスにできたら便利かも?ということで挑戦したので作業ログまとめ。
たぶんいらないパッケージとかいろいろ入ってるので次回セットアップする機会があれば綺麗にするかもしれない。。。
RaspberryPiにshairportやPulseAudioを導入する記事は探せば出てくるのだが、両方を入れてるものがなくてかなり苦戦した。
ALSAとPulseAudioの関係も知らなかったし。。。

注意

このエントリは途中から試行錯誤しすぎて作業メモを取らずにあとから予想で書いている部分があります。
これで足りるのか、もしくは不要なものがあるのかが微妙な状態です。


動作環境

インストール

本家含めいろいろあるので省略。
今回はGUIあり、OCあり、言語は英語のままで。


IPアドレスを固定IPに。

$ sudo vi /etc/network/interfaces
auto lo

iface lo inet loopback
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.0.xx
netmask 255.255.255.0
gateway 192.168.0.1

#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp

DNSも書き換え。

$ sudo vi /etc/resolv.conf
nameserver 192.168.0.1


ufwを導入して設定する。

$ sudo apt-get install ufw
$ sudo ufw default DENY
$ sudo ufw enable
$ sudo ufw app list
$ sudo ufw allow OpenSSH
$ sudo ufw allow 4713/tcp
~略~

で、結果こんな感じに。

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
5353/udp                   ALLOW       Anywhere
4713/tcp                   ALLOW       Anywhere
5002/tcp                   ALLOW       Anywhere
Bonjour                    ALLOW       Anywhere
6000/udp                   ALLOW       Anywhere
6001/udp                   ALLOW       Anywhere
6002/udp                   ALLOW       Anywhere
6003/udp                   ALLOW       Anywhere
6004/udp                   ALLOW       Anywhere
6005/udp                   ALLOW       Anywhere


今回はUSB-DACを接続するので、本体のステレオミニジャックは不要。
読み込んでいるカーネルモジュールをコメントアウトする。

$ sudo vim /etc/modules
#snd-bcm2835

オーディオ設定

PulseAudioをインストールして設定に2行ほど追加する。

$ sudo apt-get install alsa pulseaudio pulseaudio-module-zeroconf avahi-utils git libao-dev libssl-dev libcrypt-openssl-rsa-perl libio-socket-inet6-perl libwww-perl alsa-utils alsa-tools-gui pulseaudio-module-bluetooth pulseaudio-module-gconf pulseaudio-utils mplayer
$ sudo aptitude install  libao-dev libssl-dev libcrypt-openssl-rsa-perl libio-socket-inet6-perl libwww-perl avahi-utils 
$ sudo vim /etc/pulse/default.pa
load-module module-native-protocol-tcp auth-anonymous=1
load-module module-zeroconf-publish


あと、後述のshairportはALSAをたたくのでPulseAudioとオーディオデバイスの取り合いになってしまう。
ALSAを直接たたくアプリケーションの出力をPulseAudioのミキサーに接続する。

$ vim ~/.asoundrc
pcm.pluse {
	type pulse
}
ctl.pulse {
	type pulse
}
$ vim /etc/asound.conf
pcm.!default {
    type pulse
    # If defaults.namehint.showall is set to off in alsa.conf, then this is
    # necessary to make this pcm show up in the list returned by
    # snd_device_name_hint or aplay -L
    hint.description "Default Audio Device"
}
ctl.!default {
    type pulse
}

shairport

基本的に以下URLそのままだったはず。
http://d.hatena.ne.jp/sakurai_youhei/20110903/1315034986

$ sudo apt-get install git
$ sudo apt-get install build-essential 
$ sudo apt-get install libssl-dev libcrypt-openssl-rsa-perl libao-dev libio-socket-inet6-perl  libwww-perl avahi-utils pkg-config
$ git clone https://github.com/albertz/shairport.git
$ curl -LOk http://xrl.us/cpanm
$ chmod +x cpanm
$ sudo ./cpanm Net::SDP
$ git clone https://github.com/albertz/shairport.git

どうやらIPv6での接続を試みたりしてしまうので、socketlib.c上のIPv6に関するあたりをコメントアウト

--- socketlib.c	2013-02-10 22:20:18.068302338 +0900
+++ /home/pi/shairport/socketlib.c	2013-01-13 02:45:41.411870109 +0900
@@ -159,7 +159,7 @@
     int tFamily = AF_INET;
     #ifdef AF_INET6
     //printf("Listening on IPv6 Socket\n");
-    tFamily = AF_INET6;
+    //tFamily = AF_INET6;
     #else
     //printf("Listening on IPv4 Socket");
     #endif

で、コンパイル

$ make
$ make install

実際に動かして、iPod touchで試してみる。

$ perl shairport.pl -a test --ao_devicename=pulse -v

実際にノートPCからも出力してみる。

$ pacmd load-module module-tunnel-sink server=192.168.0.xx

shairportを起動時から動かす

shairport自体にもそのためにいろいろ書いてあったんだけど、rootはPulseAudioのグループに入れてないので音が出せない。。。
ということでユーザをpiとしてshairportを起動することにした。
/etc/rc.localに以下の行を追記する。

su - pi -c 'shairport.pl -d -a RaspberryPi'

まとめ

もっとエントリを綺麗にしてから載せるべきなのはわかってるんだけど、整形の時間がとれないからといって寝かせておくのが嫌だった。
RaspberryPi環境自体をもう一度作りなおすつもりなので、その時に修正するつもり。。。