JPLAYで BulkPetドライバを接続する方法(3)
このテーマで3回も書くことがあろうとは思いませんでしたが (^^;;;、こだわります。
まず、前回書いた内容の補足です。
DualMode での JPLAY Streamer の動作に関して
*2 DLNAサーバをコントロールPCに置く必要があります。
と書きましたが、コントローラーもコントロールPCに置く必要があることを書き忘れました。
つまりコントロールPCに置いた音楽ファイルをコントロールPCで動作するDLNAサーバ(例えばMinimServer)でアクセス出来るようにして、コントールPCで動作するコントローラー(例えばKAZOO)で操作する必要があります。タブレットのKAZOOでは曲の演奏を開始すると、だんまり状態となり、操作できません。つまりタブレットでは操作出来ません。仕方がないので、僕はノートPCからリモート接続を使いコントロールPCに繋ぎ、操作しています。下図はその操作中の画面です。Windowsの中にWindowsがあるというシュールな画面となります。
この方法もオーディオPCのJPLYSettingの DAC Link を厳しい値にすると音が出なくなります。
また、DAC Link を甘い値にすると、DLNAサーバをコントロールPCに置かなくても演奏は可能です。前回、一切の操作が不能になるというのはこの値がギリギリのところで発生したようです。タブレットからの操作はDAC Linkをどんな値にしても駄目ですね。
以上、他のドライバではこういう状況は発生しないので、BulkPetドライバが要因だと思います。
ここからが本題です。
その前にBulkPetドライバについて興味深い記事を発見しました。
『USBオーディオ伝送の違いで音が良くなる? 「BulkPet」はどんな技術なのか』 というタイトルで、藤本健さんがインターフェース社のBulkPetドライバの開発者にインタビューした内容です。
BulkPetドライバ開発の本音の部分が語られていて、とても面白いです。
詳しくは本文を読んで頂くとして、要約すると
『BulkPetドライバはもともとは音質改善といった目的ではなく、レイテンシーを縮めることが目的で開発された。Isochronous転送では1msecごとに規則正しく間欠的にデータを送ることが決められている。Bulk転送の場合は、そうした決まりがないので、1mSecよりも細かなタイミングで転送することが可能であり、レイテンシーを縮められる。このデータ量を平均的にこまめに転送することが、DAC側の処理負荷の変動が少なくすることが出来る。結果、レイテンシーを小さくすると共に音質に良い影響を与えているのではないか。
ASIOでもバッファサイズを小さくすることにより同じような効果を狙うことができる。アプリケーションから見て、レイテンシーは実際にオーディオ機器から音が出るまでの時間を意味している。従って、これを小さくするのはバッファサイズを小さくするとともに、ドライバからハードへ転送する時間を短くすることが必要になる。 以上を実現するために、ドライバおよびファームウェア側の両方に手をいれBulk Pet方式として完成した。』
BulkPetドライバがレイテンシー対策として開発されたというのは知りませんでした。結果として、DAC側の処理負荷の変動を抑えることにより、ノイズ対策となり、音質アップにつながっているのではないかという指摘は鋭いですね。「さすが。開発サイドの卓見だなぁ」という感じてす。
バッファサイズを小さくすると音が良くなるといのは linuxでは周知の事実ですが、これに「ドライバからハードへ転送する時間を短くすることが必要になる」という形で、BulkPetドライバの意味があるという指摘ももっともですね。
さて前置きはこの位にして、本論です。
JPLAYはこの図でいうと USB Audio Kernel Mode Driver の位置で動作することになります。 次の図は前回の書き込みのインターフェース社BulkPetドライバ紹介記事の中にあるもので、ITF-USB-DSDというタイトルのドライバ構成図です。Windows/Mac共通の構成であるということを示すために引用されています。
この「ITF-USB-DSD…..」というタイトルが、SoulNote用BulkPetドライバを上書きアップデートした時に出てきて、ビックリしたことを覚えています。「あらまあ、バレバレだなぁ」という感想。タイトルがバレバレでも、動作は問題なく、バルクモードを指定し、音を出すことが出来ました。この時、JPLAYSettingではWASAPIのBulkPetドライバ以外のKSとASIOのSoulNote用ドライバを選択できて、音を出すことも出来ました。「古いドライバが残っている」ということなのですかね。気持ちが悪いので、完全に旧版のドライバをアンインストールしてから、BulkPetドライバをインストールしたら、タイトルは「SOULNOTE USB Audio Control Panel」に戻り、KSドライバも姿を消しました。ただ、ASIOドライバは存在します。これは、ITF社/CSR社が意図的に残しているということなのでしょう。
この図から判断すると、パソコン側のBulkPetドライバは上記記事にあるような処理を行っているだけで、JPALYを意識し、特別な処理を行っているようには見えませんね。疑問が残るのはJPLAYというモードを選択した時に何をしているかだけです。
これに対してファームウェア側はかなり怪しい。 「ITF-USB-DSD…..」のパラグラフで、「旧版のドライバをちゃんとアンインストール」と書きましたが、このためには、BulkPetドライバをアンインストールして、旧版のドライバをインストールする必要があります。実は、この時、かなり悩みました。悩んだ理由は、初めてBulkPetドライバをインストールした時、その前にD-1のファームウェアを更新していたからです。つまり、「ファームとドライバが不整合となり、D-1が炎上爆発する(^^;;;と困るなぁ」と考えたわけです。
しかし、BulkPetドライバの変な状態を解消するには、この方法しかありません。仕方がないので、やってみました。驚いたことに、旧ドライバと新ファームの組み合わせで何の問題もなく動きました。一つ上の図の USB Audio Class 2.0 で、問題なく動いているということですかね。だから、Linuxマシンに繋いでも、何の問題も発生しなかったわけですね。
さて、この状態で、JPLAYを使い、DSD再生したら(ドライバはKSを使います)、表示はどうなるか。当然、DoP(88.2KHz)表示だと思いますよね。ところが、驚いたことに、ネイティブ表示(2.4M)になりました。
ドライバは古いドライバを使っているわけだから、これでファームが犯人であることが断定できます。旧ドライバはDoPフォーマットで新ファームにデータ転送していることは間違いないですから。
従って、新ファームがDAC側にDoPをASIOネイティブに変換したデータが渡っているか、ファームがDoPデータをそのまま渡しておいて、裏で手を回して表示をごまかしているか(そんなことが出来るのかわかりませんが)、のどちらかです。
まあ普通に考えれば、ファームがDoPフォーマットをASIOネイティブフォーマットに変換して、DACにデータを渡していることになります。謎は何故ここで、JPLAYの時だけ依怙贔屓して、変換するのか。理由はさっぱり分かりませんね。FORCE 24 Bit がこれに関連しているのですかね。
まあ、これ以上の解明はインターフェース社とSoulNoteからの説明がないと不可能ですので、この件はこれまでとします。
ところで、BulkPetドライバにこだわった理由は、バルク転送がパソコンを使った音楽再生のテクニカルなニューフロンティアだと、思っているからです。USBの使い方についてはアイソクロナス転送が常識で、バルク転送というアプローチは、一部の例外を除いて、ほとんどありませんでした。使ってみたら、結構いけると分かったというのが、今回の BulkPetドライバの最大の収穫ではないでしょうか。できれば、なんらかの形で標準化され、Linuxにも展開されるといいなと思います。
前回、書いたように、バルク転送を音楽データの転送に使う方式はインターフェース社だけではなく、エレクトロアート社も行っています。どちらも、DACではなく、主としてDDC基板を開発している会社です。つまり、この方式はドライバとDDCファームの両方の対応で成立するものです。バルク転送が汎用化&標準化されるかどうかはDDCファームの開発状況次第です。個人的には日本発の新方式として、広まるといいなと思っています。
(PC_Audio) 2018/08/04
JPLAYで BulkPetドライバを接続する方法(2)
この件、しつこいですが、もう少しこだわります。
まず、前回書いたことの誤りの訂正。
ところが、僕の環境ではBulkPETドライバはデュアルモードでは動かないので、
と書きましたが、これは誤りでした。
i3(i3225)デスクトップ + amd_e450デスクトップ という構成でデュアルモードで素晴らしい音が鳴ることを確認しました。
「動かない」と勘違いした理由は専用機のi3(i3225)デスクトップの代わりに常用のノートを使い
SurfaceノートPC(i7-6600u) + i3(i3225)デスクトップ
という構成で確認を行っていたからのようです。何故、「使えなかったのか」の原因は不明です。Surfaceノートだと、デュアルモードの認識は出来て、再生も開始出来るのですが、音だけ出ないという不可解な状態になります。不思議です。原因は僕のノートパソコンの環境にあると思いますが、これ以上追求しても解明出来そうもないので、諦めます(^^;;;。
さて、ここからが本題です。
BulkPetドライバはインターフェース社が開発したものです。インターフェース社は様々な組込み機器に内蔵されるシステム開発を主業務とする日本の会社で、USB関連の技術も得意としています。BulkPetドライバもこの組み込み開発の中で誕生した製品のようです。技術的な情報はここにあります。従って、BulkPetドライバは Soulnote DAC専用の製品という訳ではなく、インターフェース社のDDC(USB対応のDD変換を行う)基板を使っているDACであれば、同じようにサポートされます。「バルクペット | BulkPet」でググれば、どのメーカーがインターフェース社の基板を使っているのか分かりますね。当然、これらのメーカのDACも、JPLAYを使い、同じようにバルクモードで鳴らせるのではないかと思います。
ちょっと脱線しますが、インターフェース社のDDCはUSB Audio Class 2.0に対応していますので、Linuxと問題なく繋ぐことができます。国内メーカーのDACをLinuxで動かそうと考えているのであれば、DDC部分がこの会社の製品かどうかを確認すれば、安心して使えます。
本題に戻ります。
バルク転送はUSBを使って大量のデータをまとめて送るのに向いた方式で、エラー補正機能もあるので、データ転送にはよく使われています。しかし、一定時間内に一定量のデータを規則正しく送るのには向いていないので、オーディオデータでは、一般的にはIsochronous転送が使われています。
このあたりの技術的内容についてはエレクトロアート社のブログに丁寧かつ分かりやすく解説されています。ここ(アイソクロナス vs バルク(その1))とここ(その2)です。エレクトロアート社のDDC基板の多くはIsochronous転送だけでなくバルク転送に対応しています。
尚、USBのデータ転送に全般ついてはasoyajeさんのサイトに大変良くまとめらた記事がありますので、そちらを参照されると良いと思います。
というわけで、バルク転送でオーディオデータを送るという方式はインターフェース社が初めてはじめたというわけではありません。インターフェース社のBulkPetがユニークな点は、同社のサイトにもあるように
ドライバとDDCファームをバルク転送に一体化させ
- USB Audio Class2.0互換のモードを搭載
- 専用(Windows、Mac)の独自ドライバを提供
- Asynchronous転送、DSDネイティブデータ転送に対応
- 一般的の再生ソフトで再生可能
としたところでしょう。結果としてIsochronous転送のドライバに対し、バルク転送のドライバは切れ味の良い音がするようになったということだと思います。何故、本来、オーディオに向いていない方式なのに、このような切れ味の良い音を出せるのかは謎ですが(^^;;;。
BulkPetドライバにはJPLAYと繋いだ時、もう一つ謎があります。ASIO転送によるDSDネイティブ再生に関してです。
DSDデータをPCMに変換せずDSD信号として再生する方式にはDoP転送とASIO転送の二方式があります。 最近の新製品であれば、多くのDACはこの二方式に対応していますが、PC側の対応は遅れています。特に、Windowsの場合、ASIO転送のDSDネイティブ再生が出来るプレーヤソフトはあまりありません(ドライバに手を入れられるLinuxの場合は、数年前から対応されています)。
WASIPIとASIOの両方のドライバに対応することにより、DoP転送(DoP再生)とASIO転送(DSDネイティブ再生)の両方に対応しているTuneBrowserプレーヤを使って確認してみました。
次の写真はSoulnote D-1 のフロントパネルの一部で再生中のデータの内容を表示している部分です。
これはCDからリッピングしたデータを再生している時の表示です。当然44.1Kとなります。
これはBulkPetドライバを指定し、2.8MのDSDデータを再生中の写真です。DoP転送ですので、2.8MのPCMデータ転送速度に対応する88.2Kと表示されます。
これは TuneBrowser でD-1のASIOドライバを指定し、2.8MのDSDデータを再生中の写真です。ASIOドライバを使うことにより、DSDネイティブ再生されますので、表示は左の2.8Mとなります。 ここまでは、何の謎もない仕様通りの表示がされています。
謎を呼ぶ事件は次の写真。
JPLAYminiでBulkPetドライバを指定し、2.8MのDSDデータを再生中の写真です。DoP再生ですから、本来二つ上の88.2Kと表示されるはずなのですが、一つ上のDSDネイティブ再生の2.8M表示になっています。
あららら。事件です。早速、JPLAYの日本語掲示板に駆け込み、質問してみました。
お答えは『JPLAYはDSDということで特別な処理は行っていない。現在のバージョンではDSDネイティブ再生は出来ない。DACがDoP対応していて、プレーヤ側がDoP変換したデータを、送ってくれば、そのままUSBに送ることにより、DSD再生はされる。従って、この場合はDoP再生の表示になるはずである。DSDネイティブ再生の表示になるということは考えられない。ドライバがおかしいか、DACの表示ミスではないか。』というものでした。
「DACの表示ミス」については、その前の三つの写真が正しく表示されていること。Linux(LightMPD)でも同じように表示されていること。からなさそうです。
従って「ドライバがおかしい(^^;;;」ということになります。
BulkPetドライバがバルク転送するため「おかしな」処理をしているように見えるということは十分ありそうです。しかし、何故、JPLAYだけ特別扱いするのか。
DoP転送で88.2KHz表示されることはPlayPcmWinでも確認しています。このプログラムも、JPLAYと同じく、DoP転送にしか対応していませんので、何故、BulkPet ドライバがこういう依怙贔屓(?)をするのか不思議です。
上の写真は、JPLAYSettingでBulkPet ドライバを指定し、JPLAYminiを使って表示させたものですが、TuneBrowserやPlayPcmWinを使い、ドライバとしてJPLAY Driverを指定し、DSDデータを再生させた場合もネイティブ表示(2.8M)となります。この場合は再生のエンジンはJPLAY Deiverとなりますから、ネイティブ表示(2.8M)となったと考えられます。つまり、依怙贔屓の度合い(?)はここまで徹底、首尾一貫しているということになります。
BulkPet ドライバからみて、JPLAYとそれ以外のプレーヤの違いはデータの受け渡しにJPLAYのサウンドエンジンを通っているかどうかですね。多分、BulkPet ドライバはJPLAYのサウンドエンジンからデータを受けた時、何らかの問題を回避するため、特別な処理を行っているのでしょう。結果としてDSD再生の表示が異なることになるのだと思います。「Force 24 Bit」を指定しないと駄目な理由もこのあたりありそうです。
ここで、ちょっと思い出したことがあるので、補足します。
BulkPet ドライバを入れる前にD-1を鳴らす時は専用のドライバを使っていました。記憶では、この旧ドライバはASIO版、KS版、WASAPI版の三つがあり、WASAPI版はWin10 update のcreator versionでは動かないので、ASIO版、KS版を使っていました。どちらの版でもDSD再生はDoP表示(88.2K)されていたと思います。従って、JPLAYの日本語掲示板で頂戴したご返事とつじつまは合っています。
そして、ここからが謎解きのキモです。
BulkPet ドライバのインストール時にD-1のDDC部分のファームウェアの入れ換えも行っています。BulkPet ドライバのインストール後もASIO版のドライバは残っています(このドライバが古いもののままなのかは不明です)。このASIO版のドライバを指定して、DSD再生すると表示はネイティブ表示(2.8M)となります。BulkPet ドライバのインストール前、D-1ファームウェア更新前、同じASIO版のドライバを使った時、表示はDoP表示(88.2K)だったという記憶があることは既に書いた通りです。この記憶は確かだと思います。「あれれ、ASIO接続なのにネイティブ表示されないの。変だなぁ」と勘違いしたことがあったので。
つまり、BulkPet ドライバ対応のD-1ファームウェアがこの表示の混乱を引き起こした犯人ということになります。そして、BulkPet ドライバも共犯者ということになるのではないかと思います。
ドライバの内容について情報がないので、これ以上はわかりません。謎は残りますが、そのうちインターフェース社の名探偵が解明してくれることでしょう(^^;;;。
ということで、この件もこれ以上こだわる事は止めます。
次に、JPLAYでBulkPet ドライバを使った時のもう一つの謎です。というか、こちらは問題点といった方がいいかもしれない。
冒頭に「BulkPETドライバはデュアルモードでは動きます」と書きましたが、JPLAYStreamer+DualModeで再生を開始すると、その後、外部からの操作が一切出来ない状況となります。何を言っているかというと、タブレットから曲の演奏を開始した後、止めることが出来なくなります。どういう理由かわかりませんが、BulkPet ドライバとJPLAYがグルになり、曲の再生コントールに関するすべての割り込みを無視させるということをやっているようです。まあ、それでもいいよという考え方はありますが、うっかりマーラーの交響曲全曲など再生すると途中で止められませんので、悲惨なことになります。どうしても止めたければDACの電源を落とすしかないです(^^;;;。
JPLAYStreamer+SingleModeであればコントロールは効くのですが。何故こういう差別が発生するのか、原因は不明です。まあ、DualModeの負荷は関連していると思いますが。
DualModeの音はやっぱりいいですね。SingleModeと比較し、雲泥の差です。パソコンが二台必要。立ち上げるのが大変など、ハードルは高いですが、一度聴いてしまうと元に戻せなくなります(^^;;;。BulkPetドライバと組み合わせたDualModeの音はLinux LightMPDの二台モードに匹敵します。
問題はdlna接続によるタブレットの操作性が活かせないことです。回避方法としてはコントールPCをノートPC(Androidも使えると思います)からリモート接続するという荒っぽい手段があります。ネットワークに無用な負荷をかけることになり、オーディオマニアの顰蹙をかいそうな方法ですが、まあ仕方がない。「忠ならんと欲すれば、孝ならず」(何が忠で何が孝なのかしら)。ネットワークセグメントを分離するとか、光接続するとか、手を尽くし、リモート接続による悪影響を回避することにして、この方法で運用することにしました。
ところが、この方法も問題ありです。TuneBrowserやAIMPを使って、ドライバとしてJPLAY Driverを指定すると、リモート接続のウィンドウからプレーヤを動かすことが出来なくなります。これは、BulkPet ドライバの問題というよりは、リモート接続時の負荷の問題だと思います。TuneBrowserやAIMPはDualMode時のJPLAY Driver負荷にリモート接続処理が耐えられないということなのでしょう。DualMode で普通のプレーヤを使う場合はリモート接続は諦め、コントールPCにディプレイを繋いで、そこから操作するしかないです。
『DualMode&リモート接続でまともに動かせるプレーヤはJPLAYminiだけです。』と分かりました。『うーむ。前門の虎、後門の狼。』、やっぱり、JPLAYは御しがたいですね。
しかし、ここで諦めては、JPLAYという荒馬を乗りこなすことは出来ません。もう少し頑張ってみました。
ロック状態となる JPLAYStreamer+DualMode を条件を変えて、試してみました。
結局、DLNAサーバをコントロールPCにおけば、開始以外の操作を一切受け付けないという問題は回避できました。ロックはDualModeに伴うネットワーク負荷によって発生したようです。
徒然なるままに、ゴタゴタと書きつらねてきましたが、シングルモードではこういう問題は発生しません。まとめると下表の通りです。
JPLAY Streamer | JPLAY Driver | JPLAYmini | |
---|---|---|---|
SingleMode | ◎ | ◎ *1 | ◎ *1 |
DualMode | △ *2 | ○ *3 | ◎ *1 |
*1 リモート接続でも問題はありません。
*2 DLNAサーバをコントロールPCに置く必要があります。
*3 リモート接続は出来ません。操作はDisplayを接続し、行う必要があります。
BulkPet ドライバを使った時のJPLAY音の傾向は JPLAY Streame、JPLAY Driver、JPLAYmini のいずれでも同じです。多少の解像度やクリアさの差はありますが、BulkPetモードでは isochroousモードにたいし、どの場合もも解像度の高い、リアルな音がします(JPLAY Streame≒JPLAYmini>JPLAY Driveという感じですかね)。
また、BulkPet ドライバの4つのモードのどれが良いかはオーディオ環境次第だと思います。
というわけで、JPLAYminiを使ったデュアル構成のBulkPetドライバの音はLinux APU構成の音を上回るという感じなので、節操なくこちらをメインのプレーヤに代えることにしました。「さらば、Linux (^^;;;」といいきたいところなのですが、I2S接続とか、NAS用とかあり、まだサラバには早いようです。
グローバルには高音質のDDCというとXMOSチップを使ったものが大半ですが、BulkPet ドライバによるインターフェース社のDDC基板は十分対抗出来る音質だと思います。
インターフェース社の企業情報をみると、1984年創業とあります。企業規模などは創業時とあまり変わっていないようですから、無理に規模拡大しないで、自社技術を活かして頑張っている会社という感じですね。XMOSチップを使った欧州、中華DACの海外勢に対抗して、是非頑張ってもらいたいものです。
(PC_Audio) 2018/07/28
JPLAY 再び
ネットで見るとJPLAYがWindowsハイエンド派のメイジャーなプレーヤになっているようですね。僕がJPLAYの紹介記事を書き始めたころはマイナーな存在だったので、2年ちょっとで大きく様変わり。感慨深いです。
現時点で僕はメインのプレーヤ(レンダラーのことです)は
環境 | レンダラー |
---|---|
オーディオルーム(SoulNote D-1 usb接続) | apu2c4+apu1c2 lightMPD-v1.0.2 |
パソコン部屋(aitlabo i2s接続) | apu1c2(lightMPD-v1.0.2)+BBG(BB用 Boticized lightMPD UPnP版自作) |
となっていて、JPLAYを紹介はしましたが、メインのプレーヤとしては使っていませんでした(^^;;;。 理由はD-1はWindowsで鳴らすとLinuxと比較して、いまいちの音だったからです。
しかし、今年になってから、昨年秋にバルク転送の新ドライバが出たことも知りました。このドライバはとても音が良く、Linux環境に匹敵する音が出ます(音のキャラクターは違いますが)。前回紹介したようにこのドライバが JPLAYでも動くと知り、JPLAYを復活させることにしました。
ところが、僕の環境ではBulkPETドライバはデュアルモードでは動かないので、どうしたものかと思案。JPLAYmini を使うとデュアルモード並の高音質で再生できると分かり、これを使うことにしました。
JPLAYmini で再生中のバソコン画面です。ご覧の通りそっけないです。まあ画面をみながら聴いているわけではないので、これで十分。
JPLAYMINIはトラブル時の切り分け用に開発されたプログラムのようですが、シンプルな作りから音の良さには定評があります。 再生開始時にコピーされたデータをバッファに読み出すため若干の待ち時間が発生しますが、僕には許容範囲です。問題はディフォルトのバッファサイズが256KBなこと。このサイズではDSDファイルのちょっと長い曲などは再生不能となってしまいます。どうしたものかなと、JPLAYの掲示板で質問したら、管理人さんに「cキーを押すことで拡張できるよ」と教えてもらいました。このことは、開始画面で解説されていますね(上の画面をご覧ください)。プログラムの出力メッセージはちゃんと読まないといけないという典型的な例ですね(^^;;;。
JPLAYの掲示板(英文)を探すとJPLAYminiのサポートプログラムがいくつか紹介されています。
- A small program to send tracks to JPLAYmini with one click
- 右クリックでSendToJPLAYMINIを指定できるようにするユーティリティ。エクスプローラーで再生したいファイルを表示させ、右クリック一発でJPLAYMINIに渡せるので、便利です。シフトキーを使い、複数のファイルをまとめてSendToさせることもできます。
- Jplaymini with JRMC or Foobar using an AutoHotKey script
- AutoHotKeyを使いJRMC/FoobarからJPLAYminiを呼び出すことの出来るスクリプトです。選曲はJRMC/Foobarを使えるので、それらのプログラムの愛用者にはいいのかもしれません。
- I ‘ve made my playlist editor for JPLAYmini available to whomever has use for it
- m3u形式のプレイリストを作成するJAVAプログラムです。JPLAYMIN専用という訳ではありません。作成したm3uファイルをJPLAYminiのアイコンにドラッグ&ドロップすれば、曲を思い通りの順番で再生できます。flacのタグ情報を利用した編集機能やネットワーク対応もされていますので、便利です。
僕が使っているのは最初の「send tracks to」だけですが、これで十分ですね。JPLAYMINIのHibernate Modeでの音の良さについては定評があります。PC一台でも音楽再生専用機にしてしまい、この形で動かせば、デュアルモードに匹敵する高音質にできます。リモートデスクトップ機能を使い、手元のノートPCから専用機に入り操作するという方法をとれば、不自由なく操作できます。お勧めです。
P.S. soulnote社バルクペット対応のドライバを最新のものに入れ換えたらこんな画面が出てきました。
「あれれ、JPLAY対応しているみたい。どうなっているのかしら」とネットで調べましたが、soulnote社にも、インターフェース社にも情報はなし。バージョン番号はVersion1.0.16.63 built 06/18/2018とあります。
ちょっと、こわかったですが(^^;;;、使ってみました。 ちゃんと音は出ます。バルクペットとはかなり傾向の異なる音で、高解像度のスッキリした、Linuxで聴ける音に近いです。曲によっては、これも悪くないので、正体は不明ですが、愛用しています。
JPLAYSettingで登録する時、「Force 24 Bit」を指定しないといけないのはバルクペットモードといっしょですね。ということは、JPLAYに対してはバルクペットモードとして動いているようにみえますが、謎です。
国内メーカーがこういう対応をするようになったということは、JPLAYもハイエンドプレーヤとして認知されるようになってきたということですかね。
まだ、ちょっと怪しい世界ですが、D-1 or D-2をお持ちで、勇気のある方(^^;;;はお試しを(もちろん自己責任です)。
しかし、D-2ユーザはこのドライバを使うしかないのだろうから、勇気もなにもありませんね(^^;;;。soulnote(CSR)社からしかるべき説明が必要だと思います。
もう一つ中断前に書きかけの記事をこの記事の前にアップしておきました。こちらはArchLinuxのボタン一発での電源断方法に関するものです。この方法はunionfs-fuseを使うので、正攻法ではありません。性能面でも余分な負荷を常時かけていることなるので、音質面での懸念もあります。ただ、僕の環境ではunionfs-fuseしたため音が悪くなったという感じはしなかったので、公開しておきます。
(PC_Audio) 2018/07/21
arch linux でUPnP(7)
次に、電源のオフを簡単に行うため、UPnPシステムをrom化する方法。
僕は「パソコンの電源のオフは手順通りやるのがあたりまえ。shutdownコマンドを使わないで電源をオフにするとは狂気の沙汰」という意見の持ち主ですが、タンデム方式のプレイヤー側は電源スイッチで電源オフに出来ないのはさすがに不便ですね。というわけで、主義を曲げて、システムをrom化する方法を調べてみました。
ググると情報はいろいろありますね。使えそうなものをピックアップしました。
- Raspberry Pi 3のリードオンリー化
- teratailというQ&Aサイトの書き込みです。質問者によるまとめとQ&Aやりとりが参考になります。
UnionFS方式、aufs+fsprotect方式、Read-only Root-FS方式の三つが評価の対象になっています。 - Raspbian OSのSDカードをリードオンリー化する
- overlayfs方式を解説しているサイト。
- Raspberry Piで OverlayFS (組み込み向け設定・スクリプト)
- overlayfs方式の解説サイト。丁寧に解説されているので、分かりやすいです。
- Setting up overlayFS on Raspberry Pi
- overlayfs方式のご本家。
- ラズパイをROM化する
- aufs+fsprotect方式の解説サイト。情報はちょっと古いですが丁寧に解説されています。
- Raspberry PiをReadOnlyにしてファイルシステム保護!
- aufs+fsprotect方式の解説サイト。情報はちょっと古いです。
- josepsanzcamp/root-ro
- Read-only Root-FS方式のご本家。
すべて、raspbianなどdebian系列のディストリビューションが対象です。そのまま arch linux には適用できません。いくつか試してみまたが、そのまま動く方法はありません。また、一部手順をarchに合わせても、ro化は出来るが、mpdが立ち上がらなくなるなど、綺麗に上手くいくものはありませんでした。カーネルのビルドなど、手間が大変なもの(aufs+fsprotect方式)もあり、結局どれも使えません。
という訳で、「困ったなぁ」と思って検索を続けていたら、身近な方のサイトに有力な情報がありました。moctさんのサイトの掲示板にあるunionfs-fuseを使う方法です。BB用のRO化ですが、そのままR-PIにもってくることができます。
unionfs-fuse については一番はじめのリンクで紹介されていますが、うまくいかないという結論だったので、それ以上調べなかったのですよね。盲点でした。
調べたら情報はあっちこっちにあります。ディストリビューションや機種に関係なく使えるようですね。
- BeagleBone (Green) で Read-only な環境を作る
- PINE64にunionfs-fuseでRead-Onlyな環境を作る
- Make Raspbian System Read-Only
三つのリンク先のro化の方法はいっしょです。
mount_unionfsというスクリプトを作成し、実行権を付けます。
pacman -S unionfs-fuse nano /usr/local/bin/mount_unionfs 新規ファイル #!/bin/sh DIR=$1 ROOT_MOUNT=$(awk '$2=="/" {print substr($4,1,2)}' < /etc/fstab) if [ $ROOT_MOUNT = "rw" ] then /bin/mount --bind ${DIR}_org ${DIR} else /bin/mount -t tmpfs ramdisk ${DIR}_rw /usr/bin/unionfs -o cow,allow_other,suid,dev,nonempty ${DIR}_rw=RW:${DIR}_org=RO ${DIR} fi chmod +x /usr/local/bin/mount_unionfs
次にfstabをmount_unionfsを使ってリードオンリーでマウントするよう書き換えます。
nano /etc/fstab # # /etc/fstab: static file system information # # file system dir type options dump pass #/dev/mmcblk0p1 /boot vfat defaults 0 0 #//192.168.0.35/public /music cifs username=,password=,sec=ntlm,uid=mpd,file_mode=0666,dir_mode=0766,iocharset=utf8,rsize=130048,wsize=4096,noauto,x--systemd.automount 0 0 /dev/mmcblk0p1 /boot vfat ro,noatime,errors=remount-ro 0 1 /dev/mmcblk0p2 / ext4 ro,noatime,errors=remount-ro 0 1 mount_unionfs /etc fuse defaults 0 0 mount_unionfs /var fuse defaults 0 0
/etcと/varのバックアップとマウント用ディレクトリを作成します。
cp -al /etc /etc_org mv /var /var_org mkdir /etc_rw mkdir /var /var_rw
以上の作業後、再起動すればシステムはリードオンリー化されています。
[root@alarmpi ~]# df -h Filesystem Size Used Avail Use% Mounted on dev 463M 0 463M 0% /dev run 470M 324K 470M 1% /run /dev/mmcblk0p2 6.9G 5.9G 697M 90% / tmpfs 470M 0 470M 0% /dev/shm tmpfs 470M 0 470M 0% /sys/fs/cgroup tmpfs 470M 0 470M 0% /tmp ramdisk 470M 36M 435M 8% /var_rw ramdisk 470M 80K 470M 1% /etc_rw unionfs 7.4G 7.0G 435M 95% /var unionfs 7.4G 6.9G 470M 94% /etc /dev/mmcblk0p1 100M 61M 39M 62% /boot tmpfs 94M 0 94M 0% /run/user/0
起動後、こんな感じになっているはずです。
一時的にwriteできるようにするには
mount -o remount,rw /
具体的な使い方は
systemctl stop minidlna minidlnad -R mount -o remount,rw / cp /var/cache/minidlna/files.db /var_org/cache/minidlna/files.db
という感じですね。
参考までに、minidlnaのDB更新方法はここにあります。
最後にroモードの解除方法。roモードにする逆をやればよいだけですね。
mount -o remount,rw / nano /etc/fstab cp /etc/fstab /etc_org/ reboot rm -rf /var mv /var_org /var reboot [root@alarmpi ~]# ls /var cache empty lib lock mail opt spool db games local log mymusic run tmp [root@alarmpi ~]# df -h Filesystem Size Used Avail Use% Mounted on dev 463M 0 463M 0% /dev run 470M 364K 470M 1% /run /dev/mmcblk0p2 6.9G 6.1G 481M 93% / tmpfs 470M 0 470M 0% /dev/shm tmpfs 470M 0 470M 0% /sys/fs/cgroup //192.168.0.11/CD 1.4T 1.2T 91G 94% /music tmpfs 470M 0 470M 0% /tmp /dev/mmcblk0p1 100M 70M 30M 71% /boot tmpfs 94M 0 94M 0% /run/user/0 nano /etc/fstab # /etc/fstab: static file system information # # file system dir type options dump pass #/dev/mmcblk0p1 /boot vfat defaults 0 0 #//192.168.0.35/public /music cifs username=,password=,sec=ntlm,uid=mpd,file_mode=0666,dir_mode=0766,iocharset=utf8,rsize=130048,wsize=4096,noauto,x--systemd.automount 0 0 /dev/mmcblk0p1 /boot vfat ro,noatime,errors=remount-ro 0 1 /dev/mmcblk0p2 / ext4 ro,noatime,errors=remount-ro 0 1 mount_unionfs /etc fuse defaults 0 0 mount_unionfs /var fuse defaults 0 0 cp -al /etc /etc_org mv /var /var_org mkdir /var
(PC_Audio) 2017/10/28
JPLAYで BulkPetドライバを接続する方法
ネットにはJPLAYでは BulkPetドライバを使えないという情報がありますが、これは誤りです。
僕の環境(SOULNOTE D-1)では以下の方法で接続し、使っています。
「JPLAYSettingのPlaying via:」のメニューで「WASAPI: SOULNOTE D-1 USB Audio(Bulk)」を選んで、「Bitstream」を「Forced 24 Bit」を指定すると動きます(ただし、デュアルモードではドライバのエラーで演奏できないというメッセージが出て、再生不能です)。
OSはWindows10のCreators versionです。
コントロールパネルのSOULNOTE D-1 USB Audio Control PanelからBulkPetの4つのモードは全て選択可能で問題なく音が出ます。
このあたり試しにやってみたら出来たというレベルなので、どういう理屈なのかはよく分からないのですが。
同じ内容をJPLAY掲示板に書き込んでいます。あそこはJPLAY正規ユーザ以外はアクセス出来ないので、ここに書き込んでおきます。
しばらく書き込みを中断していましたが、再開するつもりです。
中断前に書きかけの記事をこの記事の前(後?)にアップしておきました。RaspberryPI+ArchLinuxを使ってデュアル構成する時の参考になると思います。
ところで、再開しなかった理由は、掲示板にも書き込みましたが、
『最近、ブログの更新をする気にならない理由は、TEAC NT-505、IOデータ Soundgenicといったネットワーク関連の新製品が登場してきて、これらを使えば十分という感じになってきたのが大きいです。苦労して、Linuxと格闘するより、金で解決という安易な方法ですが、まあそれなりに使えそうなネットワーク機器が次々と登場。楽を出来そうというのは歓迎ですね。』
というところです。
IOデータ Soundgenic はfidata社の製品の廉価版のようですね。このfidata社製品、ネット上での評判は悪くないです。調べたら(逸品館の比較試聴ページ)、こんな構成らしい。
なるほど。ARMアーキテクチュアだったわけですか。僕が最初に使ったSOCはMarvell社Sheevaですから、いろいろ感想はあるのですが・・・。
(PC_Audio) 2018/07/16
arch linux でUPnP(6)
ここまでの内容でスタンドアロンシステムは完成しました。次にこれをタンデム型のアダプターとプレーヤにする方法を紹介します。
その前に、ここまでで作成したスタンドアロンシステムのイメージを公開しておきます。8月頃の latest をベースにカーネルを最新化させています。開発環境はそのまま残してありますので、自由に弄るのに使えるかと思います。dhcpを使っていますので、rpiarch.local でsshログインできます。ユーザ名、パスワードは root;root です。
また、GUIなどは一切無しの Raspberry-PI 2/3用のdlna対応のレンダラーとして使えるかと思います。DLNAネットワークがどの位一般的になっているのかよく分からないのですが、DLNAレンダラーとしてDHCP対応していますので、同じネットワークに繋がったサーバ(dlna対応のnas)とコントロールポイント(ipadかandroid端末、パソコンでもよい)があれば、設定ゼロで動きます。mpdをGUIを使って設定するより、接続は簡単です。
また、システムをROM化してしまえば、改造する時の使い勝手は悪くなりますが、電源のon/offも気を使わずに済みます。ROM化の方法はfstabをみれば、分かるかと思います。
ダウンロードはこちらのページからどうぞ(UPnP版のBoticized lightMPDも同じページからダウンロード出来るようにしました)。
8/11追記 申し訳ありませんが、イメージの公開はしばらく見合せます。ダウンロード用に用意したディレクトリの中身を紛失してしまったものですから(^^;;;。
本題に戻ります。上記のスタンドアロンシステムをベースにして、タンデム構成のプレーヤとアダプターを作成します。
まず、プレーヤにする方法。簡単です。
参考にした情報はここ(Archlinux 固定IPの設定)です。 不要なサービスを停止します。
[root@alarmpi ~]# systemctl stop upmpdcli.service [root@alarmpi ~]# systemctl disable upmpdcli.service Removed /etc/systemd/system/multi-user.target.wants/upmpdcli.service. 以下は必要なら [root@alarmpi ~]# systemctl stop samba.service [root@alarmpi ~]# systemctl disable samba.service [root@alarmpi ~]# systemctl stop smbd.service [root@alarmpi ~]# systemctl disable smbd.service Removed /etc/systemd/system/multi-user.target.wants/smbd.service. [root@alarmpi ~]# systemctl stop nmbd.service [root@alarmpi ~]# systemctl disable nmbd.service Removed /etc/systemd/system/multi-user.target.wants/nmbd.service. [root@alarmpi ~]# systemctl stop minidlna.service [root@alarmpi ~]# systemctl disable minidlna.service Removed /etc/systemd/system/multi-user.target.wants/minidlna.service.
プレーヤ側でsambaやminidlnaを動かすわけがないので、全部やった方がいいでしょうね。 次に固定アドレスを設定します。
nano /etc/systemd/network/eth0.network [Match] Name=eth0 [Network] #DHCP=yes DHCP=false #Address=192.168.0.41/24 #Gateway=192.168.0.1 #DNS=192.168.0.1 Address=10.0.0.2 Netmask=255.255.255.252 Gateway=10.0.0.1 DNS=10.0.0.1 # domain=mydomain.jp
polipoはlightmpdと同じような設定になります。
nano /etc/polipo.conf ### for standalone from here proxyAddress = 127.0.0.1 allowedClients = 127.0.0.1 parentProxy = 10.0.0.1:8123 # allowedClients=127.0.0.1 chunkHighMark=671088640 chunkLowMark=100663296 chunkCriticalMark=536870912 objectHighMark=256 # dnsQueryIPv6 = no cacheIsShared = false dnsUseGethostbyname = yes disableConfiguration = true disableIndexing = true disableLocalInterface = true # # dnsNameServer = "192.168.0.1" dnsNameServer = "10.0.0.1" diskCacheRoot = "/var/cache/polipo/" forbiddenFile = "forbidden" diskCacheRoot = "" dnsQueryIPv6 = no
telnetで入れるようにします(必須ではない)。
参考にした情報はTelnet(arch linux)です。
ユニットを使うことに関してはこちら。
nano /etc/xinetd.d/telnet disable = no systemctl enable telnet.socket systemctl is-enabled telnet.socket systemctl start telnet.socket systemctl status telnet.socket
以下の通り設定すれば、ro化出来ます(理屈については次回紹介するつもりです)。
nano /etc/fstab # /etc/fstab: static file system information # ##/dev/mmcblk0p1 /boot vfat defaults 0 0 #//192.168.0.35/public /music cifs username=,password=,sec=ntlm,uid=mpd,file_mode=0666,dir_mode=0766,iocharset=utf8,rsize=130048,wsize=4096,noauto,x--systemd.automount 0 0 /dev/mmcblk0p1 /boot vfat ro,noatime,errors=remount-ro 0 1 /dev/mmcblk0p2 / ext4 ro,noatime,errors=remount-ro 0 1 mount_unionfs /etc fuse defaults 0 0 mount_unionfs /var fuse defaults 0 0 cp -al /etc /etc_org mv /var /var_org mkdir /etc_rw mkdir /var /var_rw
アダプタにする方法。同じ理屈ですから、これも簡単です。
アダプタとプレーヤの接続方法はr-piのusbの実力を考慮し、シングルラインモードとします。
usb-erther変換アダプタ側をインタネット接続にして、erther-ertherで対抗接続します。
nano /etc/systemd/network/eth0.network [Match] Name=eth0 [Network] #DHCP=yes DHCP=false #Address=192.168.0.41/24 #Gateway=192.168.0.1 #DNS=192.168.0.1 Address=10.0.0.1 Netmask=255.255.255.252 Gateway=10.0.0.1 DNS=10.0.0.1 # domain=mydomain.jp nano /etc/systemd/network/eth1.network [Match] Name=eth1 [Network] DHCP=yes
confファイルの設定はlightmpd準拠ですね。
nano /etc/polipo.conf ### for standalone from here # allowedClients=127.0.0.1 proxyAddress = 0.0.0.0 allowedClients = 10.0.0.2 chunkHighMark=671088640 chunkLowMark=100663296 chunkCriticalMark=536870912 objectHighMark=256 # dnsQueryIPv6 = no cacheIsShared = false dnsUseGethostbyname = yes disableConfiguration = true disableIndexing = true disableLocalInterface = true nano /etc/upmpdcli.conf upnpiface=eth1 #mpdhost=localhost mpdhost=10.0.0.2 mpdport=6600 friendlyname=r-pi_arch ohproductroom=r-pi_arch openhome=1 ohmetapersist=1 logfilename=/var/log/upmpdcli.log loglevel=3
mpdの起動をとめます。
nano /etc/rc.local #/usr/local/bin/mpd --no-daemon /etc/mpd.conf # 以下は必要なら [root@alarmpi ~]# systemctl stop samba.service [root@alarmpi ~]# systemctl disable samba.service [root@alarmpi ~]# systemctl stop smbd.service [root@alarmpi ~]# systemctl disable smbd.service Removed /etc/systemd/system/multi-user.target.wants/smbd.service. [root@alarmpi ~]# systemctl stop nmbd.service [root@alarmpi ~]# systemctl disable nmbd.service Removed /etc/systemd/system/multi-user.target.wants/nmbd.service.
ro化したければ、以下の通り操作。
nano /etc/fstab # /etc/fstab: static file system information # ##/dev/mmcblk0p1 /boot vfat defaults 0 0 #//192.168.0.35/public /music cifs username=,password=,sec=ntlm,uid=mpd,file_mode=0666,dir_mode=0766,iocharset=utf8,rsize=130048,wsize=4096,noauto,x--systemd.automount 0 0 /dev/mmcblk0p1 /boot vfat ro,noatime,errors=remount-ro 0 1 /dev/mmcblk0p2 / ext4 ro,noatime,errors=remount-ro 0 1 mount_unionfs /etc fuse defaults 0 0 mount_unionfs /var fuse defaults 0 0 cp -al /etc /etc_org mv /var /var_org mkdir /var
(PC_Audio) 2017/10/28
arch linux でUPnP(5)
前々回、カーネルビルドで組み込んだi2s接続のドライバの一覧を紹介しました。凄い数ですね。現在出回っているi2s接続のボードのほとんどはカバーされているのではないかと思います。i2sドライバーって機種依存するはずですから、これでは他のSOCが追いつくのは絶望的という感じになりますね。
さて、このドライバを arch linux システムに組み込む方法です。
簡単です。参考にした情報はこちら(ENABLING I2S DACS AND DIGITAL OUTPUT BOARDS)。
二つの設定ファイルを修正すればいいです。
nano /etc/modules-load.d/raspberrypi.conf snd-bcm2835 をコメントアウト #snd-bcm2835 nano /boot/config.txt device_tree_overlay=hifiberry-dac を適当に設定
I/O schedulerの選択
ディフォルトをカーネルで設定する方法については(3)にご紹介しました。
ここではそれを変更する方法。まず、ブート時点での変更方法です。参考にした情報はこちら。
/boot/cmdline.txt の elevator というパラメータで指定できます。
The default disk scheduler is cfq. It implements Completely Fair Queuing and is a non optimal choice for flash based block devices. The common choice is using the noop or deadline scheduler by adding the elevator parameter to the kernel command line (/boot/cmdline.txt):
以下の通りにすれば良いようです。
elevator=cfq elevator=noop elevator=deadline
ブート後でも変更可能でその場合は /sys/block/mmcblk0/queue/scheduler に書き込めばいいようです。
echo "noop" | sudo tee /sys/block/mmcblk0/queue/scheduler
symphonic mpd は /etc/rc.local を使って、この方法で対応していますね。
本題に戻ります。polipo、libupnpp、upmpdcli のインストール。
ソースコードをダウンロード。それぞれgitを使います。
pacman -S git git clone git://github.com/jech/polipo git clone https://@opensourceprojects.eu/git/p/libupnpp/code libupnpp-code git clone https://@opensourceprojects.eu/git/p/upmpdcli/code upmpdcli-code
polipoにdigififanさんのパッチをかけることをお勧めします。パッチをかけることで、UPnP接続専用化させることができるようです。digififanさんのパッチのありかにつてはこの記事を参照。
cp /music/sdd/CD/buildroot-polipo-v2.4.tgz ./ tar zxvf buildroot-polipo-v2.4.tgz cd polipo patch -p1 < 0001-lightmpd-v2.4.patch
polipoの場合、configureが無いので、最適化オプションはMakefileにかけます。
export OPT="-march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ffast-math -ftree-vectorize -funsafe-math-optimizations" nano Makefile CDEBUGFLAGS = -O2 -Wall -fno-strict-aliasing ${OPT} make && make install cd ../
libupnppとupmpdcliのビルドです。最適化オプションはconfigureで設定します。exportの内容はpolipoと変わりますので、要注意です。
export OPT="-O2 -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ffast-math -ftree-vectorize -funsafe-math-optimizations" cd libupnpp-code/ ./autogen.sh ./configure --prefix=/usr --sysconfdir=/etc CFLAGS="${OPT}" CXXFLAGS="${OPT}" make && make install cd ../ cd upmpdcli-code/ pacman -S libmicrohttpd jsoncpp ./autogen.sh ./configure --prefix=/usr --sysconfdir=/etc CFLAGS="${OPT}" CXXFLAGS="${OPT}" make && make install cd ../
これでインストールは完了です。
次にそれぞれのソフトの設定です。
useradd -G root upmpdcli useradd -G root polipo nano /etc/polipo.conf ### for standalone from here allowedClients=127.0.0.1 chunkHighMark=671088640 chunkLowMark=100663296 chunkCriticalMark=536870912 objectHighMark=256 # dnsQueryIPv6 = no cacheIsShared = false dnsUseGethostbyname = yes disableConfiguration = true disableIndexing = true disableLocalInterface = true # dnsNameServer = "192.168.0.1" diskCacheRoot = "/var/cache/polipo/" forbiddenFile = "forbidden" diskCacheRoot = "" dnsQueryIPv6 = no
polipoの設定ファイルのチューニングに関しては、次の2つのサイトを参考にして下さい。
nano /etc/upmpdcli.conf upnpiface=eth0 mpdhost=localhost #mpdhost=10.0.0.2 mpdport=6600 friendlyname=r-pi_arch ohproductroom=r-pi_arch openhome=1 ohmetapersist=1 logfilename=/var/log/upmpdcli.log loglevel=3 #iconpath = /var/lightMPD/bin/miero.jpg nano /usr/lib/systemd/system/upmpdcli.service [Unit] Description=UPnP Renderer front-end to MPD After=network.target [Service] Type=simple # Note: if start fails check with "systemctl status upmpdcli" ExecStart=/usr/bin/upmpdcli -c /etc/upmpdcli.conf # For some reason, the first start of libupnp fails. Probably this should # be started later in the start sequence, but I don't know how. Retry a bit # later. Restart=always RestartSec=1min [Install] WantedBy=multi-user.target nano /usr/lib/systemd/system/polipo.service [Unit] Description=Polipo Proxy Server After=network.target [Service] ExecStart=/usr/local/bin/polipo -c /etc/polipo.conf User=polipo PrivateDevices=yes [Install] WantedBy=multi-user.target systemctl --system daemon-reload systemctl enable polipo.service systemctl enable upmpdcli.service
ここまでで、スタンドアロンモードで動くUPnPシステムが完成します。
(PC_Audio) 2017/10/21
gccの最適化オプション
前回、symphonic-mpdを紹介しましたが、このソフトの特徴の一つは「ラズパイ3向けの最適化オプションでビルド」です。以下、ご本家トップページから引用します。
- Kernelをラズパイ3向けの最適化オプションでビルド
- mpdをラズパイ3向けの最適化オプションでビルド
- shairport-sync(AirPlay)をラズパイ3向けの最適化オプションでビルド
- alsa-libをラズパイ3向けの最適化オプションでビルド
- libFLACをラズパイ3向けの最適化オプションでビルド
特徴として24項目あるのですが、そのうち5項目が最適化オプションの使用です。また、初版公開後に WAV/ALAC/AAC/mp3コーデックの再ビルドされた修正も試験公開されています。
というわけで、「どんな最適化をされているのかな」と興味をもって、サイトを拝見していました。
同じタイミングでネット仲間から、
lightmpdのbbb(bbg)向けの公開されているbuildrootのソースを見ていただくと わかるのですが、/package/mpd-native-dsd/mpd-native-dsd.mkでは、CFLAGS, CCFLAGSが設定されているんですよね。buildrootでシステム全体に最適化オプション をかける場合、make menuconfigで、Toolchain-->Target Optimizationsのところに CFLAGSを設定したらいいはずなんですが,これをやりますとビルドが通らないんです。 digififanさんもここには、-O2しか入力されてません。 そこで、音楽再生に使われるものだけ最適化オプションをかけてビルドしてみたところ あっさりビルドは通りました。そして、出てきた音は、lightmpd1.04では聴けなかった音 でした。これに感動してしまったため音楽を聴きなおすことに忙しくなり、、、というのが 私の近況です。パパリウスさんもalsa-libなどを最適化オプションでビルドなんてうたって ますので、こういう基本的なことを失念していたことは、恥ずかしいの一言です。
というメールを頂戴しました。
これは試してみないわけにはいきません。というわけで、「arch linux でUPnP」は一回お休みして、脱線します。前回も、実質、脱線ですから、脱線続き。どこにたどり着くことやらですが、まあ仕方がないですね(^^;;;。
まず、情報のありか。
- ご本家マニュアル(ARM Options)
- GCC compiler optimization for ARM-based systems
- Best Compilation Flags for RPi3 on Raspbian 32 bit?
- 1.7 -ffast-math(ARM コンパイラ armclang リファレンスガイド)
- 1.27 -mfloat-abi(ARM コンパイラ armclang リファレンスガイド)
- PDF版ARM コンパイラ armclang リファレンスガイド
- ARM FPU (VFP/NEON) の種類
- SIMDの組み込み関数のことはじめ
- MPDをソースコードからコンパイルしてPi 2 Pi 3に最適化する方法
というところですかね。他にもググればいくらでも情報は出てきますが、キリがないのでこの位にします。
ご本家マニュアル(一番目のリンク)を見ただけで、スイスイ出来ちゃうという方は相手にしないことにして(^^;;;、リンク先の解説です。
二つ目の「GCC compiler optimization for ARM-based systems」というページがコンパクトにまとまっていますので、お勧め。三番目の「Best Compilation Flags for RPi3 on Raspbian 32 bit?」は Raspbian掲示板サイトのやりとりですが、実践的なので、役に立ちます。
四番目と五番目のリンクはarm社が提供するcコンパイラのオプションの日本語解説ページです。六番目は同じサイトの内容をPDFファイルとしてまとめたものです。htmlページは読みやすいとはいいづらいので、htmlページでどこに情報があるか確認してPDFファイルで読むという方法をお勧めします。
七つ目の「ARM FPU (VFP/NEON) の種類」はARMアーキテクチュアマシンの FPU構成について綺麗にまとめたサイトです。目を通しておかれるとよいと思います。八番目の「SIMDの組み込み関数のことはじめ」はSIMD命令(amdの場合はneon)の最適化に関する解説です。
最後のリンク先はたかじんさんのサイトの記事ですが、以前にも紹介したことのあるmpdビルドの最適化オプションが記載されています。
ここでは、僕のネット仲間が使った最適化パラメータとたかじんさんの最適化パラメータから出発することにします。まず二つを紹介します。
僕のネット仲間が使った最適化パラメータ。NanoPi-NEO2用です。ハードは異なりますが、内容的にはr-pi3と同じということになります。
CFLAGS="-O2 -march=armv8-a -mtune=cortex-a53 -ffast-math" CXXFLAGS="${CFLAGS}"
たかじんさんの最適化パラメータです。r-pi3専用です。
CFLAGS="-O2 -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard" \ CXXFLAGS="-O2 -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard"
違いは『-ffast-math』と『-mfpu=neon-fp-armv8 -mfloat-abi=hard』です。
『-ffast-math』については四番目のリンク先に
このオプションを設定することで、強力な浮動小数点の最適化を実行するようコンパイラに指示します。 その結果、ISO C および C++ 標準に対して完全には準拠しない動作となります。ただし、数値的に頑健な 浮動小数点プログラムは正しく動作します。
とあります。「数値的に頑健な」とはナンジャホイですね。
-mfloat-abiについては、三番目のリンク先で
浮動小数点演算にハードウェア命令を使用するか、ソフトウェアライブラリ関数を使用するかを指定し、 浮動小数点パラメータおよび戻り値を渡すために使用するレジスタを指定します。
とあり、soft、softfp、hard が指定できます。r-pi3は hard を指定することができます。
-mfpuについては、同じサイトで
ターゲットの FPU アーキテクチャを指定します。これはターゲットで使用できる浮動小数点ハードウェアです。
とあり、armv8アーキテクチャを指定することになります。
まとめると、-ffast-math だけ指定すれば問題なさそうですが、よく分からない。とりあえず、全部入りにして試してみました。
./configure CFLAGS="-O2 -march=armv8-a -mtune=cortex-a53 -ffast-math -mfpu=neon-fp-armv8 -mfloat-abi=hard" CXXFLAGS="${CFLAGS}"
ビルドは問題なく通りましたので、これでいけそうです。
さて、次に、気になるのは、三番目のリンクでやりとりされている内容です。
スレッドを起こした MikeMelbourne さんが一番目(gccご本家のマニュアル)のリンクから拾いだしているのは
-O2 -Otime -marm -mabi=aapcs-linux -march=armv8-a+crc -mfloat-abi=hard -mfpu=neon-fp-armv8 #other options are 'fp-armv8', 'neon-fp-armv8', and 'crypto-neon-fp-armv8' -funsafe-math-optimizations -mhard-float -mlittle-endian -mtls-dialect=gnu2 #or just gnu if gnu2 doesn't work -mtune=cortex-a53 -munaligned-access -mvectorize-with-neon-quad #-ftree-vectorize (removed since Autovectorizing (-ftree-vectorize) for NEON gives between zero and negligible performance gains)
それぞれのオプションについてはご本家のインデックス(Option Index)から参照することもできます。+crcとcrypto-については MikeMelbourne さんが示しているリンク先(Raspberry Pi 3 (ARMv8/Aarch32, with CRC, without Crypto)))に記述があり、また、日本語ではちょっと古いですがここ(gcc 4.9でARMv8の暗号化命令を使うときのオプションメモ)に情報があります。
問題はこれらのリンク先を読んでみても、どれが必要でどれが不要なのかよく分からないことです(^^;;;。
試してみるしかないですね。
まず、minidlnaを使って確認します。途中のプロセスは省略して、結論となる結果だけ示しておきます。
オプションが無指定の時の結果です。
[root@rpiarch minidlna-1.1.6-dsd]# ls -l /usr/bin/minidlnad -rwxr-xr-x 1 root root 255352 Jun 1 08:20 /usr/bin/minidlnad
ここまでは、効果がありました。
[root@rpiarch minidlna-1.1.6-dsd]# ./configure CFLAGS="-O2 -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ffast-math -ftree-vectorize" CXXFLAGS="${CFLAGS}" [root@rpiarch minidlna-1.1.6-dsd]# ls -l minidlnad -rwxr-xr-x 1 root root 211444 Oct 10 12:48 minidlnad
あとは変化なしです。
[root@rpiarch minidlna-1.1.6-dsd]# ./configure CFLAGS="-O2 -marm -mabi=aapcs-linux -march=armv8-a+crc -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard -mhard-float -ffast-math -ftree-vectorize -funsafe-math-optimizations -mlittle-endian -munaligned-access -mvectorize-with-neon-quad -mtls-dialect=gnu2" CXXFLAGS="${CFLAGS}" [root@rpiarch minidlna-1.1.6-dsd]# ls -l minidlnad -rwxr-xr-x 1 root root 211444 Oct 10 11:51 minidlnad
mpdでも確認してみることにしました。
CFLAGS="-O2 -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ffast-math -ftree-vectorize -funsafe-math-optimizations" CXXFLAGS="${CFLAGS}" [root@rpiarch mpd-0.20.9]# ls -l /usr/local/bin/mpd -rwxr-xr-x 1 root root 2864012 Oct 6 05:34 /usr/local/bin/mpd
一行目はmyconfigの最終行です。
CFLAGS="-O2 -march=armv8-a+crc -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard -ffast-math -ftree-vectorize -funsafe-math-optimizations" CXXFLAGS="${CFLAGS}" [root@rpiarch mpd-0.20.9]# ls -l src/mpd -rwxr-xr-x 1 root root 2864012 Oct 10 23:13 src/mpd
+crcとcrypto-はmpdでも関係ないようですね。次に全部入りで試してみます。
CFLAGS="-O2 -marm -mabi=aapcs-linux -march=armv8-a+crc -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard -mhard-float -ffast-math -ftree-vectorize -funsafe-math-optimizations -mlittle-endian -munaligned-access -mvectorize-with-neon-quad -mtls-dialect=gnu2" CXXFLAGS="${CFLAGS}" [root@rpiarch mpd-0.20.9]# ls -l src/mpd -rwxr-xr-x 1 root root 2864012 Oct 10 23:56 src/mpd
minidlnaと同じ結果です。+crcとcrypto-は MikeMelbourne さんがこだわっていますが、関係ないようです。
従って、以下の通り環境変数を設定すれば、よさそうです。
export OPT="-O2 -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ffast-math -ftree-vectorize -funsafe-math-optimizations"
以下、ビルドの仕方。./configure のあるものは、たいていそこで設定できるはずです。ないものはMakefileを弄る方針でいきます。何をビルドするかも悩ましいですが、
- Alsalib(https://www.alsa-project.org/main/index.php/Download)
- Flac(https://git.xiph.org/?p=flac.git;a%3Dsummary)
- audiofile(https://github.com/mpruett/audiofile)
- libcurl(https://github.com/curl/curl)
を対象にしました。リンク先はダウンロードに関連するページです。mp3対応が抜けていますが、僕は使わないので、パス。
Alsalib
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.4.1.tar.bz2 tar xf alsa-lib-1.1.4.1.tar.bz2 cd alsa-lib-1.1.4.1 ./configure CFLAGS="${OPT}" CXXFLAGS="${OPT}" make && make install
Flac
git clone https://git.xiph.org/flac.git cd flac/ ./autogen.sh ./configure CFLAGS="${OPT}" CXXFLAGS="${OPT}" make && make install
audiofile。今のところ –disable-docs しないとビルドは通りません。
git clone --depth 1 https://github.com/mpruett/audiofile.git cd audiofile ./autogen.sh ./configure --disable-docs CFLAGS="${OPT}" CXXFLAGS="${OPT}" make && make install
libcurl
git clone --depth 1 https://github.com/curl/curl.git cd curl ./buildconf ./configure CFLAGS="${OPT}" CXXFLAGS="${OPT}" make && make install
mpd、upmpdcli、polipoもビルドします。polipoはconfigureが無いのでMakefileを修正して対応します。
cd polipo export OPT="-march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ffast-math -ftree-vectorize -funsafe-math-optimizations" nano Makefile CDEBUGFLAGS = -O2 -Wall -fno-strict-aliasing ${OPT}
効果の程はなかなかです。最適化オプションなしの状態と比較して、ヴェールを一枚剥いだという感じになります。r-pi3用の電源を良質なものに変えるのと同じような効果がありますね。これほどの効果があるOSのチューニングは初めて経験しました。
簡単に試せるので、お勧めします。
p.s. 私事ですが、一ヶ月位インタネットが出来ない環境になりますので、サイトの更新を中断します。また掲示板へのレスポンスも出来なくなります。ご了解よろしくお願いします。
(PC_Audio) 2017/10/21
arch linux でUPnP(4)
例によって脱線。
symphonic-mpdという rpi3-i2s接続専用の新しい音楽再生ディストリビューションを試してみました。内容についてはたかじんさんが適切に紹介されていますので、そちらを参照して下さい。
「『raspbian、nas接続、webコントロール』という三重苦(^^;;;のなかでも、作り込めば、これだけ素晴らしい音を出せるがでるのだなぁ」と感嘆しました。名前の通りコンサートホールの空気感がよく出ていますね。「VOLUMIOやMOODEの音じゃ満足できない? ラズパイ3には symphonic-mpd があるじゃない!」と作者が豪語されるだけのことはあると思いました。
ちょっと残念なのはi2s専用だということ。ガルバティック変換型フィルターを使えば、usb接続でもi2sに匹敵する音は出せますので、是非とも usb出力に対応してもらいたいです。
ご本家のサイトのトップページに「日本語」というボタンがあり、今のところ押しても無効なようです。十分にグローバル対応出来るソフトだと思います。usb出力も可能にして、海外に打って出てほしいですね。
このソフトrpi3専用ということですが、rpi2で動かすことができます。実は試聴はその状態で行いました。僕の rpi3は頑丈なオーディオ専用箱に入っていてi2s用の基板(TerraBerry)を付けることが困難だったので。
rpi2で動かすためには/boot/config.txtを以下の通り変更する必要があります。
# over clock #force_turbo=1 #arm_freq=1440 arm_freq=960
また、mpd.confはディフォルトの状態ではdsd再生に対応していません。こちらも手作業での追加修正が必要です。
さて、raspbian lite でもチューニング次第でこれだけの音が出せるとわかったので、『arch linux、dlna接続、luminコントロールポイント』で同じようにチューニングしたらどうなるか、試してみようと思いました。何をチューニングしたかは symphonic-mpd ご本家のサイトに記述があります。関係するものを取り出すと、
- 最適化オプションでビルド(kernel、mpd、alsa-lib、libFLAC)
- MPDの各スレッドにリアルタイム優先度と実行CPUを指定
- CPUのオーバークロック、GPUのアンダークロック
- プロセスマイグレーション等のカーネルスレッドによる割り込みの抑止
- カーネルパラメータのチューニング
- HDMI出力の停止
- Wifi、Bluetoothの停止
- LED消灯
- ALSAバッファのチューニング
というところですね。簡単に出来そうなものは試してみるつもりです。成果の程はこのシリーズの中でご紹介したいと思います。
脱線ついでに(^^;;;、関連しますので、前回のカーネルのビルドで紹介を省略していたチューニングについて解説します。
不要な機能の削除
ネットワーク関連
[*] Networking support ---> --- Networking support Networking options ---> [ ] Amateur Radio support ---- < > CAN bus subsystem support ---- < > IrDA (infrared) subsystem support ---- < > Bluetooth subsystem support ---- < > RxRPC session sockets < > KCM sockets [*] Wireless ---> --- Wireless < > cfg80211 - wireless configuration API *** CFG80211 needs to be enabled for MAC80211 *** < > WiMAX Wireless Broadband support ---- < > RF switch subsystem support ---- < > Plan 9 Resource Sharing Support (9P2000) ---- < > CAIF support ---- < > Ceph core library < > NFC subsystem support ---- < > Packet-sampling netlink channel ---- < > Inter-FE based on IETF ForCES InterFE LFB ---- [ ] Network light weight tunnels < > Network physical/parent device Netlink interface
要するに Networking options を除いて全て削除しています。Networking optionsはディフォルトのままです。
Bluetooth、Wireless も当然省かれます。
ドライバの削除
Device Drivers ---> Generic Driver Options ---> Bus devices ---> <M> Connector - unified userspace <-> kernelspace linker ---- <M> Memory Technology Device (MTD) support ---> -*- Device Tree and Open Firmware support ---> < > Parallel port support ---- [*] Block devices ---> < > NVM Express over Fabrics FC host driver < > NVMe Target support Misc devices ---> SCSI device support ---> < > RAID Transport Class < > SCSI device support < > Serial ATA and Parallel ATA drivers (libata) ---- [ ] Multiple devices driver support (RAID and LVM) ---- [*] Network device support ---> <*> USB Network Adapters ---> あった方がよいものをモジュール登録 [ ] Wireless LAN ---- < > IEEE 802.15.4 drivers ---- [ ] Wan interfaces support ---- 以外はディフォルトのまま
Generic Driver Options はディフォルトのままです。SCSI device support、Serial ATA and Parallel ATA drivers (libata)は削除しています。従って、USB HDは認識しません。
[ ] Open-Channel SSD target support ---- Input device support ---> Character devices ---> I2C support ---> [*] SPI support ---> < > SPMI support ---- < > HSI support ---- PPS support ---> PTP clock support ---> Pin controllers ---> -*- GPIO Support ---> < > Dallas's 1-wire support ---- [ ] Adaptive Voltage Scaling class support ---- [*] Board level reset or power off ---> -*- Power supply class support ---> <M> Hardware Monitoring support ---> <*> Generic Thermal sysfs driver ---> [*] Watchdog Timer Support ---> Sonics Silicon Backplane ---> Broadcom specific AMBA ---> Multifunction device drivers ---> [*] Voltage and Current Regulator Support ---> < > Multimedia support ---- Graphics support ---> Frame buffer Devices ---> < > OpenCores VGA/LCD core 2.0 framebuffer support <*> Sound card support ---> --- Sound card support <*> Advanced Linux Sound Architecture ---> --- Advanced Linux Sound Architecture < > Sequencer support < > OSS Mixer API < > OSS PCM (digital audio) API [ ] PCM timer interface <*> HR-timer backend support [ ] Dynamic device file minor numbers [ ] Support old ALSA API [*] Sound Proc FS Support [*] Verbose procfs contents [ ] Verbose printk [ ] Debug [ ] Generic sound devices ---- HD-Audio ---- <*> HR-timer backend support [ ] Dynamic device file minor numbers [ ] Support old ALSA API [*] Sound Proc FS Support [*] Verbose procfs contents [ ] Verbose printk [ ] Debug [ ] Generic sound devices ---- HD-Audio ---- (64) Pre-allocated buffer size for HD-audio driver [ ] ARM sound devices ---- [ ] SPI sound devices ---- [*] USB sound devices ---> <M> ALSA for SoC audio support ---> < > Open Sound System (DEPRECATED) ---- HID support ---> [*] USB support ---> [ ] OTG support < > Inventra Highspeed Dual Role Controller (TI, ADI, AW, ...) < > USB Gadget Support ---> < > Ultra Wideband devices ----
不要なものをだいぶ残しているような気がするが、そのままにしてあります。Multimedia supportのみ完全削除。
USB support の OTG supportは排除しました。理由は r-piのUSBの実力に限界があるので、OTG を削除した方が音には良いと考えたからです。異論もあるかと思いますが、プレーヤとして使う場合はethnet回線があれば、adapterとは繋がるので、usbは音源接続用に専用化すべし考えました。
その他、大幅にいじったのは Graphics support(HDMIの削除)、Sound card support(不要機能の削除とi2sモジュールの追加)、USB support(otg機能の追加) です。
<*> MMC/SD/SDIO card support ---> < > Sony MemoryStick card support ---- -*- LED Support ---> [ ] Accessibility support ---- [ ] EDAC (Error Detection And Correction) reporting ---- [*] Real Time Clock ---> [*] DMA Engine support ---> DMABUF options ---> [ ] Auxiliary Display support ---- <M> Userspace I/O drivers ---> [ ] Virtualization drivers ---- Virtio drivers ---> Microsoft Hyper-V guest support ---- [*] Staging drivers ---> [ ] Platform support for Goldfish virtual devices ---- [ ] Platform support for Chrome hardware ---- Common Clock Framework ---> Hardware Spinlock drivers ---- Clock Source drivers ---> [ ] Mailbox Hardware Support ---> [ ] IOMMU Hardware Support ---- Remoteproc drivers ---> Rpmsg drivers ---- SOC (System On Chip) specific Drivers ---> [ ] Generic Dynamic Voltage and Frequency Scaling (DVFS) support ---- <M> External Connector Class (extcon) support ---> [ ] Memory Controller drivers ---- <M> Industrial I/O support ---> [ ] Platform support for Goldfish virtual devices ---- [ ] Platform support for Chrome hardware ---- Common Clock Framework ---> Hardware Spinlock drivers ---- Clock Source drivers ---> [*] Mailbox Hardware Support ---> [ ] IOMMU Hardware Support ---- Remoteproc drivers ---> Rpmsg drivers ---- SOC (System On Chip) specific Drivers ---> [ ] Generic Dynamic Voltage and Frequency Scaling (DVFS) support ---- <M> External Connector Class (extcon) support ---> [ ] Memory Controller drivers ---- <M> Industrial I/O support ---> [*] Pulse-Width Modulation (PWM) Support ---> < > IndustryPack bus support ---- [ ] Reset Controller Support ---- < > FMC support ---- PHY Subsystem ---> [ ] Generic powercap sysfs driver ---- < > MCB support ---- Performance monitor support ---> [ ] Reliability, Availability and Serviceability (RAS) features ---- Android ---> {*} NVMEM Support ---- < > System Trace Module devices < > Intel(R) Trace Hub controller FPGA Configuration Support ---> FSI support --->
どこをどういじったか覚えていないのですが(^^;;;、削除したものがいくつかあります。 symphonic mpdのconfigをチェックしましたが、raspbian lite ディフォルトのままで、不要なモジュールをコンフィグで外すという方法はとっていませんね。ブート時のconfig.txtとrc.localで使わない機能を宣言するという方法をとっています。menuconfigで行う方法との音への違いはよくわかりませんね。
この他のパラメータはほぼディフォルトのままです。File systems など弄れそうな部分はあるのですが、とりあえず保留しています。
menuconfigからの引用だらけとなりましたが、ここまで来たら「毒食わば皿まで」、i2s接続に関連する ALSA for SoC audio support をどうしているか引用して、終わりにします。
<M> AMD Audio Coprocessor support <M> SoC Audio for the Atmel System-on-Chip <M> SoC Audio support for the Broadcom BCM2835 I2S module <M> Support for Google voiceHAT soundcard <M> Support for HifiBerry DAC <M> Support for HifiBerry DAC+ <M> Support for HifiBerry Digi <M> Support for the HifiBerry Amp <M> Support for Cirrus Logic Audio Card <M> Support for RPi-DAC <M> Support for Rpi-PROTO <M> Support for JustBoom DAC <M> Support for JustBoom Digi <M> Support for IQaudIO-DAC <M> Support for IQAudIO Digi <M> Support for RaspiDAC Rev.3x <M> Support for ADAU1977 ADC <M> Support for audioinjector.net Pi add on soundcard <M> Support for audioinjector.net Octo channel (Hat) soundcard <M> Support for Red Rocks Audio DigiDAC1 <M> Support for Dion Audio LOCO DAC-AMP <M> Support for Dion Audio LOCO-V2 DAC-AMP <M> Support for Allo Piano DAC <M> Support for Allo Piano DAC Plus <M> Support for Fe-Pi-Audio <M> Support for Allo Boss DAC <M> Support for Allo DigiOne <M> Support for Blokas Labs pisound <M> Synopsys I2S Device Driver < > PCM PIO extension for I2S driver SoC Audio for Freescale CPUs ---> [*] Audio support for Imagination Technologies designs <M> Imagination I2S Input Device Driver <M> Imagination I2S Output Device Driver <M> Imagination Parallel Output Device Driver <M> Imagination SPDIF Input Device Driver <M> Imagination SPDIF Output Device Driver <M> Support for Pistachio SoC Internal DAC Driver <M> XTFPGA I2S master <M> Imagination I2S Input Device Driver <M> Imagination I2S Output Device Driver <M> Imagination Parallel Output Device Driver <M> Imagination SPDIF Input Device Driver <M> Imagination SPDIF Output Device Driver <M> Support for Pistachio SoC Internal DAC Driver <M> XTFPGA I2S master CODEC drivers ---> <M> Build generic ASoC AC97 CODEC driver <M> Analog Devices ADAU1701 CODEC <M> Analog Devices ADAU7002 Stereo PDM-to-I2S/TDM Converter <M> AKM AK4104 CODEC <M> AKM AK4554 CODEC <M> AKM AK4613 CODEC <M> AKM AK4642 CODEC <M> AKM AK5638 CODEC <M> Realtek ALC5623 CODEC <M> Dummy BT SCO codec driver <M> Cirrus Logic CS35L32 CODEC <M> Cirrus Logic CS35L33 CODEC < > Cirrus Logic CS35L34 CODEC < > Cirrus Logic CS42L42 CODEC <M> Cirrus Logic CS42L51 CODEC (I2C) <M> Cirrus Logic CS42L52 CODEC <M> Cirrus Logic CS42L56 CODEC <M> Cirrus Logic CS42L73 CODEC <M> Cirrus Logic CS4265 CODEC <M> Cirrus Logic CS4270 CODEC <M> Cirrus Logic CS4271 CODEC (I2C) <M> Cirrus Logic CS4271 CODEC (SPI) -M- Cirrus Logic CS42448/CS42888 CODEC (I2C) <M> Cirrus Logic CS4349 CODEC <M> Cirrus Logic CS53L30 CODEC < > Everest Semi ES8328 CODEC (I2C) < > Everest Semi ES8328 CODEC (SPI) <M> GTM601 UMTS modem audio codec <M> InvenSense ICS43432 I2S microphone codec <M> Inno codec driver for RK3036 SoC <M> Maxim MAX98504 speaker amplifier <M> Maxim MAX9860 Mono Audio Voice Codec < > Qualcomm MSM8916 WCD DIGITAL Codec <M> Texas Instruments PCM1681 CODEC <M> Texas Instruments PCM179X CODEC (I2C) <M> Texas Instruments PCM179X CODEC (SPI) <M> Texas Instruments PCM3168A CODEC - I2C <M> Texas Instruments PCM3168A CODEC - SPI -M- Texas Instruments PCM512x CODECs - I2C <M> Texas Instruments PCM512x CODECs - SPI <M> Realtek RT5616 CODEC <M> Realtek ALC5631/RT5631 CODEC -M- Freescale SGTL5000 CODEC <M> SiRF SoC internal audio codec <M> S/PDIF CODEC <M> Analog Devices SSM2602 CODEC - SPI <M> Analog Devices SSM2602 CODEC - I2C <M> Analog Devices ssm4567 amplifier driver support <M> STA326, STA328 and STA329 speaker amplifier <M> STA350 speaker amplifier <M> codec Audio support for STI SAS codec <M> Texas Instruments TAS2552 Mono Audio amplifier <M> Texas Instruments TAS5086 speaker amplifier <M> Texas Instruments TAS5711/TAS5717/TAS5719/TAS5721 power ampli <M> Texas Instruments TAS5720 Mono Audio amplifier <M> NXP Semiconductors TFA9879 amplifier <M> Texas Instruments TLV320AIC23 audio CODEC - I2C <M> Texas Instruments TLV320AIC23 audio CODEC - SPI <M> Texas Instruments TLV320AIC31xx CODECs <M> Texas Instruments TLV320AIC3x CODECs <M> TI Headset/Mic detect and keypress chip <M> Wolfson Microelectronics WM8510 CODEC <M> Wolfson Microelectronics WM8523 DAC <M> Wolfson Microelectronics WM8580 and WM8581 CODECs <M> Wolfson Microelectronics WM8711 CODEC <M> Wolfson Microelectronics WM8728 DAC -M- Wolfson Microelectronics WM8731 CODEC <M> Wolfson Microelectronics WM8737 ADC -M- Wolfson Microelectronics WM8737 DAC <M> Wolfson Microelectronics WM8750 CODEC <M> Wolfson Microelectronics WM8753 CODEC <M> Wolfson Microelectronics WM8770 CODEC <M> Wolfson Microelectronics WM8776 CODEC <M> Wolfson Microelectronics WM8804 S/PDIF transceiver I2C <M> Wolfson Microelectronics WM8804 S/PDIF transceiver SPI <M> Wolfson Microelectronics WM8903 CODEC <M> Wolfson Microelectronics WM8960 CODEC <M> Wolfson Microelectronics WM8962 CODEC <M> Wolfson Microelectronics WM8974 codec <M> Wolfson Microelectronics WM8978 codec <M> Wolfson Microelectronics WM8985 and WM8758 codec driver < > Nuvoton Technology Corporation NAU85L40 CODEC <M> Nuvoton Technology Corporation NAU88C10 CODEC -M- Texas Instruments TPA6130A2 headphone amplifier <M> ASoC Simple sound card support <M> ASoC Simple SCU sound card support <M> Imagination I2S Input Device Driver <M> Imagination I2S Output Device Driver <M> Imagination Parallel Output Device Driver <M> Imagination SPDIF Input Device Driver <M> Imagination SPDIF Output Device Driver <M> Support for Pistachio SoC Internal DAC Driver <M> XTFPGA I2S master CODEC drivers ---> <M> ASoC Simple sound card support <M> ASoC Simple SCU sound card support
全てモジュールとして登録しています。これによってメモリが圧迫されることはないだろうという判断です。
(PC_Audio) 2017/10/14
arch linux でUPnP(3)
続いて、カーネルビルドですが、その前に例によって脱線。何故、UPnP化にこだわるかについて。
理由は単純で「DLNAの方がNASより、音がよく、操作性もいい」からです。
音につては「オンメモリ再生の方が優位だ」という意見があるかもしれません。その通りだと思いますが 、polipoを使って、実質オンメモリ化すれば、差はありません。従って、操作性を犠牲にしたオンメモリ再生にこだわる理由はないでしょう。
UPnPのコントロールポイントの操作性については否定的な意見が多いようですが、僕は慣れの問題だろうと思っています。旧来のnas接続方式のクライアントの操作性には、優秀なものがあることは認めますが、滅びゆくものにこだわってもしかたがないでしょう。Windows、IOSなどで動くクライアイント数はどんどん減っているという状況ですから、シーラカンス化しないためにはさっさと切り替える一手だと思います。新しいクライアントが登場しない理由は、WebGUIを使ったクライアントが主流になってきたためですが、こちらの操作性は確実にDLNAコントロールポイントより悪いですね。
操作性の中には設定の容易性があります。この点ではUPnPはその名前(Universal Plug and Play)の通りで、圧倒的に優位だと思います。クライアント方式のソフトもWEB方式のソフトのMPDのDB設定、ネットワーク設定の難しさをカバーするためそれなりの工夫をしていますが、DHCPを使って、コントロールポイントから名前だけでサーバとレンダラーを選択できる操作性には、従来のクライアント方式やWEB方式のものは敵わないと思います。
という訳で、UPnP化にこだわって、カーネルのビルドです。
modprobe + zcat でconfigを取り出す方法は4.9.30番台のころの arch linux ではうまくいかなったのですが、40番台ではOKのようですね。このあたりがローリングリリース arch linuxの本領発揮ですね(^^;;;。
カーネルのビルドについては第1回にやり方を紹介していますので、整理してコマンドだけ再掲します。
pacman -S bc modprobe configs zcat /proc/config.gz > ../config-this-machine [root@rpiarch ~]# uname -a Linux rpiarch 4.9.40-rt30-v7-volpre1000CFQ-play+ #12 SMP Thu Aug 24 09:25:18 UTC 2017 armv7l GNU/Linux git clone --depth 1 https://github.com/raspberrypi/linux.git -b rpi-4.11.y git clone --depth 1 https://github.com/raspberrypi/firmware.git wget https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/patch-4.11.12-rt14.patch.gz cd linux cp ../firmware/extra/Module7.symvers Module.symvers gzip -dc ../patch-4.11.12-rt14.patch.gz | patch -p1 make menuconfig make -j4 zImage modules dtbs make modules_install cp arch/arm/boot/dts/*.dtb /boot/ cp arch/arm/boot/dts/overlays/*.dtb /boot/overlays/ scripts/mkknlimg arch/arm/boot/zImage /boot/kernel7.img
ところで、menuconfigで BCM2835 VCHIQ というキーワードに関連するモジュールを削除するとビルドエラーになるのですが、何故ですかね。BCM2835_VCHIQというのは
Device Drivers ---> [*] Staging drivers ---> <*> Videocore VCHIQ
で指定されるBroadcomの BCM2835 ALSA driver というものらしいのですが。
あと、rpi3用の64ビット版のカーネルのビルド方法です。
あっちこっちに情報はあります。
- BUILD A 64-BIT KERNEL FOR YOUR RASPBERRY PI 3
- Raspberry Pi 3向けの 64bitカーネルをビルドして、使用する
- Raspbianは64-bitに対応するのか
- raspberrypi 3 64bit版のlightMPDを公開しました
ビルドは出来るのですが、arch linux環境で実行させようとするとエラーになります。最後のdigififanさんの情報を除いて、リンク先はraspbianでの話なので、arch linuxでは何か制限があるのですかね。
一応、ビルドを通すやり方を残しておきます。
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig make -j 4 cp ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig cp arch/arm64/boot/Image /boot/kernel8.img cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /boot/ make ARCH=arm64 modules_install
rpi3用のカーネルのレベルはrpi3用が4.13ですので、かなり新しくなります。当然、新しいレベルを選択したがいろいろな面で有利です。何故、rpi2用は4.9のままなのか、謎です。
rpi2用のシステムでも、自前でビルドすることにより 4.11系列、4.12系列にできます。こちらの方が音も良くなりますので、お勧めします。
カーネルのチューニングですが、基本的には不要なモジュールを削除しコンパクトにしていくことになります。
チューニングでポイントとなるパラメータがいくつかありますので、ご紹介します。
High Resolution Timer Supportをオン
General setup ---> Timers subsystem ---> [*] High Resolution Timer Support
これは当たり前ですがオンにした方がいいです。ディフォルトはオンだと思います。
Default I/O schedulerの選択
Enable the block layer ---> IO Schedulers ---> Default I/O scheduler --->
Deadline、CFQ、No-op が指定できます。Deadlineは雰囲気のある柔らかい音、CFQはハードで解像度の高い音、No-opはその中間という感じです。音の良さの優劣はありませんので、好みで決めるしかないと思います。
ただし、この内容は後からコマンドを使って変更することもできます。
Kernel Featuresの選択
Kernel Features ---> - No Forced Preemption (Server) - Voluntary Kernel Preemption (Desktop) - Preemptible Kernel (Low-Latency Desktop) - Preemptible Kernel (Basic RT) - Fully Preemptible Kernel (RT)
から選択します。「rtカーネルでないと駄目」という人もいますが、僕はそうは思いません。
特に、UPnP方式でpolipoを使った場合はサーバに近い動きとなりますので、Preemptionが弱い方がいいと思います。ということで、「Voluntary Kernel Preemption」がお勧めです。
また4番目と5番目のRTカーネルはrtパッチがかかっていないと選択できません。これもrt化の足かせとなります。
理論的には低レイテンシーのrtカーネルの方が音楽再生に有利というのはその通りなのですが。
あと、xenomaiというロボット用rtカーネルがあります。これはアプリケーションがxenomaiが提供する命令に対応している必要があります。いまのところ音楽再生用アプリでこれに対応しているアプリはないので、あまり意味がないと思います。また、xenomaiは対応するカーネルのバージョンがrtカーネル以上に制約されます。
xenomaiは、確かに、ロボットの制作のようにアプリが手作りでどうにでもなるという時は千人力です。将来的にはrt機能はカーネルに統合され便利に使えるようになるとは思うのですが、先は長そうです。この記事を参照。
Timer frequency値を1000 Hzに設定
Kernel Features ---> Timer frequency (1000 Hz) --->
100Hz、200Hz、250Hz、300Hz、500Hz、1000Hzが指定できます。値が大きくなるほど、解像度が高く、切れ味が鋭くなります。ハード性能次第ですが、問題なければ 1000 Hzを指定しましょう。
カーネルのビルドで失敗談を一つ。
チューニングを行っている時、あるタイミングから音源の音が出なくなりました。この時変だったのはコントールポイントからみると、全く正常に再生されているように見えたことです。しかし、変えたののは menuconfig のパラメータだけですから、当然その内容を疑います。最終的にどうにも分からないので、menuconfigのパラメータを完全に元に戻して試しましたが、それでも音が出ない。変だなぁと、音源の状態を確認したら
[root@alarmpi ~]# cat /proc/asound/cards 0 [Dummy ]: Dummy - Dummy Dummy 1 1 [Loopback ]: Loopback - Loopback Loopback 1 2 [DSDAC10R ]: USB-Audio - DS-DAC-10R KORG INC. DS-DAC-10R at usb-3f980000.usb-1.2, high speed
となっています。「なるほど、これなら音が出ないのはごもっとも。でも、Dummy、Loopbackは削除したのにどうなっいるの」。make menuconfig してみて確認してみました。
Device Drivers ---> Sound card support ---> Advanced Linux Sound Architecture ---> Generic sound devices ---> <*> Dummy (/dev/null) soundcard (NEW) <*> Generic loopback driver (PCM) (NEW)
となっていました。「うーむ。削除したはずなのに何でだろう? 」と悩んでみたら、分かりました。カーネルのレベルを4.9から4.12と大きく変えていたのですね。ビルドの条件が大きく変わるから、結果、以前の設定が元に戻ったということらしい。これで二日ロスしました。「やっぱり、コントロールポイントからみると正常に見えるのに、音が出ないないという変な状況になった時は、まず、基本に戻り音源の状態を確認すべし」だったなぁと、サルでも出来る反省をしました(^^;;;。
解説は不要と思いますが、DummyとLoopbackが音源として見なされていますから、/etc/mpd.confの
audio_output { type "alsa" name "USB Dac" device "hw:0,0" <======この番号 # priority "FIFO:99" mixer_type "disabled"
の順番が変わって、音が出なくなっていたということですね。
(PC_Audio) 2017/10/07
Galvanic変換
「USB接続は音を悪くする」という件について、以前、このサイトで話題にしたことがあります。詳しくはI2Sに関するこの記事とこの記事を参照して下さい。
この対策の製品として、以前にこんな記事(JCAT USBカードとINTONA USBアイソレータ)を書いたことがあります。また、Intona社の製品(USBノイズ対策)については掲示板で話題になったことがあって、ここにスレッドがあります。
リンク先に紹介されている情報はPC/ネットワークオーディオをやっていく上では必須の情報ではないかと思いますが、雑誌でも、ネットワークでも取り上げられることは少ないですね。プロモーションに不要な情報は無視されるということでしょうか?
というわけで、いわゆるPC/ネットワークオーディオにおいて構成のポイントは「USB接続に伴うノイズにどう対策するか」です。僕が有効だと思う方法は次の三つです。
- i2s接続
- 一番目は単純で、USB接続そのものをやめてしまおうというもの。USB接続しなければ、USB関連のノイズも発生しないわけだから、これが一番分かりやすい。問題はi2s接続の可能なDACがほとんどないこと。基板レベルで自作という方法はあるのですが、制限が多くメイジャーになりそうもないですね。
- 電源分離型USBボード
- 二番目の対策は独立したusbボードを使い、電源など分離することで、ノイズの発生を回避しようというもの。これが正攻法ということになるかと思いますが、問題は独立したボードを刺せるマザーボードが必要なこと。そんなものは、今時、希少価値です。
- ガルバニックUSBアイソレータ
- 三番目の対策はパソコン側でノイズが発生するのは仕方がないとして、パソコンとDACの間に入って発生したノイズを、無理矢理、除去してしまおうというもの。三つ中では一番荒っぽい方法ですが、使う側からみると、パソコンとDDC/DACの間に製品を入れるだけなので、一番簡単、使いやすいです。
課題はノイズを除去する性能。音楽信号から綺麗にノイズだけを分離し除去するというノイズフィルターがほとんど無いことですね。僕の経験の範囲ではガルバニック方式のUSBアイソレータが唯一効果がはっきり感じられる製品だと思います。
この三つの方法をそれぞれ試したことがあります。
i2s接続については過去何度も書き込んでいるますね。ノイズ対策としては、USBは使わないという一番分かりやすい方法なので、お勧めなのですが、問題は機種が限定されることですね。詳しくは過去の記事を参照して頂くとよいかと思います。僕はaitlaboのDACを使っています。
試してみるには、r-piやbbb/bbgに直接差し込む基板形式のものがお勧めですかね。
電源分離型USBボードも製品は数種類しかありません。正攻法の対策であり、JPLAYをお使いであれば、この方法がお勧めかもしれません。問題はボードが刺さるマザーボードが必要なことです。ノートパソコンやlinux SOCマシンでの対策にはなりません。
僕は、乱暴ですが、単純明快な方式である三番目のガルバニックUSBアイソレータ対策製品に興味を持っています。これは既存のUSB接続の間に製品を入れるだけで、「あら不思議、DACがワンランクレベルアップしたのかな」という位に効果があります。SOCと普通のDACという組み合わせで問題なく使えるので、重宝しています。
ガルバニックUSBアイソレータの新製品としては ifiから最近 iGalvanic3.0 という製品が日本で販売が開始されました。
この製品、5月ごろに発売開始予定でした。「試しに聞いてみたいのだけど」と近所のオーディオ屋さんに頼んだら、「トラブルが発生していて、試聴機入手の予定は分からない」というご返事。僕の持っているIntona社製品で、半年位、繋げられる繋がらないのトラブルが続いていたことを知っているので、「なるほどなぁ」と思いました。オーディオ屋さんに事情を説明してあげて、「という訳だから、気長に待ちますよ」とお願いしておいたら、8月にようやく届きました。案外、トラブルの収束が速かったですね。さすが ifiということかしら。
ifi社によるガルバティック変換についてレポートが公開され、日本語訳がPhileWEBに掲載されていますね。新製品のプロモーションが目的だとは思いますが、興味深く読みました。
iGalvanic3.0 ですが、良い製品だと思います。手持ちのIntonaと比較して、効果の程はいい勝負ですね。Intonaの古いファームで動かなかった DAC でも問題なく動きました。Intonaのように、ご本家のサイトでPayPalを使わなくても、日本の普通のオーディオショップで現金を使って購入できます。コンパクトな製品ですが、高級なオーディオ装置らしいしっかりした作りです。まっとうなオーディオファンにはお勧めだと思います。
それでは、まっとうなオーディオファンでない僕はどうしたかなのですが、iGalvanic3.0 は価格が高かったので、パスしました。そして、同じタイミングでIntonaから「新製品が出来たよ。10%引きにするからどう」という案内が届きましたので、こちらを入手しました。
発端のIntonaからのメールですが、こんな感じです。
htmlメールはウイルスの元ですから普段は開けないのですが、Intonaのアドレスを確認できたので、シュテムラーさんとのやりとりを思い出し、開けて、読んでみました。ifi社のiGalvanic3.0を意識した内容で興味深く読みました。面白い内容なので、簡単にご紹介します(画面をクリックすれば、英文の全文がでます)。
顧客様各位
Intona社のちょっとしたアップデートについてお伝えする時がきました。
この二年間、良いことは一杯ありました。産業分野で多数のプロジェクトを受注し、オフィスも拡大し、従業員数も増えました。
しかし、もっと重要なのは『皆様のおかげで我々のUSBアイソレータが大成功』したことです。
そして、この成功はオーディオファイル・コミュニティにおける皆様方の積極的なご支援の賜物であると思います。厚く御礼申し上げます。直接のメール、フォーラムへの書き込み、レビューなど様々な形で多数の積極的かつ好意的なご意見を頂きました。この製品はもともと産業分野向けにデザインされたものであることをご存じだと思います。しかしながら皆様方の積極的なフィードバックにより、産業分野以外のプロオーディオ分野で認知されるようになりましたので、我々はオーディオファイル・コミュニティ向けに特化した製品を開発することにしました。
その間にも、我々のテクノロジーに興味を持ついくつかの会社と彼らの製品への我々の技術のOEM提供について議論を重ねてきました。これは、USB接続におけるハイレソデジタル音楽データの取り扱いに関して新しい視点を切り開くものとなりました。
また、少なからぬ数の会社がバスに乗り遅れまいとこの分野に参入してきました。我々はこのことを歓迎しています。我々の最初の製品の重要性と意味について改めて教えてくれたわけですから。グローバルに、我々は、サードパーティからのチップベースのソリューションに頼らずに、透過型のガルバニック変換とUSBバスのリクロッキングができる唯一の会社です。
ドイツから初めてのちょっとしたアップデートは完了しました。次に、我々が声をあげる時は皆様がお待ちの興味深く、重要な製品が誕生した時だけです。
という内容です。このあと「10月末まで10%ダウンで提供するよ」というお誘いと
Please feel free to share this link with any of your friends who deserves a great upgrade of their audio system!
というご案内が続きます(この案内を見て、メールの内容をそのまま紹介しても問題なかろうと判断しました)。ちなみに this link というのはここです。
メールの文面ですが、なかなかの自信ですね。
文面読んで、ついフラフラとリンク先のボタンをクリック。安かったので、またついふらふらとget。同じようなプラスチック製のボロい箱が3個並ぶことになりました(^^;;;。
新製品は写真の黒いやつです。旧製品のクリーム色のものが2台ありますが、二つ買ったというわけではなくて、一番最初の製品のファームウェアでは一部のdac(ddc)が繋がらなかったので、「何とかしてよ」とメールしたら、二つ目が送られてきたというわけです。そのあたりの詳細はこちらを参照して下さい。
製品の内容で何が変わったかについてはリンク先(this link)を参照して下さい。
気分転換に真っ黒のやつを頼んでみました。残念ながらあまりかわりばえはしないようですね。新製品と言っても外見は全く変わっていません。
ただし、音は随分変わります。ますます透明度が上がり、雰囲気がよくなったという気がします。楽器の実在感が新製品の方が高く感じます。楽器との距離がますます近づいたという印象で、全ての音がよりクリア聞きとれるようにになりました。ファームウェアの改良だけでこれだけの違いがでるとは驚きです。このレベルまでいけば、i2s接続にこだわる理由はなくなりますね。さすが、シュテムラーさんが「 When we raise our voice for the next time, be sure that there will be very interesting and exciting product updates, you might have been waiting for! 」と豪語するだけのことはあると思いました。
送料込みで235ドル位でしたから、ちょっと円安ぎみのタイミングですが、まあ満足。とてもよい買い物をしたと思います。ケースのボロさ(^^;;;を無視できるなら、お勧めです。
購入にはPayPalのアカウントが必須です。PayPalに登録してある住所が自動的に選択されますので、購入のための操作は簡単です。処理は迅速で、僕の場合は、月曜日に注文したら、その週の木曜日に届きました。ヨーロッバからでは最速でした。