Windows(Cygwin)でも mpd + ncmpcppを使いたい 

mpdとは、音楽ファイルやプレイリストを管理するサーバーです。mpdは単体だけでは動きません。操作するクライアント(ncmpcpp等)が必要になります。今回紹介するのはmpdとncmpcppをCygwin上でのビルド方法です。mpdとncmpcppは`Cygwin Ports` http://cygwinports.org/ からインストールすることができます。また、windows向け(Cygwin非依存)ビルド済みmpdをhttp://www.musicpd.org/download.html からダウンロードできます。

環境
Windows 8.1 64-bit
Cygwin 1.7.35 64-bit
mpd 0.19.9

#MPD
##必要なパッケージのインストール
cyg-fastでパッケージをインストールします。cyg-fastについては
http://qiita.com/d9magai@github/items/ff867393b7c257135e70
を参考にしてください。


```
$cyg-fast -m ftp://ftp.iij.ad.jp/pub/cygwin/ update
$cyg-fast install gcc-core gcc-g++ make libboost-devel doxygen cygrunsrv libsqlite3-devel autoconf automake pkg-config libglib2.0-devel zlib-devel libiconv flac flac-devel libogg libvorbis libvorbis-devel libao-devel libao4 libao libcurl-devel curl libopus-devel libsndfile libsndfile-devel
```

一応これだけでビルドができますが、flacやDSDくらいしか聴けません。mp3やaacに対応させたいので機能を追加していきます。使用用途に合わせて追加していきます。

 mpdのインストールを簡潔にするためパッケージはすべて`-prefix=/usr`にしています。
`/usr/local/`にインストールした場合、mpd の configure実行時に以下のように環境変数を設定します。

```
libid3tagの場合
$ ID3TAG_CFLAGS=-I/usr/local/include ID3TAG_LIBS="-L/usr/local/lib -lid3tag"  ./configure
```

###libmpdclient
ncmpcppでも使うので、入れておきましょう。

```
$ mkdir -p /tmp/mpd
$ cd !$
$ wget http://www.musicpd.org/download/libmpdclient/2/libmpdclient-2.9.tar.xz
$ tar Jxf libmpdclient-2.9.tar.xz
$ cd libmpdclient-2.9
$ ./configure --prefix=/usr
```

###libid3tag
ID3タグを読み込むのに使います

```
mkdir -p /tmp/mpd
cd !$
wget 'http://sourceforge.net/projects/mad/files/libid3tag/0.15.1b/libid3tag-0.15.1b.tar.gz'
tar -xzvf libid3tag-*.tar.gz
cd libid3tag-*
./configure --prefix=/usr
make && make install
```

```terminal:error
configure: error: cannot guess build type; you must specify one
```
64bitで./configure実行のとき、このエラーが出た場合
`./configure --prefix=/usr --build=x86_64-unknow-cygwin`
で実行してみてください。

###libmad
MAD(MPEG Audio Decoder)、MP3の再生に使います

```
mkdir -p /tmp/mpd
cd !$
wget 'http://sourceforge.net/projects/mad/files/libmad/0.15.1b/libmad-0.15.1b.tar.gz'
tar -xzvf libmad-0.15.1b.tar.gz
cd libmad-0.15.1b
./configure --prefix=/usr
```

```:error
gcc: error: unrecognized command line option '-fforce-mem'
```
make時たぶんこのエラーがでます。このgccオプションは廃止されてるみたいなので
`vi`などでMakefileのCFLAGSから`-fforce-mem`を消してください

`make && make install`

###LAME
MP3エンコーダーです。

```
mkdir -p /tmp/mpd
cd !$
wget 'http://sourceforge.net/projects/lame/files/lame/3.99/lame-3.99.5.tar.gz'
tar -xzvf lame-3.99.5.tar.gz
cd lame-3.99.5
./configure --prefix=/usr
```
こちらもmake時エラーがでます。

```:error
lametime.c:139:25: エラー: ‘_O_BINARY’ が宣言されていません (この関数内での最初の使用)
     setmode(fileno(fp), _O_BINARY);
```
frontend内のlametime.cを修正してください。138行目あたりです

```c:lametime.c
#elif defined __CYGWIN__
    //setmode(fileno(fp), _O_BINARY);
    setmode(fileno(fp), O_BINARY); // _を消します
```

`make && make install`

###mpg123
MP3再生用。MADの替わりに使うことができます。

```
mkdir -p /tmp/mpd
cd !$
wget 'http://sourceforge.net/projects/mpg123/files/mpg123/1.22.0/mpg123-1.22.0.tar.bz2'
tar jxf mpg123-1.22.0.tar.bz2
cd mpg123-1.22.0
./configure --prefix=/usr
make && make install
```

###FAAD2
aac(.m4a)再生に使います。

```
mkdir -p /tmp/mpd
cd !$
wget 'http://sourceforge.net/projects/faac/files/faad2-src/faad2-2.7/faad2-2.7.tar.bz2'
tar jxf faad2-2.7.tar.bz2
cd faad2-2.7
./configure --prefix=/usr
make && make install
```

###Audio File Library
AIFFやWAVE再生用

```
$ cyg-fast install audiofile libaudiofile-devel
```
または、

```
$ mkdir -p /tmp/mpd
$ cd !$
$ wget 'http://audiofile.68k.org/audiofile-0.3.6.tar.gz'
$ tar -xzvf audiofile-0.3.6.tar.gz
$ cd audiofile-0.3.6
$ ./configure --prefix=/usr
$ make && make install
```

###FFMPEG
http://ffmpeg.zeranoe.com/builds/ から[Shared]と[Dev]をダウンロードし解凍します

```
$ mkdir -p /usr/local/ffmpeg

```
この中にDevの中身すべてとSharedのbinを入れてください

```
.
├── bin
├── doc
├── include
├── lib
├── licenses
└── README.txt

```

pkgconfigを追加します。

```
$ vi /lib/pkgconfig/ffmpeg.pc
```

```bash:ffmpeg.pc
# Package Information for pkg-config

prefix=/usr/local/ffmpeg
exec_prefix=${prefix}
libdir=
includedir=${prefix}/include

Name: ffmpeg
Description: Open Source Computer Vision Library
Version: 2.4.9
Libs:  ${exec_prefix}/lib/libavcodec.dll.a ${exec_prefix}/lib/libavdevice.dll.a ${exec_prefix}/lib/libavfilter.dll.a ${exec_prefix}/lib/libavformat.dll.a ${exec_prefix}/lib/libavutil.dll.a ${exec_prefix}/lib/libpostproc.dll.a ${exec_prefix}/lib/libswresample.dll.a ${exec_prefix}/lib/libswscale.dll.a -lm -ldl -lrt
Cflags: -I${includedir}

```

確認

```
$ vi ffmpeg.c
```

```c:ffmpeg.c
#include <libavcodec/avcodec.h>
int main() {
        av_register_all();
        return 0;
}
```

```
$ gcc ffmpeg.c -o ffmpeg `pkg-config --cflags --libs ffmpeg`
$ ls ffmpeg.*
```

~/.bashrc または~/.zshrcに

```bash:.bashrc
export PATH=$PATH:/usr/local/ffmpeg/bin
```
を追加、パスを通します

```
$ source ~/.bashrc
$ ffmpeg -version
```

###その他のパッケージ

fluidsynth, AdPlug, GME(Game Music Emu), ModPlug, WavPack などがあります。
mpd の `./configure --help`で確かめてください。

##MPDインストール

```
$ mkdir -p /tmp/mpd
$ cd !$
$ wget http://www.musicpd.org/download/mpd/0.19/mpd-0.19.9.tar.xz
$ tar xvf mpd-0.19.9.tar.xz
$ cd mpd-0.19.9
$ ./configure

ffmpegをいれた場合
$ FFMPEG_CFLAGS=`pkg-config --cflags ffmpeg` FFMPEG_LIBS=`pkg-config --libs ffmpeg` ./configure
```
追加した機能が＋になっていることを確認

```
########### MPD CONFIGURATION ############

Archive support:
        (-bzip2) (-ISO9660) (-ZIP)
Client support:
        (+IPv6) (+TCP) (+UNIX Domain Sockets)
Storage support:
        (-NFS) (-SMB)
File format support:
        (+AAC) (-AdPlug) (+DSD) (-C64 SID) (+FFMPEG) (+FLAC) (-FluidSynth) (-GME)
        (+libsndfile) (-MikMod) (-MODPLUG) (+MAD) (+MPG123) (-Musepack)
        (+Opus) (-OggTremor) (+OggVorbis) (+WAVE) (-WavPack) (-WildMidi)
Other features:
        (-libsamplerate) (-libsoxr) (+libmpdclient) (-inotify) (+SQLite)
Metadata support:
        (+ID3)
Playback support:
        (-ALSA) (+FIFO) (+File Recorder) (+HTTP Daemon) (-JACK)
        (+libao) (+OSS) (-OpenAL) (-OS X) (-Pipeline)
        (-PulseAudio) (-ROAR) (-SHOUTcast) (-Solaris) (-WinMM)
Streaming encoder support:
        (+FLAC) (+LAME) (-Shine) (+Ogg Vorbis) (+Opus) (-TwoLAME) (+WAVE)
Streaming support:
        (-CDIO_PARANOIA) (+CURL) (-SMBCLIENT) (-Soundcloud)
        (-MMS)
Event loop:
        poll

```

```
make && make install
```

makeの途中エラーが出た場合

```:error
src/system/SocketUtil.cxx:79:29: エラー: ‘SO_PASSCRED’ was not declared in this scope
  setsockopt(fd, SOL_SOCKET, SO_PASSCRED,
                             ^
```

```
$ ./configure --disable-un
```
または、コードを修正します



```
$ vi src/system/SocketUtil.cxx
```


```cpp:SocketUtil.cxx
//56行目あたり
#ifdef HAVE_STRUCT_UCRED
        //setsockopt(fd, SOL_SOCKET, SO_PASSCRED,
        setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
                   (const char *) &reuse, sizeof(reuse));
#endif

```

##MPD設定

```
$ mkdir -p ~/.mpd
$ mkdir -p ~/.mpd/playlists
$ cp /usr/local/share/doc/mpd/mpdconf.example ~/.mpd/mpd.conf
$ vi ~/.mpd/mpd.conf
```
コメントアウトをはずしていきます

```bash:mpd.conf
music_directory         "~/music"
db_file                 "~/.mpd/database"
playlist_directory              "~/.mpd/playlists"
log_file                        "~/.mpd/log"

audio_output {
        type            "oss"
        name            "My OSS Device"
        format          "44100:16:2"
        device          "/dev/dsp"      # optional
        mixer_type      "software"      # optional
        mixer_control   "PCM"           # optional
}

filesystem_charset              "UTF-8"
id3v1_encoding                  "UTF-8"


```
##動作確認

```
$ mpd --verbose --no-daemon --stdout
```

#ncmpcpp

##必要なパッケージのインストール
```
$ cyg-fast install libfftw3-devel fftw3 ncurses ncursesw libncurses-devel libncursesw-devel libreadline-devel

```
##ncmpcppインストール
```
$ mkdir -p /tmp/ncmpcpp
$ cd !$
$ wget http://ncmpcpp.rybczak.net/stable/ncmpcpp-0.6.3.tar.bz2
$ tar xvf ncmpcpp-0.6.3.tar.bz2
$ cd ncmpcpp-0.6.3
$ BOOST_LIB_SUFFIX="" ./configure --enable-visualizer --enable-clock --enable-unicode --enable-outputs --with-curl  --with-fftw
$ make
```

```:error
status.cpp:131:71: エラー: ‘setsockopt’ was not declared in this scope
  setsockopt(Mpd.GetFD(), IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
                                                                       ^
```

```
$ vi src/status.cpp
```

```c:status.cpp
//追加
#include <sys/types.h>
#include <sys/socket.h>
```

```

$ vi src/Makefile
```

```bash:Makefile
# -lreadline　を追加
LDFLAGS = -lboost_filesystem -lboost_system -lboost_locale -lboost_program_options -lboost_regex -lboost_thread -lmpdclient  -lpthread -lncursesw -lfftw3 -lm  -lcurl -lreadline
```

```
make && make install
```

##ncmpcpp設定
```
$ mkdir -p ~/.ncmpcpp
$ cp /usr/local/share/doc/ncmpcpp/config ~/.ncmpcpp/
$ vi ~/.ncmpcpp/config
````
コメントアウトをはずしていきます

```bash:~/.ncmpcpp/config
mpd_host = localhost
mpd_port = 6600
```


```
$ mpd && ncmpcpp
```

![mpd+ncmpcpp.png](https://qiita-image-store.s3.amazonaws.com/0/65683/b56c7fe8-3d48-0712-b556-9248ee276646.png)

##ncmpcpp　テーマなど

http://dotshare.it/category/mpd/ncmpcpp/
こちらを参考に