Ubuntu14.04向けカスタムカーネル

現在位置のナビ

トップコンピュータの国雑記帳オーディオ譚 → Ubuntu14.04向けカスタムカーネル

説明

Webmasterが白MacBook(Core2Duo 2.1GHz)にUbuntu 14.04 64bit Desktopをインストールして音楽再生したら、DoP音声が途切れるトラブルにあいました。 解決したので、AMD64のカーネルパッケージを公開し、トラブルの解説をします。

トラブル現象

特許方式を確認する試聴機を白MacBookからアクセスしようとして、Ubuntu14.04 AMD64 Desktopバージョンをインストールしました。 お約束通り、apt-getで最新までupgradeもかけました。 Core i3マシンのUbuntu16.04で動作しているアプリケーションを移植したところ、再生音が数分に1回の頻度で1秒未満の短時間だけ途切れます。

おなじハードウェアを数年前にLinuxで使用していた時も、それ以前にMac OS Xで使っていた時も、現象は出ていません。 Core i3マシンと最新Linuxの組み合わせも正常です。 最新Linuxのソースコードと、白MacBookのハードウェアの組み合わせが発生条件のようです。

無効だった対策

トラブルの原因と思われる要素を想像し、対策してみました。 以下は、本来の原因ではなかった対策で悪戦苦闘した記録です。

CPUクロック

Ubuntu14.04は、デフォルトではCPUクロックが負荷変動に応じて大きく変化します。 再生負荷変動にCPUクロックが追いついていないのではないかと疑い、cpufreqdパッケージをインストールしましたが、現象は変わりません。

アプリのマルチスレッド制御

再生アプリは、マルチスレッドで動作しています。 CPUのコアが2つしか無いので、スレッド切り替えのタイミングが悪いのかと思いusleep(0)している場所を調節しましたが、現象は変わりません。

ALSAのバージョン

ALSAのリングバッファ周りにはよくバグが入ります。 試しに、問題のないUbuntu16.04からALSA関係のソースコードを移植しましたが、ダメでした。

USBのパワーコントロール

2006年に某社が発売したWindowsマシンのように、USBインタフェースの電源をスクリーンブランクに同期してOffしているのではないかと疑いましたが、違いました。

対症療法を発見

ALSAのバージョンを差し替えた時にソースコードを読んでみて、タイマー周りの記述に引っかかりました。 Intel CPUのAT-PC互換機向けにLinuxのデバイスドライバソースコードを書いた人には心当たりがあると思いますが、High Resolution timer周りは注意が必要です。

もともとAT-PC互換機のLinuxタイマーは100Hzでした。 より短いタイミングを測る必要が出てきて High Resolution timerができたのですが、機種ごとにハードウェアがいろいろあります。 しかもいま問題になっているのは1秒間に8000回パケットを送るUSBオーディオです。 ALSAのHigh Resolution timer対応実装が、白MacBookと相性悪い(有り体に言えばバグ)可能性が考えられたので、High Resolution timerを使わない設定にしてみました。

これでビルドしたカーネルで、トラブルは解決しました。 debパッケージも配布します。

linux-image-4.4.134ALSAwithoutHRtimer_amd64.deb 66、846、356 Bytes

掲載日

2018年7月7日 初出


back button オーディオ譚