「Voyage MPD+Fireface400」の続編(2)

ソースからインストールしてヴァ?ジョンを「0.17」にする

さて、今回は肝心のMPDをソースからコンパイルしてヴァージョンを「0.16→0.17」に挙げておきたいと思います。
いつものよう、いつもの手順で操作をしてMPDを起動させたのですが、「outputにjackなんてないよ!」と叱られてしまいました。そうでした、バイナリ版と違ってソースからコンパイルしてインストールするときは必要なライブラリは手動で入れておかないとダメなのでした。
でも、jackのライブラリって何なのさと思って調べてみたのですが、すぐに見つけることができませんでした。
そこで、「apt」の便利なコマンド「search」を使って調べてみました。

apt-cache search libjack //←「libjack」の文字列を含むパッケージを検索

libjack-dev – JACK Audio Connection Kit (development files)
libjack0 – JACK Audio Connection Kit (libraries)
libjack-jackd2-0 – JACK Audio Connection Kit (libraries)
libjack-jackd2-dev – JACK Audio Connection Kit (development files)
libjackson-json-java-doc – standard conformant json processor in java – API documentation
libjackson-json-java – streaming fast powerful standard conformant json processor in java

実にいいかげんですが、おそらくは「libjack-jackd2-0」と「libjack-jackd2-dev」が必要なライブラリだろうと見当をつけてインストールしてみることにしました。

apt-get install libjack-jackd2-0 libjack-jackd2-dev

./autogen.sh
./configure -disable-ipv6 -disable-sndfile

としてみると、「MPD CONFIGURATION」の「Playback support」で(+JACK)となっていましたので、おそらくこれで大丈夫だろうと判断して、「make」「make install」を行ってインストールしました。
今度は、MPDを起動しても「outputにjackなんてないよ!」と叱られることもなく無事に起動しました。

何でもないことですが、ソースからインストールしようとすると、このライブラリの捜索に意外と手間取ります。

ただ、一つ困ったのは、この状態からyanさんの例のパッチファイルを適用しようとすると、上手くいかないことに気づきました。
「./configure」をして「MPD CONFIGURATION」を確認してみると(-rtopt) になっています。
何度か試してみたのですが上手くいかないので、

find . -name “*.rej” -print //パッチに失敗すると失敗したファイルを探す

./src/conf.c.rej
./src/conf.h.rej
./src/decoder_thread.c.rej
./src/main.c.rej
./src/output_internal.h.rej
./src/output_thread.c.rej
./src/player_thread.c.rej
./src/update.c.rej
./Makefile.am.rej
./configure.ac.rej

となります。
MPDのヴァージョンは「0.17」で変化はないのですが、開発版と言うことなので微妙に中味が変化しているのかもしれません。もっとも、端に私のやり方が悪いだけかもしれませんが(^^;

<追記>
yanさんより「git上の最新版でもpatchはちゃんとあたります。」とコメントを頂きました。

「rejの具合から、patchを当てた時のディレクトリがmpdのソースの一つ上だったのではないかと思います。patchを当てるときはlsでsrcやMakefile.amが見えるディレクトリで行って下さい。」
とのことなのですが、間違いなくそのディレクトリでパッチを当てています・・・。
おかしいな・・・と思いつつ、ハタと、大馬鹿をやっていることに気づきました。

何のことはない、configureの引数に「-enable-rtopt」を追加するのを忘れていました。これじゃ、(+rtopt)になるはずがありません。
ご丁寧に、自分のサイトに「-enable-rtoptを追加することで「realtime_option」が有効になるので必須。」と書いておいたのにこの体たらくです。

皆様、お騒がせして申し訳ありません。

優先度の設定

yanさんのパッチが上手く適用できなかったので、細かい優先度の設定はできないのですが、最低限の設定だけはしておこうかと思います。
まずは、fireface400をつないでいるfirewireのirq番号を調べます。

cat /proc/interrupts

CPU0 CPU1
0: 142 16 IO-APIC-edge timer
1: 1 1 IO-APIC-edge i8042
9: 0 0 IO-APIC-fasteoi acpi
12: 1 3 IO-APIC-edge i8042
16: 4646 4644 IO-APIC-fasteoi uhci_hcd:usb3, i915
17: 51746 51736 IO-APIC-fasteoi firewire_ohci, eth1
18: 0 0 IO-APIC-fasteoi ehci_hcd:usb1, sata_sil24, uhci_hcd:usb8
19: 111 110 IO-APIC-fasteoi uhci_hcd:usb5, uhci_hcd:usb7, ata_piix, ata_piix
21: 82 79 IO-APIC-fasteoi uhci_hcd:usb4, firewire_ohci
23: 35976 35989 IO-APIC-fasteoi ehci_hcd:usb2, uhci_hcd:usb6
NMI: 0 0 Non-maskable interrupts
LOC: 206084 210088 Local timer interrupts
SPU: 0 0 Spurious interrupts
PMI: 0 0 Performance monitoring interrupts
PND: 0 0 Performance pending work
RES: 14928 15728 Rescheduling interrupts
CAL: 11080 9233 Function call interrupts
TLB: 5546 5463 TLB shootdowns
ERR: 0
MIS: 0

となりますので、「17」らしい・・・と言うことが分かります。
ネットワーク端子は「eth1」で、これもまた「17」が割り当てられていることが分かります。

よって、

# vi /etc/rc.local

<以下を追記する>

chrt -f -p 99 `pgrep irq/17-firewire`
chrt -f -p 52 `pgrep irq/17-eth1`
chrt -f -p 52 `pgrep cifsd`

とだけはしておきます。

ps -eLo pid,lwp,rtprio,priority,time,cmd | egrep “irq/17|irq/21|cifsd”

1441 1441 50 -51 00:00:00 [irq/21-uhci_hcd]
1450 1450 99 -100 00:00:00 [irq/17-firewire]
1465 1465 50 -51 00:00:00 [irq/21-firewire]
2318 2318 52 -53 00:00:00 [irq/17-eth1]
2378 2378 52 -53 00:00:00 [cifsd]

と言うことで、無事に優先度の設定が反映しています。
この設定は非常に効きますから必須と考えていいでしょう。

さらに、パッチファイルも無事に適用できたので、mpd.confも編集しておきます。
#/etc/init.d/mpd stop
#vi /etc/mpd.conf

<以下を追記する>

realtime_option {
memlock “yes”
stack_reserve “1024”
heap_reserve “10240”

main_priority “OTHER:0”
player_priority “FIFO:51”
decoder_priority “OTHER:0”
update_priority “OTHER:0”
}

audio_output {
type “jack”
name “fireface400”
priority “FIFO:53”
}

#/etc/init.d/mpd start

これで、優先度の設定が反映します。
なお、今回はかなり端折った記述になっていますので、詳しい情報が必要な人は

Voayage MPDの優先度をチューニングしてさらなる高みを目指す(1)
Voayage MPDの優先度をチューニングしてさらなる高みを目指す(2)

を参考にしてください。
また、MPDをソースからコンパイルしてインストールする仕方についても

MPDをバージョンアップ(0.16→0.17)
MPD 0.17.0+ALSAで音が出ないという問題が解決しました。

を参考にしてください。


4 comments for “「Voyage MPD+Fireface400」の続編(2)

  1. yan
    2011年7月2日 at 8:35 PM

    ユングさん こんばんは
    git上の最新版でもpatchはちゃんとあたります。
    rejの具合から、patchを当てた時のディレクトリがmpdのソースの
    一つ上だったのではないかと思います。
    patchを当てるときはlsでsrcやMakefile.amが見えるディレクトリ
    で行って下さい。その時-p1オプションを忘れずに。

    あいにく、fireface400を持っていないのですがfireface400が
    voyageで動作すると喜ぶ人がおおいでしょうね。
    評価を楽しみにしています。

  2. ユング君
    2011年7月2日 at 11:10 PM

    コメントありがとうございます。
    人間の思いこみというのは怖いもので、一度上手くいかないとあれこれ難しい」事を考えてしまって、きわめてイージーなミスを見逃してしまうと言う「典型」でした。

    ですから、「git上の最新版でもpatchはちゃんとあたります。」という「確証」をもらっただけで、その馬鹿げたイージーミスを簡単に発見することができました。

    ただし、今回のこの馬鹿げたミスにもメリットがありました。
    それは「小出し」にチューニングしたので、それぞれの設定が「音質」にどの程度貢献するのかがよく分かりました。

    MPDを「0.17」にヴァージョンをあげる→firewire端子の優先度を上げる→パッチファイルをあててMPDの個々のスレッドの優先度を上げる

    間違いなく、一つ一つの設定は音質向上に寄与していることが分かりました。
    そして、パッチファイルをあてた状態で「Voyage MPD+Fireface400」を聞いてみると、従来の「Voyage MPD+UDIF」の音にかなり肉薄してきたように思います。
    ただし、現時点では上回るところまで入っていません。
    やはり、注文しているファンレスのPCが届かないとダメなようです。
    オリオスペックからは7月10日前後に出荷の予定というメールが届いています。まだまだ当分の間これで遊べそうです。

  3. ushi
    2011年7月8日 at 12:53 AM

    こんにちは
    うちではusb側はelectroArtさんのUSB DUAL AUDIO基板を使ってますが、FF400も遜色ないレベル(好みの差程度)に感じてます。yungさんはFF400には別クロックを投入されてますでしょうか。FF400内臓のクロックは今となっては性能が悪いので(UDIFより)、そこも怪しく感じました。
    見当違いな事を言ってるかも知れませんが気になりましたモノで。

  4. ユング君
    2011年7月9日 at 12:28 PM

    >yungさんはFF400には別クロックを投入されてますでしょうか。FF400内臓のクロックは今となっては性能が悪いので(UDIFより)、そこも怪しく感じました。

    コメントありがとうございます。
    私の場合は、クロック云々以前に、間に合わせのPCで「Voyage MPD」をどうさせているので、それが一番「悪さ」をしているものと思われます。「Voyage MPD」はそう言うハードの特性をもろに表に出してしまう「怖さ」を持っていますから、おそらくそれが一番の原因だと考えています。

    幸いにして、注文していたPCが九日に届くというメールがきましたので、この土日でそのPCに「Voyage MPD」をインストールして聞き比べてみたいと思っています。

    なお、クロックに関しては、今の時点では「様子見」をしています。
    理由は、ここに足を踏み込むとそれこそ「泥沼」」から抜け出せなくなるのではないか・・・という危惧(^^;があるからです。
    でも、いつかは、どこかで導入する必要があることは分かっているのですが・・・。

Comments are closed.