coding, photo, plant and demo

*Raspberry Pi + RuneAudioで音楽を鳴らしてみる

audio mpd tech 20140208 175657

ラズパイ買ってみた

なんとなくRaspberry Piを買ってみました。
ARM11 700MHz シングルコア, SDRAM 512MB, HDMI*1, USB2.0*2
ストレージはSDカードという代物です。

なぜこんなものが欲しくなるかというと、
  • 消費電力が小さいので付けっぱなしの軽量サーバに最適
    • こちらによると普通に使えば電気代は月間36円
  • GPIOが付いているので、電子工作に最適
    • 単純なものなら、さらに消費電力が小さくサイズも小さく出来る Arduino でもいいですが、CPUがショボイのとEtherもHDMIもないのでやれることは狭くなります
  • サイズが小さい
    • 部屋のちょっとした隙間に置けます。リビングに置いてもバレません

ということでリビングに猫の監視カメラとか、猫の自動餌やり器とか、猫のじゃらし器とか、いろいろと夢が広がりんぐ…ってどれも要らねえな。そもそも会社で毎日似たようなもの触ってるじゃん…なんで買ったんだ俺。

ちなみに、似たものに BeagleBoard (BeagleBone)やCubieboardPandBoard 、Arduinoを内蔵したUDOOやArduino互換のGalileo等がありますが、最も手頃な価格で入手しやすくコミュニティも活発で情報も手に入りやすいRaspberry Piがオススメです。個人的にはSATAやSPDIFが生えていてデュアルコアのCubieboard2が気になるんですが、ちょっと高いですね。


サウンドサーバにしてみる

2年ほど前に、 PogoPlugをサウンドサーバにしたことがある んでなんかデジャブを感じますが、そんなことは忘れてまたサウンドサーバを作りましょう。

どうやらラズパイには幾つかサウンドサーバ向けのディストロがあるようです。

RaspyFi - Pi never sounded so good!
一番有名なのがこれ。Debianベースで色々チューニングした上でMPDを入れてWebでUIをこしらえたもののようです。焼いて起動してGUIでNASとかを指定すればすぐWebやiOSやAndroidからのMPDクライアントから操作可能になります(Quick Start Guide)。AirPlayにも対応してます。

Volumio - A REVOLUTIONARY AUDIOPHILE MUSIC PLAYER
RaspyFiを進化させたものらしいですが、RaspyFiのBeableBoard等の他機種対応をしたものと思って良さそうです。

RuneAudio - A REVOLUTIONARY DIGITAL HI-FI PLAYER
まだベータですが、arch linuxベースのRaspyFiと言って良さそうです。これもラズパイ以外にも対応しています。

piCorePlayer - SQUEEZE AUDIO DEVICE
これはちょっと毛色が変わっていてsqueezeliteというLogitechのSqueeze Boxのエミュレートをするソフトを動かすディストロです。


なるほど、どれも面白そうですが僕はArchが好きなのでRuneAudioで。

RuneAudioを入れてみる

ここからイメージをダウンロードしてSDに焼きます。

ホスト名runeaudioで、root:runeでログインできます。
$ ssh -l root runeaudio
root@runeaudio's password:
===============  RuneOS distribution  ===============
  ____                      _             _ _
 |  _ \ _   _ _ __   ___   / \  _   _  __| (_) ___
 | |_) | | | | '_ \ / _ \ / _ \| | | |/ _` | |/ _ \
 |  _ <| |_| | | | |  __// ___ \ |_| | (_| | | (_) |
 |_| \_\\__,_|_| |_|\___/_/   \_\__,_|\__,_|_|\___/

================  www.runeaudio.com  ================
RuneOs: 0.2-beta
RuneUI: 1.2

Last login: Thu Jan  1 00:00:19 1970
[root@runeaudio ~]#

もしruneaudioが見つからない場合は、仕方ないのでキーボードとHDMIを繋げてifconfig等でIPが取れているか確認してdhcpdを叩きなおすとかしましょう。

nginxが起動しているので、ブラウザでruneaudioと入れるとphpで作られたUIが出てきます(RuneUIというらしいですが、要はRaspyFiのPlayerUIからのフォークです)。このUIでsambaで公開しているpublicな音楽ディレクトリ(music)を設定します。

ADD NEW MOUNTを選んで
fileshare protocol: smb/cifs
IP address: 192.168.x.x
remote directory: music
SMB guest access: yes
けどマウントできません。dmesgをみたら、
CIFS: Unknown mount option "noatime"
noatimeの指定ができない?よく分からんけど、ええい面倒くさいShow advanced optionsのMount flagsからnowatimeを消したった(noatimeを消すとアクセス記録を残すようになるので若干遅くなります)。

これでDBのアップデートをかければ曲を選択して鳴らすことができます。あとはMPD SettingsでAudio buffer sizeを2048以上にした方がいいです。音が途切れることがあるので。

これで音楽サーバになりました。ちょっとハマったけど一から入れることを考えれば簡単すぎますね。

ちなみにkernelやmpdのversionはこんな感じです。
$ uname -a
Linux runeaudio 3.10.28-1-ARCH #1 PREEMPT Tue Jan 28 15:46:05 MST 2014 armv6l GNU/Linux

$ /usr/bin/mpd -V
Music Player Daemon 0.18.7

Copyright (C) 2003-2007 Warren Dukes <warren.dukes@gmail.com>
Copyright (C) 2008-2013 Max Kellermann <max@duempel.org>
This is free software; see the source for copying conditions.  There is NO
warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Decoders plugins:
 [mad] mp3 mp2
 [vorbis] ogg oga
 [oggflac] ogg oga
 [flac] flac
 [opus] opus ogg oga
 [sndfile] wav aiff aif au snd paf iff svx sf voc w64 pvf xi htk caf sd2
 [audiofile] wav au aiff aif
 [dsdiff] dff
 [dsf] dsf
 [faad] aac
 [wavpack] wv
 [modplug] 669 amf ams dbm dfm dsm far it med mdl mod mtm mt2 okt s3m stm ult umx xm
 [ffmpeg] 16sv 3g2 3gp 4xm 8svx aa3 aac ac3 afc aif aifc aiff al alaw amr anim apc ape asf atrac au aud avi avm2 avs bap bfi c93 cak cin cmv cpk daud dct divx dts dv dvd dxa eac3 film flac flc fli fll flx flv g726 gsm gxf iss m1v m2v m2t m2ts m4a m4b m4v mad mj2 mjpeg mjpg mka mkv mlp mm mmf mov mp+ mp1 mp2 mp3 mp4 mpc mpeg mpg mpga mpp mpu mve mvi mxf nc nsv nut nuv oga ogm ogv ogx oma ogg omg psp pva qcp qt r3d ra ram rl2 rm rmvb roq rpl rvc shn smk snd sol son spx str swf tgi tgq tgv thp ts tsp tta xa xvid uv uv2 vb vid vob voc vp6 vmd wav webm wma wmv wsaud wsvga wv wve
 [pcm]

Output plugins:
 shout null fifo pipe alsa ao oss pulse jack httpd recorder

Encoder plugins:
 null vorbis opus lame wave flac

Archive plugins:
 [bz2] bz2

Input plugins:
 file archive curl ffmpeg mms

Playlist plugins:
 extm3u m3u xspf pls asx rss soundcloud cue cue

Protocols:
 file:// http:// https:// mms:// mmsh:// mmst:// mmsu:// gopher:// rtp:// rtsp:// rtmp:// rtmpt:// rtmps://

GME対応してみる

SPCとかGYMも聴きたいよね、ってことでlibgmeを有効にしてみる。

git clone git://git.musicpd.org/master/mpd.git
./autogen.sh
./configure --enable-gme
make
make install

vi /etc/systemd/system/multi-user.target.wants/mpd.service
/ExecStart
ddiExecStart=/usr/local/bin/mpd --no-daemon /etc/mpd.conf
ZZ
systemctl restart mpd

$ /usr/local/bin/mpd -V
Music Player Daemon 0.19~git (release-0.18.7-665-g9c637df)

Copyright (C) 2003-2007 Warren Dukes <warren.dukes@gmail.com>
Copyright (C) 2008-2014 Max Kellermann <max@duempel.org>
This is free software; see the source for copying conditions.  There is NO
warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Database plugins:
 simple proxy

Neighbor plugins:
 smbclient

Decoders plugins:
(中略)
 [gme] ay gbs gym hes kss nsf nsfe sap spc vgm vgz
(後略)

無事にいろいろ聴けるようになりました。

MDX対応してみる

2年ほど前に無理やりGMEと同じような形で対応させたことがあるのですが、今見ると結構コードが変わっているようだし、移植しなおしてもまたリベースするの大変かもだし、そもそも同じプロセスで動く場合相当メモリリークやクラッシュが絶対にないようにしないといけないから筋が悪いよね。そもそもgmeも実は不安定なんだよな、特定のファイルで落ちる。

てことで素直に外部のデコーダが使えるようなので、それを利用すべきですね(前からあったんだっけこれ…)。
http://mpd.wikia.com/wiki/GenericDecoder

ということで気が向いたら続く。
(追記:と思ったら、このGenericDecoderのパッチ、最新のmpdには全然当たらないですね。うーん、どうしたものか)