意外にもcygwinでMusicPlayerDaemonが動いた

ousttrue2009-01-18

http://mpd.wikia.com/wiki/Music_Player_Daemon_Wiki
cygwinへのインストールについて(mpd-0.14.1)


けっこう頑張りが必要だがなんか適当にやったらできたのでメモ。
まず、
cygwinのsetup.exeのインストーラでcategory audioで要りそうなものをインストールする。
あとpkg-configとglib。

次に依存(していそうな)ライブラリをビルドした。
インストールしたのは、
libmad, libid3tag, lame
http://sourceforge.net/project/showfiles.php?group_id=12349
http://lame.sourceforge.net/
それぞれ解凍して

./configure
make
make install

で特に問題なくビルドできた。
しかしこのままではmpdのconfigureがlibmadを認識してくれないので、
libmadとlibid3tagのpkg_configをgentooからコピーしてやった。
/usr/lib/pkgconfig/mad.pc

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

Name: mad
Description: MPEG Audio Decoder
Requires:
Version: 0.15.1b
Libs: -L${libdir} -lmad -lm
Cflags: -I${includedir}

/usr/lib/pkgconfig/id3tag.pc

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

Name: id3tag
Description: ID3 tag reading library
Requires:
Version: 0.15.1b
Libs: -L${libdir} -lid3tag -lz
Cflags: -I${includedir}

次にmpd本体のビルド。
これはけっこう手をいれるところがあるので面倒。
とりあえずエラーメッセージを読めるように

$ export LANG=C

すかさず

$ ./configure

ここまでは問題ない。
ある場合は多分ライブラリが足りないのでsetup.exeで追加する。

$ make

ここでたしかresolv.hが無いというエラーが出る。
src/os_compat.hの

#include <resolv.h>

コメントアウトする。

$ make

今度はsrc/listen.cのビルドで止まる。
src/listen.cの#includeが終わったあたりに
下記を追加
http://musicpd.org/mantis/view.php?id=1566
を参考に適当に書いております。

#include <cygwin/in.h>
#include <netdb.h>
#include <string.h>

struct addrinfo {
  int     ai_flags;
  int     ai_family;
  int     ai_socktype;
  int     ai_protocol;
  unsigned long  ai_addrlen;
  char   *ai_canonname;
  struct sockaddr  *ai_addr;
  struct addrinfo  *ai_next;
};

static int
getaddrinfo(const char *hostname, struct addrinfo *ai, in_port_t port, void *dumy)
{
  struct hostent *he;
  struct in_addr **ap;
  struct sockaddr_in *sa_in;

  he = gethostbyname(hostname);
  if (!he)
    return (-1);
  ai->ai_family = he->h_addrtype;
  ai->ai_socktype = SOCK_STREAM;
  ai->ai_protocol = 0;
  //ai->ai_addrlen = he->h_length;
  ai->ai_addrlen = sizeof(struct sockaddr_in);
  if (NULL == (ai->ai_addr = malloc(ai->ai_addrlen)))
    return (-1);

  sa_in = (struct sockaddr_in *)ai->ai_addr;
  memset(sa_in, 0, sizeof(struct sockaddr_in));
  sa_in->sin_family = PF_INET;
  sa_in->sin_port = htons(port);
  ap = (struct in_addr **)he->h_addr_list;
  memcpy(&sa_in->sin_addr, *ap, sizeof(struct in_addr));

  ai->ai_next = NULL;
  return (0);
}

static void
freeaddrinfo(struct addrinfo *ai)
{
  free(ai->ai_addr);
}

const char *
gai_strerror(int errcode)
{
  return "fake gai_strerror.";
}

#define AI_PASSIVE 0x1

それからconfig.hから

#define HAVE_STRUCT_UCRED 1

コメントアウト

$ make

ビルドが通ったはず。

$ make install
$ cp mpdconf.example /etc/mpd.conf

インストール終わり。

適当にmpd.confを編集。
最低限、
music_directory

audio_outputのoss
を変える。

$ mpd

これでうまくいけばmusic_directory内のファイルを読み込んでデーモンが起きる(port:6600)

次にclientのインストール。
gmpcをインストールする。
http://gladewin32.sourceforge.net/
からGtk+をインストールする(多分、新しい方のRunTimeで十分)
gladeは必要ない。

http://gmpcwiki.sarine.nl/index.php?title=Installation_Win32
からgmpc-0.17.0.zip(windows版のクライアント)を入手して
実行。
デフォルトのlocalhost:6600につなぎに行くので
適当に再生してみる。
以上で動作確認完了。
しかしこのままだとSJISのタグが文字化けしている。

これを直すにはパッチを書かないといけないのだが、
それは明日、というか今度起きたらやるw