@パパリウスさん
朝になりまして一定の音量で鳴らせますので再度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の記述を見直ししてみます。
@パパリウス さま
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でお話があった複数マウントの件は今回はまだ未対応です。
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を利用できることを確認しました。
お騒がせしました。
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のための文字列が切れてしまうのが原因だと思われます。
セパレータを他の文字にするか、それとも","は使わないように許容して頂くかちょっと検討 + パパリウスさまにも相談してみますね。