オーディオ向けにカスタマイズしたLinuxカーネル説明インターネットにはElectrArtさんという方がいて、ご自身で設計したディジタルオーディオ基板を有償で配布しています。私の知り合いがこの方のデュアルオーディオ基板を入手したのですが、Linuxではうまく動作しませんでした。そこで、私がLinuxのカーネルソースコードを解析して、動作するようにパッチを当てました。現在では、アイソクロナス転送モードのUSBオーディオクラス1とクラス2で動作しています。ElectrArtさんには、Linuxにパッチを当てて動かした事実を伝え、パッチ公開の許可をいただきました。10.10からクラス2モードで接続できるようになりました。クラス2のパッチは、取り下げる事にします。クラス2のパッチは今や不要だと思われますが,クラス1のパッチはまだ有効です。DACが動作するようになる可能性がありますので、本ページは残しておくことにします。追記LinuxのカーネルソースコードとUSB規格を調査してみました。その結果、1月のパッチは対症療法であり、問題があることが発覚しました。対症療法をやめ、本格的に対応したのが本日公開のパッチです。先日ElectrArtさんから、ご指摘を受けました。2月11日公開のパッチでは、対応部分が不足していて問題が発生するそうです。再生途中で音程が変化したり、再生が停止したりするということでした。原因と思われる部分も同時にご指摘いただいたので、再修整したパッチとカーネルパッケージとしてaudio3を公開します。パッチをここで公開します。このパッチは、Linuxのカーネルをソースコードからコンパイルできる人向けです。10.10のカーネルパッケージを利用してください。class1.patch3が、USBオーディオクラス1で動作させるパッチです。技術解説このパッチがなぜ必要になったか、どのように動作するかを技術的に解説します。技術論に興味のない方は、この節を読み飛ばしていただいてかまいません。背景USBアイソクロナス転送でアシンクロナスを精密に行うとき、フィードバックが必要になります。わかりやすく説明しましょう。Ver.1.1の12Mbpsなら1秒間に1000回)データが送られてきます。DAC側では、受け取ったデータを一定の周期でDA変換して再生します。アシンクロナス転送は、音質をよくするために外付けDACの中(あるいはDACに外から供給するクロック)にクロックを用意して、一定のリズムで再生します。このときパソコンのクロックとDACのクロックは、どんなに精密に作成してもわずかなずれが出てきてしまいます。このずれが蓄積してゆくと、DACが音声を出力したいのにまだデータが来ていなかったり、逆にデータの到着が早すぎて再生が間に合わなくなったりします。このずれをDACからパソコンに報告して、データ量の調整をしてもらう方法がフィードバックです。パッチが必要になったのかフィードバックのデータ形式はUSBの規格で定められていて、12Mbps以下ならば3バイト、480Mbpsならば4バイトのデータを送ります。ところが、Windowsでは480Mbpsでも3バイトのフィードバックを期待しているようなのです。USBオーディオデバイスは、しかたなく3バイトのフィードバックを返しています。Linuxでは480Mbpsの場合に、規格どおりに4バイトのフィードバックが帰ってくることを期待しているので、Windows向け480Mbpsオーディオクラス1のデバイスが接続できなくなるのです。Windowsは、2011年2月現在USBオーディオクラス2に対応していないようなので、この現象は480Mbpsオーディオクラス1に限定されます。パッチが実現すること1月のパッチは、4バイトのフィードバックを期待している時に3バイトしか帰ってこなかったら無視するようにしていました。この方式では、せっかくのフィードバックを無視してしまい、再生タイミングが合わなくなってしまいます。今回のパッチは、フィードバックエンドポイントのディスクリプタ中にあるwMaxPacketSize変数を調べ、フィードバックが3バイトを返すのか4バイトを返すのかを自動判定して動作を切り替えます。この自動判定により、Windows向け480Mbpsオーディオデバイスの多くが動作するようになると思います。従来接続できていたDACに、悪影響はないはずです。向けの32bitカーネルパッケージも作りました。クラス1向けのパッチを当ててあります。3年に製造されたPCならば動作しますが、古いPCでは動作しないかもしれません。linux-image-2.6.35-audio3.debがパッケージです。このパッケージの使い方を解説します。10.10が動作しているPCです。CPUには、IntelかAMDのi686互換CPUが必要です。Windowsが動作する最近のPCなら、まず問題無いでしょう。ファイルをシステム上にコピーします。次に、『端末』を起動します。端末は、画面左上の『アプリケーション』メニューから『システムツール』を選択すると、中にあります。端末が起動したら、キーボードからコマンドを入力します。除いたそれ以降を入力してください。linux-image-2.6.35-audio3.deblinux-image-2.6.35-audio3.debを置いた場所によっては、上記のコマンドがエラーになるかもしれません。その場合は、次のコマンドを試してみてください。~/ダウンロード/linux-image-2.6.35-audio3.deb最後にコンピューターを再起動します。前回、前々回のパッチを既に使用している方へ今回のカーネルは、前回、前々回のカーネルと共存できます。ここに書かれた手順で、新しいカーネルを組み込んでください。2.6.35-audio3を選択してください。以下のコマンドで、前回、前々回のパッチされたカーネルを消すこともできます。カーネルのソースコードは、GPLライセンスで保護されています。だれでも無料で入手、使用でき、バイナリを配布するときはソースコードも配布できなければいけません。変更を加えるのは自由ですが、変更したものを配布するときも同様の制限があります。今回組み込んだ改造部分にも、元からあるLinuxのカーネル部分にも、全く保証はありません。期待通りに動かないかもしれません。したら、ハードウェアの故障原因になったり、データを失ったりするかもしれません。それでも良いと思った方だけ利用してください。期待通りに動かない場合でも誰にも文句は言えませんが、Linuxのカーネルをメンテしている人に報告すると対応してもらえるかもしれません。2011年4月24日もどる。