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

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

ALSA PCMプラグインとその設定について(既定のプラグインデバイス)

既定(default)のPCMプラグインバイス

ALSAアプリケーションは、特に指定のない限り、「default」というPCMプラグインバイスに対してデータのやりとりをする。この定義は/usr/share/alsa/cards/以下のカードごとの設定ファイルにされている。*1
この「default」などの予約された名前のPCMプラグインの定義を使用せず、代わりに自分で定義したものを使用(上書き=オーバーライド)することは可能。その場合、${HOME}/.asoundrcなどには

pcm.!default {
  # (既定のPCMプラグインデバイスの定義を記述)
}

のように、「!」を付けて記述する。他にも、

defaults.pcm.dmix.!rate 96000

のように、/usr/share/alsa/alsa.conf内で定義されている変数値の設定で書くこともある。

一般的な「default」PCMプラグインバイスの形

PCMプラグインバイス名の指定をしないときにはこれが使用されるため、そのままでも扱いやすいような形となっている場合が多い。
内部的には、「asym」というプラグインが使用されていて、再生(プレイバック)/録音(キャプチャ)の両方のプラグインバイスに対して接続する役目を持っている。
参考URL:

実際には、その中で

  • dmix:音声を合成する(出力先を共有)
  • dsnoop:外部入力のキャプチャを共有

という2つのプラグインと接続する形となっている。
更に、カードによってはsoftvolというプラグインもdmixとの間に挟んでいて、ALSA上でsoftvolプラグインを使用している範囲で有効*2なソフトウェアボリュームも提供している。
/usr/share/alsa/cards/以下のファイルを見ると、実際の定義を見ることができる。下は「hda-intel」向けの「default」PCMデバイスの定義。
[引用]ファイル名: /usr/share/alsa/cards/HDA-Intel.conf

# default with dmix+softvol & dsnoop
HDA-Intel.pcm.default {
	@args [ CARD ]
	@args.CARD {
		type string
	}
	type asym
	playback.pcm {
		type plug
		slave.pcm {
			type softvol
			slave.pcm {
				@func concat
				strings [ "dmix:" $CARD ]
			}
			control {
				name "PCM Playback Volume"
				card $CARD
			}
		}
	}
	capture.pcm {
		type plug
		slave.pcm {
			type softvol
			slave.pcm {
				@func concat
				strings [ "dsnoop:" $CARD ]
			}
			control {
				name "Digital Capture Volume"
				card $CARD
			}
			min_dB -30.0
			max_dB 30.0
			resolution 121
		}
	}
}

この場合の「default」PCMデバイスを使用した処理の流れとしては
再生が

default - asym - plug - softvol - dmix - hw

録音が

hw - dsnoop - softvol - plug - asym - default

という形になる。

アプリケーションが使用するPCMプラグインバイスの指定

既定でないプラグインバイスにアプリケーションから接続したい場合、アプリケーションごとに固有な方法でプラグインバイス名を指定することが必要となる。主に自分で${HOME}/.asoundrcに新しく定義したPCMプラグインバイスへ処理を渡したい場合*3となる。
指定方法に関しては「ALSA対応アプリケーションのPCMデバイス指定」に書いているが、アプリケーションごとに指定方法は違うので、世に出回っている全てのALSAアプリケーションのPCMプラグインバイス指定の方法をカバーするのは非常に困難。

関連記事:

使用したバージョン:

*1:実際には/usr/share/alsa/alsa.conf/usr/share/alsa/pcm/default.confの記述から、ドライバごとのファイルが参照される形になっている

*2:hwプラグインを直接使用した場合など、softvolを途中で通さずに音を出した場合には無視される

*3:かつ、既定のプラグインの上書きをしない場合