2012-03-30

PulseAudioの問題

PulseAudioについては、悪い話しか聞かない。まだ私が不自由なOSであるWindowsを使っていた頃から、PulseAudioは酷評されていた記憶がある。

これが不思議だ。そもそも、PulseAudioというのは、低レベルAPIをラップする高レベルAPIである。PulseAudioによって、すべてのプログラムが、あたかもサウンドデバイスを独占的に使用できているかのような環境をエミュレートしている。その実装の質はともかく、思想は至って普通だ。モダンなOSなら、当然ハードウェアなどは通常のプログラムから意識させないようにするべきである。いまや、OSはサウンドデバイスの制限のあるミキシングに頼らないのだ。CPUは十分に速くなった。ソフトウェアでのミキシングは、現代のCPUならパフォーマンス上、なんの問題もない。いまや、完全なソフトウェアによるリアルタイムのミキシングやリサンプリングは当たり前である。

ところが、PulseAudioについて検索すると、まず出てくるのが、「お前を消す方法」である。これは一体どういうことか。大抵のディストリでPulseAudioはデフォルトで入っているのだ。入っているからには理由があるはずだ。理由とは、ハードウェアを仮想化するためである。

さて、この問題に、私もぶち当たった。なぜか、一部のプログラムでの音の再生に、周期的なノイズが乗るのである。私は当初、Linuxのサウンドドライバーを疑った。しかし、一部のプログラムだけに発生するので、ドライバーではあるまい。では、プログラム側の問題なのだろうか。このプログラムは非常にダメな実装をしているのだろうか。しかし、どうも実装の質による問題でもなさそうだ。

問題の根本的な理由は、この一部のプログラムが、ALSAを直接使っているためである。PulseAudioはALSAを仮想化するものだから、その仮想化に従わないプログラムがあると問題になる。

なるほど、一部の短気な人間が、PulseAudioをアンインストールすることによって問題の解決を図るのも納得だ。PulseAudioを消せば、すわなち、PulseAudioのサーバーを実行しなければ、とりあえず問題は解決する。PulseAudioの高レベルな仮想化の恩恵は受けられないが、ALSAを直接使っているプログラムは、正しく動作する。そして、ほとんどのGNU/Linuxで動く音声を再生するプログラムは、実行環境にPulseAudioがない場合を想定して、ALSAを直接使う動的なフォールバックを提供している。だから、PulseAudioがなくても、とりあえずは動く。

明らかに、これは間違っている。この手のことは個々のプログラムで行うべきことではない。システム側で一律に行うべきことだ。PulseAudioの実装の質はどうあれ、その理念は当然だ。

では解決方法はあるのか。真の解決には、すべてのプログラムが最終的にはPulseAudioを使うことである。PulseAudioを直接使うにせよ、OpenALとかlibabなどの更に高レベルなライブラリに頼るにせよ、最終的にPulseAudioを使うことが重要だ。しかし、ことGNU/Linuxの世界で、そのようなAPIの統一を図るのは不可能だ。ALSAを直接使うプログラムは依然として存在する。ソースコードが公開されていれば、自力で直すこともできようが、労力的に現実的ではない。

そこで、普通にALSAを使った場合は、PulseAudioが提供している仮想的なデバイスに入出力するようにするのだ。仮想的なデバイス経由で使われたPulseAudioは入出力を一手に引受、ALSAを使って、本当の物理的なハードウェアに出力する。

そのためには、.asoundrcか、あるいはシステムワイドな/etc/asound.confを設定する必要がある。詳しくは、以下を参照されたし。

freedesktop.org - Software/PulseAudio/Documentation/User/PerfectSetup

問題は、なぜUbuntuはデフォルトでこの設定をしていないのかということだ。不思議だ。まあもっとも、調べて設定するのはそれほど難しくないので、特に困らないが。

GNU/Linuxの問題は、ここにある。本来、このようなオーディオスタックは、単一の実装が低レベルから高レベルまで提供すべきなのだ。そうであれば、たとえ低レベルなAPIを使ったとしても、高レベルなAPIと強調できる。GNU/LinuxではALSAとPulseAudioが分離しているために、協調的な動作が難しい。選択の自由があることは素晴らしいことだが、運用を少しややこしくする。

2 comments:

M59 said...

Ubuntuでのデフォルトの設定は /usr/share/alsa/ 以下にあるのがそうだと思います。/etc/asound.conf や ~/.asoundrc はそこの設定ファイルから読み込まれているようです。

江添亮 said...

ふーむ、/usr/share/alsa/以下の設定ファイルを覗いてみると、ALSAからpulseaudioが使われるようになっているはずなのですがね。
不思議だ。