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

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

JACK Audio Connection KitをALSAのdmixとdsnoopから使用する

(2014/10/3)2014年時点ではPulseAudioがALSAに統合されているディストリが多数で、ALSAのライブラリからALSAの「dmix」などのプラグインを経由してALSAのドライバへ出力されることは基本的にはなく、本記事の形を用いるメリットもない。

JACK Audio Connection Kitは、一般的にALSAのハードウェアデバイス(「hw」プラグイン)に直接アクセスして使用する。オーディオ作成においてはこれが最も好ましいのだが、別のオーディオ出力系からの音が出せずに困るということもある。
例えば、音の出るFlashを含むサイト(動画投稿サイトなど)に行っても、jackdを「停止」しないと音が出せない。
(2010/9/9)Flash 10の時点ではALSAの既定のPCMデバイスをJACKプラグインへ渡すような設定をする(「ALSA PCMデバイスとしてJACK Audio Connection Kitを使用」の設定に加え「pcm.!default pcm.pjack」を記述)ことでJACKへ音を出すことはできる。ただし他のALSAアプリケーションで不具合が出ることもあるため、おすすめはできない。以下、以前の内容。
ALSAに含まれる「dmix」というプラグインは複数のオーディオを合成する機能を持っているのだが、jackdのプレイバックポート(system:playback_[チャンネル番号])に入ったデータをここに流すことは可能で、ALSA向けの出力もJACK向けの出力もdmixプラグインからハードウェアデバイスへ出す形となる。
これだけではライン入力などのキャプチャはできないが、ALSAのキャプチャデバイス「dsnoop」をキャプチャデバイスに指定することでキャプチャポートも使用できるようになり、JACK上のオーディオ入出力を、ハードウェアデバイス(hw)を直接使用したのと同じ感覚で扱うことができるようになる。「dsnoop」は外部入力(キャプチャ)を共有するプラグインで、dmixがハードウェアへの出力を共有する形になっているのと対照的。
また、JACKと違い、ALSAのdmixプラグインを経由すると、x86_64上でx86_32なアプリケーションの音も混ぜて出力できるのも大きなメリットとなる。
(2010/9/9)x86_32アプリケーションとx86_64アプリケーションの音はその後のJACKで混ぜることができるようになっている。以下、以前の内容。
デメリットは、リアルタイム性が多少犠牲になる(保証できない)ことと、スピーカーやヘッドホンから出てくる音のフォーマットがdmixプラグインに影響され、同様に外部入力から取り込まれる音のフォーマットがdsnoopプラグインに影響されること。dmix/dsnoop使用時にのみ起きる不具合もある(後述)。なお、JACKアプリケーションどうしでやりとりしたオーディオデータ*1の品質は変わらない。
参考URL:

(2010/9/9)JACK 1.9.5/alsa-lib 1.0.23の時点では本記事の以前の記述による方法ではうまくいかなかったが、

としつつ(本記事の以下の「:0」付きの記述は全て「:0」なしのものに置き換える)、更に以下の設定を記述(サウンドカードが1枚ならサウンドカード番号は0)して
ファイル名: ~/.asoundrc

defaults.ctl.card [サウンドカード番号]
defaults.pcm.card [サウンドカード番号]
ctl.dmix
{
  type hw
  card [サウンドカード番号]
}
ctl.dsnoop
{
  type hw
  card [サウンドカード番号]
}

とすることで動作するようになった。ただ、複数のサウンドカードがある場合の動作については追加のサウンドカードを所有していないため未確認。

該当するjackdのコマンドラインオプション

  • -D: キャプチャポートとプレイバックポートの両方を用いる
  • -P dmix:0: ALSAの「dmix:0」というPCMデバイス(プラグイン)をプレイバック用に使用
  • -C dsnoop:0: ALSAの「dsnoop:0」というPCMデバイス(プラグイン)をキャプチャ用に使用
  • -s: 音切れ(xrun)を無視

JACK Audio Connection Kit 0.109系からは-XオプションでALSA MIDIドライバも使える。
-sオプションを付けないと、GlashCtl使用時に挙動がおかしくなることがある(LASHのオーディオセッションを開いたり閉じたりを繰り返すと固まる)。付けても、jackdを再起動するまで音が出なくなったりすることがある。*2この不具合は、ALSAのhwプラグインを直接使用したときには起こらない。

QjackCtlの設定

QjackCtlでは、ハードウェア(hwプラグイン)を使用する場合の設定とdmix/dsnoopを使用する場合の設定を別々のプリセットとして登録しておくと便利。切り替えはプリセットを切り替えてデーモンを起動し直すだけなので、それほど面倒にはならない。

dmix/dsnoop使用時


hw使用時

使用したバージョン:

  • ALSA 1.0.16
  • JACK Audio Connection Kit 0.109.2
  • QjackCtl 0.3.2

*1:あるJACKアプリケーションから出る音を別のJACKアプリケーションが録音したものなど

*2:環境やALSAのバージョンなどにより、起こらない場合もあるかもしれない