FLAGS

2016年2月17日水曜日

UbuntuでJACKとPulseAudioを同時に使う (oka01-rxqbidhqglvaownc)

Linuxで音楽作成環境を構築する時、JACKと呼ばれる音声再生サーバーが必要だ。

だが、現在(2016年)LinuxでJACK対応のソフト(例えば 作曲ソフト Ardour や、ドラムマシン hydrogenなど)を起動すると、大抵、ウェブブラウザや他の音楽再生ソフトから音が出なくなる問題が発生する。

2016年2月現在、この問題の対処方法は、日本語でも英語でもあまりきちんと説明されていなかったので、今回はこの問題が何故起こるのか、そしてその対処法を説明してみたい。

(2016年7月31日追記)
Ubuntu16.04で若干変更があったらしいので当記事で追記した。

たくさんあるサウンドシステムの違いについて

この音が出なくなる問題に対処するには、Linux上で動いている音声システムの『立役者』を知らなければならない。

音声システムには、いくつか種類がある。
  • OSS
  • ALSA
  • PulseAudio
  • JACK

これらの名前は、よく耳にはするものの、実際どういうものなのかは、あまり知られていないのではないだろうか。

■OSS(Open Sound System)は、カーネルやドライバーを通じて、任意の音声を再生したり録音したりする為のシステムだ。 かつてLinux標準の音声再生システムだったが、ALSAの発展に伴い徐々に廃れていき、Linuxカーネル2.5で開発者によって廃止が宣言された。かつて、多くのLinuxディストリビューションでデフォルトとして搭載されていた。

■ALSA(Advanced Linux Sound Architecture)は、Linux専用の音声再生システムで、機能的にはOSSと同じくカーネルやドライバーを通じて音声再生・音声録音を実現するシステムだ。OSSよりも高機能。

■PulseAudio は、現在(2016年)では、ほとんどのLinuxディストリビューションで搭載されているポピュラーな音声再生システムだ。PulseAudioは通常、ALSAの上で動作する。

PulseAudioの主な機能は、一言でいえばミキサーだ。PC上に複数起動している録音ソフト/再生ソフトを、PC上に複数インストールされている録音デバイス/再生デバイスに、接続する為のシステムだ。音量を調節したり、音質やステレオ・モノラルを切り替えたりできる。

PulseAudioにはネットワーク透過性があり、ネットワーク越しに音声を再生する機能がある。

■JACK(JACK Audio Connection Kit)は、PulseAudioと同じくミキサーの様な役割を果たすが、PulseAudioよりもずっときめ細かい制御が可能だ。

ローレイテンシー(音声データがシステムに入力されてから実際に発音されるまでの時間をできるだけ減らすことを目的とした設計方針)を念頭に設計されており、PulseAudioよりも音の立ち上がりが速いため、ソフトウェア・シンセなどで利用することに向いている。

JACKは通常、PulseAudioと同じようにALSA上で動作するが、OSSやCoreAudio(MAC用の音声再生システム)上でも動作する。


何故jack対応アプリを起動すると音が出なくなるのか

JACKは、jackd(JACKデーモン)と呼ばれるプログラムを利用する。デーモンとはサーバーと同じで常に起動したまま使うサービスプログラムのことだ。

ArdourやHydrogen等々の JACK対応のソフトは、jackdが起動していないと音が出ないので、ユーザーの便宜の為、しばしば自動でjackdを起動する様になっている。これらのソフトはしばしば、起動時にjackdを自動で起動するものの、終了時にjackdを自動で終了しない。これらのソフトは、jackdを起動したまま終了する。

jackdは前述の通りローレイテンシー設計なのでALSAを独占する。つまりjackdが起動している間は、JACK以外の音声再生システムはALSAにアクセスできないので、音も出せない。

これにより、ArdourやHydrogenを起動したが最後、金輪際 Firefox や VLCから音が出なくなるという貴方が体験した悪夢の現象が発生することになる。

この現象は、OSを再起動すれば解決する。

だが実は、

> pkill -9 jackd

とすることでも簡単に解決できる。jackdが終了してALSAが独占から開放され、PulseAudio が従来通りにALSAにデータを送信できるようになるからだ。


音が出なくなった時の解決方法

音が出なくなる問題は、解決された。だが問題は、どうやったら Ardourなどを利用している時に、同時に Firefox や VLCを利用できるのか、ではないだろうか。Ardourは JACK対応だが、Firefoxは PulseAudio対応なので、同時に音を出すことができない。これはとても不便だ。

ネット上を探すと、PulseAudioを利用するアプリを特殊なプログラムで包み込むことによってJACK対応に橋渡しする為のシステムがあるらしい。だがこれを動作させることは難しい様だ。

実は、PulseAudio自身がJACKに対応している。

PulseAudio をJackに対応する為の手順

1.jack対応モジュールのインストール

PulseAudioには、module-jack-sink / module-jack-source という2つのモジュールが用意されており、これをインストールすることで、PulseAudioを JACK上の音源として認識させることが可能だ。

Ubuntuであれば

> sudo apt-get install pulseaudio-module-jack

で簡単にインストールできる。(恐らく既にインストール済みの筈だ。)

インストールしたら、これを pulseaudio上で有効化する必要がある。

> sudo gedit /etc/pulse/default.pa

でファイルを開き、ファイルの最後に

load-module module-jack-sink
load-module module-jack-source

の2行を追加して保存する。保存したら

> pulseaudio -k

する。すると pulseaudioが、Ardour や、zynaddsubfx などと同じ様に、JACKの音源として認識される様になる。

2.JACKのルーティング変更

※ もし JACKをインストール済みであれば、patchage や QjackCtl はインストール済みではないかと思われるが、もしインストール済みでなければ、インストールする。

ここで patchageを使って JACKの音声データの接続状況(ルーティング)を確認すると、画面は次のように表示される。



【PulseAudioJACK Sink】が新たに登場したことを確認する。そしてそれが sytem playbackに接続されているか確認する。

3.PulseAudioのルーティングの変更

次に PulseAudio側で、音声の出力先をサウンドカードからJACKに切り替える必要がある。切り替えるのは、pavucontrol (PulseAudio Volume Control)を利用するのが簡単だ。

Ubuntuであれば

> sudo apt-get install pavucontrol

でインストール可能だ。これは必須ソフトと言える程に重要だが、Ubuntuでは何故かデフォルトでインストールされていない。

pavucontrol を起動したら Output Devices(出力デバイス)タブを開く。



すると出力先一覧に新たに PulseAudio JACK Sink が登場する。これの右側の緑のボタンをクリックして、選択状態にする。これでPulseAudioの音声出力先がJACKに変更される。

これでFirefoxとArdourで同時に音声が再生するようになる。

JACK対応アプリケーションについて

VLCは、JACKプラグインが用意されており、これをインストールすることでJACKに直接音声を出力することができる。

Ubuntuなら

> sudo apt-get install vlc-plugin-jack

でインストール可能だ。 インストールすると VLCの音声出力先にJACKが表示されるようになる。

Audacity は、JACKに対応しているがまだ完全ではないようだ。録音時のタイムラグなどはJACKの方が小さいことが期待されるが、JACK対応が成熟するまでは、 PulseAudio-JACK-Sink を使うことでしのぐことができそうだ。

Ubuntu 16.04 以降の仕様変更について

(2016年7月31日追記)

Ubuntu 16.04 で上記の動作に、微妙に変更があったらしい。

変更点は、

/etc/pulse/default.pa  で

load-module module-jack-sink
load-module module-jack-source

を追加してmodule-jack-sink / module-jack-source の読み込みを指定する必要がなくなった。むしろここでこの読み込みの指定を行うと問題が発生する

Ubuntu 16.04 では、jackd を起動すると、DBus経由で jackが起動したことがpulseaudioに通知され、pulseaudioは、通知されると自動で module-jack-sink / module-jack-source を読み込むらしい。その原理の詳細は不明だ

module の読み込みが自動になった影響で、 default.pa で module-jack-sink module-jack-source の読み込みを指定すると、システム内で何らかの衝突が起こり、pulseaudio / jackd の起動時にエラーが発生するようになることがあるらしい。

つまり、Ubuntu 16.04 で、pulseaudio と jackを共存させる際は、特に設定を必要としない様だ。

筆者の記憶では、14.04ではこの問題は発生しなかったので、16.04からの変更ではないか、と思われるが、詳細は不明。



また、 qjackctl の "Setup..." > "Options" > "Execute script after Startup" に

pactl set-default-sink jack_out

と pulseaudio の出力先を jack に変更するスクリプトを配置すると、jack を起動した時にいちいち pulseaudioの出力先を jack に変更する手間が省けるので、便利という。



上記の追記を書く際、次のポストを参照した。
How to use JACK and Pulseaudio/ALSA at the same time on the same audio device?


また、日本語のフォーラムで次の様な書き込みを見つけた。この問題の原因は上記と同じではないか…と思われるが、詳細は不明。但し、筆者の環境では、(default) を 括弧なしの default に変えても問題は解決できなかった。
16.04LTSにてQjackCtlからJackdを起動できない?

jack1 と jack2 の違いについて

追記2019年7月12日

jack1 と jack2 の違いについて調べてみた。ほとんど同じ処理をするプログラムなのに1と2がある。1が旧バージョンかと思いきや今でも平行運用されている。何故平行運用されているのか? 機能上に違いがあるのか? 利用者としては混乱するばかりだ。事情が込み入っており、情報が錯綜しているので、はっきりとしたことはわからないのだが、あちこちの掲示板の書き込みを総合してみるとだいたい次のようなことらしい。
  • jack1 は dbus 非対応だが jack2 は dbus対応。
  • jack1 は jackd という名前のプログラムを起動する。jack2 は jackd に加えて jackdbus という2種類のプログラム名がある。
  • jackdbus は DBus 対応したjackd らしい。jackd + dbus を『文字って』 jackdbus という名前になったのではないか…と思われる。
  • jackd はいわゆる『デーモン』なので起動停止が必要。jackdbus はいわゆる『サービス』でプロセス自体は起動したままでサービスの起動停止ができる。
  • jack2(jackdbus)はdbus経由で pulseaudio と通信することで pulseaudio を制御する機能がある。jack1はdbus通信の機能がないが、パッチを追加することでpulseaudio と通信することが可能になる。
  • jack1 は Cベースで開発されており、jack2はC++ ベースで開発されている。
  • jack1はjack2リリース後に廃止される予定だったが、 jack1 の開発者が C++への以降を拒んでそのままjack1の開発を続けるという意見分裂が起こったことから、jack1/jack2の並行運用が行われるようになったらしい。
  • jack1/jack2 のJack Audio Connection Kitとしての機能に違いはない。だが上記で見てきたように付随する機能に若干の違いがある。
  • jack2はマルチプロセス対応・マルチサウンドカード対応・ウィンドウズ対応など、jack1よりも拡張性が高いらしい。jack1はメモリ効率がよいらしい。
  • Ubuntu16.04 あたりから jack2 がデフォルトになったらしい。詳細不明。
この様な事情によって Ubuntu16.04 では
load-module module-jack-sink
load-module module-jack-source
が必要なくなった、ということなのではないか、と思われる。

だがjackdbusがpulseaudio と通信しているメカニズムやその動作を変更する設定ファイルがどこにあるかなど依然として不明なことは多い。ドキュメントされてない仕様が多く事情がつかみにくい。 僕は、単なる1人のジャズギタリストとして、いちいちgitリポジトリをクローンしてソースを検索したりしたり、古いメーリングリストのアーカイブを掘り返して最初から読み返してみたり…等々できればしたくない気がする。

参考資料:
jack1 と jack2 の違いについて


更新記録:
(Thu, 15 Sep 2016 14:35:53 +0700) pavucontrol のパッケージ名が間違っていたのを修正した。
(Fri, 12 Jul 2019 04:46:11 +0900) jack1とjack2の違いについて追記した。
(Sat, 08 Feb 2020 06:21:54 +0900) 目次が出来たのでヘッダ対応を行った。特に jack1/jack2の違いについての追記部分が目次上で綺麗に見えるようにタイトルを変更した。

著者おかあつしについて

小学生の頃からプログラミングが趣味。都内でジャズギタリストからプログラマに転身。プログラマをやめて、ラオス国境周辺で語学武者修行 ─── そんな僕が気付いた『音楽と言語』の不思議な関係について、このブログで説明しています。

特技は、即興演奏・作曲家・エッセイスト・言語研究者・コンピュータープログラマ・話せる言語・ラオ語・タイ語(東北イサーン方言)・中国語・英語・Java8 C++11・Qt・Scheme・Lilypond・Delphi・Ubuntu・Node.js等々




おかあつ日記メニューバーをリセット


2020 オカアツシ All Right Reserved