試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

JACK Audio Connection Kitの音飛びについてと、その対処

JACK Audio Connection Kitを使用すると、音声が途切れてしまうことがある。端末には

**** alsa_pcm: xrun of at least xx.xxx msecs

のような形で、切れた時間の目安が表示される。これが出てしまう状況ではかなり聞き苦しい音になってしまうのだが、効果的な対策は(完全とは言えないかもしれないが)あり、以下を参考に対処する。

  • jackd--realtime(-R)オプションを付けて実行すれば音飛び防止に非常に効果的
  • QjackCtlでは「Setup」ダイアログの「Settings」タブにある「Realtime」をチェックする
  • リアルタイム優先順位は-Pオプションで指定でき、QjackCtlでは「Realtime」の横にある「Priority」で指定する。
  • (既定の設定において)一般ユーザでは、権限の問題で--realtimeオプションを付けられない
  • sudojackdを(管理者権限で)起動した場合、リアルタイム優先順位は指定できるものの、一般ユーザ権限で動作するJACKアプリケーションから接続できない(JACKアプリケーションもsudoで実行すれば使うことはできる)
  • 一般ユーザでも--realtimeオプションを付けられるようにするには、/etc/security/limits.confというファイルを編集する(参考ページ・PAMのバージョンが0.99以上の必要がある?設定後にはログアウトも必要)。Realtime Linux Security Module(realtime-lsm)というカーネルモジュールで権限を与える方法もあるが、外部モジュールのため、いつまで使えるかは分からず、手間もかかる

手元のGentoo Linuxにて、limits.confによる方法(PAM 0.99.9.0)とrealtime-lsmによる方法(Liunx 2.6.23 + realtime-lsm 0.8.5-r2)のどちらも機能し、音飛びがかなり改善したことを確認した。

/etc/security/limits.confの設定

http://gentoo-wiki.com/HOWTO_Jack#RLIMITS
の設定では
ファイル名: /etc/security/limits.conf

@audio - rtprio 90
@audio - nice -5
@audio - memlock 500000

となっているが、値は例なので、好みに応じて調整する。また、上の書き方では「audio」グループが対象となっているが、(「@」を付けず)ユーザ名指定もできる。詳細は

$ man limits.conf

を実行してマニュアルを参照。

  • 「rtprio」は(権限を持たないプロセスの)最大のリアルタイム優先順位で、[ここで指定した値 - 10]の値jackdの優先度オプション(-P)に指定できる(例:「rtprio 90」の場合、優先順位値は「80」が最大)
  • 「nice」は(権限なしのプロセスの)最大*1のスケジューリング優先順位(nice値)
  • 「memlock」はメモリロックできる最大のサイズ

なお、指定した値は、対象ユーザの全てのプロセスで有効になるため、上の例の場合は、あらゆるプロセスのnice値が-5まで(-6は不可)指定できてしまう。

関連項目: Preemptible Kernelの設定について

デスクトップ用途のカーネル設定として、リアルタイム性能を向上させる効果のあるCONFIG_PREEMPTがある。この指定に加え、CONFIG_PREEMPT_BKLの指定を行うと、更にデスクトップ用途に適した反応性が得られる。
これらは必須な設定ではないが、自分でデスクトップ用途のカーネルをビルドする場合には設定しておきたい項目。ついでに、「Timer frequency」の値も1000Hzにしてある。

Processor type and features  --->
 Preemption Model (Preemptible Kernel (Low-Latency Desktop))   [CONFIG_PREEMPT]
 [*] Preempt The Big Kernel Lock                           [CONFIG_PREEMPT_BKL] 
 Timer frequency (1000 HZ)  --->                               [CONFIG_HZ_1000]

(2008/2/16)これに加え、以下のタイマー・クロック関係の設定も追加。ALSAはCONFIG_RTC(組み込みでも可)を使用する。CONFIG_RTC_CLASS以下は使用しない。ALSA以下も、問題がなければ組み込みでもOK。

Processor type and features  --->
 [*] High Resolution Timer Support          [CONFIG_HIGH_RES_TIMERS]
Device Drivers  --->
 Character devices  --->
  <M> Enhanced Real Time Clock Support      [CONFIG_RTC]
 < > Real Time Clock  --->                  [CONFIG_RTC_CLASS]
 Sound  --->
  <*> Sound card support
   <M> Advanced Linux Sound Architecture    [CONFIG_SND]
   <M> Sequencer support                    [CONFIG_SND_SEQUENCER]
   <M> RTC Timer support                    [CONFIG_SND_RTCTIMER]
   [*] Use RTC as default sequencer timer   [CONFIG_SND_SEQ_RTCTIMER_DEFAULT]

この他に、
http://www.kernel.org/pub/linux/kernel/projects/rt/
のrtパッチを使用したrtカーネルというものもあり、更にリアルタイム性能を上げることができそう(ただし実験的なので使用する際には注意)。
Gentoo Linux向けの解説もある。
関連記事:

関連URL:

その他メモ

適切な設定をせずに実行した場合のエラー

sudojackdを実行した場合に一般ユーザで接続しようとした場合、下のようなエラーとなる。
参考として、jackdの起動/終了の処理と、JACKクライアントをsudoで実行したときの結果も一緒に書いている。

$ sudo jackd -R -d alsa &
$ jack_lsp
JACK tmpdir identified as [/dev/shm]
JACK server not running
$ sudo jack_lsp
JACK tmpdir identified as [/dev/shm]
alsa_pcm:capture_1
alsa_pcm:capture_2
alsa_pcm:playback_1
alsa_pcm:playback_2
(以下略)
$ sudo killall jackd

一般ユーザ権限で、特に設定を行わずに--realtime指定をした場合には、下のようなエラーになる。

$ jackd -R -d alsa
(中略)
cannot use real-time scheduling (FIFO at priority 10) [for thread -296430976, from thread -296430976] (1: Operation not permitted)
cannot create engine

-Pのデフォルト値は「0」で、要求しているリアルタイム優先順位は「10」であることが分かるが、この値も許可されていないため、「Operation not permitted」になってしまっている。

realtime-lsmを使用する場合に必要なカーネル設定

realtime-lsmを使用する場合には、以下のカーネル設定が必要。

[*] Enable loadable module support  --->   [CONFIG_MODULES]
 [*] Module unloading                      [CONFIG_MODULE_UNLOAD]
Security options  --->
 [*] Enable different security models      [CONFIG_SECURITY]
 <M> Default Linux Capabilities            [CONFIG_SECURITY_CAPABILITIES]

まとめドキュメント:

使用したバージョン:

  • JACK Audio Connection Kit 0.103.0
  • PAM 0.99.9.0

*1:値の小さいほうが優先順位は高く、ここでの「最大」は、マイナスの絶対値が大きいことを示す