2013/04/29

VortexBoxのMPD(Music Player Daemon)に最適化パッチを当てる

安かったので購入したのに全く使っていなかったノートPCにVortexBoxというLinuxディストリビューションをインストールしました。
VortexBox user forum - News:

インストールしたVortexBoxのバージョンは2.2です。

VortexBoxは音楽配信に特化したLinuxディストリビューションとのことですが、外部DACをUSBに接続してMPD(Music Player Daemon)を使って音楽を聴くことも出来ます。

ノートPCのパーティションを全部初期化してインストールした限りでは、VortexBoxのインストールはとても簡単でした。

VortexBoxで動いているMPDの最適化パッチをこちらこちらを参考に当てました。
とてもすばらしいパッチをありがとうございます。
PCオーディオ実験室
みみず工房

パッチを適用したMPDのバージョンは0.17.4です。

パッチを使用する上で悩んだのは以下の点でしょうか。
  1. /etc/mpd.confや/etc/vortexbox-player/mpd0.confに記述した設定が前者は無視され、後者はいつの間にか消えている
  2. mpdの優先度が設定されていない
  3. mount.exfat-fuseなどのプロセスにchrt コマンドで優先度を設定しようとするとOperation not permittedになる 

1は後回しにします。

  • 2と3について
2と3については関連しているようです。

システム起動時にmpdを起動するようにした場合、後から優先順位を設定しようと下記のコマンド

# sudo chrt -p -f 99 `pgrep mpd`

を実行すると "Operation not permitted"になってしまいました。

さんざん悩んだのですが、こちらにある方法で上手くいくみたいです。

私は/etc/sysctl.confに

kernel.sched_rt_runtime_us=-1

と記述し、

/etc/rc.d/rc.local



/usr/bin/chrt -p -f 49 `pgrep -f mount.exfat-fuse`
/usr/bin/chrt -p -f 49 `pgrep usb-storage`


を記述しました。

[vortexbox.localdomain ~]# tail -n1 /etc/sysctl.conf
kernel.sched_rt_runtime_us=-1
[vortexbox.localdomain ~]# tail -n2 /etc/rc.d/rc.local
/usr/bin/chrt -p -f 49 `pgrep -f mount.exfat-fuse`
/usr/bin/chrt -p -f 49 `pgrep usb-storage`


またmpdは

/usr/local

以下にインストールしたので、

/etc/rc.d/init.d/vortex-player

のmpdを起動している部分を修正しました。

[vortexbox.localdomain ~]# cat /etc/rc.d/init.d/vortexbox-player

~ 省略 ~

#               /usr/bin/mpd /etc/vortexbox-player/mpd$COUNT.conf
                /usr/local/bin/mpd /etc/vortexbox-player/mpd$COUNT.conf

~ 省略 ~


ここまでの設定と、下の方に記述した「1について」の設定を行った状態で再起動した直後のpsコマンドの結果です。
一応設定通りになっているかなと思っています。

[vortexbox.localdomain ~]# ps -eLo pid,ppid,lwp,rtprio,priority,cmd
 PID  PPID   LWP RTPRIO PRI CMD
    1     0     1      -  20 /sbin/init

 ~ 省略 ~

  235     2   235     49 -50 [usb-storage]

 ~ 省略 ~

  733     1   733     49 -50 /sbin/mount.exfat-fuse /dev/sdb1 /mnt/EXHDD2 -o rw,umask=000

 ~ 省略 ~

 1665     1  1665      -  20 /usr/local/bin/mpd /etc/vortexbox-player/mpd0.conf
 1665     1  1666      -  20 /usr/local/bin/mpd /etc/vortexbox-player/mpd0.conf
 1665     1  1668     52 -53 /usr/local/bin/mpd /etc/vortexbox-player/mpd0.conf
 1665     1  1669     48 -49 /usr/local/bin/mpd /etc/vortexbox-player/mpd0.conf
 1665     1  1673     99 -100 /usr/local/bin/mpd /etc/vortexbox-player/mpd0.conf

 ~ 省略 ~



  • 1について
1についてですが、mpdの起動などを行っているらしい

/etc/rc.d/init.d/vortexbox-player

では次のように記述されています。

/usr/bin/mpd /etc/vortexbox-player/mpd$COUNT.conf

ですので

/etc/mpd.conf

は存在していても使用していないようです。

また、VortexBoxの主要な設定は他のPCのWebブラウザから変更することが出来るのですが、「Configure VortexBox Player」のページから設定を変更すると

/etc/vortexbox-player/mpd0.conf

で行った設定はクリアされてしまいます。

ブラウザから設定変更した際に呼ばれているPHPスクリプトは

/opt/vortexbox/mpd_config.php

のようです。

私のmpd_config.phpは次のようにしています。
色を変えてある箇所が加えたところです。

私は音を出すのは外部DAC経由でしか行っていませんので、複数のサウンドデバイスから音を出すのであればもう少し考えて記述しなければいけないかもしれません。
(もっと言うと、適当にいじっただけです…)
    <?php
    // This program is free software; you can redistribute it and/or
    // modify it under the terms of the GNU General Public License
    // as published by the Free Software Foundation; either version 2
    // of the License, or (at your option) any later version.
    //
    // This program is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    // GNU General Public License for more details.
    //

    error_reporting(E_ERROR);

    $configfile = "/var/www/html/config/playergui.cfg";
    $configall = file_get_contents($configfile);
    $config = unserialize($configall);

    $vbplayer="";
    $vbplayerfile = fopen("/etc/vortexbox-player/mac_list.conf",'w');
    $x=0;
    foreach ($config as $devarray) {
      if (isset($devarray['NAME'])) {
        $mpdfile = fopen("/etc/vortexbox-player/mpd".$x.".conf",'w');

        $configcontent="# Created by Configure VortexBox Player on ".date('F j, Y, g:i a')."\n";
        $configcontent.="# If you edit this file it will be over written the next time you make\n";
        $configcontent.="# changes in the Configure VortexBox Player GUI.\n";
        $configcontent.="#"."\n";
        if ($x == 0) {
            $configcontent.='music_directory  "/storage/music/flac"'."\n";
            $configcontent.='playlist_directory  "/var/lib/mpd/playlists"'."\n";
            $configcontent.='db_file  "/var/lib/mpd/database"'."\n";
            $configcontent.='log_file  "/var/log/mpd.log"'."\n";
            $configcontent.='pid_file  "/var/lib/mpd/pid"'."\n";
            $configcontent.='state_file  "/var/lib/mpd/state"'."\n";
            $configcontent.='sticker_file  "/var/lib/mpd/sticker.sql"'."\n";
    }
    if (file_exists("/etc/vortexbox/mpd_auto_update.no")) {
            $configcontent.='auto_update "no"'."\n";
        } else {
            $configcontent.='auto_update "yes"'."\n";
        }
        $configcontent.='port  "'.(6600 + $x).'"'."\n";
        $configcontent.='zeroconf_enabled  "yes"'."\n";
        $configcontent.='zeroconf_name  "'.$devarray['NAME'].'"'."\n";
        $configcontent.="\n";
        if (strtoupper($devarray['DEVICENAME']) != "DEFAULT") {
            $devicelist=(preg_split('/\s+/', $devarray['DEVICENAME']));
            $count=1;
            foreach ($devicelist as $v) {
                $configcontent.='audio_output {'."\n";
                $configcontent.='    type        "alsa"'."\n";
                $configcontent.='    name        "'.$devarray['NAME']."-".$count.'"'."\n";
                $configcontent.='    device        "'.trim($v).'"'."\n";
                $configcontent.='    dsd_usb     "yes"'."\n";
                $configcontent.='    priority    "FIFO:99"'."\n";
                if ($devarray['softvol_ischecked'] == "softvol") { $configcontent.='    mixer_type    "software"'."\n";}
                $configcontent.='}'."\n";
                $count++;
            }
        }

        $configcontent.='realtime_option {'."\n";
        $configcontent.='    memlock        "yes"'."\n";
        $configcontent.='    stack_reserve    "1024"'."\n";
        $configcontent.='    heap_reserve    "0"'."\n";
        $configcontent.='    main_priority    "OTHER:0"'."\n";
        $configcontent.='    player_priority "FIFO:52"'."\n";
            $configcontent.='    decoder_priority "FIFO:48"'."\n";
            $configcontent.='    update_priority "OTHER:0"'."\n";
        $configcontent.='}'."\n";

        fwrite($mpdfile,$configcontent);
        fclose($mpdfile);
        $vbplayer.=$devarray['MAC']."\n";

        }
    $x++;
    }

    fwrite($vbplayerfile,$vbplayer);
    fclose($vbplayerfile);

    // restart vortexbox-player
    exec("/bin/systemctl restart vortexbox-player.service");

    ?>


    0 件のコメント: