2017年3月25日土曜日

lightMPD/upnpgw(adapter) + lightMPD/upnpgw(player)を試す

lightMPD/upnpgwのrootfsがアップデートされたので、player側にもlightMPD/upnpgwを使い、polipoのカスケードとイーサーネット分離にチャレンジしてみました。

なお、mpdも"mpd-0.20.6rt-upnp"にアップデートしています。

その結果、これまで
・apu1cが時々起動しない
・alacで時々大きなノイズが出て再生ができなくなる
という問題があったのですが、両方とも解消されました。

メモ

ダウンロード
新しいrootfs
upnpgw-initrd-20170324.zip
※解凍してできたファイルを、lightMPD/upnpgwをインストールしたUSBメモリ(SDカード)のinitrd-ligtmpd-64に上書きします。

(追記: 20170406)
バグフィックス版がリリースされました。
upnpgw-initrd-20170406.zip
バグの内容は、
1. キャッシュの指定(ChunkHighMark,ChunkLowMark,ChunkCriticalMark)で4Gbyte以上の設定ができなかった。
2. 2Gbyte以上のファイルを再生するとpolipoが異常終了する。
(追記: 20170414)
バグフィックス版がリリースされました。
upnpgw-initrd-20170414.zip
修正されたバグの内容は、
1. データのサイズが2Gbyte以上あり、キャッシュに一度に入りきらない時にpolipoが異常終了してしまう。
2. 32bitシステムで旨く動作しない。
(追記: 20170418)
polipでchunkの処理を一部見直したものがリリースされました。
upnpgw-initrd-20170418.zip
今回の見直しは、apu以外で24bitのwavがノイズまみれになることへの対策なので、digififanさんが提供するapu用のバイナリを使っている範囲ではアップデートの必要は少なそうです。
(追記: 20170428)
バグフィックス版がリリースされました。
upnpgw-initrd-20170428.zip
一部のwavファイルにノイズが乗ることへの対策版ですが、apuではそもそもwavも正常に再生できるのでアップデートは必要ないかも。ただ、気のせいかも知れませんが、音が良くなったような。。




mpd-0.20.6rt-upnp
mpd-0.20.6rt-upnp.zip
※解凍すると、
mpd-0.20.6rt-upnp
mpd-02x.conf
という2つのファイルができるので、"mpd-0.20.6rt-upnp"をlightMPD/upnpgwをインストールしたUSBメモリ(SDカード)の/lightMPDにコピーするとともに、"mpd-02x.conf"を"mpd.conf"に上書きします。

接続
イーサネットを分離するので、adapter(apu2c4)とplayer(apu1c)を以下のとおり接続します。
                                adapter                      player
  HOME NET <---->   eth0
                                  eth1 <------------------>  eth0
                                  eth2 <------------------>  eth1
                                                                      eth2  未接続

設定ファイル
adapter(apu2c4)

lightmpd.conf
-------------------------------------------------------------------
#
#
[network]
        interface=eth0
        address=192.168.1.20
        gateway=192.168.1.1
        netmask=255.255.255.0
        nameserver=192.168.1.1
        domain=mydomain.jp

[ntp]
        server=ntp.nict.jp
        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

[cpuaffinity]
        type=0

[irqpriority]
        setdefault=no

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

[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 = 2048
        chunkLowMark = 512
        chunkCriticalMark = 1536
        objectHighMark = 2048
#
        dnsQueryIPv6 = no
        cacheIsShared = false
        dnsUseGethostbyname = yes
        disableConfiguration = true
        disableIndexing = true
        disableLocalInterface = true

[nat]
        masquerade=network:player,network:nasgate
        dnsforwarding=no
        ntpforwarding=no
        8023=10.0.0.2:23
-------------------------------------------------------------------

menu.lst
-------------------------------------------------------------------
#
#
default 0
timeout 0
#
serial --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=0 serial console
hiddenmenu
#
#
title lightMPD/upnpgw
root (hd0,0)

# upnpgw
kernel /boot/bzImage-4.8.6rt5-64 root=/dev/ram0 ro console=ttyS0,115200n8 ramdisk_size=98304 rootfstype=romfs rootdelay=5 clocksource=hpet lightmpd.systype=apu2 lightmpd.bootdev=/dev/sda1

#  standalone
#kernel          /boot/bzImage-4.6.5rt10-64 root=/dev/ram0 ro console=ttyS0,115200n8 ramdisk_size=98304 rootfstype=romfs rootdelay=5 clocksource=tsc idle=poll processor.max_cstate=1 isolcpus=1 nohz_full=1 rcu_nocbs=1 lightmpd.systype=apu2 lightmpd.bootdev=/dev/sda1

#
initrd /boot/initrd-lightmpd-64
-------------------------------------------------------------------

player(apu1c)

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=arakinet.jp

[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

[ntp]
server=ntp.nict.jp
ntpd=no
timezone=Asia/Tokyo

[mpd]
load_module=mpd-0.20.6rt-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"
buffer_time     "150000"
period_time     "37500"
}

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


###### decoder selector
# 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"
# }


#
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"
#audio_output_format "x4L4:24:2"

resampler {
   plugin              "soxr"
#   quality             "ultra high"
   quality             "very high"
#   quality             "high"
#   quality             "medium"
#   quality             "low"
#   quality             "quick"
#   passband_end        "0.98"
#   phase               "0"
   threads             "0"
}

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"
-------------------------------------------------------------------

menu.lst
-------------------------------------------------------------------
#
#
default 0
timeout 0
#
serial --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=0 serial console
hiddenmenu
#
#
title lightMPD/upnpgw
root (hd0,0)

# upnpgw
kernel /boot/bzImage-4.6.5rt10-64 root=/dev/ram0 ro console=ttyS0,115200n8 ramdisk_size=98304 rootfstype=romfs rootdelay=5 clocksource=hpet lightmpd.systype=apu1 lightmpd.bootdev=LABEL=LMPDAPU

#  standalone
#kernel          /boot/bzImage-4.6.5rt10-64 root=/dev/ram0 ro console=ttyS0,115200n8 ramdisk_size=98304 rootfstype=romfs rootdelay=5 clocksource=tsc idle=poll processor.max_cstate=1 isolcpus=1 nohz_full=1 rcu_nocbs=1 lightmpd.systype=apu1 lightmpd.bootdev=/dev/sda1

#
initrd /boot/initrd-lightmpd-64
-------------------------------------------------------------------

(追記)
PAUSE後、一定時間おいて再生を再開すると、次の曲にスキップする現象が報告されていますが、これはバグではなくpolipoの仕様だそうです。
lightmpd.confの
[polipo]
セクションに、
clientTimeout=3600s
のように記述することで、タイムアウトまでの時間を設定できるようです。

また、[polipo]セクションで設定するパラメータですが、digififanさんがご自身の掲示板で
chunkCriticalMarkはchunkHighMarkの2/3
chunkLowMarkはchunkHighMarkの1/3
と書かれていましたので、それに合わせて設定しています。

メモ
chunkHighMark           キャッシュの容量
chunkCriticalMark       キャッシュ内のデータがこれを超えた場合、読み込みを停止する
chunkLowMark            キャッシュ内のデータがこれ以下になった場合は読み込みを再開する


3 件のコメント:

  1. JOE COOLさん始めましてlightmpdのイーサーネット分離の検索で来ました。
    一点御質問があります教えて頂ければ有難いです。
    apu1,2 or apu2x2でこのイーサーネット分離を設定する場合には「adapter,player側共」conf.folder内のlightmpd.conf-Upnpgwを使うのでしょうか。
    それ共lightmpd.conf-Upnpgw-nasgateを使うのでしょうか?

    以上宜しくお願いします。  ccr_246

    返信削除
  2. ccr_246さま
    ご連絡が遅れて申し訳ありません。

    お問い合わせの件ですが、adapterには
    /lightMPD/conf/lightmpd.conf-upnpgw-nasgate
    を使います。

    また、playerにはdigififanさんがlightMPD掲示板に公開されているものを使います。
    https://groups.google.com/forum/embed/?parenturl=https%3A%2F%2Fsites.google.com%2Fsite%2Fdigififan%2Fhome%2Flightmpdbbs&service=jotspot&ul=1&theme=default&place=forum%2Flightmpd&showpopout=true&showsearch=true#!topic/lightmpd/yov2E_2nfu0

    このページに載せている設定ファイルがまさにそれですので、adapter側の[network]の設定をccr_246さんの環境に変更すれば動作すると思います。

    返信削除
  3. JOE COOLさんお世話になります。
    お忙しい中有難う御座いました。早速試してみたいと思います。

    ccr_246

    返信削除