オーディオ向けにカスタマイズしたLinuxカーネル

現在位置のナビ

トップコンピュータの国フリーソフト → オーディオ向けにカスタマイズしたLinuxカーネル

説明

インターネットにはElectrArtさんという方がいて、ご自身で設計したディジタルオーディオ基板を有償で配布しています。

私の知り合いがこの方のデュアルオーディオ基板を入手したのですが、Linuxではうまく動作しませんでした。 そこで、私がLinuxのカーネルソースコードを解析して、動作するようにパッチを当てました。 現在では、アイソクロナス転送モードのUSBオーディオクラス1とクラス2で動作しています。

ElectrArtさんには、Linuxにパッチを当てて動かした事実を伝え、パッチ公開の許可をいただきました。

2011年1月10日 追記

昨日1月9日 ELectrArtさんのファームウェアが更新されて、ここのパッチなしでも素のUbuntu 10.10からクラス2モードで接続できるようになりました。 クラス2のパッチは、取り下げる事にします。 クラス2のパッチは今や不要だと思われますが,クラス1のパッチはまだ有効です。 さらにクラス1のパッチによって、他のUSB DACが動作するようになる可能性がありますので、本ページは残しておくことにします。

2011年2月11日 追記

LinuxのカーネルソースコードとUSB規格を調査してみました。 その結果、1月のパッチは対症療法であり、問題があることが発覚しました。 対症療法をやめ、本格的に対応したのが本日公開のパッチです。

2011年4月24日 追記

先日ElectrArtさんから、ご指摘を受けました。 2月11日公開のパッチでは、対応部分が不足していて問題が発生するそうです。 再生途中で音程が変化したり、再生が停止したりするということでした。 原因と思われる部分も同時にご指摘いただいたので、再修整したパッチとカーネルパッケージとしてaudio3を公開します。

パッチ

Ubuntu 10.10 のカーネルソース 2.6.35 にパッチを当てました。 パッチをここで公開します。 このパッチは、Linuxのカーネルをソースコードからコンパイルできる人向けです。 それ以外の人は、後に記述するUbuntu 10.10のカーネルパッケージを利用してください。

class1.patch3が、USBオーディオクラス1で動作させるパッチです。

技術解説

このパッチがなぜ必要になったか、どのように動作するかを技術的に解説します。 技術論に興味のない方は、この節を読み飛ばしていただいてかまいません。

背景

USBアイソクロナス転送でアシンクロナスを精密に行うとき、フィードバックが必要になります。 もっとわかりやすく説明しましょう。 USB経由でパソコンから外付けDACにオーディオ出力する場合、パソコンからは定期的に(USB Ver.1.1の12Mbpsなら1秒間に1000回)データが送られてきます。 DAC側では、受け取ったデータを一定の周期でDA変換して再生します。 アシンクロナス転送は、音質をよくするために外付けDACの中(あるいはDACに外から供給するクロック)にクロックを用意して、一定のリズムで再生します。 このときパソコンのクロックとDACのクロックは、どんなに精密に作成してもわずかなずれが出てきてしまいます。 このずれが蓄積してゆくと、DACが音声を出力したいのにまだデータが来ていなかったり、逆にデータの到着が早すぎて再生が間に合わなくなったりします。 このずれをDACからパソコンに報告して、データ量の調整をしてもらう方法がフィードバックです。

なぜパッチが必要になったのか

フィードバックのデータ形式はUSBの規格で定められていて、12Mbps以下ならば3バイト、480Mbpsならば4バイトのデータを送ります。 ところが、Windowsでは480Mbpsでも3バイトのフィードバックを期待しているようなのです。 そのためWindows向けに作られた480Mbps USBオーディオデバイスは、しかたなく3バイトのフィードバックを返しています。 Linuxでは480Mbpsの場合に、規格どおりに4バイトのフィードバックが帰ってくることを期待しているので、Windows向け480Mbpsオーディオクラス1のデバイスが接続できなくなるのです。 Windowsは、2011年2月現在USBオーディオクラス2に対応していないようなので、この現象は480Mbpsオーディオクラス1に限定されます。

パッチが実現すること

1月のパッチは、4バイトのフィードバックを期待している時に3バイトしか帰ってこなかったら無視するようにしていました。 この方式では、せっかくのフィードバックを無視してしまい、再生タイミングが合わなくなってしまいます。

今回のパッチは、フィードバックエンドポイントのディスクリプタ中にあるwMaxPacketSize変数を調べ、フィードバックが3バイトを返すのか4バイトを返すのかを自動判定して動作を切り替えます。 この自動判定により、Windows向け480Mbpsオーディオデバイスの多くが動作するようになると思います。 従来接続できていたDACに、悪影響はないはずです。

Ubuntu 10.10 用のカーネルパッケージ

ソースコードのパッチだけでは利用できる人が少ないだろうと考え、Ubuntu 10.10 向けの32bitカーネルパッケージも作りました。 クラス1向けのパッチを当ててあります。 i686向けにコンパイルしてあるので、最近2 , 3年に製造されたPCならば動作しますが、古いPCでは動作しないかもしれません。 linux-image-2.6.35-audio3.debがパッケージです。 このパッケージの使い方を解説します。

必要となるのは、Ubuntu 10.10が動作しているPCです。 CPUには、IntelかAMDのi686互換CPUが必要です。 Windowsが動作する最近のPCなら、まず問題無いでしょう。

Ubuntu 10.10を起動したら、先のリンクを右クリックして『名前を付けてリンク先を保存』を選び、linux-image-2.6.35-audio3.deb ファイルをシステム上にコピーします。

次に、『端末』を起動します。 端末は、画面左上の『アプリケーション』メニューから『システムツール』を選択すると、中にあります。 端末が起動したら、キーボードからコマンドを入力します。 % は、システムの指示待ちを示しますので、% を除いたそれ以降を入力してください。

% sudo dpkg -i linux-image-2.6.35-audio3.deb

linux-image-2.6.35-audio3.debを置いた場所によっては、上記のコマンドがエラーになるかもしれません。 その場合は、次のコマンドを試してみてください。

% sudo dpkg -i ~/ダウンロード/linux-image-2.6.35-audio3.deb

最後にコンピューターを再起動します。 今後は、起動直後のメニューに "Ubuntu , with linux 2.6.35-audio3"が表示されますので、ElectrArtさんのデュアルオーディオ基板をオーディオクラス1で使用するときは、"Ubuntu , with linux 2.6.35-audio3" を選択してください。

前回、前々回のパッチを既に使用している方へ

今回のカーネルは、前回、前々回のカーネルと共存できます。 ここに書かれた手順で、新しいカーネルを組み込んでください。 ブートの時に前回のカーネルと今回のカーネルの両方がメニューに並びますので、audio3と書いてある方 2.6.35-audio3を選択してください。 以下のコマンドで、前回、前々回のパッチされたカーネルを消すこともできます。

% sudo dpkg -r linux-image-2.6.35.8-audio
% sudo dpkg -r linux-image-2.6.35.9-audio

ライセンスと免責

Linux カーネルのソースコードは、GPLライセンスで保護されています。 だれでも無料で入手、使用でき、バイナリを配布するときはソースコードも配布できなければいけません。 変更を加えるのは自由ですが、変更したものを配布するときも同様の制限があります。

今回組み込んだ改造部分にも、元からあるLinuxのカーネル部分にも、全く保証はありません。 期待通りに動かないかもしれません。 もしかしたら、ハードウェアの故障原因になったり、データを失ったりするかもしれません。 それでも良いと思った方だけ利用してください。

期待通りに動かない場合でも誰にも文句は言えませんが、Linuxのカーネルをメンテしている人に報告すると対応してもらえるかもしれません。

初出 2011年1月1日
改訂 2011年4月24日

back button もどる