本日時点までの進捗について
①idleによるmpdの接続の改良(ペンディング)
UIのラグは私の実力では解消出来ませんでしたので元に戻すという結論に至りました。
利用しているクライアント端末の性能によって変化はあるかもしれませんが、
私のメイン使用環境であるPCベースの場合、既存のympdでは「ボタンクリックに対してラグがなく結果を返してくれます」。
これに対し試作版(mpd_idleを有効にするためにmpd対応処理を別スレッドにした場合)は、
「ボタンクリック後にその応答が返るまでにわずかにラグが出ます」。
恐らく、「元々idle版でずっと使用していた場合は違和感にを覚えない程度」だと思うくらいなのですが、webuiを今までお使い頂いた方にとっては恐らく違和感が顕著に感じると想定されますので、「現状でのリリースは難しい」と判断しました。
②再生カウンターのバラツキ解消
以下の点で改良を行っています。
-
カウンター取得関数の変更
現行では同カウンタ値をmpd_status_get_elapsed_time()関数で秒単位取得しています。
この関数は現在のlibmpdclientのドキュメントでは「deplicated」扱いであることがわかったので、
mpd_status_get_elapsed_ms()関数でミリ秒単位で取得するようにしました。 -
カウンター取得タイミングの適切化
従来はwhile無限ループ内で毎回time関数で現在時刻を取って前回のステータス取得時と1秒以上のラグがある場合にステータス取得を行う様に記述されていました。
今回、pthreadのタイマーでステータス取得の関数を呼び出す仕様に変更しました。
正直、ここまでやっても端末側で得られるカウンター数値はバラツキがあるのが現状です。
特に通常のカウンター間隔を確認したのですが、何故か約740ミリ秒、
たまにその2倍が計測されるのため「なぜ?」というのが正直な感想ですね...
ちなみにpthreadのタイマー実装後に「ステータス取得関数の処理終了時にstderrにログ書込をさせ」、
jounalでタイムスタンプを確認した限りでは1秒間隔(誤差おおよそ1ミリ秒以下)で当該関数が間違いなく動作しているのですが...
個人的には最終手段になりますが「再生中に取得したカウンタ値が前回の値と同じならば+1する」という処理を追加するしか無いかもしれません。
(これで問題ないかのテストは必要ですが)
再生カウンタの対応を行っていて、一つ大事なことに気づきました。
カウンタ左横の「プログレスバー」に関する問題です。
現状プログレスバーでは最小値0〜最大値100の間を表示+取得可能な仕様のため、
楽曲のトータル時間が60秒を超えた場合、毎秒更新されなくなります。
(例えば10分=600秒の曲だと6秒に1回しかプログレスバーが動かない)。
また、上記のせいでドラッグ時の値が1%単位しか調整出来ません。
(10分の曲だと6秒単位のシークしか出来ない。)
プログレスバーの追加ライブラリ(bootstrap-slider)の最新仕様では
最大値に100以外の値を定義することが可能になっていますので、
ライブラリの差替後は毎秒更新+シークの秒単位実現を可能にしたいと思います。

