Advanced Linux Sound Architecture (简体中文)

From ArchWiki
Revision as of 08:27, 18 February 2010 by Totalwormage (talk | contribs) (use i18n template)
Jump to navigation Jump to search

This template has only maintenance purposes. For linking to local translations please use interlanguage links, see Help:i18n#Interlanguage links.


Local languages: Català – Dansk – English – Español – Esperanto – Hrvatski – Indonesia – Italiano – Lietuviškai – Magyar – Nederlands – Norsk Bokmål – Polski – Português – Slovenský – Česky – Ελληνικά – Български – Русский – Српски – Українська – עברית – العربية – ไทย – 日本語 – 正體中文 – 简体中文 – 한국어


External languages (all articles in these languages should be moved to the external wiki): Deutsch – Français – Română – Suomi – Svenska – Tiếng Việt – Türkçe – فارسی

介绍

高级Linux声音架构(Advanced Linux Sound Architecture,简称ALSA)是一个Linux内核组件,用来为声卡提供设备驱动。

如果你要找其它选择请参看OSS

这篇文章将讲述如何使Alsa在2.6内核中正常使用。同时请参考allow multiple programs to play sound at once

安装

内核驱动

2.6内核已经包含了ALSA,所有arch的kernel26*软件包都包含它。如果你创建一个自定义内核,别忘了启用正确的ALSA驱动。

Udev应该自动检测和加载所有必须的模块。除非你使用ISA插卡,否则没有什么需要特别设置。如果你的是PIC或者ISAPNP声卡,请一定不要使用alsaconf,因为alsaconf加入到modprobe.conf文件里的内容有有可能破坏udev的自动检测。

Userspace utilities

  • 要求有本地化的ALSA程序和管理
# pacman -S alsa-lib alsa-utils
  • Recommended if you want to use applications with OSS sound support in combination with dmix:
# pacman -S alsa-oss

所有ALSA程序都很可能需要依赖alsa-lib。

配置

确认所有声音模块都已经加载

你可以假定udev会正常的自动检测你的声卡,包括OSS兼容模块。你可以通过这个命令进行检查

$ lsmod|grep '^snd'
snd_usb_audio          69696  0 
snd_usb_lib            13504  1 snd_usb_audio
snd_rawmidi            20064  1 snd_usb_lib
snd_hwdep               7044  1 snd_usb_audio
snd_seq_oss            29412  0 
snd_seq_midi_event      6080  1 snd_seq_oss
snd_seq                46220  4 snd_seq_oss,snd_seq_midi_event
snd_seq_device          6796  3 snd_rawmidi,snd_seq_oss,snd_seq
snd_pcm_oss            45216  0 
snd_mixer_oss          15232  1 snd_pcm_oss
snd_intel8x0           27932  0 
snd_ac97_codec         87648  1 snd_intel8x0
snd_ac97_bus            1792  1 snd_ac97_codec
snd_pcm                76296  4 snd_usb_audio,snd_pcm_oss,snd_intel8x0,snd_ac97_codec
snd_timer              19780  2 snd_seq,snd_pcm
snd                    43776  12 snd_usb_audio,snd_rawmidi,snd_hwdep,snd_seq_oss,snd_seq,snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_intel8x0,snd_ac97_codec,snd_pcm,snd_timer
snd_page_alloc          7944  2 snd_intel8x0,snd_pcm

如果输出和上面类似,你的声音驱动应该已经成功自动检测(请注意在这个案例中,snd_intel8x0和snd_usb_audio是硬件设备的驱动)。你还想检查一下目录/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

如果你至少有controlC0pcmC0D0p或者类似的设备,那么你的声音模块已经被正确检测并加载了。

如果不是这个结果,表示你的声音模块尚未被正确检测。如果你想在IRC或者论坛上寻求帮助,请将上述命令的输出结果粘贴出来。要解决这个问题,你得尝试手动加载模块:

  • ALSA Soundcard Matrix里查找你的声卡模块。模块都是以'snd-'作为前缀的(例如:‘snd-via82xx’)。
  • 加载模块:
 # modprobe snd-NAME-OF-MODULE
 # modprobe snd-pcm-oss
  • 检查/dev/snd里的设备文件(上面已经叙述),并且/或者尝试alsamixeramixer有没有合理的输出。
  • snd-NAME-OF-MODULEsnd-pcm-oss加入到/etc/rc.conf的MODULES列表中,确保它们下次可以被加载。(请确认snd-NAME-OF-MODULE 排在snd-pcm-oss前面)。

开启声音通道并测试声卡

在本段中,我们假设你以root身份登录。如果你要作为一般权限用户执行这些步骤,请先跳到下一段权限设置

  • 开启声卡

当前版本的ALSA安装后所有通道缺省是静音,因此即使安装成功并且所有设备都工作正常,你仍然听不到声音。你必须手动开启声音通道。推荐使用'alsamixer'来完成这个任务。从alsamixer文字界面上看,底下http://wiki.archlinux.org/index.php/%E8%AE%BE%E7%BD%AEALSA标有"MM"的通道表示该通道是静音的,而"00"则表示它是开启的。按'm'键切换MM/00状态。使用左右箭头键在各个通道中切换,上下箭头键调整音量。

注意:当使用amixer时,unmute的同时还要将音量调高到一定百分比程度,也就是你得使用%符号。amixer只接受百分号(%),而不是单独数字。如果你只使用数字(例如90),amixer只会当作100%,这有可能会损害你的扬声器。

 # amixer set Master 90% unmute
 # amixer set PCM 85% unmute
  • 播放一个wav文件
 # aplay mywav.wav

注意:某些声卡(嗯,至少Soundblaster Audigy LS)还需要关闭/静音数字输出才能听到模拟输出声音。

权限设置

作为普通用户要能够使用声卡,需要执行以下步骤:

  • 将你的用户加入到audio组:
# gpasswd -a USERNAME audio
  • 注销用户然后重新登录使得设置生效。

在系统启动时恢复Alsa混音器设置

  • 运行一次'alsactl'命令创建 '/etc/asound.state' 文件
 alsactl store
  • 编辑 '/etc/rc.conf' 文件,添加 'alsa' 到DAEMONS行,使得系统启动时运行。这样就可以在每次关机时保存混音器设置,启动的时候自动恢复设置。


获得SPDIF输出

  • (来源于gentoo论坛的gralves)
  • 在Gnome音量控制的选项(Options)标签页下,将IEC958改为PCM。这个选项可以在设置里被启用。
  • 如果你没有安装Gnome音量控制
    • 编辑/etc/asound.state。这个文件是alsasound用来保存你的混音器设置的。
    • 找到有'IEC958 Playback Switch'内容的那行。在它附近你会发现有一行写着value:false,将它改为value:true
    • 现在找到这行:'IEC958 Playback AC97-SPSA',将值改为0。
    • 重启alsa。

另一种登录时自动启用SPDIF输出的方法是(在SoundBlaster Audigy上测试通过):

  • 加入下面几行到/etc/rc.local:
 # Use COAX-digital output
 amixer set 'IEC958 Optical' 100 unmute
 amixer set 'Audigy Analog/Digital Output Jack' on

你可以用这个命令查看声卡的数字输出名称:

 amixer scontrols


KDE 设置

  • 启动KDE:
# startx


  • 为这个用户设置声音(每个用户都有自己的设置):
# alsamixer
# 注销然后再以xyz用户身份登录以启用声音。
  • KDE 3.3 打开 K 菜单 > Multimedia > KMix
    • 选择设置 > 配置 KMix...
    • 去掉对复选框"在登录时恢复声音(Restore volumes on logon)" 的选择
    • 单击OK按钮,这样就都设置好了。现在你在命令行和KDE有了相同的音量设置。

疑难解答

仍然没有声音?

记住,ALSA安装后所有通道缺省是静音(看前面的章节)。不过,如果你确定没有静音,驱动安装正确,音量没问题,但还是听不到声音,试一下把下面内容加入到/etc/modprobe.conf,应该可以解决问题(至少via82xx驱动是)。

options snd-NAME-OF-MODULE ac97_quirk=0

也有可能是Udev在检测时,将主板喇叭配置成了主声音设备.这时可以试着删掉/etc/rc.conf中MODULES行中的snd-pcsp 。

板载Intel声卡无声

这也许是因为同时加载两个冲突的模块snd_intel8x0snd_intel8x0m导致。这种情况的话,编辑rc.conf,在MODULES数组黑名单里加入后者!snd_intel8x0m

糟糕的音质?

如果你觉得音质很差,请尝试设置PCM的音量(通过alsamixer)使得增益(gain)为0。

启动和停止回放时有暴音

某些模块会在你的声卡不使用的时候将它断电。断电过程会使你的声卡发出些噪音。如果你对此感到厌烦可以试一下"modinfo snd-MY-MODULE",然后找这个模块的有关选项调整或者关闭这个特性。

例如:要禁止snd-hda-intel的能源保护模式,将 "options snd-hda-intel power_save=0"加入到/etc/modprobe.conf,或者试试"modprobe snd-hda-intel power_save=0"。

Alsamixer无法运行

如果运行alsamixer出错并且获得这样的错误信息

alsamixer: function snd_ctl_open failed for default: No such device

你可能需要重新安装你的内核。执行'pacman -S kernel26'或者其他你需要的patchset。同时,请确保你是audio组的用户。

SigmaTel STAC9205的耳机无声

使用内置的扬声器能够播放声音,可是插入耳机后,耳机内却没有任何声音。这个问题出现在DELL的部分机型和Gateway的T系列的机型上。

目前,alsa-lib = 1.0.20已经部分解决了这个问题。请确保你已经升级到了最新版本。

pacman -S alsa-lib alsa-utils

假如依然不能解决,请在 /etc/modprobe.d/modprobe.conf 中添加snd-hda-intel模块参数:

options snd-hda-intel enable_msi=0 model=eapd

这个参数目前在我的 Gateway T-6834c + kernel 2.6.30 + x86_64上成功解决耳机无声问题。

其它资源

你可以在这里找到更多的信息