2013年1月16日水曜日

RaspberryPiでMusicPlayerDaemonサーバを構築する


【2013/3/27 修正】

  • 日本語ロケール化をしないよう修正
  • PulseAudioのインストール手順が抜けていたのを修正
  • mount.cifsのマウントオプション「codepage」が指定できなくなっていることに対応



自宅で使っているミニコンポでネットワーク上の音楽を手軽に聴くため、RaspberryPi(RAM512MB版)のRaspbian"Wheezy"上にMusicPlayerDaemon(MPD)を入れてみたので、その時のメモをまとめておく。
主に参考にしたサイトはこちら。

■n-mmra.net Web Site
Raspberry Piのいたずら
Raspberry Pi+MPDの設定

RaspberryPiでMPDサーバを立てよう!と考えている人は多く、どのページも上手にまとめられているが、上記のページは特に丁寧にまとめられているので、詳しく知りたい方はこちらを参照した方が良いだろう。
先人の方々、ホントにありがとうございます…m(__)m


【前提】
RaspberryPiの内部音源のみでMPDを構築しようとした場合、

  1. 内臓音源の起動/停止時(電源ON/OFF時)
  2. 演奏の開始/停止時(音源サスペンドON/OFF時)
に発生するポップノイズが大きな障害となる。
ここでは2.のポップノイズに対処する方法と、RaspberryPi+USB-DACで運用する方法の2通りを紹介する。
※1.のポップノイズはソフトウェアでの対応は難しいため断念した。

  • SSH接続で運用するため、GUIは使わない。
  • USB-DACを使用する場合はALSA経由で接続する。
  • USB-DACを使用せず内臓音源を使用する場合はPulseAudio経由で接続し、RaspberryPiを常時稼働させる。
  • MPDの操作はスマートデバイス(Android端末)上で行う。

【物理的に準備するもの】

  • RaspberryPi(USB-DACを使用する場合は512版を推奨)
  • RaspberryPi用の電源(5V700mAが必要だが、USB-DACを利用したり、USBメモリを抜き差しするなら1A以上推奨)
  • SDカード(RaspberryPiとの相性は事前に調べておくと良い)
  • USBキーボード
  • HDMI入力かRCA映像入力(懐かしの黄色いビデオ端子)を持つディスプレイ
  • 母艦(Windows)


【下準備】
RaspberryPiにディスプレイとキーボードをつないでおく


■Raspbianのインストール
Windows母艦でRaspbianのイメージをSDカードに書き込む。
公式ページではWin32DiskImagerでRaspbianのイメージをSDに書き込め、と書いてあるので、それをそのまま実行。
現在のRaspbian配布イメージだと、何もしなくても512MBのRAMを認識してくれるので、ファームウェア更新等の必要は無し。
raspi-configでSDカードの領域拡張した後は、以下の項目を設定しておく。


  • change_locale:"en_GB.UTF-8 UTF-8","en_US.UTF-8 UTF-8","ja_JP.UTF-8 UTF-8"(default_locale:"en_US.UTF-8")
  • change_timezone:"Asia - Tokyo"
  • memory_split:"16MB"
  • ssh:"enable"
  • boot_behaviour:"no"


overclockはお好みで。とはいえ、700MHz動作でも、MPDだけならCPU負荷は20%程度(PulseAudioの場合は25%程度)なので、他に何もさせない場合は安定性の面から"none"を推奨。
SDカードの領域拡張処理は再起動後に行われるため、再起動に時間がかかる。


■利用ユーザの追加
初期ユーザ"pi"、パスワード"raspberry"でログイン後、新しいユーザを追加する。
$ sudo adduser [UserName]
$ sudo visudo
新しいユーザでsudoが利用できるよう、以下の行を追加。
[UserName] ALL=(ALL) ALL


■SDカードの領域をjournal_data_writeback modeにする
SDカードの領域はext4でフォーマットされているので、Cubox同様にjournal_data_writeback modeにしておく。
$ sudo tune2fs -c 0 -o journal_data_writeback /dev/root


■初期ユーザの停止
ログアウト後、追加したユーザでログインし、sudoが使えることを確認がてら、初期ユーザ"pi"を削除する。
$ sudo userdel -r pi


■日本語対応
日本語表示と日本語入力に対応させておく。
SSH接続がメインになるので、不要かもしれないが…将来のメンテナンス用に。
$ sudo apt-get install fonts-ipafont ttf-vlgothic xfonts-intl-japanese xfonts-intl-japanese-big
$ sudo apt-get install ibus-anthy
$ sudo dpkg-reconfigure locales
$ echo "export LANG=ja_JP.UTF-8" >>~/.profile


■ホスト名変更
固定IPで運用する場合は/etc/network/interfacesに設定を行う。

$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet static
address [RPi-StaticIP]
netmask 255.255.255.0
broadcast 192.168.XXX.255
gateway [DefaultGatewayIP]
dns-nameservers [DNSServerIP]
以下のファイルにホスト名を設定しておく。

$ sudo nano /etc/hostname
[HostName]
$ sudo nano /etc/hosts
127.0.1.1 [HostName]
また、再起動後、ifconfigで現在のIPアドレスを確認しておくと、ここから先の作業はSSH経由で可能となる。
$ ifconfig eth0
他の端末からホスト名でアクセスしたい場合はSambaを入れておく。
$ sudo apt-get install samba


■MPDのインストール
MPDと、MPDを操作するためのクライアント(MPC)をインストールする。
$ sudo apt-get install mpd mpc
$ sudo apt-get install alsa-utils


■USB-DACの設定
USB-DACを使用する場合は、ここでDACを接続して認識されることを確認しておく。
ウチの場合(LXU-OT2)は以下のように認識された
--------------------------------------------------
$ dmesg
[  647.493275] usb 1-1.3: new full-speed USB device number 4 using dwc_otg
[  647.596953] usb 1-1.3: New USB device found, idVendor=08bb, idProduct=2704
[  647.596984] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  647.597001] usb 1-1.3: Product: LUXMAN LXU-OT2
[  647.597013] usb 1-1.3: Manufacturer: LUXMAN LXU-OT2
[  647.608224] input: LUXMAN LXU-OT2                   LUXMAN LXU-OT2   as /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.2/input/input0
[  647.608337] generic-usb 0003:08BB:2704.0001: input: USB HID v1.00 Device [LUXMAN LXU-OT2                   LUXMAN LXU-OT2  ] on usb-bcm2708_usb-1.3/input2
[  647.839017] usbcore: registered new interface driver snd-usb-audio
$ cat /proc/asound/cards
 0 [ALSA           ]: BRCM bcm2835 ALSbcm2835 ALSA - bcm2835 ALSA
                      bcm2835 ALSA
 1 [LXUOT2         ]: USB-Audio - LUXMAN LXU-OT2
                      LUXMAN LXU-OT2 LUXMAN LXU-OT2 at usb-bcm2708_usb-1.3, full speed
--------------------------------------------------
このままではALSAによって内臓音源が優先して利用されてしまうため、ALSAの設定を変更する。
$ sudo nano /etc/modprobe.d/alsa-base.conf
以下の行をコメントアウト
#options snd-usb-audio index=-2


■内臓音源の設定
内臓音源をそのまま使用した場合、演奏の開始/停止時(音源サスペンドON/OFF時)に、割と大きなポップノイズが出てしまうため、PulseAudioを使用し、内臓音源をサスペンドさせないようにすることで対処する。
$ sudo apt-get install pulseaudio
$ sudo nano /etc/pulse/default.pa
以下の行をコメントアウトする。
#load-module module-suspend-on-idle
設定変更後にPulseAudioを再起動する。(ポップノイズが出ます)
$ sudo /etc/init.d/pulseaudio restart


■MPDの設定
MPDの設定を変更する。
$ sudo nano /etc/mpd.conf
以下の行をコメントアウト。
#bind_to_address "localhost"
USB-DACを使用する場合は、audio_outputの設定を以下のように変更する。(コメントアウトされているものを解除する)
audio_output {
type "alsa"
name "My ALSA Device"
device "hw:0,0" # optional
}
内臓音源を使用する場合は、audio_outputの設定を以下のように変更する。(コメントアウトされているものを解除する)
audio_output {
type “pulse”
name “MPD PulseAudio Output”
}
また、偶にMPDが音源をコントロールできないエラーを吐くことがあるので、以下のデバイスの権限を変更しておく。
$ sudo chmod 770 /dev/snd -R && sudo chgrp audio /dev/snd -R
ここまで設定できたらMPDを再起動する。
$ sudo /etc/init.d/mpd restart


■USBメモリ上の楽曲ファイルを認識させる場合
RaspberryPiにUSBメモリを刺しこんだ時にオートマウントさせて、USBメモリ上の楽曲をMPDに認識させるために、以下の設定をしておく。
$ sudo apt-get install usbmount
$ sudo ln -s /media/usb0 /var/lib/mpd/music


■NAS上の楽曲ファイルを認識させる場合
NAS上で管理されている楽曲ファイルを認識させる場合、/etc/fstabに記述を追加する。
ここではWindows上から閲覧できるNAS(Samba等)からファイルを参照することを想定している。
$ sudo nano /etc/fstab
//[NASHostName]/[TargetDirectory] /var/lib/mpd/music/[LinkName] cifs codepage=cp932,iocharset=utf8,r,defaults 0 0

※2013/03/27追記
現在の最新版「2013-02-09-wheezy-raspbian」では、mount.cifsのオプション「codepage」の指定ができないため、/etc/fstabのcodepage指定を除去した。
どうやらRaspbianに限らず、Ubuntu等のDebian系Distribution全体で、mount.cifsのオプション「codepage」が使えなくなっているらしい。
「codepage」を指定した場合のエラー内容は以下の通り。

$ sudo mount //[Server]/[TargetDir] /var/lib/mpd/music/[TargetName] -t cifs -o codepage=cp932,iocharset=utf8,r,defaults
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
$ sudo dmesg | tail -n1
[23499.354795] CIFS: Unknown mount option "codepage=cp932"



■RaspberryPiの再起動とMPC
再起動後、MPCから音出しして確認する。
$ sudo reboot
"/var/lib/mpd/music"以下に楽曲ファイルを配置しておくと、MPD側で認識される。
以下のコマンドで、配置された楽曲ファイルを全て演奏する。
$ mpc update
$ mpc ls
$ mpc ls | mpc add
$ mpc play
演奏停止は以下のコマンドで行う。
$ mpc stop
MPCのコマンドについては、エレキジャックの「Music Player Daemon (MPD) を使ってみる」を参照。


MPDの設定はここまで。Android用のMPDクライアントには「MPDroid」を使ってるけど、なかなか便利。
ただ、Android4.2だとMPDへのコネクション切断がうまくいかずに残ってしまうバグがあるようなので、Nexus7では他のアプリを使った方が良さそうだなぁ。
※クライアントの接続情報は以下のコマンドで確認可能
$ netstat -a --programs | grep 6600
RaspberryPiはNICが100Baseと貧弱なので、使いどころが難しいけど、

  • 無線LANアダプタを繋いで無線LANアクセスポイント化
  • CUPSを立ち上げてプリンタサーバ化
  • ウェブカメラを繋いで簡易な監視カメラ化

なんかが面白そうかな。まぁ、また時間ができた時にでも…。