四万十川(四万十大橋) 高知県


Date/Time: 2007:04:29 12:35:45
Camera: Panasonic
Model: DMC-LX2
Exporsure Time: 1/400
FNumber: 6.3
Aperture Value: 5.3
Focal Length: 6.3

Close

y2blog » UPnP/OpenHome Music Server の自作(その8)

9

02

2018

UPnP/OpenHome Music Server の自作(その8)

MPDレンダラーをUPnP/OpenHomeでコントロールする


さて、これまで長々とミュージックサーバ環境とオーディオネットワーク環境の構築に時間を費やしてきたが、いよいよ今回の本題のUPnP/OpenHome対応オーディオネットワーク環境の構築に取り掛かることにしよう.


私の現在のメインのネットワークオーディオ環境は、UPnP対応化したlightMPD(BeagleBone Green Botic7ベース + ES9038PRO/AK4497EQ I2S DAC)を LINN Kazoo、IO-Data fidataなどのUPnP/OpenHome対応コントローラアプリとの組み合わせで構築している.音質的なメリットから、lightMPDを、操作性の観点から Kazoo という良いとこ取りの選択だが、元々MPDとUPnP/OpenHomeという別な世界の組みあわせなので、この環境を整えるにはそれなりの工夫が必要だ.


このアプローチは、lightMPDでお馴染みの「デジファイのおと」さんの、”digifi labo”で紹介している、”lightMPD/upnpgw” を参考に、自分でAPU2C4上のCentOS7環境上に構築したものだ.


技術的な概要はlightMPD/upnpgwのページ詳細な解説(一般のユーザにとってはかなり難解かもしれない)があるので、そちらを参照するのが良いだろう.但し、複数のソリューションが紹介されているので、自分の目的に合った組みあわせを選択するのが難しそうだ.自分でLinuxのインストールや複雑なアプリをインストールする必要もなく、とても簡単(今回の記事内容に較べれば)なのでLinuxのエキスパートでも無い限り、こちらの “lightMPD/upnpgw” の方をお薦めする.”lightMPD/upnpgw”については、また別な機会に紹介しようと思う.


一般的なMPDレンダラーはNFSやSMB/CIFSを使って、音源データがボリュームをネットワークマウントして使用しているが、今回はMinimServerがAPU2C$側で稼働しているので、MPDレンダラー側がHTTPプロトコルでサーバと音源データのやりとりが行える環境であれば、NFSやSMB/CIFSなどのネットワークボリュームを手元のコンピュータ上にマウントする必要はない.この方法の方がネットワークオーディオ的に見ても洗練されているし、何よりもファイルシステムなどという厄介な物から解放されるので精神衛生上好ましい.


APU2C4 OpenHome Audio Network
今回のUPnp/OpenHomeオーディオネットワーク環境

今回は、UPnP/OpenHomeプロトコルをMPDプロトコルに変換する “upmpdci” というアプリケーションを、今回のAPU2C4上のCentOS7環境に構築する.”upmpdci“はDebian系のディストリビューションであれば比較的簡単に実装できるのだが、CentOSなどのRedHat系はソースコードからコンパイルを行わなければならず、Linuxに精通していなければ構築は無理だろう.


私も当初は、CentOS7環境で “upmpdci” をソースコードから構築する事を試みたが、”./configure” 段階でギブアップして、安直にCentOS7のKVM仮想環境上で、Debian 9(Stretch) を動かし、その上で “upmpdci”を稼働させていたほどだ.KVM仮想環境を整える方が、”upmpdci”をソースコードから構築するより簡単だ.


今回何とかCentOS7上でKVM仮想環境を用いること無く、”upmpdci”をソースコードから構築することができたので、とりあえずその手順の概要を紹介することにする.但し、”upmpdci”と結びつくMPDクライアントは1つだけのようなので、複数のMPDレンダラー(プレイヤー)をOpenHomeコントローラで切り替えて使う場合は、KVM仮想環境上で複数のDebian 9(Stretch) 環境を立ち上げ、”upmpdci”を同時に複数動かす方が現実的だろう.


“upmpdci”のページにはネットワークオーディオに関する有益な情報が載っているので、一度目を通して置くと良いだろう.ソースコードからコンパイルするには、”Building from source” は必読だ.ここに書かれている情報だけで作業を進めることは出来ず、一週間近く試行錯誤してようやく”upmpdci”を正常にコンパイルすることができた.CentOS7では難儀すること必至だろう.


“upmpdci”のコンパイルが成功するまでの長い道のり


本当は”upmpdci”のコンパイルが成功するまでの試行錯誤の様子をきちんと紹介したかったが、余りにも膨大なので、今回は単純に上手く出来た時の手順の概要だけを示すことにする.実機では無く仮想環境上に何度もCentOS7環境を作っては壊しの連続で、ようやくこの手順に辿り着いたというのが実情だ.


もう一度同じ事をしても、本当に上手く行くかどうかはやってみなければわからないというのが実情だ.同じCentOS7環境でも、インストールされているパッケージやツール類が異なれば上手く行かない可能性があるので、その場合は辛抱強く試行錯誤を重ねて欲しい.


1.ソースコードのダウンロード

Upmpdcli downloads” ページから、libupnpp-0.16.1.tar.gz, upmpdcli-1.2.16.tar.gz, sc2mpd-1.1.5.tar.gz の3つのtarボールをダウンロードし、適当なディレクトリ配下に解凍して展開しておく.



[yasuaki@jukebox UpMPD]$ mkdir RPM
[yasuaki@jukebox UpMPD]$ mkdir SRC
[yasuaki@jukebox UpMPD]$ ls -la
total 0
drwxr-xr-x  4 yasuaki wheel  28 Sep  2 20:39 .
drwx------. 6 yasuaki wheel 154 Sep  2 20:38 ..
drwxr-xr-x  2 yasuaki wheel   6 Sep  2 20:39 RPM
drwxr-xr-x  2 yasuaki wheel   6 Sep  2 20:39 SRC
[yasuaki@jukebox UpMPD]$ cd SRC
[yasuaki@jukebox SRC]$ wget https://www.lesbonscomptes.com/upmpdcli/downloads/libupnpp-0.16.1.tar.gz
 ...
[yasuaki@jukebox SRC]$ wget https://www.lesbonscomptes.com/upmpdcli/downloads/upmpdcli-1.2.16.tar.gz
 ...
[yasuaki@jukebox SRC]$ wget https://www.lesbonscomptes.com/upmpdcli/downloads/sc2mpd-1.1.5.tar.gz
 ...
[yasuaki@jukebox SRC]$ tar xvzf libupnpp-0.16.1.tar.gz
[yasuaki@jukebox SRC]$ tar xvzf sc2mpd-1.1.5.tar.gz
[yasuaki@jukebox SRC]$ tar xvzf upmpdcli-1.2.16.tar.gz
[yasuaki@jukebox SRC]$ ls -la
total 1104
drwxr-xr-x 5 yasuaki wheel    159 Sep  2 20:53 .
drwxr-xr-x 4 yasuaki wheel     28 Sep  2 20:39 ..
drwxr-xr-x 3 yasuaki wheel    303 Apr  6 23:59 libupnpp-0.16.1
-rw-r--r-- 1 yasuaki wheel 473013 Apr  7 01:06 libupnpp-0.16.1.tar.gz
drwxr-xr-x 4 yasuaki wheel    224 Apr  7 22:09 sc2mpd-1.1.5
-rw-r--r-- 1 yasuaki wheel 219031 Apr  8 01:06 sc2mpd-1.1.5.tar.gz
drwxr-xr-x 8 yasuaki wheel   4096 Apr  7 00:29 upmpdcli-1.2.16
-rw-r--r-- 1 yasuaki wheel 429958 Apr  7 01:06 upmpdcli-1.2.16.tar.gz
[yasuaki@jukebox SRC]$

2.関連するライブラリの準備

この関連ライブラリの準備を行うのが結構大変で、ライブラリパッケージの依存関係や各種ツールの事前インストールなどで一筋縄では行かない.”yum install xxxx” で一発インストールとは行かない.今回はRHEL7系(CentOS7)では標準で導入されていない、 yumの後継であるdnf 環境を整えることから始める.



[yasuaki@jukebox SRC]$ sudo yum install epel-release
  ...
 
[yasuaki@jukebox UpMPD]$ sudo yum install centos-release-yum4
  ...
 
Installed:
  centos-release-yum4.noarch 0:1-2.el7.centos                                                                                             

Dependency Installed:
  centos-release-configmanagement.noarch 0:1-1.el7.centos                                                                                 

Complete!
[yasuaki@jukebox UpMPD]$ sudo yum install yum4
 ...
Installed:
  yum4.noarch 0:2.7.5-10.el7                                                                                                              

Dependency Installed:
  PyYAML.x86_64 0:3.10-11.el7                           dnf.noarch 0:2.7.5-10.el7                 dnf-conf.noarch 0:2.7.5-10.el7         
  libcomps.x86_64 0:0.1.8-7.el7                         libdnf.x86_64 0:0.11.1-3.el7              librepo.x86_64 0:1.8.1-1.el7           
  libreport-filesystem.x86_64 0:2.1.11-40.el7.centos    libsmartcols.x86_64 0:0.2.32-0.2.el7      libsolv.x86_64 0:0.6.26-2.el7          
  libyaml.x86_64 0:0.1.4-11.el7_0                       python-dateutil.noarch 0:1.5-7.el7        python2-dnf.noarch 0:2.7.5-10.el7      
  python2-hawkey.x86_64 0:0.11.1-3.el7                  python2-libcomps.x86_64 0:0.1.8-7.el7     python2-librepo.x86_64 0:1.8.1-1.el7   
  python2-modulemd.noarch 0:1.3.3-2.el7                 python2-smartcols.x86_64 0:0.3.0-2.el7   

Complete!
[yasuaki@jukebox UpMPD]$ sudo yum4 install dnf-plugins-core
  ...
 
Installed:
  dnf-plugins-core.noarch 2.1.5-4.el7                             python2-dnf-plugins-core.noarch 2.1.5-4.el7                            

Complete!
[yasuaki@jukebox UpMPD]$

以上で、新しいdnf環境が整ったので、関連するライブラリの個別インストールを行う.この際に、同時にデベロップ用のパッケージも必ず一緒にインストールしておく.これがないと”./configure” 段階でエラーとなって先へ進めない.



[yasuaki@jukebox UpMPD]$ sudo dnf install expat*
 ...
 
[yasuaki@jukebox UpMPD]$ sudo dnf install jsoncpp*
 ...
 
[yasuaki@jukebox UpMPD]$ sudo dnf install libcurl*
 ...
 
[yasuaki@jukebox sc2mpd-1.1.5]$ sudo dnf install libmicrohttpd*
 ...
 
[yasuaki@jukebox sc2mpd-1.1.5]$ sudo dnf install alsa-lib*
 ...
 
[yasuaki@jukebox sc2mpd-1.1.5]$ sudo dnf install libsamplerate*
 ...

[yasuaki@jukebox UpMPD]$ sudo dnf install libupnp-*
 ...
 
[yasuaki@jukebox UpMPD]$ 
[yasuaki@jukebox RPM]$ wget http://li.nux.ro/download/nux/dextop/el7/x86_64/libmpdclient-2.7-4.el7.nux.x86_64.rpm
 ...
 
[yasuaki@jukebox RPM]$ wget http://li.nux.ro/download/nux/dextop/el7/x86_64/libmpdclient-devel-2.7-4.el7.nux.x86_64.rpm
 ...
 
[yasuaki@jukebox RPM]$ ls -la
total 204
drwxr-xr-x 2 yasuaki wheel    102 Sep  2 22:08 .
drwxr-xr-x 4 yasuaki wheel     28 Sep  2 20:39 ..
-rw-r--r-- 1 yasuaki wheel  36080 Jan 13  2015 libmpdclient-2.7-4.el7.nux.x86_64.rpm
-rw-r--r-- 1 yasuaki wheel 169412 Jan 13  2015 libmpdclient-devel-2.7-4.el7.nux.x86_64.rpm
[yasuaki@jukebox RPM]$ 
[yasuaki@jukebox RPM]$ sudo rpm -ivh libmpdclient-2.7-4.el7.nux.x86_64.rpm
warning: libmpdclient-2.7-4.el7.nux.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 85c6cd8a: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:libmpdclient-2.7-4.el7.nux       ################################# [100%]

[yasuaki@jukebox RPM]$ sudo rpm -ivh libmpdclient-devel-2.7-4.el7.nux.x86_64.rpm
[sudo] password for yasuaki: 
warning: libmpdclient-devel-2.7-4.el7.nux.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 85c6cd8a: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:libmpdclient-devel-2.7-4.el7.nux ################################# [100%]
[yasuaki@jukebox RPM]$ 

3.ソースコードのコンパイル

関連ライブラリの準備が整ったら、ソースコードのコンパイルに取り掛かる.”upmpdcli” は “libupnpp” のライブラリが必要になるので、”libupnpp”のコンパイルが終了後に構築を行う必要がある.手始めに “sc2mpd” から取り掛かる.OpenHome関連の環境を構築するための専用スクリプト “ohbuild.sh” を実行した後、”./configure” を実施する.


“sc2mpd” はLINNの “Songcast” プロトコルに対応させるためのもののようだが、今回の用途では実装しなくても良いのかもしれない.LINN製品を導入する予定はないが念のため実装しておくことにする.(いつかは”LINN”…)



[yasuaki@jukebox SRC]$ cd sc2mpd-1.1.5
[yasuaki@jukebox sc2mpd-1.1.5]$ ls -la
total 424
drwxr-xr-x 4 yasuaki wheel    224 Apr  7 22:09 .
drwxr-xr-x 5 yasuaki wheel    159 Sep  2 20:53 ..
-rw-r--r-- 1 yasuaki wheel  42141 Apr  7 22:07 aclocal.m4
-rwxr-xr-x 1 yasuaki wheel   7333 Apr  7 22:07 compile
-rwxr-xr-x 1 yasuaki wheel 193254 Apr  7 22:07 configure
-rw-r--r-- 1 yasuaki wheel   2701 Apr  7 22:02 configure.ac
-rw-r--r-- 1 yasuaki wheel  17992 Mar 20  2017 COPYING
-rwxr-xr-x 1 yasuaki wheel  23566 Apr  7 22:07 depcomp
-rwxr-xr-x 1 yasuaki wheel  15155 Apr  7 22:07 install-sh
-rw-r--r-- 1 yasuaki wheel   3680 Apr  7 22:04 Makefile.am
-rw-r--r-- 1 yasuaki wheel  82769 Apr  7 22:07 Makefile.in
-rwxr-xr-x 1 yasuaki wheel   6872 Apr  7 22:07 missing
drwxr-xr-x 2 yasuaki wheel    309 Apr  7 22:09 mpd2src
-rw-r--r-- 1 yasuaki wheel  13001 Sep 19  2017 ohbuild.sh
drwxr-xr-x 2 yasuaki wheel   4096 Apr  7 22:09 sc2src
[yasuaki@jukebox sc2mpd-1.1.5]$ mkdir OpenHome
[yasuaki@jukebox sc2mpd-1.1.5]$ sh ohbuild.sh -b OpenHome
opt_t 0
opt_c 0
opt_b 1
 
 ... 【数十分〜1時間程度時間が掛かる】
 
I../ohTopology/build/Include/  WavSender/WavSender.cpp
g++ -pthread  -o Build/Obj/Posix/Release/WavSender.elf Build/Obj/Posix/Release/WavSender.o Build/Obj/Posix/Release/Ohm.o Build/Obj/Posix/Release/OhmMsg.o Build/Obj/Posix/Release/OhmSocket.o Build/Obj/Posix/Release/OhmSender.o ../ohNetGenerated/Build/Obj/Posix/Release/DvAvOpenhomeOrgSender1.o ../ohNet/Build/Obj/Posix/Release/libohNetCore.a ../ohNet/Build/Obj/Posix/Release/libTestFramework.a
[yasuaki@jukebox sc2mpd-1.1.5]$ 
[yasuaki@jukebox sc2mpd-1.1.5]$ ./configure --prefix=/usr --with-openhome=./OpenHome
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for g++... g++
 
 ... 【省略】
 
config.status: creating sc2src/config.h
config.status: executing depfiles commands
[yasuaki@jukebox sc2mpd-1.1.5]$ 
[yasuaki@jukebox sc2mpd-1.1.5]$ make
g++ -DHAVE_CONFIG_H -I. -I./sc2src  -I. -DDEBUG -g -Wall -DDATADIR=\"/usr/share/sc2mpd\" -DCONFIGDIR=\"/usr/etc\" -DPACKAGE_VERSION=\"1.1.5\" -I./OpenHome/ohNet/Build/Include/ -I./OpenHome/ohNetGenerated/Build/Include/ -I./OpenHome/ohTopology/build/Include/ -I./OpenHome/ohSongcast/ -DWITH_OHBUILD    -DDEFINE_LITTLE_ENDIAN -std=c++11 -g -O2 -MT sc2src/sc2mpd-alsadirect.o -MD -MP -MF sc2src/.deps/sc2mpd-alsadirect.Tpo -c -o sc2src/sc2mpd-alsadirect.o `test -f 'sc2src/alsadirect.cpp' || echo './'`sc2src/alsadirect.cpp
mv -f sc2src/.deps/sc2mpd-alsadirect.Tpo sc2src/.deps/sc2mpd-alsadirect.Po
g++ -DHAVE_CONFIG_H -I. -I./sc2src  -I. -DDEBUG -g -Wall -DDATADIR=\"/usr/share/sc2mpd\" -DCONFIGDIR=\"/usr/etc\" -DPACKAGE_VERSION=\"1.1.5\" -I./OpenHome/ohNet/Build/Include/ -I./OpenHome/ohNetGenerated/Build/Include/ -I./OpenHome/ohTopology/build/Include/ -I./OpenHome/ohSon
 
 ... 【省略】
 
pd2src/mpd2sc-stringtotokens.o mpd2src/mpd2sc-wavreader.o sc2src/mpd2sc-log.o ./OpenHome/ohSongcast/Build/Obj/Posix/Release//Ohm.o ./OpenHome/ohSongcast/Build/Obj/Posix/Release//OhmMsg.o ./OpenHome/ohSongcast/Build/Obj/Posix/Release//OhmSocket.o ./OpenHome/ohSongcast/Build/Obj/Posix/Release//OhmSender.o ./OpenHome/ohNetGenerated/Build/Obj/Posix/Release/DvAvOpenhomeOrgSender1.o ./OpenHome/ohNet/Build/Obj/Posix/Release/libohNetCore.a ./OpenHome/ohNet/Build/Obj/Posix/Release/libTestFramework.a -lasound -lsamplerate -lmicrohttpd -lpthread  -lasound -lsamplerate -lmicrohttpd -lpthread 
[yasuaki@jukebox sc2mpd-1.1.5]$ 
[yasuaki@jukebox sc2mpd-1.1.5]$ sudo make install
[sudo] password for yasuaki: 
make[1]: Entering directory `/home/yasuaki/UpMPD/SRC/sc2mpd-1.1.5'
 /bin/mkdir -p '/usr/bin'
  /bin/install -c sc2mpd mpd2sc '/usr/bin'
 /bin/mkdir -p '/usr/bin'
 /bin/install -c mpd2src/scmakempdsender '/usr/bin'
make[1]: Nothing to be done for `install-data-am'.
make[1]: Leaving directory `/home/yasuaki/UpMPD/SRC/sc2mpd-1.1.5'
[yasuaki@jukebox sc2mpd-1.1.5]$ 

[yasuaki@jukebox sc2mpd-1.1.5]$ cd ..
[yasuaki@jukebox SRC]$ ls -la
total 1104
drwxr-xr-x 5 yasuaki wheel    159 Sep  2 20:53 .
drwxr-xr-x 4 yasuaki wheel     28 Sep  2 20:39 ..
drwxr-xr-x 3 yasuaki wheel    303 Apr  6 23:59 libupnpp-0.16.1
-rw-r--r-- 1 yasuaki wheel 473013 Apr  7 01:06 libupnpp-0.16.1.tar.gz
drwxr-xr-x 5 yasuaki wheel    323 Sep  2 21:50 sc2mpd-1.1.5
-rw-r--r-- 1 yasuaki wheel 219031 Apr  8 01:06 sc2mpd-1.1.5.tar.gz
drwxr-xr-x 8 yasuaki wheel   4096 Apr  7 00:29 upmpdcli-1.2.16
-rw-r--r-- 1 yasuaki wheel 429958 Apr  7 01:06 upmpdcli-1.2.16.tar.gz
[yasuaki@jukebox SRC]$ cd libupnpp-0.16.1
[yasuaki@jukebox libupnpp-0.16.1]$ 
[yasuaki@jukebox libupnpp-0.16.1]$ ./configure --prefix=/usr --sysconfdir=/etc
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking for a BSD-compatible install... /bin/install -c
 
 ... 【省略】
 
config.status: executing depfiles commands
config.status: executing libtool commands
[yasuaki@jukebox libupnpp-0.16.1]$ 
[yasuaki@jukebox libupnpp-0.16.1]$ make
depbase=`echo libupnpp/control/avlastchg.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
/bin/sh ./libtool  --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H -I. -I./libupnpp  -DDEBUG -g -Wall -I/usr/include/upnp     -DDATADIR=\"/usr/share/libupnpp\" -DCONFIGDIR=\"/etc\"  -std=c++11 -std=c++11 -g -O2 -MT libupnpp/control/avlastchg.lo -MD -MP -MF $depbase.Tpo -c -o libupnpp/control/avlastchg.lo libupnpp/control/avlastchg.cxx &&\
mv -f $depbase.Tpo $depbase.Plo
 
 ... 【省略】
 
-lpthread -lrt -lupnp -lthreadutil -lixml -lcurl -lexpat -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o  -g -O2 -Wl,-zdefs -pthread   -pthread -Wl,-soname -Wl,libupnpp.so.7 -o .libs/libupnpp.so.7.0.0
libtool: link: (cd ".libs" && rm -f "libupnpp.so.7" && ln -s "libupnpp.so.7.0.0" "libupnpp.so.7")
libtool: link: (cd ".libs" && rm -f "libupnpp.so" && ln -s "libupnpp.so.7.0.0" "libupnpp.so")
libtool: link: ( cd ".libs" && rm -f "libupnpp.la" && ln -s "../libupnpp.la" "libupnpp.la" )
[yasuaki@jukebox libupnpp-0.16.1]$ 
[yasuaki@jukebox libupnpp-0.16.1]$ sudo make install
[sudo] password for yasuaki: 
make[1]: Entering directory `/home/yasuaki/UpMPD/SRC/libupnpp-0.16.1'
 /bin/mkdir -p '/usr/lib'
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
 /bin/mkdir -p '/usr/include'
 /bin/mkdir -p '/usr/include/libupnpp/control'
 /bin/install -c -m 644  libupnpp/control/avtransport.hxx libupnpp/control/cdircontent.hxx libupnpp/control/cdirectory.hxx libupnpp/control/description.hxx libupnpp/control/device.hxx libupnpp/control/discovery.hxx libupnpp/control/linnsongcast.hxx libupnpp/control/mediarenderer.hxx libupnpp/control/mediaserver.hxx libupnpp/control/ohinfo.hxx libupnpp/control/ohplaylist.hxx libupnpp/control/ohproduct.hxx libupnpp/control/ohradio.hxx libupnpp/control/ohreceiver.hxx libupnpp/control/ohsender.hxx libupnpp/control/ohtime.hxx libupnpp/control/ohvolume.hxx libupnpp/control/renderingcontrol.hxx libupnpp/control/service.hxx libupnpp/control/typedservice.hxx '/usr/include/libupnpp/control'
 /bin/mkdir -p '/usr/include/libupnpp/device'
 /bin/install -c -m 644  libupnpp/device/device.hxx libupnpp/device/vdir.hxx '/usr/include/libupnpp/device'
 /bin/mkdir -p '/usr/include/libupnpp'
 /bin/install -c -m 644  libupnpp/base64.hxx libupnpp/conf_post.h libupnpp/config.h libupnpp/log.h libupnpp/log.hxx libupnpp/soaphelp.hxx libupnpp/upnpavutils.hxx libupnpp/upnpplib.hxx libupnpp/upnpputils.hxx libupnpp/workqueue.h '/usr/include/libupnpp'
 /bin/mkdir -p '/usr/lib/pkgconfig'
 /bin/install -c -m 644 libupnpp.pc '/usr/lib/pkgconfig'
make[1]: Leaving directory `/home/yasuaki/UpMPD/SRC/libupnpp-0.16.1'
[yasuaki@jukebox libupnpp-0.16.1]$ 
 
[yasuaki@jukebox SRC]$ cd upmpdcli-1.2.16
[yasuaki@jukebox upmpdcli-1.2.16]$ ./configure --prefix=/usr --sysconfdir=/etc
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
 
 ... 【省略】
 
checking pkg-config is at least version 0.9.0... yes
checking for upnpp... no
configure: error: libupnpp <== 環境変数: PKG_CONFIG_PATHが設定されていないのでエラー発生

[yasuaki@jukebox upmpdcli-1.2.16]$ export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig  <== PKG_CONFIG_PATHの設定
 
[yasuaki@jukebox upmpdcli-1.2.16]$ ./configure --prefix=/usr --sysconfdir=/etc
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
 
 ... 【省略】
 
UPMPDCLI_LIBS=-lpthread  -pthread -lupnpp -lcurl -lupnp -lthreadutil -lixml   -lmpdclient   -lmicrohttpd   -ljsoncpp  
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/config.h
config.status: executing depfiles commands
[yasuaki@jukebox upmpdcli-1.2.16]$ 
[yasuaki@jukebox upmpdcli-1.2.16]$ make
make  all-am
make[1]: Entering directory `/home/yasuaki/UpMPD/SRC/upmpdcli-1.2.16'
depbase=`echo src/avtransport.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
 
 ... 【省略】
 
(cd //usr/share/upmpdcli/cdplugins/uprcl; chmod a+x uprcl-app.py) 
make[3]: Leaving directory `/home/yasuaki/UpMPD/SRC/upmpdcli-1.2.16'
make[2]: Leaving directory `/home/yasuaki/UpMPD/SRC/upmpdcli-1.2.16'
make[1]: Leaving directory `/home/yasuaki/UpMPD/SRC/upmpdcli-1.2.16'
[yasuaki@jukebox upmpdcli-1.2.16]$ 
[yasuaki@jukebox upmpdcli-1.2.16]$ which upmpdcli
/bin/upmpdcli
[yasuaki@jukebox upmpdcli-1.2.16]$ ls -la /etc/upmpdcli.conf
-rw------- 1 root root 27104 Sep  2 22:20 /etc/upmpdcli.conf
[yasuaki@jukebox upmpdcli-1.2.16]$ 

4.”upmpdcli” 実行環境の整備

“upmpdcli” が無事インストールできたら、設定ファイル “/etc/upmpdcli.conf” に最低限必要なパラメータを記載し、”upmpdcli”をサービスとして登録しておく.


 ”/etc/upmpdcli.conf” のパラメータ記載例

 logfilename = /var/log/upmpdcli.log
 loglevel = 2
 friendlyname = UPnPLMPDBotic7
 openhome = 1
 mpdhost = 192.168.10.51
 mpdport = 6600
 ohproductroom = UPnPLMPDBotic7



[yasuaki@jukebox upmpdcli-1.2.16]$ sudo vi /usr/lib/systemd/system/upmpdcli.service
[yasuaki@jukebox upmpdcli-1.2.16]$ cat /usr/lib/systemd/system/upmpdcli.service
[Unit]
Description=UPnP Renderer front-end to MPD
After=network.target

[Service]
Type=simple
# Note: if start fails check with "systemctl status upmpdcli"
ExecStart=/usr/bin/upmpdcli -c /etc/upmpdcli.conf
# For some reason, the first start of libupnp fails. Probably this should
# be started later in the start sequence, but I don't know how. Retry a bit
# later. 
Restart=always
RestartSec=1min

[Install]
WantedBy=multi-user.target


“upmpdcli” 実行用のユーザアカウントを作成し、”upmpdcli” がOS起動時に自動起動するように設定しておく.



[yasuaki@jukebox upmpdcli-1.2.16]$ sudo groupadd -g  500 upmpdcli
[sudo] password for yasuaki: 
[yasuaki@jukebox upmpdcli-1.2.16]$ sudo useradd -g upmpdcli -u 500 -s /sbin/nologin upmpdcli
 
[yasuaki@jukebox upmpdcli-1.2.16]$ sudo systemctl enable upmpdcli
[sudo] password for yasuaki: 
Created symlink from /etc/systemd/system/multi-user.target.wants/upmpdcli.service to /usr/lib/systemd/system/upmpdcli.service.
[yasuaki@jukebox upmpdcli-1.2.16]$ sudo systemctl start upmpdcli
[yasuaki@jukebox upmpdcli-1.2.16]$ ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 191044  3992 ?        Ss   14:27   0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S    14:27   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    14:27   0:00 [ksoftirqd/0]

root     17852  0.0  0.0      0     0 ?        S    22:34   0:00 [kworker/2:1]
root     17853  0.0  0.0      0     0 ?        S    22:39   0:00 [kworker/2:2]
upmpdcli 17882  2.0  0.1 659568  6424 ?        Ssl  22:49   0:00 /usr/bin/upmpdcli -c /etc/upmpdcli.conf
yasuaki  17892  0.0  0.0 155324  1864 pts/0    R+   22:49   0:00 ps -aux
[yasuaki@jukebox upmpdcli-1.2.16]$ 

もし、”upmpdcli”の実行時に下記の様な共有ライブラリ関係のエラーが発生したら、下記のように “ldconfig” を実行して、共有ライブラリパスを更新しておく.



[root@jukebox etc]# upmpdcli -D -c  /etc/upmpdcli.conf
upmpdcli: error while loading shared libraries: libupnpp.so.7: cannot open shared object file: No such file or directory

[root@jukebox etc]# ldconfig

[root@jukebox etc]# ldconfig -p | grep "libupnpp.so.7"
	libupnpp.so.7 (libc6,x86-64) => /lib/libupnpp.so.7
[root@jukebox etc]# 

5.Kazooなどのコントロールアプリ上で Room 名が表示されることを確認


Checking on Kazoo Room Settings
Kazoo上で動作確認


次回は、CentOS7上のKVM仮想環境下でDebian系列のOSを導入して、”upmpdcli” を複数導入する方法を紹介することにする.



CentOS7 Minimal からのインストールコマンド抜粋(おまけ)

export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig

yum update
yum install epel-release
yum install centos-release-yum4
yum install yum4
yum4 install dnf-plugins-core

dnf install wget
dnf group install "Development Tools"

dnf install libupnp* 
dnf install expat*
dnf install jsoncpp*
dnf install libsamplerate*
dnf install libmicrohttpd*
dnf install libcurl*
dnf install libasound*
dnf install alsa-lib*

wget http://li.nux.ro/download/nux/dextop/el7/x86_64/libmpdclient-2.7-4.el7.nux.x86_64.rpm
rpm -ivh libmpdclient-2.7-4.el7.nux.x86_64.rpm

wget http://li.nux.ro/download/nux/dextop/el7/x86_64/libmpdclient-devel-2.7-4.el7.nux.x86_64.rpm
rpm -ivh libmpdclient-devel-2.7-4.el7.nux.x86_64.rpm

wget https://www.lesbonscomptes.com/upmpdcli/downloads/sc2mpd-1.1.5.tar.gz
tar xvzf sc2mpd-1.1.5.tar.gz
cd sc2mpd-1.1.5
mkdir OpenHome
sh ohbuild.sh -b OpenHome
./configure --prefix=/usr --with-openhome=OpenHome
make
make install

wget https://www.lesbonscomptes.com/upmpdcli/downloads/libupnpp-0.16.1.tar.gz
tar xvzf libupnpp-0.16.1.tar.gz
cd libupnpp-0.16.1
./configure --prefix=/usr --sysconfdir=/etc
make
make install

wget https://www.lesbonscomptes.com/upmpdcli/downloads/upmpdcli-1.2.16.tar.gz
tar xvzf upmpdcli-1.2.16.tar.gz
cd upmpdcli-1.2.16
./configure --prefix=/usr --sysconfdir=/etc
make
make install