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

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

GNU/Linux上のサウンドシステムについて(前半)

GNU/Linux上の音声出力に関する仕組みは複雑に見えてしまうが、それほど難しいわけではない。

低レベルサウンドシステム

ALSAOSSといったサウンドシステムは音声の出力をするデバイスと最も密接な関係があり、アプリケーションから受け取ったデータをサウンドカードに直接渡す。
後述の高レベルのサウンドシステム(サウンドデーモン)からの最終的な音声出力は、これらのサウンドシステムに渡されてサウンドカードに出力される。
ライン入力やマイクといった外部入力もこのレベルのサウンドシステムで処理され、サウンドデーモンからも利用できる。

OSS

OSSは古くから存在するサウンドシステムでPCM音声では/dev/dspMIDI信号では/dev/midi(/dev/sequencerなども使用される)のようなデバイスファイルを通じてアクセスする。カーネルOSS向けドライバがサポートするサウンドカードで使用できる他、後述のALSAによってもエミュレートされる。
PCM音声は別のアプリケーションが使用中の場合には出力できない(ALSAによるOSSエミュレーションでも同様)。
OSSにはこの旧バージョンの他に新しいバージョン4系があり、音声を同時に出力したり後述のALSAをエミュレートしたりできるようだが、使用したことはないため、詳しくは分からない。
OSS4についての情報は
http://www.4front-tech.com/wiki/
以下が参考になるかもしれない。

ALSA

ALSAは新しいサウンドシステムで、ドライバ*1、ライブラリ*2、各種ツールなどから成る。/dev/snd/以下のデバイスファイルが用いられる。
プラグインシステムを持ち、音声の合成により複数のアプリケーションが同時に音を出せる仕組み*3、高レベルのサウンドシステム(サウンドデーモン)への接続*4、出力前の音声の加工*5、ファイルへの音声の書き出し*6などに加え、出力先の色々な制御を行うこともできる。
プラグインの1つ「hw」を用いると、旧OSSと同様、他のアプリケーションと同時には使えない、サウンドカードへの最も低レベルなアクセスを提供する。そのため、ALSAサウンドシステム上のプラグイン処理による遅延の影響を受けず、上位レベルのサウンドシステム(デーモン)からは好んで用いられる。*7
MIDIバイスを扱う仕組みも用意されており、ALSA対応のハードウェアMIDI音源が扱える他、TiMidity++*8FluidSynth*9のようなソフトウェアもALSAMIDIバイスとして動作し、MIDIアプリケーションから使用できる。
ALSAプラグインシステムについては「ALSA PCMプラグインとその設定について(概要と設定ファイル)」「ALSA PCMプラグインとその設定について(既定のプラグインデバイス)」で詳しく扱っている。

サウンドデーモン(概要)

PulseAudioやJACK Audio Connection Kitといったものは前述のサウンドシステムの上で動作するサウンドデーモンで、対応アプリケーションからのオーディオデータを待ち受ける。
複数の対応アプリケーションから同時に出力される音声を合成して低レベルサウンドシステムに渡すのを基本とし、遠隔マシンに音声を渡したりするなどの高度な機能も持っている。
アプリケーション間で音声をやりとりできるのでアプリケーション上の音声を録音(ファイルに保存)するのにも役立つ。
PulseAudioとJACK Audio Connection Kitはどちらも低遅延でデータを処理できる設計となっており、更に、システム側の設定*10しだいでは高い優先度で実行してより信頼性の高いサウンドデーモンとして動かすことができる。*11
サウンドデーモンにはaRtsやesdといったものも存在するが、2009年秋の時点ではこれらは使われなくなってきている。*12
欠点としてはゲームなどとの相性の悪さがあり、特にPulseAudioは低レベルサウンドシステムを用いたときと比べて音がずれたり乱れたりする原因となることがある。SDLを用いたゲームなどでは環境変数SDL_AUDIODRIVERを「alsa」にしてALSAサウンドシステムから出力するようにすると改善するが、ALSAの既定の出力先がPulseAudio*13やJACKのプラグイン*14になっている場合はその設定を修正しないと効果がない。

(「GNU/Linux上のサウンドシステムについて(後半)」に続く)

関連記事:

*1:カーネルの一部として動作するデバイスドライバ

*2:プログラム内で扱う方法を提供するファイル群

*3:dmixプラグイン

*4:JACKやPulseAudioのプラグイン

*5:LADSPAプラグイン

*6:ファイルプラグイン

*7:リズムゲームStepManiaGNU/Linux版もALSAの「hw」プラグイン(もしくは旧OSS)を直接用いる仕組みとなっているが、遅延対策の意図があるかどうかは不明

*8:GUS/Patchかサウンドフォントを音源データに用いるMIDIシンセサイザ

*9:サウンドフォントを音源データに用いるMIDIシンセサイザ・QsynthというGUIがある

*10:/etc/security/limits.confにおける権限の設定

*11:JACKの場合、きちんと設定しないと音切れだらけになってしまうが、設定すると非常に有用となる

*12:aRtsはKDE3で用いられたがKDE4では(後半で扱う)Phononが用いられるようになっていて、esdもGNOME2系の途中まで用いられたがその後標準サウンドデーモンがPulseAudioに置き換えられた

*13:typeが「pulse」なPCM・詳しくは「Wine上の音声をPulseAudioへ渡す」の中の設定を参照

*14:typeが「jack」なPCMをslaveに取るPCM・詳しくは「ALSA PCMデバイスとしてJACK Audio Connection Kitを使用」を参照