2016年11月26日土曜日

LightMPD_Upnpアダプター完成

デジファイの音さんのUPNPアダプター(図5 イーサーネットの分離(UPnPモード))で音出しに成功した。
https://sites.google.com/site/digififan/home/digifi-labo/lightmpd-upnpgw


Lightmpdをこのように2台のAPUでカスケード接続すると、JPLAYに肉薄するほど高音質に激変する。

Lightmpdの凄いところは、音質以外に、ファイルの編集をするために、telnetやSSHなどでLightmpdにアクセスし Linux と格闘する必要がないという点だ。これはかつてなかった快挙だ。

要するに、WindowsでLightmpdをインストールしたSDカードをそのままWindowsで開き、中の設定ファイルを直接編集できるということだ。

Linuxのコマンドは不要だし、Linuxの階層を意識したり行ったり来たりする必要もないし、Vi を使う必要もない。 しかも、各環境に合わせてすべての設定ファイルが、ほぼデフォルトで使えるように準備されている。これは本当に便利だし凄いことだ。

これならLinux素人でも十分に挑戦できる!

もしかしたら、JPLAYのAudioPCのWindowsServerCoreモードの構築より簡単かもしれない。

1.接続

下図のとおりにLANケーブルを繋ぐ。

2.UPnPアダプター側の設定

BOOTイメージ
apuboot4g.img.xz
パッケージ
lightmpd-upnpgw-apu1-v1.0.0.zip
     
① lightmpd.conf       
------------------------------------------      
[network]      
        interface=eth0      
        address=192.168.3.1      
        gateway=192.168.3.2      
        netmask=255.255.255.0      
        nameserver=192.168.3.2      
        domain=mydomain.jp      
       
[ntp]      
        server=192.168.0.0      
        ntpd=no      
        timezone=Asia/Tokyo      
       
[network:player]      
        interface=eth1      
        address=10.0.0.1      
        netmask=255.255.255.252      
       
[network:nasgate]      
        interface=eth2      
        address=10.0.1.1      
        netmask=255.255.255.252      
       
[upmpdcli]      
        enable=yes      
        upnpiface = eth0      
        mpdhost=10.0.0.2      
        mpdport=6600      
        friendlyname=UpLightMpd      
        ohproductroom=UpLightMpd              
        logfilename=/tmp/upmpdcli.log      
        openhome = 1      
        ohmetapersist = 1              
        loglevel = 3      
       
[polipo]      
        enable=yes      
#      
        proxyAddress = 0.0.0.0      
        allowedClients = 10.0.1.2      
#      
        chunkHighMark = 1024      
        chunkLowMark = 256      
        chunkCriticalMark = 768      
        objectHighMark = 2048      
#      
        dnsQueryIPv6 = no      
        cacheIsShared = false      
        dnsUseGethostbyname = yes      
        disableConfiguration = true      
        disableIndexing = true      
        disableLocalInterface = true      
       
[telnetd]      
#  yes | no      
        enable=yes      
        port=23      
       
[cpuaffinity]      
        type=0      
       
[irqpriority]      
        setdefault=no      
       
[nat]      
        masquerade=network:player,network:nasgate      
        dnsforwarding=yes      
        ntpforwarding=yes      
        8023=10.0.0.2:23      
-----------------------------------------------

3.player側の設定

BOOTイメージ
apuboot4g.img.xz
パッケージ
lightmpd-upnpgw-apu1-v1.0.0.zip

① lightmpd.conf    
---------------------------------
[network]
interface=eth0
address=10.0.0.2
gateway=10.0.0.1
netmask=255.255.255.252
nameserver=10.0.0.1
domain=mydomain.jp

[ntp]
server=10.0.0.1
ntpd=no
timezone=Asia/Tokyo

[network:nasgate]
interface=eth1
address=10.0.1.2
netmask=255.255.255.252

#[route]
#nas-ip/32 = gateway
#192.168.0.0/32=10.0.1.1

[route]
nas-ip/32 = gateway
192.168.3.10/32=10.0.1.1

[mpd]
load_module=mpd-0.19.18rt-native-dsd-upnp

[polipo]
enable = yes
proxyAddress = 127.0.0.1
allowedClients = 127.0.0.1
#parentProxy = 10.0.1.1:8123
dnsQueryIPv6 = no
chunkHighMark = 1024
chunkLowMark = 256
chunkCriticalMark = 512
objectHighMark = 2048
cacheIsShared = false
dnsUseGethostbyname = yes
#
# disableVia = false
disableConfiguration = true
disableIndexing = true
disableLocalInterface = true
#
replyUnpipelineTime = 40
smallRequestTime = 20
maxSideBuffering = 15000

[rpcbind]
enable=no

[telnetd]
# yes | no
enable=yes
port=23

[webconsole]
# yes | no
# start page: http://thishost:${port}/index.html
enable=no
port=9000

[cpuaffinity]
# 0 normal
# 1 cpu1: usb irq handler
# 2 cpu1: usb irq handler
type=2

[irqpriority]
setdefault=no
xhci_hcd#0=FIFO:99

[debug]
interfaces=yes
resolvconf=yes
ntpd=yes
ntpconf=yes
ifconfig=yes
cards=yes
mounts=yes
ps=yes
mpdversion=yes
date=yes
ntpq=yes
music=yes
messages=yes
save=no
-----------------------------------------

② mpd.conf
-------------------------------------
realtime_option {
    memlock               "yes"
    stack_reserve         "2048"
    heap_reserve         "10240"
    main_priority         "OTHER:0"
    player_priority       "FIFO:53"
    decoder_priority     "OTHER:0"
    update_priority       "OTHER:0"
}

audio_output {
        type             "alsa"
        name             "uda"
        device           "hw:0,0"
        priority         "FIFO:54"
mixer_type       "disabled"
# dsd_usb         "yes"
dsd_native              "yes"
dsd_native_type         "2"
buffer_time     "150000"
period_time     "37500"
}

#decoder {
#      plugin                    "sndfile"
#      enabled                   "no"
#}

#decoder {
#      plugin                    "audiofile"
#     enabled                   "no"
#}

input {
      plugin "curl"
      proxy                     "127.0.0.1:8123"
}      

###### decoder selector
#decoder {
#   plugin                       "dsdiff"
#   enabled                      "yes"
#}

#decoder_selector {
#   suffix                       "mp3"
#   plugin                       "mad"
#}
#
#decoder_selector {
#   suffix                       "m4a"
#   plugin                       "ffmpeg"
#}
#
#decoder_selector {
#   suffix                       "wav"
#   plugin                       "audiofile"
#   scan_plugin                  "ffmpeg"
#}
#
#decoder_selector {
#   suffix                       "flac"
#   plugin                       "flac"
#}

database {
   plugin "simple"
   path "/var/lib/mpd/tag_cache"
   compress "no"
}

#
music_directory "/var/lib/mpd/Music"
playlist_directory "/var/lib/mpd/playlists"
#sticker_file             "/var/lib/mpd/sticker.sql"
log_file "/var/lib/mpd/mpd.log"
pid_file "/var/run/mpd.pid"
state_file "/var/lib/mpd/state"

user "root"
group                   "root"

bind_to_address "any"
port "6600"

#
#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc"
metadata_to_use "artist,album,title,track,genre,date,disc"

#audio_output_format "96000:24:2"
#
# extended audio format
#audio_output_format "X4L4:24:2"

#LIBSAMPLERATE
#samplerate_converter            "Best Sinc Interpolator"
#samplearte_converter            "Medium Sinc Interpolator"
#samplearte_converter            "Fastest Sinc Interpolator"
#samplearte_converter            "ZOHc Interpolator"
#samplearte_converter            "Linear Sinc Interpolator"
#samplearte_converter            "internal"

# SOXR
samplerate_converter            "soxr very high"
#samplerate_converter            "soxr high"
#samplerate_converter            "soxr medium"
#samplerate_converter            "soxr low"
#samplerate_converter            "soxr quick"
#
#samplerate_converter            "soxr very high openmp"
#samplerate_converter            "soxr high openmp"
#samplerate_converter            "soxr medium openmp"
#samplerate_converter            "soxr low openmp"
#samplerate_converter            "soxr quick openmp"


follow_outside_symlinks "yes"
follow_inside_symlinks "yes"
default_permissions     "read,add,control,admin"
#
mixer_type "disabled"
#
audio_buffer_size "4096"
buffer_before_play "50%"
#
filesystem_charset "UTF-8"
id3v1_encoding "UTF-8"
------------------------------------------------------

③ WAVがノイズになる場合の対処方法

これは、キャッシュサーバーpolipoをカスケード接続すると現れる現象で、デジファイの音さんが現在調査中。問題が解決されるまでは以下の方法で対処する。

(1) ffmpegを使う

wavは sndfileかaudiofile,ffmpegのいずれかでデコードされるが、
今回、sndfile や audiofile を使うとノイズの嵐になるので、これらを使えなくしffmpegを使う

player側の mpd.conf の audio_output {   } の下当たりに以下を書き込む。

decoder {
      plugin                    "sndfile"
      enabled                   "no"
}

decoder {
      plugin                    "audiofile"
      enabled                   "no"
}

これでWAVはノイズなく再生される。しかし352KHzWavは依然ノイズの嵐となる。
352KHzを聴かないならこれで十分だが、聴きたいなら(2)の方法で対処する。

(2) player側のpolipoのみ使う設定にする

これは、UnPNアダプター側のpolipoを経由せずに直接NASからデータを取り受ける方式。

上記(1)の設定をキャンセル(全てコメントアウト)する。

#decoder {
#      plugin                    "sndfile"
#      enabled                   "no"
#}

#decoder {
#      plugin                    "audiofile"
#      enabled                   "no"
#}

player側の lightmpd.conf の[route]にNASのIPアドレスを指定する。
parentProxyはコメントアウトする。

 [route]
nas-ip/32 = gateway
192.168.3.10/32=10.0.1.1

[polipo]
#parentProxy = 10.0.1.1:8123

これで、playerのpolipoだけを使う設定となり、WAVが全くノイズなしで再生される。

192KHzも352KHzもOKだ。


④ DSD再生について

DDCが対応していれば、Dopではなく、NativeDSDを使うことができる。
player側の mpd.conf で、

Dopの場合
dsd_usb                   "yes"
#dsd_native              "yes"
#dsd_native_type       "2"

NativeDSDの場合
#dsd_usb                "yes"
dsd_native              "yes"
dsd_native_type        "2"

なお、忘れてはいけないのは Minimserverのstream,transcodeの設定だ。
Dopの場合、 dff:dopwav、dsf:dopwav と記述されている。
これを削除すと、NativeDSDで再生されるようになる。
 



4.NASのIPアドレス

NASのIPアドレスをLightMPDのネットワークに合わせて変更しておく。


5.ControlPoint

Upplay Kinsky Kazooで再生確認。
ControlPointの中では、Upplayが明らかに一歩抜きんでいる。Kinsky、Kazooは落ち着いた感じ。




6.音質

LightMPDのネットワークをホームネットワークと分け、更に、UNPNアダプターとUNPNプレイヤーをカスケード接続し2本のネットワークに分け、楽曲もNASにすることで、音質はここまで変わるかというくらい変わる。

これまでLightMPDは、綺麗な音だがやや細く伸びがなく、心に響いてくるJPLAYには一歩足りない感じであったが、解像度が高く、深みと厚みが出て艶のある心に響いてくる音に変わった。聴き始めるといつまでも聴いていたい気持ちになる。

これまで、あまりいい録音でないと思っていた楽曲が見違えるほど良くなる。これはほんとうに凄い。

LighrMPD恐るべし!JPLAYStreamerと遜色なし?!。