Gentoo Linux ALSA指南

Shyam Mani  作者
Joshua Saddler  作者
Diego Pettenò  贡献者
奚焜  译者
陆冠群  译者
南继超  译者

更新于2009年 1月 26日
本文档的原始版本最后更新于2009年 8月 5日

1.  简介

什么是ALSA?

ALSA是Advanced Linux Sound Architecture,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持。在2.6系列内核中,ALSA已经成为默认的声音子系统,用来替换2.4系列内核中的OSS(Open Sound System,开放声音系统)。

ALSA的主要特性包括:高效地支持从消费类入门级声卡到专业级音频设备所有类型的音频接口,完全模块化的设计, 支持对称多处理(SMP)和线程安全,对OSS的向后兼容,以及提供了用户空间的alsa-lib库来简化应用程序的开发。

Gentoo上的ALSA

从历史上来说,Gentoo提供了两种方法可以使ALSA运行在您的系统上:内核自带的驱动和外部的alsa-driver软件包。这两种方案基本上完成的是同一项任务;这使得提供对外部软件包的支持异常困难和耗时。Gentoo维护者决定不再继续对alsa-driver软件包进行支持,而是将他们的资源集中在Linux内核中的ALSA驱动部分。这份指南将只集中介绍如何通过在内核自带的驱动来配置ALSA。

如果你仍然需要alsa-driver软件包,请发邮件至Gentoo ALSA维护团队,并告之为何在内核自带的驱动不能正常工作,记得包括具体的出错信息。

2.  安装ALSA

在您开始之前

首先,您需要知道您的声卡用什么驱动。大多数情况下,声卡(板载和独立声卡)基于PCI总线,lspci将帮助您获取所需的信息。如果您没有安装lspci,请emerge sys-apps/pciutils。如果您使用的是USB声卡,sys-apps/usbutilslsusb或许有用。ISA声卡的用户,请试一下sys-apps/isapnptools。下列页面对使用ISA声卡的用户也许有所帮助:

注意: 为了便于解释,我们在下文中假设用户使用的是基于PCI总线的声卡。

下一步,我们将找出声卡的详细信息。

代码 2.1: 声卡的详细信息

# lspci -v | grep -i audio
0000:00:0a.0 Multimedia audio controller: Creative Labs SB Live! EMU10k1 (rev 06)

现在我们知道机器里的声卡是Sound Blaster Live!,而且声卡的制造商是Creative Labs。看一下ALSA声卡支持表,选择Creative Labs。您将会跳转到Creative Labs支持设备表的页面,您可以看到SB Live!采用emu10k1模块。这正是我们所需要的信息。如果您对技术细节有兴趣,您可以点击"详细信息"旁边的的链接,访问emu10k1的相关页面。

如果您想使用MIDI, 在emerge任何ALSA软件包之前,您必须在/etc/make.conf里,把midi加入到您的USE标记中。我们在下文中将会介绍如何设置MIDI支持

配置内核

注意: 自从2005.0版,Gentoo Linux使用2.6系列作为默认的内核。请确认您的内核是2.6系列。以下方法并不适用于2.4内核。

让我们配置内核来启用ALSA选项

重要: genkernel的用户请先运行genkernel --menuconfig all,然后参考ALSA内核配置

代码 2.2: 编译内核

# cd /usr/src/linux
# make menuconfig

注意: 上述例子假设/usr/src/linux符号链接指向您想使用的内核源代码。在下一步之前,请确定上述条件。

现在我们要看一下在2.6内核下要打开哪些选项使得ALSA能够支持我们的声卡。

请注意:由于考虑到易用性,下面的例子中ALSA都被编译成模块。我们建议您采用相同的步骤,从而可以使用alsaconf来配置您的声卡。请不要跳过本文的配置部分。如果您还是希望将其编入内核,请作相应的调整。

代码 2.3: ALSA内核配置

Device Drivers  --->
   Sound  --->
   
(这个选项需要打开)
<M> Sound card support

(确保OSS被禁用)
Open Sound System   --->
   < > Open Sound System (DEPRECATED)

(回到上一步进入ALSA)
Advanced Linux Sound Architecture  --->
   <M> Advanced Linux Sound Architecture
   (如果您需要MIDI序列化或者路由,请选择此选项)
   <M> Sequencer support
   (老式的/dev/mixer*和/dev/dsp*支持。推荐。)
   <M> OSS Mixer API
   <M> OSS PCM (digital audio) API 

(您现在可以要支持的设备。通常您只有一种设备,如果您有多块声卡,请在这里激活全部设备。

(主要用于测试和开发,除非您知道自己在作什么,一般用户不需要启用此选项。)
Generic devices  --->
   
(ISA声卡需要此选项)
ISA devices   --->
(如果您有Gravis设备,请选择此选项)
   <M> Gravis UltraSound Extreme

(回到上一级进入PCI设备,现在大多数声卡是PCI设备)
PCI devices   --->
   (我们现在为我们的声卡选择emu10k1驱动)
   <M> Emu10k1 (SB Live!, Audigy, E-mu APS)
   (或者是Intel的声卡)
   <M> Intel/SiS/nVidia/AMD/ALi AC97 Controller
   (或者您使用的是VIA的声卡)
   <M> VIA 82C686A/B, 8233/8235 AC97 Controller

(如果您的声卡是USB接口,回到上一级,选择
USB Devices   --->

现在所有的选项都配置好了,您可以(重新)编译内核,声卡的ALSA支持应该在重启后使用新内核时生效。不要忘了更新您的GRUB配置并使用新编译的内核。您可以前进到ALSA实用工具查看是否一切都工作正常。

3.  配置/测试ALSA

ALSA实用工具

alsa-utils是ALSA不可或缺的一部分,它集成了一些非常有用的应用程序,包括ALSA启动脚本。所以我们强烈建议您安装alsa-utils

代码 3.1: 安装alsa-utils

# emerge alsa-utils

注意: 如果您没有将ALSA编译成模块,请前进至ALSA启动脚本部分。否则您需要配置ALSA。由alsa-utils提供的alsaconf使得这个过程相当容易。

配置

最新版本的udev>=udev-103)为您的声卡提供了某种程度上的内核级自动配置。如果可能的话,让内核自动来设置您的声卡。否则如下所示,用alsaconf来配置您的声卡。

注意: 在运行时alsaconf,请关闭所有可能访问声卡的程序。

要配置您的声卡,请以root身份登录控制台,键入alsaconf

代码 3.2: 启动alsaconf

# alsaconf

您会看到一个由菜单引导的干净界面,它将自动探测您的设备,发现您的声卡。您会被要求从一个列表中选择您的声卡。然后它会请求修改/etc/modules.d/alsa,自动调整音量到合适的位置,运行update-modules并启动/etc/init.d/alsasound服务。alsaconf退出后,您可以进一步设置ALSA启动脚本。

ALSA启动脚本

我们几乎完成了所有的配置。无论您采用何种方法来安装ALSA,您都需要在系统启动的时候,加载模块,初始化ALSA,恢复您的音量设定。ALSA启动脚本可以为您处理所有的这一切,它就是alsasound。 我们将它加入到启动运行级。

代码 3.3: 将ALSA加入到启动运行级

# rc-update add alsasound boot
 * alsasound added to runlevel boot
 * rc-update complete.

下一步,检查/etc/conf.d/alsasound文件,确保SAVE_ON_STOP变量设置为yes。这将在您关闭系统时保存您的声音设置。

Audio组

在我们开始测试之前,最后还有一个重要设定。类Unix操作系统的经验——除非必要,不要运行在root权限,也适用于此;)。怎么做呢?大多数时间,您以普通用户的身份登录系统听音乐或者访问您的声卡。因此,您需要在""audio" 组中。在此,我们将用户加入到audio组中,当他们需要访问声卡的时候就不会有任何问题。我们需要以root的身份登录,运行gpasswd

代码 3.4: 将用户加入audio组

(用您的用户替换 <username> )
# gpasswd -a <username> audio 
将用户 <username> 加入audio组

音量检查!

我们完成了所有的设置和前期工作,让我们启动ALSA吧。如果您已经运行了alsaconf,您可以跳过这一步,因为alsaconf已经完成了下述工作。

代码 3.5: 启动服务

# /etc/init.d/alsasound start

所有的问题都得到了解决,我们要检查一下音量。多数情况下,系统是静音的。我们用alsamixer来调整音量。

代码 3.6: 启动alsamixer

(开启一个控制台程序。仅显示需要的配置)
# alsamixer

也许是ALSA Mixer在您首次打开时的界面。请注意Master和PCM声道,它们下面都有MM的标记。这意味着它们都被静音了。如果在此状态下,您试图播放任何音频文件,您将无法从您的扬声器里听到任何声音。


图示 3.1: Alsa Mixer主窗口,静音

Fig. 1: AlsaMixer静音

现在,我们要禁止静音,并根据需要设置音量。

警告: 如果您想从您的扬声器里听到任何声音,Master和PCM声道不能设置为静音模式,并且音量必须调整到听得见的水平。

注意: 设置低音和颤音的时候请注意,50通常是一个合适的值。除非特制的低音音箱,过强的低音会导致扬声器发出刺耳的杂音。

作完了这些以后,您的ALSA Mixer应该看起来如下。请注意00标记,而非MM标记;而且音量也作了调整。


图示 3.2: Alsa Mixer蓄势待发

Fig. 2: AlsaMixer禁止静音

声音测试!

终于可以来点音乐了。如果上述一切工作正常,您可以听些不错的音乐了。一个快捷的测试方法是运行像media-sound/madplay这样的命令行工具。您也可以用一些更有名的工具,比如mpg123。如果您青睐ogg, 您可以使用由media-sound/vorbis-tools提供的ogg123。选一个您用着舒服的程序。一直如此,emerge您想要的。

代码 3.7: 获取软件

(安装您所需的应用程序)
# emerge madplay mpg123
(播放.ogg文件)
# emerge vorbis-tools

播放您喜爱的音乐……

代码 3.8: 播放音乐

# madplay -v /mnt/shyam/Music/Paul\ Oakenfold\ -\ Dread\ Rock.mp3
MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al.
          Title: Dread Rock
         Artist: Paul Oakenfold
          Album: Matrix Reloaded
           Year: 2003
          Genre: Soundtrack
                 Soundtrack
 00:04:19 Layer III, 160 kbps, 44100 Hz, joint stereo (MS), no CRC

# ogg123 Paul\ Oakenfold\ -\ Dread\ Rock.ogg
Audio Device:   Advanced Linux Sound Architecture (ALSA) output

Playing: Paul Oakenfold - Dread Rock.ogg
Ogg Vorbis stream: 2 channel, 44100 Hz
Genre: Soundtrack
Transcoded: mp3;160
Title: Dread Rock
Artist: Paul Oakenfold
Date: 2003
Album: Matrix Reloaded
Time: 00:11.31 [04:28.75] of 04:40.06  (200.6 kbps)  Output Buffer  96.9%

ALSA和USE标记

现在您可以把alsa use标记加入到/etc/make.conf使得您的应用程序如果支持ALSA,就在编译时加入这个特性。某些架构,比如x86和amd64默认加入了这个标记。

问题?

如果由于某些原因,您无法听到声音,请您首先查看alsamixer 设置,80%的问题源于声道被静音或者音量过低。您也可以查看您的窗口管理器的声音小程序以确保音量被调整到听得见的水平。

/proc是您的朋友。在此/proc/asound是您最好的朋友。我们将简单的看一下它能提供多少有用的信息。

代码 3.9: 有趣的/proc/asound

(首先,如果/proc/asound/cards显示了您的声卡,ALSA
在所选的声卡上工作正常。)
# cat /proc/asound/cards
0 [Live           ]: EMU10K1 - Sound Blaster Live!
                     Sound Blaster Live! (rev.6, serial:0x80271102) at 0xb800, irq 11

(这显示了现在运行的ALSA的版本)
# cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version 1.0.8 (Thu Jan 13 09:39:32 2005 UTC).

(ALSA OSS模拟层详解)
# cat /proc/asound/oss/sndstat
Sound Driver:3.8.1a-980706 (ALSA v1.0.8 emulation code)
Kernel: Linux airwolf.zion 2.6.11ac1 #2 Wed May 4 00:35:08 IST 2005 i686
Config options: 0

Installed drivers:
Type 10: ALSA emulation

Card config:
Sound Blaster Live! (rev.6, serial:0x80271102) at 0xb800, irq 11

Audio devices:
0: EMU10K1 (DUPLEX)

Synth devices: NOT ENABLED IN CONFIG

Midi devices:
0: EMU10K1 MPU-401 (UART)

Timers:
7: system timer

Mixers:
0: SigmaTel STAC9721/23

其他用户碰到的常见问题是可怖的"Unknown symbol in module"错误。举例如下。

代码 3.10: Unknown Symbol in module错误

# /etc/init.d/alsasound start
 * Loading ALSA modules ...
 *   Loading: snd-card-0 ...                                              [ ok ]
 *   Loading: snd-pcm-oss ...
WARNING: Error inserting snd_mixer_oss
(/lib/modules/2.6.12-gentoo-r6/kernel/sound/core/oss/snd-mixer-oss.ko): Unknown
symbol in module, or unknown parameter (see dmesg) FATAL: Error inserting
snd_pcm_oss
(/lib/modules/2.6.12-gentoo-r6/kernel/sound/core/oss/snd-pcm-oss.ko): Unknown
symbol in module, or unknown parameter (see dmesg)                             
                                                                          [ !! ]
 *   Loading: snd-mixer-oss ...
FATAL: Error inserting snd_mixer_oss
(/lib/modules/2.6.12-gentoo-r6/kernel/sound/core/oss/snd-mixer-oss.ko): Unknown
symbol in module, or unknown parameter (see dmesg)                             
                                                                          [ !! ]
 *   Loading: snd-seq ...                                                 [ ok ]
 *   Loading: snd-emu10k1-synth ...                                       [ ok ]
 *   Loading: snd-seq-midi ...                                            [ ok ]
 * Restoring Mixer Levels ...                                             [ ok ]

建议您看一下dmesg的输出,您很有可能会看到类似的结果:

代码 3.11: dmesg输出

(仅显示相关部分)
# dmesg | less
ACPI: PCI Interrupt 0000:02:06.0[A] -> Link [APC3] -> GSI 18 (level, low) -> IRQ 209
snd_mixer_oss: Unknown symbol snd_unregister_oss_device
snd_mixer_oss: Unknown symbol snd_register_oss_device
snd_mixer_oss: Unknown symbol snd_mixer_oss_notify_callback
snd_mixer_oss: Unknown symbol snd_oss_info_register
snd_pcm_oss: Unknown symbol snd_unregister_oss_device
snd_pcm_oss: Unknown symbol snd_register_oss_device
snd_pcm_oss: Unknown symbol snd_mixer_oss_ioctl_card
snd_pcm_oss: Unknown symbol snd_oss_info_register
snd_mixer_oss: Unknown symbol snd_unregister_oss_device
snd_mixer_oss: Unknown symbol snd_register_oss_device
snd_mixer_oss: Unknown symbol snd_mixer_oss_notify_callback
snd_mixer_oss: Unknown symbol snd_oss_info_register

上述问题是由于您从alsa-driver转换到内核自带的ALSA而造成的, 在您卸载alsa-driver时,内核模块由于受保护而没有移除。所以当您使用内核自带的ALSA,运行modprobe时, alsa-driver和内核自带的驱动混在一起,造成了上述的错误。

解决方案相当简单。我们只需要在unmerge alsa-driver后手动删除出问题的目录。请确定您删除的是正确的内核版本而非当前的版本!

代码 3.12: 删除alsa-driver模块

# rm -rf /lib/modules/$(uname -r)/alsa-driver

另一个引起类似错误的可能是在/etc/modules.d中的某个文件错误地输出了 device_mode参数。请确认这是问题所在,并且找出这个捣蛋鬼。

代码 3.13: 确认并查找device_mode

(查看dmesg以确认)
# dmesg | grep device_mode
snd: Unknown parameter `device_mode'
(现在,找到问题的根源)
# grep device_mode /etc/modules.d/*

通常是一个叫alsa的文件包含了一行: options snd device_mode=0666。删除此行,重启alsasound服务应该能够解决问题。

4.  其他

设置MIDI支持

首先请确定/etc/make.confmidi USE标记。如果没有,请加上它。您需要重新emerge任何使用了midi标记的ALSA软件包,比如alsa-libalsa-utils

如果您的声卡有板载的MIDI合成器并且您希望听一些.mid文件,您需要安装awesfx,它基本上是一组实用工具来控制AWE32驱动。我们首先要安装它。如果没有硬件合成器,您可以使用虚拟合成器,更多信息,请查看虚拟合成器一节。

代码 4.1: 安装awesfx

# emerge awesfx

注意: 然后您需要从声卡驱动光盘或者Windows安装文件中复制SoundFont (SF2)文件到/usr/share/sounds/sf2/。举例来说,SBLive!的SoundFont文件可以是8MBGMSFX.SF2.

复制了Soundfont文件以后,我们可以如下所示播放midi文件。您也可以把asfxload命令加入到/etc/conf.d/local.start,从而在每次系统启动时加载SoundFont。

注意: 下述代码列表中的/mnt路径也许和您的机器上的路径不同。它们只是例子而已,您需要根据您的机器改变路径。

代码 4.2: 加载Soundfonts

(首先,复制Soundfont)
# cp /mnt/win2k/Program\ Files/CreativeSBLive2k/SFBank/8MBGMSFX.SF2 /usr/share/sounds/sf2/ 
(或者从SoundBlaster的光盘里复制文件)
# cp /mnt/cdrom/AUDIO/ENGLISH/SFBANK/8MBGMSFX.SF2 /usr/share/sounds/sf2/
(加载特定的Soundfont)
# asfxload /usr/share/sounds/sf2/8MBGMSFX.SF2

您现在可以用aplaymidi这样的程序来播放midi文件。运行aplaymidi -l来获取端口列表,然后选择一个端口来播放。

代码 4.3: 播放MIDI

(查看可用的端口)
# aplaymidi -l
 Port    Client name                      Port name
 64:0    EMU10K1 MPU-401 (UART)           EMU10K1 MPU-401 (UART)
 65:0    Emu10k1 WaveTable                Emu10k1 Port 0
 65:1    Emu10k1 WaveTable                Emu10k1 Port 1
 65:2    Emu10k1 WaveTable                Emu10k1 Port 2
 65:3    Emu10k1 WaveTable                Emu10k1 Port 3
(选择一个端口,播放mid文件)
#  aplaymidi --port=65:0 /mnt/shyam/music/midi/mi2.mid

虚拟合成器

如果您的声卡不支持硬件合成器,您可以使用虚拟合成器,比如timidity++。安装是小菜一碟。

代码 4.4: 安装timidity++

# emerge timidity++

timidity需要一个SoundFont来播放声音。幸运的是ebuild会为您安装一些SoundFont。Portage里还有一些可用的SountFont包,比如timidity-freepatstimidity-eawpatches。您可以安装多个SountFont包,而且可以在/usr/share/timidity/安装您自己的SoundFont文件。要在多个timidity的配置中选择,您需要eselect

代码 4.5: 改变配置

# eselect timidity list
# eselect timidity set eawpatches

不要忘了把timidity加入默认运行级。

代码 4.6: 把timidity加入默认运行级。

# rc-update add timidity default
# /etc/init.d/timidity start

您现在可以试着播放MIDI文件。

工具和固件

某些特定声卡可以从alsa-toolsalsa-firmware包中获得性能的提升。您只需要简单的emerge

代码 4.7: 安装ALSA工具

# emerge alsa-tools

多块声卡的支持

如果ALSA被编译为内核模块,您可以同时在您的系统中使用多块声卡。您仅需要在/etc/modules.d/alsa里指定启动的顺序。此文件用驱动名来标记您的声卡。0是第一块卡,1是第二块卡,以此类推。这是一个有两块声卡系统的例子。

代码 4.8: 两块声卡的/etc/modules.d/alsa配置

options snd-emu10k1 index=0
options snd-via82xx index=1

如果您有两块声卡使用相同的驱动,您在同一行里用逗号分隔的数字来配置它们。这是一个有三块声卡的系统,其中的两块是Intel高保真声卡。

代码 4.9: 多块声卡的/etc/modules.d/alsa配置

options snd-ymfpci index=0
options snd-hda-intel index=1,2

插件

您也许想安装一些插件来获得额外的功能。alsa-plugins打包提供了一些有用的插件,包括: PulseAudio输出,采样率转换器;jack(一个低延迟的音频服务器)和一个可以通过数字S/PDIF接口(光线或同轴电缆)输出6声道音频的编码器。您可以通过USE标记来选择安装什么插件

代码 4.10: 安装alsa-plugins

# emerge -avt alsa-plugins

感谢

所有Gentoo ALSA指南的贡献者: Vincent Verleye, Grant Goodyear, Arcady Genkin, Jeremy Huddleston, John P. Davis, Sven Vermeulen, Benny Chuang, Tiemo Kieft and Erwin。

资源