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は、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に対応している。

1.インストール

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を起動できない?





更新記録:
(Thu, 15 Sep 2016 14:35:53 +0700) pavucontrol のパッケージ名が間違っていたのを修正した。