2015-11-13

Raspberry PiをMPD(Music Player Daemon)サーバにする

SDカードにRaspbianを書き込み、Raspberry Piを起動します。まずCUIコンソールで起動するように設定します。初回起動時の設定画面、または、raspi-configコマンドで設定できます。

Enable Boot to Desktop で<No>を選択し、再起動します。

初期アカウントはpi、パスワードはraspberryです。必要に応じてパスワードを変更しましょう。

以下の作業はrootで行います。Raspberry Piが起動したら、sudo suを実行して、rootになります。

IPアドレスをDHCPから固定にする

各自ネットワークに合わせて、IPアドレスを設定します。下記例では 192.168.0.90 に設定しています。

/etc/network/interface

auto lo
auto eth0
iface lo inet loopback
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface eth0 inet static
    address 192.168.0.90
    netmask 255.255.255.0
    network 192.168.0.0
    broadcast 192.168.0.255
    gateway 192.168.0.1

MPDをインストール

# aptitude install mpd mpc

楽曲ファイルの準備

音楽再生サーバですから、当然楽曲ファイルを用意しなければなりません。

SDカードに充分な空き容量があるなら、/var/lib/mpd/musicにファイルをそのまま格納すればいいです。

著者の環境では、ファイルサーバ(NAS)で楽曲ファイルを管理していますので、これをマウントします。筆者のNASはCIFS(SMB)だけでなくNFSやAFPもサポートしている物ですが、おそらくLinuxと最も相性がいいと思われるNFSでマウントします。それにはrpcbindが必要です。下記を実行して再起動。

# aptitude install nfs-client
# update-rc.d rpcbind defaults 

マウント

筆者の場合、NASは192.168.0.2で、/share/pub/musicにファイルが置いてあります。

# mount 192.168.0.2:/share/pub/music /var/lib/mpd/music

dfコマンドで確認。

# df
Filesystem                     1K-blocks      Used  Available Use% Mounted on
rootfs                          15251960   1506756   12970640  11% /
/dev/root                       15251960   1506756   12970640  11% /
devtmpfs                          224436         0     224436   0% /dev
tmpfs                              44900       232      44668   1% /run
tmpfs                               5120         0       5120   0% /run/lock
tmpfs                              89780         0      89780   0% /run/shm
/dev/mmcblk0p1                     57288     16872      40416  30% /boot
192.168.0.2:/share/pub/music/ 1935807360 553990272 1381817088  29% /var/lib/mpd/music

システム起動時に、自動的にマウントするように、fstabの最後に1行追記します。

/etc/fstab

192.168.0.2:/share/pub/music /var/lib/mpd/music nfs defaults 0 0   

MPDを起動

再起動時、または service mpd start を実行した際に、下記のようなエラーになる場合があります。

# service mpd start
[....] Starting Music Player Daemon: mpdlisten: bind to '[::1]:6600' failed: Failed to create socket:
 Address family not supported by protocol (continuing anyway, because binding to '127.0.0.1:6600' succeeded)

その場合、/etc/mpd.conf内のbind_to_addressをコメントアウトすればいいようです。

#bind_to_address                "localhost"

楽曲の準備

mpcコマンドを使って、楽曲ファイルをmpdに登録します。一日一回自動的に更新するように、スクリプトを作成しておきます。

/etc/cron.daily/updatemusic

#!/bin/sh
mpc clear >/dev/null
mpc update >/dev/null
mpc ls|mpc add >/dev/null 

※2013-02-02追記

自動的にプレイリストを更新するのに、スクリプトを走らせる必要はありません。

手動で更新する必要がある場合にのみ、上記、mpc clear、mpc update、mpc ls|mpd addを実行することはできますが、mpd.confに自動更新の設定がありますので、それを有効にします。初期状態では無効になっているので、コメントを外し(先頭の # を取り除き)ます。

/etc/mpd.conf

auto_update    "yes"

mpcコマンドについてはエレキジャックの解説が詳しいです。参考にしてください。

ボリューム

音量を100%にしておきます。

# amixer set PCM 100%

MPDクライアント

Windowsからmpdを制御します。筆者はCantataを採用しました。

(2013-08-07改訂)

モバイル端末も含めて、様々なOS用のMPDクライアントが公開されていますが、筆者の環境はWindowsです。以前はCantataを使用していました。全国的にはGMPCというのが有名なようです。

ですが、既製品が何となく手に馴染まなかったので、MPDクライアントを自作してみました。SkyMPCといいます。自分に必要最小限の機能に絞って設計してありますので、必ずしも高機能なものではありませんが、シンプルなMPDクライアントで充分という方は、是非お試しください。

外付けUSB-DACをつなぐ

Raspberry Piのオーディオ出力は、通常のサウンド再生だけなら何の支障もありませんが、搭載しているDACは簡便なものだそうで、オーディオ的には高音質ではありません。そこで、外付けのUSB-DACを接続します。

ただUSB-DACをつないだだけだと、下記のように、Raspberry Piの内蔵音源が最初に認識され、2番目にUSB-DACが認識されます。

# cat /proc/asound/cards
 0 [ALSA           ]: BRCM bcm2835 ALSbcm2835 ALSA - bcm2835 ALSA
                      bcm2835 ALSA
 1 [DAC            ]: USB-Audio - USB Audio DAC
                      Burr-Brown from TI USB Audio DAC at usb-bcm2708_usb-1.2, full speed
認識する順番を変更します。alsa-base.confの最後に追記して再起動します。

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

options snd-usb-audio index=0
options snd-bcm2835-audio index=1
options snd-usb-audio nrpacks=1

※nrpacksの行については後述

以下のように順番が変わりました。

# cat /proc/asound/cards
 0 [DAC            ]: USB-Audio - USB Audio DAC
                      Burr-Brown from TI USB Audio DAC at usb-bcm2708_usb-1.2, full speed
 1 [ALSA           ]: BRCM bcm2835 ALSbcm2835 ALSA - bcm2835 ALSA
                      bcm2835 ALSA

これで、外付けUSB-DACから出力されるはずです。

rsyslogdが高負荷になる場合

USBオーディオを使用時、topコマンドでパフォーマンスを見てみるとrsyslogdがCPUタイムを過剰に使用している状態が続き、/var/log/syslogを見てみると、以下のようなログが大量に出力されることがあります。

Aug 11 16:51:39 raspberrypi kernel: [751906.398942] delay: estimated 0, actual 132
Aug 11 16:51:39 raspberrypi kernel: [751906.406941] delay: estimated 0, actual 132 Aug 11 16:51:39 raspberrypi kernel: [751906.414946] delay: estimated 0, actual 133 Aug 11 16:51:39 raspberrypi kernel: [751906.422949] delay: estimated 0, actual 133 Aug 11 16:51:39 raspberrypi kernel: [751906.430945] delay: estimated 0, actual 133 ...

再生音がたまに途切れたり、SDカードの寿命を縮める恐れがありますので、このログ出力を抑止するために、上に書いたとおり alsa-base.conf におまじないを記述します。 options snd-usb-audio nrpacks=1 と書いて再起動すると、無駄なログ出力が停止し、CPU負荷が下がります。また、この対策により、再生中にときどきプツッと音飛び/音切れが発生していた問題が解消されました。

Raspbian GNU/Linux 8 (Jessie)

2015-09-24-raspbian-jessie で、Debian 8ベースに移行したことにより、ALSAの設定が以前とだいぶ変わっています。現時点(2015-11-01)でわかっていることをメモします。ここに記載している情報は、必ずしも正確ではなく、しっかり検証したものではありません。

JessieベースのRaspbianにUSBオーディオを接続すると、0=bcm2835、1=USBの順に認識されるのは、今まで通りですが、この順番を変更する、正しい方法がわかりません。/etc/modprobe.d/alsa-base.conf はなくなり、代わりに /usr/share/alsa/alsa.conf で設定することになったようです。この中に、下記のような定義があります。

defaults.ctl.card 0
defaults.pcm.card 0

この 0 を 1に変更します。これでUSB機器をデフォルトのオーディオデバイスとして認識させます。仕組みはちゃんと確認していませんが、とりあえずこれでUSBオーディオから音が鳴ります。

ボリュームを設定するには、

amixer set PCM 100%

で行えます。通常の使い方だと、出力は最大にしておき、アンプのボリュームつまみで音量を調節することが多いと思いますので、100%に設定しておけばいいでしょう。/etc/rc.localにでも書いておくといいでしょう。