2013/04/30

VortexBoxインストール直後からMPD最適化パッチを当てるまでの手順

VortexBox 2.2にMPD最適化パッチを当てるまでの手順です。

VortexBoxのMPDに最適化パッチを当て、Voyage MPDの場合に必要な設定と同等の設定を既にしていてもmpdプロセスの優先度が変わらない場合の対策は、「(9) 再起動時にMPDの優先度が設定されるようにする」の内容だけ行えば良いみたいです。

VortexBoxのMPD(Music Player Daemon)に最適化パッチを当てる」で実行したコマンドの手順になります。

こちらこちらを参考にいたしました。
PCオーディオ実験室
みみず工房

「(9) 再起動時にMPDの優先度が設定されるようにする」についてはこちらを参考にしました。


以下の例では他のPCからVortexBoxマシンにSSHでログインしています。

ユーザ追加とsudoを使えるようにするまでの手順はこちら

bash-3.2$ ssh -l hanaguro VortexBoxのIP
hanaguro@VortexBoxのIPs password: 

Last login: Wed May  1 00:17:44 2013 from 作業PCのIP
[vortexbox.localdomain ~]# 


(1) VortexBoxをアップグレードする

[vortexbox.localdomain ~]# sudo yum upgrade

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for hanaguro:

〜 省略 〜

トランザクションの要約
==================================================================================================================
インストール   1 パッケージ (+2 依存するパッケージ)
更新          59 パッケージ

総ダウンロード容量: 81 M
これでいいですか? [y/N]y

〜 省略 〜

file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-i386 から鍵を取得中です。

〜 省略 〜

From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-i386
これでいいですか? [y/N]y

〜 省略 〜


完了しました!
[vortexbox.localdomain ~]#


再起動します。

[vortexbox.localdomain ~]# sudo reboot

〜 再起動 〜




SSHでVortexBoxにログインします。

bash-3.2$ ssh -l hanaguro VortexBoxのIP
hanaguro@VortexBoxのIP's password:

Last login: Tue Apr 30 15:31:10 2013 from 作業PCのIP



(2) VortexBoxにデフォルトでインストールされているのMPDのプロセスの状態を調べる

[vortexbox.localdomain ~]# ps -eLo pid,ppid,lwp,rtprio,priority,cmd|grep mpd
 1336     1  1336      -  20 /usr/bin/mpd /etc/vortexbox-player/mpd0.conf
 1336     1  1338      -  20 /usr/bin/mpd /etc/vortexbox-player/mpd0.conf
 1336     1  1339      -  20 /usr/bin/mpd /etc/vortexbox-player/mpd0.conf
 1336     1  1341      -  20 /usr/bin/mpd /etc/vortexbox-player/mpd0.conf
 1336     1  1342      -  20 /usr/bin/mpd /etc/vortexbox-player/mpd0.conf
 1369  1050  1369      -  20 grep --color=auto mpd


当然優先度はまだ設定されていません。


(3) MPDのビルドに必要なものをそろえる

作業ディレクトリを作成し移動する。

[vortexbox.localdomain ~]# mkdir -p src/mpd/
[vortexbox.localdomain ~]# cd src/mpd
 


yum-builddepコマンドを使用してMPDのビルドに必要な必要なパッケージのインストールを試みますが、VortexBoxインストールしてupgradeしただけの状態だと失敗します。

[vortexbox.localdomain mpd]# sudo yum-builddep mpd
No source RPM found for mpd-1.17.2-2.fc16.i686
No uninstalled build requires
[vortexbox.localdomain mpd]#


そこで、setup-mplayerを実行します。

[vortexbox.localdomain mpd]# sudo /usr/local/sbin/setup-mplayer
読み込んだプラグイン:langpacks, presto, refresh-packagekit

 〜 省略 〜

tar: これは tar アーカイブではないようです
tar: 前のエラーにより失敗ステータスで終了します
cp: `essential-20071007/*' を stat できません: そのようなファイルやディレクトリはありません
Done.
[vortexbox.localdomain mpd]#


最後エラーになっていますが、目的は果たせたので先に進みます。
また、setup-mplayerを実行することによりffmpegもインストールされます。

再度yum-builddepコマンドを使用してMPDのビルドに必要な必要なパッケージのインストールを試みます。

[vortexbox.localdomain mpd]# sudo yum-builddep mpd
読み込んだプラグイン:langpacks, presto, refresh-packagekit
Enabling atrpms-source repository

〜 省略 〜

インストール  33 パッケージ (+45 依存するパッケージ)

総ダウンロード容量: 157 M
インストール済み容量: 218 M
これでいいですか? [y/N]y

〜 省略 〜

完了しました!

[vortexbox.localdomain mpd]# 


今度は成功しました。

まだgcc、make、patchコマンドがインストールされていないのでインストールします。

[vortexbox.localdomain mpd]# sudo yum install make
[vortexbox.localdomain mpd]# sudo yum install gcc
[vortexbox.localdomain mpd]# sudo yum install patch




(2013/09/16 追記)
sudo yum-builddep mpd を実行しても必要なパッケージがインストールされなくなっているようです。

下記の./configure等でエラーになる場合、それらを手動でインストールすれば良いのですが、全ては分かりませんでした。
MPDがビルドできない?
(2013/09/16 追記終了)


(2013/10/09 追記)
MPDがビルドできない?」ではyumコマンドで取得できないパッケージを無視していましたが、それらをソースからインストールする手順を下記に記述しました。
MPDがビルドできない? その2 
(2013/10/09 追記終了)



(4) MPDのソースと最適化パッチを取得する

[vortexbox.localdomain mpd]# wget http://www.musicpd.org/download/mpd/0.17/mpd-0.17.4.tar.xz
[vortexbox.localdomain mpd]# wget http://www.symphonic-net.com/kubotayo/cgi-bin/downlog.cgi?edata/mpd-0.17git-20120226rtopt.diff.gz



(5) MPDのソースを解凍しパッチを当てる

[vortexbox.localdomain mpd]# tar xJvf mpd-0.17.4.tar.xz

〜 省略 〜

mpd-0.17.4/NEWS

[vortexbox.localdomain mpd]# cd mpd-0.17.4/

[vortexbox.localdomain mpd-0.17.4]# zcat ../mpd-0.17git-20120226rtopt.diff.gz |patch -p1
patching file Makefile.am
Hunk #1 succeeded at 221 (offset 1 line).
Hunk #2 succeeded at 402 with fuzz 2 (offset 10 lines).
patching file configure.ac
Hunk #3 succeeded at 1584 (offset 8 lines).
patching file src/conf.c
Hunk #1 succeeded at 102 (offset -1 lines).
patching file src/conf.h
patching file src/decoder_thread.c
Hunk #2 succeeded at 464 (offset 4 lines).
patching file src/main.c
Hunk #2 succeeded at 314 (offset -3 lines).
Hunk #3 succeeded at 324 (offset -3 lines).
Hunk #4 succeeded at 381 (offset -3 lines).
Hunk #5 succeeded at 487 (offset -3 lines).
patching file src/output_internal.h
patching file src/output_thread.c
Hunk #1 succeeded at 32 with fuzz 2 (offset 1 line).
Hunk #2 succeeded at 584 (offset 5 lines).
patching file src/player_thread.c
Hunk #2 succeeded at 1087 (offset 27 lines).
patching file src/rt_opt.c
patching file src/rt_opt.h
patching file src/update.c
Hunk #1 succeeded at 33 (offset 2 lines).
Hunk #2 succeeded at 76 (offset 5 lines).


リジェクトはされていないようです。


(6) MPDをビルドし、インストールする

なお、VortexBoxにインストールされているconfigure時のオプションはこちらの方法で調べてなるべくそれに合わせました。

--enable-rtop: は最適化パッチを使用するために必要なオプションのようです。

--prefix=/usr/local: を指定して/usr/local以下にインストールするように明示的に指示しました。

(2013年5月5日 追記)
問題があったわけではないのですが、 --enable-zzipオプションを指定して作り直しました。
VortexBoxのMPDを--enable-zzipオプション指定してビルド
(2013年5月5日 追記終了)

[vortexbox.localdomain mpd-0.17.4]# ./autogen.sh

〜 省略 〜

MPD is ready for compilation, type "make" to begin.

[vortexbox.localdomain mpd-0.17.4]# ./configure --enable-wildmidi --enable-fluidsynth --enable-mikmod --enable-bzip2 --enable-zip --enable-iso9660 --enable-pipe-output --enable-lastfm --enable-rtopt --prefix=/usr/local
configure: WARNING: unrecognized options: --enable-zip

〜 省略 〜

########### MPD CONFIGURATION ############

Archive support:
        (+bzip2) (+ISO9660) (-ZIP)
Autodiscovery support:
        (+Avahi) (-Bonjour)
Client support:
        (+IPv6) (+TCP) (+UNIX Domain Sockets)
File format support:
        (+AAC) (-C64 SID) (+FFMPEG) (+FLAC) (+FluidSynth) (-GME) (-libsndfile)
        (+MikMod) (-MODPLUG) (+MAD) (+MPG123) (+MP4) (+Musepack)
        (-OggTremor) (+OggVorbis) (+WAVE) (+WavPack) (+WildMidi)
Other features:
        (+libsamplerate) (+inotify) (+SQLite) (+rtopt)
Metadata support:
        (+ID3)
Playback support:
        (+ALSA) (-FFADO) (+FIFO) (+File Recorder) (+HTTP Daemon) (+JACK)
        (+libao) (-Media MVP) (+OSS) (-OpenAL) (-OS X) (+Pipeline)
        (+PulseAudio) (-ROAR) (+SHOUTcast) (-Solaris) (-WinMM)
Streaming encoder support:
        (+FLAC) (+LAME) (+Ogg Vorbis) (+TwoLAME) (+WAVE)
Streaming support:
        (+CDIO_PARANOIA) (+CURL) (-Despotify) (+Last.FM) (-Soundcloud)
        (+MMS) (-SOUP)

##########################################

〜 省略 〜

configure: WARNING: unrecognized options: --enable-zip
MPD is ready for compilation, type "make" to begin.
[vortexbox.localdomain mpd-0.17.4]# 


--enable-zipオプションは存在しないみたいですが、問題なさそうなので無視します。

[vortexbox.localdomain mpd-0.17.4]# make

〜 省略 〜

-lpulse libutil.a -pthread -lgthread-2.0 -lrt -lglib-2.0 -lmp3lame -lm

make[1]: ディレクトリ `/home/hanaguro/src/mpd/mpd-0.17.4' から出ます

[vortexbox.localdomain mpd-0.17.4]# sudo make install-strip

〜 省略 〜

/usr/bin/install -c -m 644 doc/mpd.conf.5 '/usr/local/share/man/man5'
make[2]: ディレクトリ `/home/hanaguro/src/mpd/mpd-0.17.4' から出ます
make[1]: ディレクトリ `/home/hanaguro/src/mpd/mpd-0.17.4' から出ます
[vortexbox.localdomain mpd-0.17.4]#



(7) MPDの起動スクリプトを修正する

MPDは/usr/local以下にインストールしたため、起動スクリプトを修正します。
色を変えているところが修正した箇所です。

[vortexbox.localdomain mpd-0.17.4]# sudo vi /etc/rc.d/init.d/vortexbox-player

〜 省略 〜

start() {

if [ ! "`pidof /usr/bin/vortexbox-player`" ]; then
         # restore sound card settings
          /sbin/alsactl restore
          /opt/vortexbox/unmute_all.sh

         for macaddr in $(cat /etc/vortexbox-player/mac_list.conf )
         do
                echo -n $"Starting mpd: "
#               /usr/bin/mpd /etc/vortexbox-player/mpd$COUNT.conf
                /usr/local/bin/mpd /etc/vortexbox-player/mpd$COUNT.conf

                echo

〜 省略 〜


[vortexbox.localdomain mpd-0.17.4]# sudo systemctl --system daemon-reload



(8) MPDの設定ファイルに優先度の設定を追加する

MPDの起動時に/etc/vortexbox-player/mpd0.confを読むようになっていますが、このファイルを直接修正して優先度の設定を追加しても、他のPCのブラウザからVortexBoxの設定画面にアクセスし、

「Configure VortexBox Player」(http:// VortexBoxのIP /vortexbox-player.php)

で設定を変更すると修正して追加した設定内容が消えてしまいます。

これを避けるために、

 /opt/vortexbox/mpd_config.php

に優先度の設定を記述します。
色が変わっている箇所が変更点です。

(2013年5月16日 追記)
 outputのproirityをFIFO:99からFIFO:98に変更
(2013年5月16日 追記終了)


[vortexbox.localdomain mpd-0.17.4]# sudo vi /opt/vortexbox/mpd_config.php

〜 省略 〜

        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:98"'."\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);

〜 省略 〜




ここで他のPCのブラウザからVortexBox設定画面の

「Configure VortexBox Player」(http:// VortexBoxのIP /vortexbox-player.php)

にアクセスして「Submit」ボタンを押します。

mpd_config.phpの修正に成功していれば/etc/vortexbox-player/mpd0.confは以下のようになるはずです。

[vortexbox.localdomain ~]# less /etc/vortexbox-player/mpd0.conf

〜 省略 〜

audio_output {
        type            "alsa"
        name            "Player1-1"
        device          "plughw:0,0"
        dsd_usb     "yes"
        priority    "FIFO:98"
}
realtime_option {
    memlock        "yes"
    stack_reserve    "1024"
    heap_reserve    "0"
    main_priority    "OTHER:0"
    player_priority "FIFO:52"
    decoder_priority "FIFO:48"
    update_priority "OTHER:0"
}

〜 省略 〜



もしここで再起動しても、mpdプロセスの優先度の設定は有効になりません。


(9) 再起動時にMPDの優先度が設定されるようにする

/etc/sysctl.confを修正し、kernel.sched_rt_runtime_us=-1を追加します。

[vortexbox.localdomain ~]# sudo cp -i /etc/sysctl.conf  /etc/sysctl.conf.orig
[vortexbox.localdomain ~]# sudo vi /etc/sysctl.conf
[vortexbox.localdomain ~]# tail -n1 /etc/sysctl.conf
kernel.sched_rt_runtime_us=-1
[vortexbox.localdomain ~]# 


再起動し、mpdプロセスの優先度が設定されていることを確認します 。

[vortexbox.localdomain ~]# sudo reboot

bash-3.2$ ssh -l hanaguro VortexBoxのIP
hanaguro@VortexBoxのIP's password:
Last login: Tue Apr 30 18:09:58 2013 from 作業PCのIP

[vortexbox.localdomain ~]# ps -eLo pid,ppid,lwp,rtprio,priority,cmd|grep mpd
  917     1   917      -  20 /usr/local/bin/mpd /etc/vortexbox-player/mpd0.conf
  917     1   918      -  20 /usr/local/bin/mpd /etc/vortexbox-player/mpd0.conf
  917     1   919     52 -53 /usr/local/bin/mpd /etc/vortexbox-player/mpd0.conf
  917     1   920     48 -49 /usr/local/bin/mpd /etc/vortexbox-player/mpd0.conf
  917     1   921     99 -100 /usr/local/bin/mpd /etc/vortexbox-player/mpd0.conf
 1049   987  1049      -  20 grep --color=auto mpd



(2013年5月16日 追記)

(10) MPD以外のプロセスの優先度を設定する

MPDを使用しての音楽再生時のプロセスの動きをtopコマンドで調べたり、また/proc/interruptsから割り込みの発生回数を調べた結果、私の環境では/etc/rc.d/rc.localに下記の内容を追加しました。
優先度の設定はその日の気分で色々いじってみたいと思います。

chrt -p -f 99 `pgrep irq/23-uhci_hcd`
chrt -p -f 99 `pgrep irq/23-ehci_hcd`
chrt -p -f 51 `pgrep mount.exfat`
chrt -p -f 51 `pgrep irq/16-uhci_hcd`
chrt -p -f 51 `pgrep irq/16-0000:01:`

[vortexbox.localdomain ~]# sudo vi /etc/rc.d/rc.local

〜 省略 〜

[vortexbox.localdomain ~]# tail -n5 /etc/rc.d/rc.local
chrt -p -f 99 `pgrep irq/23-uhci_hcd`
chrt -p -f 99 `pgrep irq/23-ehci_hcd`
chrt -p -f 51 `pgrep mount.exfat`
chrt -p -f 51 `pgrep irq/16-uhci_hcd`
chrt -p -f 51 `pgrep irq/16-0000:01:`


(2013年5月16日 追記終了)

2 件のコメント:

Spotify さんのコメント...

大変参考になります。VortexBox2,2をインストールしていますが、
./autogen.shをすると、Glib2,16でないとコメントがでて、/Configureができないのですが、何か手はありますか?


ハナグロ さんのコメント...

Spotifyさん、こんにちは。

コメント頂いて気付いたのですが、現在
yum-builddep mpd
で必要なパッケージがインストール出来無いようです。

./autogen.sh 実行する前に必要なパッケージを手動でインストールすればいいのですが、全ては分かりませんでした。
確認したのが仮想PCのテスト環境なので音出しは出来ていないのですが、make出来る所までは確認しました。

それらを下記の記事に書いておきました。
MPDがビルドできない?