• RPi4版 v1.0系 不具合報告スレッド

    @パパリウスさん

    朝になりまして一定の音量で鳴らせますので再度alsamixerでオーバーサンプリングOn/Offの音の違いを聴いてみました。
    元気は良いけど粗さもあるoff、キレイにはなるけど鮮度が下がるon、のように感じられました。
    当面切り替えながら聴き比べてみたいと思います。長らくお付き合いいただきありがとうございました。

  • 先日NASが故障し交換した際に気づいた点を報告します。
    (こちらでも並行にて調査いたします)

    /etc/fstabのNAS設定で以前の設定がそのまま残っており、そのNASが取り外された・電源断の場合、edit_fstab.shの出力が無表示になり、処理途中で落ちますね。
    (おそらく umount /var/lib/mpd/music/NAS が原因と思われる。)

    また、どのくらいの方が該当するかはわかりませんが共有名のパスに半角スペースが含まれている場合は現状では対応できないようですね。
    (ArchWikiのSamba設定によると、半角スペースは \040に置き換えると動作する模様です。)

    という訳で、今日あたりedit_fstab.shの記述を見直ししてみます。

  • @sunatomo さん

    ご指摘ありがとうございます。
    半角スペースにも対応できると素晴らしいですね。
    開発の初期から認識はしていたのですが、半角スペースをパスに含まないよう、運用で回避してもらっていました:no_mouth:

  • @パパリウス さま
    edit_fstab.sh の件、修正してみました。

    #!/bin/bash
    # Copyright © 2020 symphonic-mpd Research and Development Club
    
    mpc stop
    if [ `mount |grep -c cifs` -gt 0 ]; then
      umount /var/lib/mpd/music/NAS
    fi
    
    LOG=/var/lib/mpd/music/RAM/.nas_setting.log
    
    # work dir
    dst=/tmp/cifsdst
    if [ ! -e $dst ]; then
      mkdir $dst
    fi
    
    # detect protocol
    user=`echo $2 | tr -d " "`
    pass=`echo $3 | tr -d " "`
    opt="cache=none,iocharset=utf8,username=$user,password=$pass"
    
    echo "updating fstab start!!" > $LOG
    
    hst=`echo $1 | sed -E 's/^\/\/([^/]+).+/\1/g'`
    if [ -z ${hst} ]; then
      echo " !!!There is no host in NAS URL" >> $LOG
      exit 1
    fi
    
    echo " Checking ping reply to ${hst}" >> $LOG
    
    /bin/ping -c 2 -W 2 ${hst} > /dev/null
    if [ ! $? = 0 ]; then
      echo "  !!!${hst} has not reply via ipv4" >> $LOG
      echo "  Checking via ipv6" >> $LOG
      /bin/ping6 -c 2 -W 2 ${hst} > /dev/null
      if [ ! $? = 0 ]; then
        echo "  !!!${hst} has not reply via ipv6" >> $LOG
        echo "!!!Aborting the process!!!" >> $LOG
        echo "check succeeded" >> $LOG
        exit 1
      fi
    fi
    echo "" >> $LOG
    
    hst=`echo $1| sed -E -e 's/ /\\040/g' -e 's/\/\$//'`
    
    echo " Checking cifs security mode and protocol version" >> $LOG
    exopt=""
    declare -a aver=("1.0" "2.0" "2.1" "3.0" "3.02" "3.11")
    for e in ${aver[@]}; do
      mount -t cifs $hst $dst -o ro,$opt,sec=ntlm,vers=${e} >/dev/null 2>&1
      if [ $? = 0 ]; then
        exopt=sec\=ntlm,vers\=${e}
        umount $dst
      fi
    
      mount -t cifs $hst $dst -o ro,$opt,sec=ntlmssp,vers=${e} >/dev/null 2>&1
      if [ $? = 0 ]; then
        exopt=sec\=ntlmssp,vers\=${e}
        umount $dst
      fi
    done
    
    if [ "$exopt" = "" ]; then
      echo "  !!!Can not resolve the security mode or protocol version." >> $LOG
      echo "  Aborting the process!!!" >> $LOG
      echo "  check succeeded" >> $LOG
      rmdir $dst
      exit 1
    fi
    
    echo "  security mode and protocol version: $exopt" >> $LOG
    exopt=,$exopt
    
    sync
    
    # detect best rsize prepare
    declare -a arsize=("7300" "16060" "32120" "61320" "129940")
    
    fioconf=/usr/local/bin/fio.conf
    testfile=
    bestrsize=
    bestbw=0
    bestctx=1000000
    
    declare -a arsize2=()
    declare -a abw=()
    declare -a alatency=()
    declare -a actx=()
    declare -a amajf=()
    declare -a aminf=()
    
    mount -t cifs $hst $dst -o rw,$opt,$exopt,wsize=4096 >/dev/null 2>&1
    dd if=/dev/zero of=$dst/rsize_test_dummy bs=4k count=1 seek=2499
    sync
    
    umount $dst
    
    echo "" >> $LOG
    echo " Checking best rsize" >> $LOG
    echo "" >> $LOG
    echo "  rsize       BW    CTX  latency" >> $LOG
    for e in ${arsize[@]}; do
      mount -t cifs $hst $dst -o ro,$opt,$exopt,rsize=${e} >/dev/null 2>&1
    
      # fio start
      out=`fio --readonly -filename="$dst/rsize_test_dummy" --output-format=terse $fioconf | cut -d';' -f7,8,16,90,91,92`
    
      #echo "RSIZE ${e}:$out" >> $LOG
    
      # detect best rsize
      bw=`echo $out|cut -d';' -f1`
      latency=`echo $out|cut -d';' -f3|cut -d'.' -f1`
      ctx=`echo $out|cut -d';' -f4`
      majf=`echo $out|cut -d';' -f5`
      minf=`echo $out|cut -d';' -f6`
    
      arsize2+=( ${e} )
      abw+=( $bw )
      alatency+=( $latency )
      actx+=( $ctx )
      amajf+=( $majf )
      aminf+=( $minf )
    
      printf "%7d %8d %6d %8d\n" ${e} $bw $ctx $latency >> $LOG
    
      if [ $bw -gt $bestbw ];then
        bestbw=$bw
        bestrsize=${e}
      fi
      umount $dst
    done
    
    i=0
    #echo "rsize  bw  lat  ctx  majf  minf" >> $LOG
    for e in ${arsize2[@]}; do
      count=0
      for ((ibw = 0; ibw < ${#abw[@]}; ibw++)){
        if [ ${abw[i]} -lt ${abw[ibw]} ];then
          let count++
        fi
      }
      if [ $count -lt 3 ];then
        count=0
        for ((ilat = 0; ilat < ${#alatency[@]}; ilat++)){
          if [ ${alatency[i]} -gt ${alatency[ilat]} ];then
            let count++
          fi
        }
        if [ $count -lt 3 ];then
          count=0
          for ((ictx = 0; ictx < ${#actx[@]}; ictx++)){
            if [ ${actx[i]} -gt ${actx[ictx]} ];then
              let count++
            fi
          }
          if [ $count -lt 3 ];then
            if [ "$bestbw" = "" ];then
              bestctx=${actx[i]}
              bestbw=${abw[i]}
              bestrsize=",rsize=${e}"
            elif [ ${actx[i]} -lt $bestctx ];then
              bestctx=${actx[i]}
              bestbw=${abw[i]}
              bestrsize=",rsize=${e}"
            fi
          fi
        fi
      fi
      #echo "${e} ${abw[i]} ${alatency[i]} ${actx[i]} ${amajf[i]} ${aminf[i]}" >> $LOG
      let i++
    done
    
    # clean up
    mount -t cifs $hst $dst -o rw,$opt,$exopt,rsize=4096 >/dev/null 2>&1
    rm "$dst/rsize_test_dummy"
    umount $dst
    rmdir $dst
    
    # edit fstab
    target=/etc/fstab
    nas="$hst /var/lib/mpd/music/NAS cifs ro,noauto,x-systemd.automount$exopt$bestrsize,$opt"
    
    echo "" >> $LOG
    echo "  best bandwidth : $bestbw kB/sec" >> $LOG
    echo "" >> $LOG
    echo "  fstab setting  : $nas" >> $LOG
    
    sed -i.bak -e "/# NAS Setting/{n;d}" $target
    sed -i -e "/# NAS Setting/a $nas" $target
    sync
    
    echo " Restarting mpd and mounting NAS with new setting" >> $LOG
    
    systemctl stop mpd
    systemctl daemon-reload
    mount /var/lib/mpd/music/NAS
    systemctl start mpd
    
    mountpoint /var/lib/mpd/music/NAS
    ret=$?
    echo "" >> $LOG
    echo "NAS setting succeeded" >> $LOG
    
    sleep 2
    rm $LOG
    
    exit $ret
    
    

    以下、修正点を記載します。
     1)現状cifsマウントされていない場合、umount コマンドをスキップさせます。
     2)ping相手先が検出できなかった場合、エラーで戻るようにした。
     3)cifsのパスの半角スペースを\040に置換、末尾の"/"を削除するようにした。
     4)SAMBA versionの3.02,3,11に対応するように文字列追加
      (mount.cifs側で対応できないかもしれませんが)

    webui-plusでお話があった複数マウントの件は今回はまだ未対応です。

  • @sunatomo さん

    修正いただきありがとうございます。
    次のバージョンで、いただいたシェルに差し替えたいと思います。
    vers=3.02とvers=3.11はcifs-utilsもカーネルも対応していますので、うまく動作するだろうと思います。

  • v1.0.6からだと思うのですが、AirPlayをリブート直後以外で利用できません。
    1.0.5までは、mpdで何らかの音源を再生•停止させることでiOSデバイスからAirPlay対応デバイスとして認識させることができましたが、1.0.6ではこの手は通用しないようです。
    AirPlayデバイスとして認識させるためには、smpdをリブートさせる以外手がないようです。
    手持ちのAllo Digione SignatureとSabreberry32の二台で確認しました(/etc/shairport-sync.confでデバイス名は変更しています)。

    追記
    Process cut-downがdefaultで起こった現象です。
    extremeにすることで正常にAirPlayを利用できることを確認しました。
    お騒がせしました。

  • @ジャイアン さん

    ジャイアンさんの環境ではshairport-sync起動後、しばらくするとAirPlayデバイスとして認識できなくなってしまうのかもしれません。

    process cut-down: extremeにすると、mpdの再生/停止に合わせてshairport-syncが停止・起動しますので、これがうまく噛み合って再びAirPlayデバイスが認識されるということなのでしょう。

    不具合リストに追加しておき、同様の報告が複数挙がるようでしたら対策を進めたいと思います。

  • こんばんは。
    音のこととは関係ないのですが、みなさまConsumeモードって使っていらっしゃいますか?
    私の環境だとConsumeモード切替の時にympdから切断されてうまく切り替わりません。
    Ver1.0.0から、以下の画像のようになります。
    2020-08-04 (8).png
    2020-08-04 (9).png
    2020-08-04 (10).png
    以上、よろしくお願いいたします。

  • 本当ですね。
    うちでも全く同じ状態です。
    普段使わないなら気づかない人が多そうですね。

  • @Sekky さま、
    @tokkari さま

    ご提示の現象が発生した後、consumeはOnになりませんか?
    また、sshのシェルにて mpc status と入力された際の出力で
    consume: on とは表示されていますか?

    「Connection to ympd lost. retrying」と表示された場合、Raspberry Pi側のympdプロセスが何らかの理由でwebsocketを閉じたと思われます。

  • @sunatomo さま
    お世話になります。
    ご指示のあったmpc status を実行しながらやってみました。
    mpdの設定画面でConsumeボタンを押すといったん切り替わります。
    その後、OKボタンを押下するとympdとの接続が切れ、Consumeモードが元に戻ります。
    運がいいと(という言い方も変ですが)、OKボタンを押下した後もConsumeモードが切り替わらずに意図した動作になります。
    元のConsumeモードがONでもOFFでも同様です。

    以上、よろしくお願いいたします。

  • 私の環境では、ご指摘の動作をさせても”consume deactivate”, “consume activate”の表示は出ません。WebUIの接続が一時的に切れるだけです。と同時にconsume modeがactivateになっていないことも確認しました。
    回避策としては”consume”ボタンをクリックした後、MPDパネルのONをクリックするのではなく、MPDパネルを直接closeすることでconsume modeがactivateされることを確認しました。

  • ジャイアンさん方式(直接close)を試したところうまく切り替わりました。
    その後は、MPDパネルのONをクリックするごとにアクティブと非アクティブが
    切り替わる通常の動作になりました。

  • consumeモードの件はベータテスト時に話題になりました。

    https://www.symphonic-mpd.com/forum/topic/88/rpi4-edition-ベータテスト/454?_=1596544672115a

    Consumeボタンを押すと即時に設定が反映されます。(1秒程度)

    mpdの設定は(キュー、リピート、ボリュームなど)は、/var/lib/mpd/stateファイルに保存されます。

    consume設定もここに保存されるはずなのですが、切り替えただけではstateファイルに保存されません。
    mpdを正式な手順で停止しても保存されません。
    そのため、ラズパイを再起動するとconsume設定が元に戻ってしまうという現象が発生していました。

    consume設定が確実にstateファイルに保存されるのは、曲を再生したときです。
    そこで、MPD設定画面のOKボタンを押したときに、「設定の反映→再生→停止」のようなことをやっています。

    ある程度動作テストは重ねたのですが、今ひとつ確実性に欠ける実装だなと思っています。
    不具合リストに挙げ、いずれ改善に取り組みたいと思います。


    ちょっと手間ですが、
    「Consumeボタンで切り替え⇨設定画面を閉じる⇨曲を再生する」
    という手順を踏んでみてください。
    現在のところ、この手順なら切り替えた設定が確実に保存され、ラズパイ再起動後も設定が復元されるはずです。

  • @パパリウス さま
    丁重な解説ありがとうございました。
    そのようにしてまいります。

  • パパリウスさま、
    プラグインを作っていて気になる動作を見つけましたので報告いたします。

    Webブラウザで、NASにあるカンマ「,」を含む名前のフォルダーを開き、プラグインメニューから「UPDATE LIBRARY」を実行すると、エラーが表示されます。

    確認ダイアログのウィンドウ表示は正常で「Scan music directory」のテキストボックスには正しいパスが表示されます。
    しかし「OK」をクリックし処理させると「error」の赤色ポップアップが表示されます。
    UPDATEの処理は実行されないようです。

    網羅的に試してはいませんので、確実なことは言えませんが、他の文字ではこの現象発生しないようです。
    (また、カンマを含む名前のフォルダーより上階層のフォルダーから「UPDATE LIBRARY」を実行する場合には正常に処理が完了します。)

    動作環境:
    Raspberry Pi 4 Model B Rev 1.2 (4MB RAM)
    symphonic-mpdのバージョンは1.0.7
    WebブラウザはChrome 84.0 (Windows 10 Home Ver. 1909)

    よろしくお願いいたします。

  • @radiowave さま
    私の方でも様子見てみました。
    記載の通り、","を含むディレクトリを作成した場合、当該ディレクトリを指定して「UPDATE LIBRARY」を実行すると、
    ご報告と同じ状態になります。
    また、この状態の場合journalctlに以下の記録があります。

    smpd ympd[15830]: sh: -c: line 0: unexpected EOF while looking for matching `"'
    smpd ympd[15830]: sh: -c: line 1: syntax error: unexpected end of file
    

    jounalctlの記載から判断すると、
    プラグインのためのパラメータ渡しの際にセパレータとして","を使用しているため途中でUPDATE LIBRARYのための文字列が切れてしまうのが原因だと思われます。

    セパレータを他の文字にするか、それとも","は使わないように許容して頂くかちょっと検討 + パパリウスさまにも相談してみますね。

  • @sunatomo さま
    確認していただきありがとうございました。
    アーティスト名やアルバム名にカンマ「,」を含むことはかなり稀です。
    回避策として全角のカンマ「,」に置き換えることも可能だとは思います。
    無理なく対応できるのであれば、対処をお願いしたいくらいの気持ちです。

    (ちなみにCIFSのファイルシステムに対する処理を前提にしているのであれば、ファイル名に対する禁止文字「:」「|」等をセパレータに使うことも可能かと思います。
    あるいはエスケープシーケンスを導入するか、URLエンコードするか等々... )

    よろしくお願いいたします。

  • @radiowave さん

    ご報告をいただきありがとうございます。
    不具合リストに追加して対応を進めたいと思います。

    @sunatomo さん

    プラグインごとに禁則とすべき文字は変わってきますので、プラグイン機構には変更を加えず、ライブラリアップデートプラグインのみの修正で対応したいと思っています。

    自由入力欄を持つプラグインとしては、検索プラグインなどが該当すると思いますが、カンマの扱いはどうなっていましたでしょうか?参考にできれば助かるのですが。

  • @パパリウス さま
    実は、検索のプラグインの場合可変長パラメータを想定して専用文字列"//"をセパレータとしています。
    これにより、websocketで電文をやり取りする場合はコマンド+パラメータ1個で渡し(この場合の電文のセパレータは","です)、
    後ろのパラメータを検索のサブルーチンで処理する際は"//"で分割しているため、仮に途中で","が入っても大丈夫だったようですね。
    ↑
    "//"が適しているかはもしかしたら検証が必要かもしれませんね。