ALSA の設定ファイル .asoundrc の解説(和訳)

Last-modified: 2007-02-08 (木) 15:53:37

原文

なぜ asoundrc?

なぜ asoundrc が必要なのでしょうか?

.asoundrc も asound.conf も ALSA が適切に動作するために必要なわけではありません。
多くのアプリケーションはそれらがなくても動作するでしょう。
それらは、ルーティングやサンプルレート変換のような特別な機能を alsa-lib レイヤを通して許可するために利用されます。

.asoundrc ファイル

このファイルは、あなたにカード/デバイスのさらに先進的な制御を可能にしてくれます。
.asoundrc ファイルは、あなたのシステムで利用可能な様々なカードの定義から構成されます。
このファイルは alsa-lib の pcm プラグインにアクセスさせてくれます。
これらのおかげで、あなたのカードをこのファイルに結びつけたり、マルチチャンネルカードのマルチ i/o にアクセスできます。

.asoundrc はどこに?

asoundrc ファイルは通常、ユーザのホームディレクトリ

$HOME/.asoundrc

にインストールされ、

/usr/share/alsa/alsa.conf

から呼び出されます。
システム全体で利用する設定ファイルとして

/etc/asound.conf

をインストールすることも可能です。
alsa アプリケーションが開始されると、両方の設定ファイルが読み込まれます。
次は最も基本的な定義です。

デフォルトプラグイン

あなたのホーム and/or ルートディレクトリに .asoundrc ファイルを作成してください。

vi /home/xxx/.asoundrc

このファイルに次のものをコピーアンドペーストして保存します。

pcm.!default {
type hw
card 0
}
ctl.!default {
type hw
card 0
}

キーワード default は ALSA lib api で定義され、常に hw:0,0 (デフォルトサウンドカードのデフォルトデバイス) にアクセスします。
Specifying the !default name supercedes the one defined in the ALSA lib api.

これであなたはテストできます:

aplay -D default test.wav

PCM デバイスのネーミング

通常の asoundrc は 'PCM hw type' で始まります。
このおかげで、ALSA アプリケーションは与えられた名前によって仮想サウンドカード(プラグインまたはスレーブ)を開始できます。
これが無い場合、hw:0,0 または default のような名前でサウンドカード/デバイスにアクセスしなければなりません。
例えば:

aplay -D hw:0,0 test.wav

または ecasound を用いて

ecasound -i test.wav -o alsa,hw:0,0

hw: の後の数字はサウンドカードナンバーとデバイスナンバーをあらわしています。
サウンド "cards" はよくサウンド "devices" と呼ばれるため混乱するかもしれません。
しかし、ハードウェアのある特定の塊を制御する特定のドライバを持つという意味でそれらは "card" なのです。
また、それらは

/proc/asound/cards

であらわされているインデックスに対応しています。

~省略~

コントロールデバイス

ひとつのカードに対するコントロールデバイスとは、プログラムがそのカード上の様々なコントロール値を修正する道具です。
多くのカードで、これはミキサーを含んでいますが、rme9652 のようにいくつかのカードはミキサーを持っていません。
しかし、それらはたくさんの別のコントロールや、それらにアクセスするために必要な JACK のようなプログラムを持っています。
例えば、デジタル i/o 同期インジケータやサンプルクロックソーススイッチなどがあります。

エイリアス

'PCM hw type' を用いてあなたのデバイスにエイリアスを定義することができます。
この定義の構文は:

pcm.NAME {
	type hw					# Kernel PCM
	card INT/STR			# Card name or number
	[device] INT			# Device number (default 0)
	[subdevice] INT			# Subdevice number, -1 first available (default -1)
	mmap_emulation BOOL		# enable mmap emulation for ro/wo devices
}

例えば、これはあなたの第一のサウンドカードにエイリアスを与えます:

pcm. {
	type hw
	card 0
	device 0
}

これであなたはエイリアス '' を使ってこのカードにアクセスできます。

aplay -D test.wav

プラグイン

プラグインのフルリストが見たければ、cvs から毎日生成されているalsa-lib documentationを訪れると良いでしょう。

  • Q: プラグインとは何ですか?
  • A: ALSA では、PCM プラグインが PCM デバイスの機能や特徴を拡張してくれます。
    プラグインは自動で仕事を処理します - デバイスのネーミング、サンプルレート変換、チャンネル間でのサンプルコピー、ファイルへの書出し、サウンドカード/デバイスのマルチ i/o (サンプル同期はされていない)への対応、マルチチャンネルサウンドカード/デバイスの利用など。
    これらを利用するために、仮想スレーブデバイスを作成する必要がある。

とても単純なスレーブは次のように定義できる:

pcm_slave.sltest {
	pcm
}

これはパラメータのないスレーブを定義しています。
It's nothing more than another alias for your sound device.
理解するのにもう少し複雑なことがあります。'pcm types'に対するパラメータがスレーブ定義ブロックに定義されなければいけません。
それでは、この振る舞いを表すレートコンバータをセットアップしてみましょう。

pcm_slave.sl2 {
	pcm
	rate 48000
}
pcm.rate_convert {
	type rate
	slave sl2
}

これであなたは新しく作成された仮想デバイスを呼び出すことができます:

aplay -D rate_convert test.wav

これは再生中に自動的にサンプルレートを44.1kHzに変換してくれます。
大半のプレーヤや alsa はサウンドカードで可能な正しいサンプルレートに変換してくれるため、これはそれほど便利とはいえません。
しかし、例えばもっと低い static サンプルレートに変換するためにこれを利用することも可能です。
変換のためのさらに複雑なツールが pcm type プラグです。
構文は:

type plug					# Format adjusted PCM
slave STR					# Slave name (see pcm_slave)
#or
slave {					# Slave definition
	pcm STR					# Slave PCM name
	#or
	pcm { }					# Slave PCM definition
	[format STR]			# Slave format (default nearest) or "unchanged"
	[channels INT]			# Slave channels (default nearest) or "unchanged"
	[rate INT]				# Slave rate (default nearest) or "unchanged"
}
route_policy STR			# 自動 ttable 生成に対する route policy
							# STR の値として 'default' 'average' 'copy' 'duplicate'
							# average: 結果は 入力チャンネルの平均
							# copy: 最初のチャンネルだけがコピーされる
							# duplicate: 最初のチャンネルセットを複製する
							# default: momo capture を除いて policy をコピーする
ttable {					# Transfer table (bidimensional compound of cchanels * schannels numbers)
	CCHANNEL {
	SCHANNEL REAL			# route value (0.0 ... 1.0)
	}
}

次のように使う:

pcm_slave.sl3 {
	pcm
	format S16_LE
	channels 1
	rate 16000
}
pcm.complex_convert {
	type plug
	slave sl3
}

呼び出すには:

aplay -vD complex_convert test.wav

これで再生中、サンプルフォーマット: S16_LE, 1つのチャンネル, 16kHzのサンプルレートに変換されます。
aplay を verbose オプション -v をつけて呼び出せば、オリジナルファイルでのオプションが分かります。

aplay -v test.wav

ファイルのオリジナル設定が分かります。

ソフトウェアミキシング

ソフトウェアミキシングとは、ひとつのデバイスで、複数の音楽ファイルや、音楽アプリケーションを同時に再生させる機能です。
Linux 環境でソフトウェアミキシングを実現する方法は沢山あります。
通常、ARTSD, ESD, JACK...のようなサーバアプリケーションが必要になります。
The list is large and the apps can often be confusing to use.

dmix

最近では、dmix (direct mixing)プラグインと呼ばれる ALSA プラグインがあります。
構文をつかうことで、インストールや理解の苦労をせずとも簡単にソフトウェアミキシングを実現できます。

このプラグインのとても面白く、潜在的で、きわめて便利な側面として、default プラグインネームと結びつけて使えます。
理論的には、ネイティブな ALSA をサポートしている全てのアプリケーションがサウンドデバイスを共有できるということになります。
実際、この機能を利用できるアプリケーションはまだそれほど多くはありません。
しかし、あなたがもしテストをしてアプリケーション開発者にあなたの発見をレポートする時間があれば、それを試す価値はあるでしょう:

pcm.!default {
	type plug
	slave.pcm "dmixer"
}
pcm.dmixer {
	type dmix
	ipc_key 1024
	slave {
		pcm "hw:1,0"
		period_time 0
		period_size 1024
		buffer_size 4096
		rate 44100
	}
	bindings {
		0 0
		1 1
	}
}

(好きな名前でこれを使いたければ、!default の部分だけを変更してみてください)
ここで複数のコンソール上で試してみましょう:

aplay -f cd -D default test.wav
  • 注意
    PCM 名 dmix はすでにグローバル設定ファイル /usr/share/alsa/alsa.conf で定義されています。
    • このデバイスに対するデフォルトサンプルレートは 48000Hz です。これを変更したかったら
      aplay -D"plug:'dmix:RATE=44100'" test.wav
      としてください。
    • dmix プラグインで 44100Hz サンプルレートと hw:1,0 出力デバイスを使うときのサンプルコマンド
      aplay -Dplug:\'dmix:SLAVE=\"hw:1,0\", RATE=44100\' test.wav
    • PCM 名 dmix はすでにグローバル設定ファイル /usr/share/alsa/alsa.conf で定義されています。
      SLAVE="hw:0,0",RATE=48000
  • NB
    dmix プラグインはクライアントサーバ技術が基盤になってはいませんが、サウンドカードの DMA バッファに直接書き込んでいます。一度に実行されるインスタンスの数に制限はありあません。

dsnoop

dmix プラグインはマルチ出力(再生)ストリーム向けですが、
あなたがマルチ入力(キャプチャ)クライアントを使いたい場合は dsnoop プラグインが必要になります。

pcm.mixin {
	type dsnoop
	ipc_key 5978293 # must be unique for all dmix plugins!!!!
	ipc_key_add_uid yes
	slave {
		pcm "hw:0,0"
		channels 2
		period_size 1024
		buffer_size 4096
		rate 44100
		periods 0
		period_time 0
	}
	bindings {
		0 0
		0 1
	}
}

JACK プラグイン

このプラグインは、alsa をネイティブにサポートしているアプリケーションを JACK デーモンに接続してくれます。

jack をコンパイルしてインストールするためには、src/pcm/ext に移動して、"make jack" "make install-jack" を実行してください。

JACK プラグインを利用するには .asoundrc に次のものを追加する必要があります。

pcm.jackplug {
	type plug
	slave { pcm "jack" }
}
pcm.jack {
	type jack
	playback_ports {
		0 alsa_pcm:playback_1
		1 alsa_pcm:playback_2
	}
	capture_ports {
		0 alsa_pcm:capture_1
		1 alsa_pcm:capture_2
	}
}

これで使えるようになります:

aplay -Djackplug somefile
arecord -Djackplug somefile

仮想マルチチャンネルデバイス

二つ以上の ALSA デバイスをリンクさせて仮想マルチチャンネルデバイスを実現することができます。
However this will not create the mythical "multi-channel soundcard out of el-cheapo consumer cards".
The real devices will drift out of sync over time.

~省略~

Bindings explained

~省略~