Advanced Linux Sound Architecture
関連記事
Advanced Linux Sound Architecture (ALSA) は、サウンドカードのデバイスドライバを提供する Open Sound System (OSSv3) を置き換えるために開発された Linux カーネルコンポーネントです。デバイスドライバの他に、ALSA は、カーネルドライバと直接やりとりせずに高レベルの API を使ってドライバ機能を使いたいという開発者のために、ユーザ空間のライブラリも提供しています。
目次
インストール
ALSA はデフォルトの Arch カーネルにモジュールセットとして含まれているので、インストールは不要です。
起動時に自動で udev があなたのハードウェアを調べて、オーディオカード用の適切なカーネルモジュールをロードします。したがって、サウンドはすでに鳴らせるはずです。ただ、デフォルトでは全てのチャンネルはミュートにされています。
(仮想端末やディスプレイマネージャで)ローカルログインしたユーザーには音楽を再生したりミキサーレベルを変更する権限があります。リモートログインしたときにこれらをするには、ユーザーを audio
グループに追加する必要があります。audio
グループに含まれているユーザーは直接デバイスにアクセスできるので、アプリケーションから排他的にアウトプットしたり(ソフトウェアミキシングが破壊されます)、高速ユーザー切り替えや multiseat を破壊してしまうおそれがあります。よって、特に必要がないのならばユーザーを audio
グループに追加することは推奨されません[1]。
ユーザースペースユーティリティ
公式リポジトリから alsa-utils パッケージをインストールしてください、サウンドデバイスをコンソールや端末から設定するための alsamixer
ユーザー空間ツールが含まれています。また、高品質なリサンプリングやアップ・ダウンミキシングなどの高度な機能を使いたい場合は alsa-plugins パッケージをインストールしてください。
OSS アプリケーションに dmix (ソフトウェアミキシング) を扱わせたい場合は alsa-oss パッケージをインストールして snd_seq_oss
, snd_pcm_oss
, snd_mixer_oss
カーネルモジュールをロードして OSS エミュレーションモジュールを有効にしてください。
チャンネルのミュートを解除する
現在のバージョンでは ALSA をインストールしたあと全てのチャンネルはデフォルトでミュートされています。手動でチャンネルをアンミュートする必要があります。
alsamixer
ncurses UI を使えば簡単にミュートを解除できます:
$ alsamixer
もしくは、コマンドラインで amixer
を使って下さい:
$ amixer sset Master unmute
alsamixer
の、チャンネルの下の MM
ラベルはそのチャンネルがミュートになっていることを示しています。00
はミュートが解除されていることを示しています。
←
や →
キーを押して Master
や PCM
チャンネルに移動して m
キーを押してミュートを解除してください。↑
キーを押してボリュームを上げて値を 0
dB ゲインにしてください。ゲインは左上の 項目:
の隣に表示されます。ゲインを大きくしすぎると音にノイズが混じります。
5.1 または 7.1 サラウンドを鳴らしたいときは Front, Surround, Center, LFE (サブウーファー), Side などの他のチャンネルも同じようにミュートを解除してください(これらのチャンネル名は Intel HD Audio のものです、チャンネル名はハードウェアによって変わっているかもしれません)。ミュートを解除しただけではステレオ音源は自動でアップミキシングされません。これをするには #アップ・ダウンミキシング を見て下さい。
マイクロフォンを有効にするには、Capture タブに F4
で切り替えてチャンネルを Space
で有効にしてください。
alsamixer を終了するときは Esc
を押して下さい。
次に、音が鳴るかテストしてみましょう:
$ speaker-test -c 2
-c
はスピーカーによって変えて下さい。例えば 7.1 では -c 8
を使います:
$ speaker-test -c 8
音が出ない場合、#設定 や Advanced Linux Sound Architecture/トラブルシューティング に進んで問題を解決してください。
alsa-utils パッケージには、それぞれ起動時とシャットダウン時に動くように設定された alsa-restore.service
と alsa-store.service
が含まれています。参考までに言うと、ALSA は設定を /var/lib/alsa/asound.state
に保存します。
設定
デフォルトサウンドカードの設定
起動毎にサウンドカードの順番が変わってしまうときは、/etc/modprobe.d
内の .conf
で終わるファイル (例: /etc/modprobe.d/alsa-base.conf
) に順番を明記することができます。
例えば、mia サウンドカードを #0 にしたい場合は:
/etc/modprobe.d/alsa-base.conf
options snd slots=snd_mia,snd_hda_intel options snd_mia index=0 options snd_hda_intel index=1
$ cat /proc/asound/modules
を使ってロードされているサウンドモジュールとその順番を取得してください。$ lsmod | grep snd
を使ってデバイス・モジュールのリストを取得してください。この設定では snd_mia
を使うサウンドカードと snd_hda_intel
を使うサウンドカード (例: オンボード) を一枚づつ挿していると仮定しています。
index を -2
にすることで ALSA にカードを優先的に使わせないようにすることも可能です。Linux Mint や Ubuntu などのディストリビューションでは以下の設定を使うことで USB やその他の"一般的でない"ドライバに index 0
を与えないようにしています:
/etc/modprobe.d/alsa-base.conf
options bt87x index=-2 options cx88_alsa index=-2 options saa7134-alsa index=-2 options snd-atiixp-modem index=-2 options snd-intel8x0m index=-2 options snd-via82xx-modem index=-2 options snd-usb-audio index=-2 options snd-usb-caiaq index=-2 options snd-usb-ua101 index=-2 options snd-usb-us122l index=-2 options snd-usb-usx2y index=-2 options snd-pcsp index=-2 options snd-usb-audio index=-2
変更を反映させるには再起動する必要があります。
環境変数を使ってデフォルト PCM を選択する
設定ファイルで、以下を追加してください:
pcm.!default { type plug slave.pcm { @func getenv vars [ ALSAPCM ] default "hw:Audigy2" } }
default の行はあなたのカードの名前に置き換える必要があります (ここでは Audigy2
を例にしています)。aplay -l
で名前を取得することができ surround51 のように PCM を使うことも可能です。ただしマイクロフォンを使う必要がある場合は full-duplex PCM をデフォルトにすると良いでしょう。
これで環境変数 ALSAPCM
を変更することでサウンドカードを選択できるようになります。カードを選択できない全てのプログラムで問題なく使えます。
例えば、mix51to20 という名前の downmix PCM を書いたときは mplayer
を ALSAPCM=mix51to20 mplayer example_6_channel.wav
で使うことができます。
他の方法
まずデフォルトに設定したいカード・デバイスの id を aplay -l
で見つける必要があります:
$ aplay -l
**** List of PLAYBACK Hardware Devices **** card 0: Intel [HDA Intel], device 0: CONEXANT Analog [CONEXANT Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: Intel [HDA Intel], device 1: Conexant Digital [Conexant Digital] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: JamLab [JamLab], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: Audio [Altec Lansing XT1 - USB Audio], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0
例えば、このリストの最後のエントリはカード ID 2 でデバイス ID 0 です。このカードをデフォルトにするには、システム全体のファイル /etc/asound.conf
かユーザー定義ファイル ~/.asoundrc
のどちらかを使ってください。ファイルが存在しないときは作成する必要があります。そして以下のオプションを適切なカード・デバイス id を使って挿入して下さい。
pcm.!default { type hw card 2 } ctl.!default { type hw card 2 }
'pcm' オプションは音声の再生で使われるカード・デバイスに影響を与え、'ctl' オプションは alsamixer などのコントロールユーティリティで使われるカードに影響を与えます。
アプリケーション (mplayer など) を(再)起動すれば変更はすぐ適用されます。また、aplay などのコマンドを使ってテストすることが可能です。
$ aplay -D default your_favourite_sound.wav
asound 設定に関するエラーが表示される場合は、upstream documentation を確認して設定ファイルフォーマットの変更を確認してください。
サウンドモジュールがロードされていることを確かめる
udev が正しくサウンドカードを検知しているかチェックするには次のコマンドを実行してください:
$ lsmod | grep '^snd' | column -t
snd_hda_codec_hdmi 22378 4 snd_hda_codec_realtek 294191 1 snd_hda_intel 21738 1 snd_hda_codec 73739 3 snd_hda_codec_hdmi,snd_hda_codec_realtek,snd_hda_intel snd_hwdep 6134 1 snd_hda_codec snd_pcm 71032 3 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec snd_timer 18992 1 snd_pcm snd 55132 9 snd_hda_codec_hdmi,snd_hda_codec_realtek,snd_hda_intel,snd_hda_codec,snd_hwdep,snd_pcm,snd_timer snd_page_alloc 7017 2 snd_hda_intel,snd_pcm
出力が上と同じようになっていれば、サウンドドライバが首尾よく自動検出されています。
/dev/snd/
ディレクトリにデバイスファイルがあるか調べてもいいかもしれません:
$ ls -l /dev/snd
total 0 crw-rw---- 1 root audio 116, 0 Apr 8 14:17 controlC0 crw-rw---- 1 root audio 116, 32 Apr 8 14:17 controlC1 crw-rw---- 1 root audio 116, 24 Apr 8 14:17 pcmC0D0c crw-rw---- 1 root audio 116, 16 Apr 8 14:17 pcmC0D0p crw-rw---- 1 root audio 116, 25 Apr 8 14:17 pcmC0D1c crw-rw---- 1 root audio 116, 56 Apr 8 14:17 pcmC1D0c crw-rw---- 1 root audio 116, 48 Apr 8 14:17 pcmC1D0p crw-rw---- 1 root audio 116, 1 Apr 8 14:17 seq crw-rw---- 1 root audio 116, 33 Apr 8 14:17 timer
とにかく controlC0 や pcmC0D0p のようなデバイスがあれば、サウンドモジュールが正しくロードされていることを示しています。
そうなってないのなら、あなたのサウンドモジュールは正しく検出されていません。これを解決するには、手動でモジュールのロードを試して下さい:
- サウンドカードのモジュールを確認します: ALSA Soundcard Matrix モジュールには名前の前に 'snd-' が付きます (例:
snd-via82xx
)。 - モジュールをロードします。
/dev/snd
の中のデバイスファイルを確認したり(上述)、alsamixer
やamixer
に変化がないか調べて下さい。snd-NAME-OF-MODULE
とsnd-pcm-oss
を起動時にロードするよう設定して下さい。
SPDIF 出力
(from gralves from the Gentoo forums)
- GNOME ボリュームコントールの、オプションタブから、IEC958 を PCM に変更して下さい。このオプションは設定から有効にすることができます。
- GNOME ボリュームコントロールをインストールしていない場合、
/var/lib/alsa/asound.state
を編集してください。このファイルには alsasound のミキサーの設定が保存されています。- 次の文を探して下さい: 'IEC958 Playback Switch'。その近くに
value:false
と書かれた行があるはずです。それをvalue:true
に変えて下さい。 - 次の行を探して下さい: 'IEC958 Playback AC97-SPSA'。これの値を 0 に変えてください。
- ALSA を再起動します。
2014年2月2日現在、上の方法は使うことができないようです。下を見て下さい。
ログイン時に SPDIF 出力を自動的に有効にする他の方法:
- 次の行を
~/.xinitrc
に追加してください:
amixer -c 0 cset name='IEC958 Playback Switch' on
あなたのカードのデジタル出力の名前を見るには次のコマンドを実行してください:
$ amixer scontrols
イコライザー
AlsaEqual を使う (UI あり)
AUR から alsaequalAUR をインストールしてください。
パッケージをインストールした後、以下を ALSA 設定ファイル (~/.asoundrc
か /etc/asound.conf
) に挿入してください:
ctl.equal { type equal; } pcm.plugequal { type equal; # Modify the line below if you do not # want to use sound card 0. #slave.pcm "plughw:0,0"; #by default we want to play from more sources at time: slave.pcm "plug:dmix"; } #pcm.equal { # If you do not want the equalizer to be your # default soundcard comment the following # line and uncomment the above line. (You can # choose it as the output device by addressing # it with specific apps,eg mpg123 -a equal 06.Back_In_Black.mp3) pcm.!default { type plug; slave.pcm plugequal; }
次のコマンドを使ってイコライザーを変更することができます
$ alsamixer -D equal
設定ファイルはユーザーごとに違うので注意してください。~/.alsaequal.bin
に保存されます。
AlsaEqual を異なるユーザーの mpd などのソフトウェアで使いたいときは、次を実行することで設定できます:
# su mpd -c 'alsamixer -D equal'
もしくは、ユーザーの home にある .alsaequal.bin
のシンボリックリンクを作って下さい。
AlsaEqual の管理
AUR から alsaequal-mgrAUR をインストールしてください (もしくは Xyneのリポジトリ を使って下さい)。
通常通りイコライザーを設定してください:
$ alsamixer -D equal
状態に満足したら、名前を付けて保存してください (例: "foo"):
$ alsaequal-mgr save foo
イコライザーの状態 "foo" は次のコマンドで戻すことができます:
$ alsaequal-mgr load foo
ゲームや映画、音楽のジャンル別、VoIP アプリなどそれぞれに合わせてイコライザーの状態を作成し、必要なときにリロードできます。
オプションの詳細は project page を見て下さい。
mbeq を使う
alsa-plugins, ladspa, swh-plugins パッケージをインストールしてください。
まだ ~/.asoundrc
か /etc/asound.conf
ファイルを作成していない場合は、どちらかを作成して以下を挿入して下さい:
/etc/asound.conf
pcm.eq { type ladspa # The output from the EQ can either go direct to a hardware device # (if you have a hardware mixer, e.g. SBLive/Audigy) or it can go # to the software mixer shown here. #slave.pcm "plughw:0,0" slave.pcm "plug:dmix" # Sometimes you may need to specify the path to the plugins, # especially if you have just installed them. Once you have logged # out/restarted this should not be necessary, but if you get errors # about being unable to find plugins, try uncommenting this. #path "/usr/lib/ladspa" plugins [ { label mbeq id 1197 input { #this setting is here by example, edit to your own taste #bands: 50hz, 100hz, 156hz, 220hz, 311hz, 440hz, 622hz, 880hz, 1250hz, 1750hz, 25000hz, #50000hz, 10000hz, 20000hz controls [ -5 -5 -5 -5 -5 -10 -20 -15 -10 -10 -10 -10 -10 -3 -2 ] } } ] } # Redirect the default device to go via the EQ - you may want to do # this last, once you are sure everything is working. Otherwise all # your audio programs will break/crash if something has gone wrong. pcm.!default { type plug slave.pcm "eq" } # Redirect the OSS emulation through the EQ too (when programs are running through "aoss") pcm.dsp0 { type plug slave.pcm "eq" }
- これで動くはずです (動かない時は、フォーラムで質問して下さい)。
高品質なリサンプリング
ソフトウェアミキシングが有効になっていると、ALSA は全てを同じ周波数 (デフォルトで 48000) にリサンプリングします。dmix はサウンドの品質を落としてしまう低品質リサンプリングアルゴリズムを使っています。
alsa-plugins と libsamplerate をインストールして下さい。
デフォルトの変換器を libsamplerate に変更します:
/etc/asound.conf
defaults.pcm.rate_converter "samplerate_best"
または:
~/.asoundrc
defaults.pcm.rate_converter "samplerate_best"
samplerate_best は最高のサウンド品質を提供しますが、リアルタイムサンプリングをするには CPU サイクルが大量に必要になるので使うにはそこそこの CPU が必須です。また、dmix の設定で buffer_size を基本の 4096 から 8192 か 16384 に調整する必要もあるかもしれません。他のアルゴリズム (samplerate など) も利用できますがデフォルトのリサンプラーに比べておそらくあまり改善はないでしょう。
アップ・ダウンミキシング
アップミキシング
音楽などのステレオ音源を 5.1 や 7.1 サウンドシステムをフルに使って再生するには、アップミキシングを使う必要があります。黎明期ではこれをするのはとても難しいものでした。ですが現在では簡単にアップミキシングができるプラグインがあります。alsa-plugins に含まれている upmix
プラグインを使います。
それから以下を ALSA 設定ファイル (/etc/asound.conf
か ~/.asoundrc
) に追加してください:
pcm.upmix71 { type upmix slave.pcm "surround71" delay 15 channels 8 }
上の例は 7.1 のものですが 5.1 や 4.0 にも簡単に変えられます。
設定をするとアップミキシングに使う新しい pcm が加わります。全てのサウンド音源をこの pcm に通したい時は、次のようにデフォルトとして追加してください:
pcm.!default "plug:upmix71"
このプラグインは使うにあたって特に設定を変える必要はありません。 プラグインが動作しないときは、以下のようにしてアップミキシングする PCM のための dmixer を自分で設定してください:
pcm.dmix6 { type asym playback.pcm { type dmix ipc_key 567829 slave { pcm "hw:0,0" channels 6 } } }
そして "surround71" のかわりに "dmix6" を使って下さい。 音がスキップしたり歪むときは、buffer_size を増やす (例: 32768) か 高品質リサンプラーを使ってください。
ダウンミキシング
5.1 サウンドの映画をステレオシステムで視聴するときなど、音源をステレオにダウンミキシングしたい場合、alsa-plugins に含まれている vdownmix
プラグインを使って下さい。
設定ファイルに以下を追加して下さい:
pcm.!surround51 { type vdownmix slave.pcm "default" } pcm.!surround40 { type vdownmix slave.pcm "default" }
ミキシング
ミキシングを使うことで複数のアプリケーションが同時に音を出力することが可能になります。外付けのサウンドカードはほとんどの場合ハードウェアミキシングをサポートしており、可能であればデフォルトで有効にされます。内蔵のマザーボードに載っているサウンドカード (Intel HD Audio など) は基本的にハードウェアミキシングをサポートしていません。そのようなカードでは、dmix という名前の ALSA プラグインを使ってソフトウェアミキシングを利用します。この機能はハードウェアミキシングが使えない場合に自動で有効にされます。
手動で dmix を有効にする
ソフトウェアミキシングが動作しない場合は、あなたの home フォルダに以下の内容で .asoundrc ファイルを作成してください。
pcm.dsp { type plug slave.pcm "dmix" }
これでソフトウェアミキシングが有効になり複数のアプリケーションがサウンドカードを使えるようになるはずです。使えない場合は、/etc/asound.conf
の中身を全て上のように置き換えてみて下さい。
S/PDIF などのデジタル音声出力をするために、ALSA パッケージは依然として dmix をデフォルトで有効にしていません。そのため、上の dmix 設定は S/PDIF デバイスで dmix を有効にするために使うことはできません。
一般的な問題と解決方法は Advanced Linux Sound Architecture/トラブルシューティング を見て下さい。
ハードウェアミキシング
サポート
ハードウェアでミキシングをサポートしているオーディオチップセットを持っている場合、設定は必要ありません。ほとんど全てのオンボード・オーディオチップセットはハードウェアミキシングをサポートしていないので、ソフトウェアでミキシングする必要があります(上述)。ハードウェアミキシングをサポートしているサウンドカードは少なく、Linux でサポートされているサウンドカードは以下になります:
- Creative SoundBlaster Live! (5.1 モデル)
- Creative SoundBlaster Audigy (複数)
- Creative SoundBlaster Audidy 2 (ZS モデル)
- Creative SoundBlaster Audigy 4 (Pro モデル)
フィックス
64-bit Arch で Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 02) を使っている場合、Enemy Territory でサウンドを鳴らすには以下を実行して下さい:
echo "et.x86 0 0 direct" > /proc/asound/card0/pcm0p/oss echo "et.x86 0 0 disable" > /proc/asound/card0/pcm0c/oss
Tips and tricks
USB サウンドカードのホットプラグ
USB サウンドカードが挿入されたときに、自動的に第一のアウトプットデバイスにするために、以下の udev ルールを使うことができます (例: 以下の2行を /etc/udev/rules.d/00-local.rules
に追加して再起動する)。
KERNEL=="pcmC[D0-9cp]*", ACTION=="add", PROGRAM="/bin/sh -c 'K=%k; K=$${K#pcmC}; K=$${K%%D*}; echo defaults.ctl.card $$K > /etc/asound.conf; echo defaults.pcm.card $$K >>/etc/asound.conf'" KERNEL=="pcmC[D0-9cp]*", ACTION=="remove", PROGRAM="/bin/sh -c 'echo defaults.ctl.card 0 > /etc/asound.conf; echo defaults.pcm.card 0 >>/etc/asound.conf'"
トラブルシューティング
Advanced Linux Sound Architecture/トラブルシューティングを見て下さい。
設定例
Advanced Linux Sound Architecture/設定例を見て下さい。