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のハードウェアの組み合わせが発生条件のようです。
トラブルの原因と思われる要素を想像し、対策してみました。 以下は、本来の原因ではなかった対策で悪戦苦闘した記録です。
Ubuntu14.04は、デフォルトではCPUクロックが負荷変動に応じて大きく変化します。 再生負荷変動にCPUクロックが追いついていないのではないかと疑い、cpufreqdパッケージをインストールしましたが、現象は変わりません。
再生アプリは、マルチスレッドで動作しています。 CPUのコアが2つしか無いので、スレッド切り替えのタイミングが悪いのかと思いusleep(0)している場所を調節しましたが、現象は変わりません。
ALSAのリングバッファ周りにはよくバグが入ります。 試しに、問題のないUbuntu16.04からALSA関係のソースコードを移植しましたが、ダメでした。
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 Bytes2018年7月7日 初出