• RPi4 Edition ベータテスト

    最適化の進め方は以下のようになります。


    第1段階 PGO

    使用頻度の低いものや、音楽再生に直接関係しないライブラリについては、PGO(Profile guided optimization) による最適化を試みます。

    プロファイルデータ出力を有効にしてビルドし、元のファイルと差し替えます。
    そのあと、実際に音楽を再生させてプロファイルデータを蓄積していきます。
    最後に、プロファイルデータを使って再ビルドします。

    PGOには、プロファイルデータの取り方によって最適化の結果が変化してしまう欠点があります。また、必ずしも狙い通りの最適化がかかるとは限りません。


    第2段階 GCOV

    gcovというカバレッジの測定を行うソフトを活用し、何度も繰り返し実行されているホットスポットをリストアップします。

    特定したホットスポットについては、以下の観点でパッチをあてていきます。

    1. 条件分岐ヒントの指定
    2. 関数呼び出しのインライン化
    3. セクション指定
    4. restrict キーワードの指定
    5. 不要コードの削除
    6. アルゴリズムの見直し
    7. インラインアセンブラによる高速化

    上記の1〜3はカバレッジデータから修正方針を判断することができ、機械的に作業を進めることができます。
    1箇所改善すれば、1CPUサイクルを稼ぐことができます。
    これを数百、数千と積み重ねていくことで、マイクロ秒オーダーの改善に繋げていきます。

    4〜7の作業を行うケースは稀ですが、性能上のボトルネックになっている箇所についてはここまでやることがあります。現状では、aplay-rt、rtalsaドライバ、xsinkドライバが該当します。

  • パパリウスさま

    精力的に作業を続けられていることに本当に感謝しております。これ以降の音質改善にとても期待しております。

    そのさなかに恐縮ですが、現在のb10について質問とお願いがあります。

    遅ればせながら、b8を新たに焼き、b10までupdateいたしました。
    きちんと再生されていますが、やはりplaying cue のnextが1500を超えると動作しません。
    さらに加えて、そういった場合でも操作可能な MPD clientも接続できなくなりました。

    システムは、いつものとおり、以下の2つです。
    RP4B/Inno-i2s>HDMI/D70
    RP4B/Sabreberry32pro

    mpd.confをのぞいてみると、

    "# port setting : /lib/systemd/system/mpd.socket"

    とありました。mpdサービスでなく、MPD client を受け付けない socket を起動しているということでしょうか。

    そしてこれ以降、MPD client は使用不可能になるということでしょうか。
    大量ソースをコントルールするときにはMPD clientが便利なこともあるので可能なら利用できる道を残していただけるとありがたいのですが、可能でしょうか?

    どうかよろしくお願い申し上げます。

  • @KSK さま
    レス遅れましたが、Consoleログ拝見しました。

    Uncaught SyntaxError: Unexpected token  in JSON at position 23
    

    というのが気になりますね。この状況、β7でDISK USAGEで個人的にハマっていた際に
    目にしていた記憶があります。
    このようなログ、β8以降のイメージでは計測されますでしょうか?

  • @パパリウス さん @sunatomoさん

    親ディレクトリに戻ったさい自動でスクロールする件、ありがとうございます。
    完璧に作動してます。

  • @mike さま
    大変恐れ入りますが、WebUIにてキューを大量に入れた際に、Developper モードのConsole、お送り頂けいると幸いです。
    @KSK さまのようにWebSocketで受信したパケットが正常に受けられていない可能性がありそうです。

    mpd.confの設定ですが、上記の通りで

    # for Any other mpd clients
    ListenStream=6600
    

    の通りコメントアウトを無効化して

    systemctl stop mpd.socket
    systemctl start mpd.service
    systemctl daemon-reload
    systemctl start mpd.socket
    

    とすれば、6600ポートの接続は復活します。

    @Cresson さま
    今回の戻る動作は私がタッチする前に パパリウス さまに対応頂いています(笑)

  • @mike さん

    これまではmpd.confでポートを設定していただいておりましたが、今後は
    /lib/systemd/system/mpd.socket
    というファイルを編集していただければと思います。

    # for Web UI
    ListenStream=%t/mpd/socket
    
    # for Any other mpd clients
    #ListenStream=6600
    

    6600の方のコメントを外して保存し、再起動してください。

    再起動の代わりに
    systemctl daemon-reload
    systemctl restart mpd.socket
    systemctl restart mpd
    でも大丈夫だと思います。

  • SEARCHプラグインの高度化について
    実はympdのラズパイ側ソースコードにはある隠し要素が入っておりまして、
    /opt/plugins/03-search/forms.htmlを以下の通り書き換えることにより拡張出来ます。

    <!-- Copyright © 2020 symphonic-mpd Research and Development Club -->
    
    <script>
    $(function() {
    
      $('#plugin-form .modal-footer').css('display', 'none');
    
      $('#plugin-form').on('shown.bs.modal', function() {
        $('#sval').focus();
      });
    
      $('#plugin-form').on('hidden.bs.modal', function() {
        $('#plugin-form .modal-footer').css('display', 'block');
      });
    
      /* enter key */
      $('#sval').keypress(function(e) {
        if (e.which == 13) {
          search_ok_btn.click();
        }
      } );
    });
    </script>
    
    <datalist id=search2_val>
      <option value="ANY" />
      <option value="Artist" />
      <option value="Album Artist" />
      <option value="Album Name" />
      <option value="Song Name" />
      <option value="Genre" />
      <option value="Composer" />
      <option value="Performer" />
    </datalist>
    
    <div  class="form-horizontal" style="padding:20px 20px 10px 20px;">
      <label class="control-label">Artist / Album / Song / Genre</label>
      <div class="form-group">
        <span class="col-sm-4"><input type="text" id="stype" class="run" list="search2_val" value="ANY" /></span>
        <span class="col-sm-8"><input type="text" id="sval" class="run"/></span>
      </div>
      <div class="form-group">
        <span class="col-sm-10"><p>*search result is shown in main table.<br /></p></span>
        <span class="col-sm-2"><button type="button" id="search_ok_btn" class="btn btn-default" onClick="search2_form_ok();$('#plugin-form').modal('hide');">Search</button></span>
      </div>
    </div>
    

    提供される機能は「各タグ毎に検索の絞り込みが可能になる」というものです。
    絞り込みタグにについては以下の通り
    ANY(従来のどのタグでもヒットすれば抽出する動作)
    以降は対象タグのみ文字列を抽出します。
    Artist(アーティスト)
    Album Artist(アルバムアーティスト)
    Album Name(アルバム名)
    Song Name(楽曲名)
    Genre(ジャンル)
    Composer(作曲家)
    Performer(演奏者)

    検索機能について追加で説明しますが、ヒットした楽曲が300曲を超えた時点でエラーを返します。
    現状ではエラーメッセージは検索結果の一番上の行に表示されますので
    検索については「あくまでディレクトリ選択の補助手段」と考えて使用して頂けると幸いです。
    ↑
    強力な検索手段が必要な場合は専用クライアントの使用を検討頂ければと思います。

  • パパリウス様

    カバーアートを表示出来たらと思い、NAS音楽データーのフォルダー内にfolder.jpgを作成し
     再起動したらSMPDが認識できなくなりましたroot [ ~ ]# ifconfig
    eth0 Link encap:Ethernet HWaddr DC:A6:32:7B:75:92
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:307 errors:0 dropped:0 overruns:0 frame:0
    TX packets:170 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:2000
    RX bytes:29204 TX bytes:23232

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Bcast:0.0.0.0 Mask:255.0.0.0
    UP LOOPBACK RUNNING MTU:65536 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:0 TX bytes:0。
    sshで接続しifconfigで探しても私には理解できない表示が出て、IPアドレスがわかりません。
    どうすれば回復できますでしょうか?ご教授お願いいたします。

  • パパリウス様
    β10更新ありがとうございました。
    当方ではOOMの問題も無くなり全ファイルの読み込みができるようになりました。
    ご報告まで。

  • @パパリウス さん

    メモリクロックを594MHzで指定されているようですが、何か理由があるのでしょうか?

    2376MHzに指定した方が音質的には好ましい様に思いますので、特定条件での安定動作等、特に理由が無いようでしたら設定を変更して使用したいと思うのですが、大丈夫でしょうか?

  • @kn929658 さま
    ifconfigの出力結果、通常でしたら

    eth0 Link encap:Ethernet HWaddr DC:A6:32:7B:75:92
    

    の行の直下に

     inet addr:192.168.11.162  Bcast:192.168.11.255  Mask:255.255.255.0
    

    のようにIPアドレスが出てくるはずです。(eth0というのが物理ネットワークインターフェースです。
    ちなみにこのIPアドレスは私の自宅環境のものです、念の為)
    「inetの行がない」ということはIPアドレスが付いていない状況のようですが、このコマンドを実行出来ているということはsshでのリモートログインは成功しているようですので不思議ですね...

    WebUIが開かないということでしたら、sshにてsystemctl status ympd.serviceの結果を見てみて下さい。
    Activeでなければ、何らかの原因でWebUIのサービスが落ちている可能性があります。

  • @sunatomo さま

    相変わらず、全然わからずに試しております。
    β10での実行です。 Nextボタンが未だに見つけられません。
    今回もWindows10のChromeです。

    bundle.js:14 A preload for 'http://smpd.local/fonts/glyphicons-halflings-regular.woff2' is found, but is not used because the request credentials mode does not match. Consider taking a look at crossorigin attribute.
    (anonymous) @ bundle.js:14
    bundle.js:14 A preload for 'http://smpd.local/fonts/material-icons.woff2' is found, but is not used because the request credentials mode does not match. Consider taking a look at crossorigin attribute.
    (anonymous) @ bundle.js:14
    VM72 0:1 [DOM] Input elements should have autocomplete attributes (suggested: "current-password"): (More info: https://goo.gl/9p2vKq) <input type=​"password" class=​"form-control" id=​"mpdnaspw" value>​
    mpd.js:24 connected
    2mpd.js:30 execQueue #next show check1
    The resource http://smpd.local/fonts/material-icons.woff2 was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally.
    The resource http://smpd.local/fonts/glyphicons-halflings-regular.woff2 was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally.
    mpd.js:30 execQueue #next show check1
    mpd.js:30 execQueue #next.show check2
    bundle.js:540 [Violation] 'mousemove' handler took 153ms
    11[Violation] Forced reflow while executing JavaScript took <N>ms
    bundle.js:540 [Violation] 'click' handler took 211ms
    VM72 0:158 [Violation] 'click' handler took 254ms
    mpd.js:30 execQueue #next show check1
    mpd.js:30 execQueue #next.show check2
    bundle.js:540 [Violation] 'click' handler took 225ms
    VM72 0:158 [Violation] 'click' handler took 258ms
    bundle.js:540 [Violation] 'mouseover' handler took 150ms
    mpd.js:30 execQueue #next show check1
    mpd.js:30 execQueue #next.show check2
    
    
  • @kn929658 さん

    sshで接続する時は、smpd.local で繋いでいるということでしょうか?


    @pass さん

    メモリクロックは色々な設定をお試しいただいて問題ありません。

    性能面の問題を早期発見できるよう、当面はRPi3版と同水準の設定で開発を進める予定です。
    最適化作業の終盤には、各種クロックとXenomai関連パラメータの調整を行う予定です。

  • @パパリウス さま

    β10へのアップデートお疲れ様です。
    無事にアップデートが完了しました。

    β8イメージを焼いての初回起動時には一瞬で10/10となりましたので、先に読み込まれているのかと思うほどでした。

    また、例のDSDにてOoMが発生する件ですが、アルバムの曲すべてをスキャンを正常に終え、再生できることが確認できました。
    TOPコマンドにてメモリの使用量も見ておりましたが10%程度から上にあがることもなく、早々に完了しているように見受けられました。
    OoMにてmpdが停止していたときに発生していたタグが表示されなくなる件も、アルバムいくつかを確認してみましたが発生しておりません。
    ご対応ありがとうございました。

  • パパリウスさま

    ありがとうございます。MPD Client うまく行きました。
    mpd.socket で定義できるんですね。もっと調べればよかったと反省しております。丁寧に教えていただき恐縮です。

    sunatomoさま

    デバックは初めてなのでこれいよいか不安が残りますが、"execQueue #next show check1" は現れません。
    お送りするコンソールのlogは、キューの最初の画面(nextで送ってもコンソールに変化はありません。)

    参考になるといいのですが、取り合えず添付してお送りします。

    →添付がうまく行かなかったようなのでベタに加えてお送りします。

    キューの画面。
    /#/0:1 A preload for 'http://192.168.127.66/fonts/glyphicons-halflings-regular.woff2' is found, but is not used because the request credentials mode does not match. Consider taking a look at crossorigin attribute.
    /#/0:1 A preload for 'http://192.168.127.66/fonts/material-icons.woff2' is found, but is not used because the request credentials mode does not match. Consider taking a look at crossorigin attribute.
    bundle.js:568 GET http://192.168.127.66/plugins/skin.css?ver=1585749936288 net::ERR_ABORTED 404 (Not Found)
    (anonymous) @ bundle.js:568
    domManip @ bundle.js:572
    append @ bundle.js:568
    (anonymous) @ (index):540
    mpd.js?v100b10:26 connected
    Ray%20Bryant%20Trio%20-%20Ray%20Bryant%20Trio%20II.jpg:1 GET http://192.168.127.66/NAS/Ray Bryant/Ray Bryant Trio II/Ray Bryant Trio - Ray Bryant Trio II.jpg 404 (Not Found)
    The resource http://192.168.127.66/fonts/glyphicons-halflings-regular.woff2 was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate as value and it is preloaded intentionally.
    The resource http://192.168.127.66/fonts/material-icons.woff2 was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate as value and it is preloaded intentionally.
    VM17:1 Uncaught SyntaxError: Unexpected token in JSON at position 102359
    at JSON.parse ()
    at WebSocket.socket.onmessage (mpd.js?v100b10:26)
    socket.onmessage @ mpd.js?v100b10:26

    よろしくお願い申し上げます。

  • @sunatomo 様

    連投すみません。
    Nextボタン見つかりました(笑)

    操作時のログを貼っておきます。

    このページは非標準の “zoom” プロパティを使用しています。関連するプロパティの値で calc() を使用するか、"transform" に加えて "transform-origin: 0 0" を使用することを検討してください。 smpd.local
    connected mpd.js:24:189
    execQueue #next show check1 mpd.js:30:89
    execQueue #next.show check2 mpd.js:30:150
    execQueue #next show check1 mpd.js:30:89
    execQueue #next.show check2 mpd.js:30:150
    execQueue #next show check1 mpd.js:30:89
    execQueue #next.show check2 mpd.js:30:150
    function(a){return p.access(this,function(a){return a===m?p.text(this):this.empty().append((this[0]&&
    this[0].ownerDocument||L).createTextNode(a))},null,a,arguments.length)}:click! mpd.js:54:66
    app.setLocation:#/500 mpd.js:54:323
    execQueue #next show check1 mpd.js:30:89
    execQueue #next.show check2 mpd.js:30:150
    function(a){return p.access(this,function(a){return a===m?p.text(this):this.empty().append((this[0]&&
    this[0].ownerDocument||L).createTextNode(a))},null,a,arguments.length)}:click! mpd.js:54:66
    app.setLocation:#/0 mpd.js:54:323
    execQueue #next show check1 mpd.js:30:89
    execQueue #next.show check2 mpd.js:30:150
    execQueue #next show check1 mpd.js:30:89
    execQueue #next.show check2 mpd.js:30:150
    function(a){return p.access(this,function(a){return a===m?p.text(this):this.empty().append((this[0]&&
    this[0].ownerDocument||L).createTextNode(a))},null,a,arguments.length)}:click! mpd.js:54:66
    app.setLocation:#/500 mpd.js:54:323
    execQueue #next show check1 mpd.js:30:89
    execQueue #next.show check2 mpd.js:30:150
    function(a){return p.access(this,function(a){return a===m?p.text(this):this.empty().append((this[0]&&
    this[0].ownerDocument||L).createTextNode(a))},null,a,arguments.length)}:click! mpd.js:54:66
    app.setLocation:#/1000 mpd.js:54:323
    execQueue #next show check1 mpd.js:30:89
    execQueue #next.show check2 mpd.js:30:150
    function(a){return p.access(this,function(a){return a===m?p.text(this):this.empty().append((this[0]&&
    this[0].ownerDocument||L).createTextNode(a))},null,a,arguments.length)}:click! mpd.js:54:66
    app.setLocation:#/500 mpd.js:54:323
    execQueue #next show check1 mpd.js:30:89
    execQueue #next.show check2 mpd.js:30:150
    

    Syntaxエラーは出ていないようです。
    このログはFirefox 74.0(64bit)です。

    追記:
    Nextボタンが出る状態で、曲送りをすると稀にSyntaxエラーがでるときがあるようです。20回に1回ぐらい?

    Failed to load resource: the server responded with a status of 404 (Not Found)
    /#/1500:1 Uncaught SyntaxError: Unexpected end of JSON input
        at JSON.parse (<anonymous>)
        at WebSocket.socket.onmessage (mpd.js:24)
    socket.onmessage @ mpd.js:24
    Charlie%20Haden%2FPat%20Metheny%20-%20Beyond%20The%20Missouri%20Sky%20(Short%20Stories).jpg:1 Failed to load resource: the server responded with a status of 404 (Not Found)
    VM108:1 Uncaught SyntaxError: Unexpected end of JSON input
        at JSON.parse (<anonymous>)
        at WebSocket.socket.onmessage (mpd.js:24)
    socket.onmessage @ mpd.js:24
    Charlie%20Haden%2FPat%20Metheny%20-%20Beyond%20The%20Missouri%20Sky%20(Short%20Stories).jpg:1 GET http://smpd.local/NAS/CD_Wave/Charlie%20Haden/Beyond%20The%20Missouri%20Sky%20(Short%20Stories)/Charlie%20Haden%2FPat%20Metheny%20-%20Beyond%20The%20Missouri%20Sky%20(Short%20Stories).jpg 404 (Not Found)
    
  • @mike さま
    @KSK さま ログの方ありがとうございました。

    Webブラウザで動作しているWebUIとラズパイサーバのympd本体プログラム間はWebSocketという通信技術を使用してデータのやり取りを行っています。

    Uncaught SyntaxErrorが記録されている行については
    「サーバ(RaspberryPi)からWebブラウザにデータがJSON形式で返却されているのだが、
    その解析に失敗した」という意味で、
    サーバから返されたデータが正常ではないことを示しています。

    以前のバージョンで動作しているという報告から推察すると、原因は以下の2点どちらのような気がします。
    1)「アルバム表記対応するためにアルバム名を追加するよう拡張した」ために文字列バッファオーバーを起こしている。
    2)WebSocketでマルチバイト文字列を返す場合はURLエンコードが推奨されているが、エンコードされていない。
    ともあれ、対策考えてみます。
    (@Castle 氏が不具合報告したところを考えるとシングルバイトでもJSONがちゃんと返って来ていない可能性が高そうですね。1)がビンゴかな?)

  • パパリウス様
    SUNAMOTO様
     sshで確認すると以下の状態になっていましたので、SDカードを変えたら起動してSMPDが
     正常になりました。しかしRaspberry pi4がSDカードを読まなくなり、Raspberry pi4
     を交換することになりました。交換後、再度ご報告いたします。
    systemctl status ympd.service
    ● ympd.service - ympd server daemon
    Loaded: loaded (/lib/systemd/system/ympd.service; disabled; vendor preset:>
    Active: inactive (dead)
    TriggeredBy: ● ympd.socket
    ...skipping...
    ● ympd.service - ympd server daemon
    Loaded: loaded (/lib/systemd/system/ympd.service; disabled; vendor preset:>
    Active: inactive (dead)

  • @パパリウス さん、v1.0.0β8へのアップデートありがとうございます。
    また、今後の最適化の方向もお示しいただき、これからも楽しみにしております。どんな音質になっていくのか、心待ちにしておりますが、パパリウス さんのペースで、ご無理なされませんように。

  • 皆様
    Next/Prevの件ほか、とりあえず手元環境で以下の改良を行うように試行しています(中間報告でした)。

    1)キュー・ブラウズ時のデータ構造の変更
     従来は簡単に言うと楽曲を配列化したデータでした。
     v0.9の途中でアルバム毎でグループ化するためにアルバム名を埋め込んだのですが、
     その際にアルバム名を全ての楽曲に埋込していたため、結果として文字量がかなり増えていました。
     今回、アルバム>楽曲配列のツリー構造とし、アルバム名はアルバムの方に格納する構造に変更したため、アルバム名の記述は1回のみとなりました。
    それに伴いWebUIでの表示側も新しいデータ構造に対応するように修正しています。
    もう少しデバッグが進んだらソースコードを返してベータ版をアップデート可能にするよう準備します。
    (当方ではライブラリのサイズがそこまで大きくないため、ブラウズでのPrev/Nextボタンの検証が
    出来ませんので皆さんのご協力を頂きたくお願いします。)

    2)Bad song indexについて
    キューデータを全消去直後にキューを表示させようとした際に「Bad song index」が表示される件については
    全消去後に残留した表示インデックス値(pagination)に基づいて表示要求を行っているため、
    「そんなインデックス値は無い」とエラーを返している状況でした。
    原因が分かりましたので対策を考えます。

    3)キューへの最大保存数について
    16000曲近く保存すると「Playlist is too large」と表示されてこれ以上はキューへの追加ができなくなります。
    どうしてもこれ以上キューに保存したい場合は調査いたしますが、可能であればこれでご容赦頂けると幸いです。