Advanced Linux Sound Architecture

提供: ArchWiki
2015年7月18日 (土) 18:38時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

関連記事

Advanced Linux Sound Architecture (ALSA) は、サウンドカードのデバイスドライバを提供する Open Sound System (OSSv3) を置き換えるために開発された Linux カーネルコンポーネントです。デバイスドライバの他に、ALSA は、カーネルドライバと直接やりとりせずに高レベルの API を使ってドライバ機能を使いたいという開発者のために、ユーザ空間のライブラリも提供しています。

ノート: もうひとつのサウンド環境については、Open Sound System のページを見て下さい。

インストール

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 はミュートが解除されていることを示しています。

キーを押して MasterPCM チャンネルに移動して m キーを押してミュートを解除してください。 キーを押してボリュームを上げて値を 0 dB ゲインにしてください。ゲインは左上の 項目: の隣に表示されます。ゲインを大きくしすぎると音にノイズが混じります。

5.1 または 7.1 サラウンドを鳴らしたいときは Front, Surround, Center, LFE (サブウーファー), Side などの他のチャンネルも同じようにミュートを解除してください(これらのチャンネル名は Intel HD Audio のものです、チャンネル名はハードウェアによって変わっているかもしれません)。ミュートを解除しただけではステレオ音源は自動でアップミキシングされません。これをするには #アップ・ダウンミキシング を見て下さい。

マイクロフォンを有効にするには、Capture タブに F4 で切り替えてチャンネルを Space で有効にしてください。

alsamixer を終了するときは Esc を押して下さい。

ノート:
  • カードによってはアナログサウンドを聞くためにはデジタル出力をミュートする必要があります。Soundblaster Audigy LS では IEC958 チャンネルをミュートしてください。
  • マシンによっては (Thinkpad T61 など)、Speaker チャンネルのミュートを解除する必要があります。
  • マシンによっては (Dell E6400 など)、同じく FrontHeadphone チャンネルのミュートを解除する必要があります。
  • 再起動するとボリューム調整が元に戻ってしまう場合、root で alsamixer を実行してみて下さい。

次に、音が鳴るかテストしてみましょう:

$ speaker-test -c 2

-c はスピーカーによって変えて下さい。例えば 7.1 では -c 8 を使います:

$ speaker-test -c 8

音が出ない場合、#設定Advanced Linux Sound Architecture/トラブルシューティング に進んで問題を解決してください。

alsa-utils パッケージには、それぞれ起動時とシャットダウン時に動くように設定された alsa-restore.servicealsa-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 を書いたときは mplayerALSAPCM=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
}
ノート: Asus U32U シリーズではカードの pcm と ctl の両方を 1 に設定する必要があります。

'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

出力が上と同じようになっていれば、サウンドドライバが首尾よく自動検出されています。

ノート: udev>=171 から、OSS エミュレーションモジュール (snd_seq_oss, snd_pcm_oss, snd_mixer_oss) はデフォルトではロードされないようになりました: 必要ならば手動でロードしてください

/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
ノート: IRC やフォーラムで助けを求める時は、上記のコマンドの出力を貼って下さい。

とにかく controlC0pcmC0D0p のようなデバイスがあれば、サウンドモジュールが正しくロードされていることを示しています。

そうなってないのなら、あなたのサウンドモジュールは正しく検出されていません。これを解決するには、手動でモジュールのロードを試して下さい:

  • サウンドカードのモジュールを確認します: ALSA Soundcard Matrix モジュールには名前の前に 'snd-' が付きます (例: snd-via82xx)。
  • モジュールをロードします
  • /dev/snd の中のデバイスファイルを確認したり(上述)、alsamixeramixer に変化がないか調べて下さい。
  • snd-NAME-OF-MODULEsnd-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 をインストールしてください。

ノート: システムが x86_64 で 32bit の flashplugin を使っていると flash で音が鳴らなくなります。alsaequal を無効にするか alsaequal を 32bit でビルドして下さい。

パッケージをインストールした後、以下を 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 を使う

ノート: この方法では ladspa プラグインを使う必要があります。サウンドを再生する際に CPU の使用量が多めです。さらに、ステレオサウンドを念頭に置いて作成されています (例: ヘッドフォン)。

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-pluginslibsamplerate をインストールして下さい。

デフォルトの変換器を 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 など) も利用できますがデフォルトのリサンプラーに比べておそらくあまり改善はないでしょう。

警告: 環境によっては、samplerate_best を有効にすると flashplayer でサウンドが出力されなくなるという問題が発生します。

アップ・ダウンミキシング

アップミキシング

音楽などのステレオ音源を 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"
}
ノート: これだけではダウンミキシングが動作しないかもしれません、[2] を参照してください。その場合、pcm.!default "plug:surround51"pcm.!default "plug:surround40" を追加する必要があります。vdownmix プラグはひとつだけ使うことができます; 7.1 チャンネルのときは、上の設定の代わりに surround71 を使って下さい。vdownmixdmix の両方を動かす設定例がここにあります。

ミキシング

ミキシングを使うことで複数のアプリケーションが同時に音を出力することが可能になります。外付けのサウンドカードはほとんどの場合ハードウェアミキシングをサポートしており、可能であればデフォルトで有効にされます。内蔵のマザーボードに載っているサウンドカード (Intel HD Audio など) は基本的にハードウェアミキシングをサポートしていません。そのようなカードでは、dmix という名前の ALSA プラグインを使ってソフトウェアミキシングを利用します。この機能はハードウェアミキシングが使えない場合に自動で有効にされます。

手動で dmix を有効にする

ノート: ALSA 1.0.9rc2 以上ではアナログサウンドに dmix を設定する必要はありません。ハードウェアミキシングをサポートしていないサウンドカードのために 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 モデル)
ノート:
  • The low end variants of above cards, (Audigy SE, Audigy 2 NX, SoundBlaster Live! 24bit and SoundBlaster Live! 7.1) do not support hardware mixing as they use other chips.
  • The onboard VIA8237 chip supports 4-stream hardware mixing, however, it does only 3 for some motherboards (the 4th makes no sound) or is just broken. Even if it works, the quality is not good compared to other solutions.

フィックス

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/設定例を見て下さい。

参照