ざっくりとALSAとPulseAudioの関係

RPi2で音を鳴らそうと思うが、その前にALSAとPulseAudioの関係について、ざっくりとまとめる。

Linuxのサウンドシステム

Linuxのサウンドシステムは複雑でいろいろなものが入り乱れていてわかりづらい。

詳しいことはここに解りやすくまとまった情報があるので参照してみてほしい。

基本的な理解としては、

  1. 最終的に音を鳴らすのはデバイス
  2. デバイスを叩くためにデバイスドライバ(カーネルランド)
  3. サウンド関連でカーネルランドとユーザーランド橋渡しをする部分を取りまとめているのがALSA
  4. 各アプリケーション間でサウンド関連のリソースを調停するのがPulseAudioなどのサウンドサーバ

複雑化の要因

複雑化している原因の1つは、アプリケーションが直接ALSAを触るケースがあること。

通常のケースでは以下のようにアプリケーションはサウンドサーバ(PulseAudio)を介してALSAにアクセスする。

f:id:mickey_happygolucky:20150404105007p:plain

ALSAもユーザーランドから触れるAPIを提供していて、これは多分サウンドサーバが仕事をできるようにするためなのだが、サウンドサーバではない通常のアプリケーションが、ALSAAPIを利用してしまうことがある。 こうなってしまうと、せっかくアプリケーション間でのリソースを調停しているサウンドサーバの管理外でサウンドリソースが利用されてしまい、サウンドサーバの動作に支障をきたす。

f:id:mickey_happygolucky:20150404105012p:plain

それを回避するためにPulseAudioなどのサウンドサーバはALSAのデバイスのふりをして、ALSAAPIを直接叩いているアプリケーションのサウンドリソースを横取りしてしまう。 そうして、管理下に置いたあと本物のALSAに音を流す。

f:id:mickey_happygolucky:20150404105017p:plain

この構図を知らないで設定ファイルをいじろうとすると、ALSA?? PulseAudio??となり混乱してしまう。

#私は混乱した。