- 论坛徽章:
- 0
|
本文转自:
http://www.gentoo.org/doc/zh_cn/alsa-guide.xml
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的一个主要优势在于用户可以最大限度的控制如何安装和配置系统。Gentoo上的ALSA秉承了同样的原则。有两种方法可以使ALSA运行在您的系统上。我们将在下一章分别予以详细讨论。
2. 安装ALSA
可选
警告: 下述方法是互斥的,您不能够将ALSA编入内核,同时使用media-sound/alsa-driver,
两个选项是:
采用内核提供的ALSA。这也是我们推荐的方法。
采用Gentoo的media-sound/alsa-driver软件包。
内核自带的驱动和alsa-driver软件包可能有细微的差别;一方出现的特性和修复可能并没有加入到另一方。上游的开发者也意识到这一点,但是这两个驱动事实上是ALSA项目完全不同的开发分支;它们不完全一样。您应该知道它们有细微的不同,所以如果一个无法正常工作,就试试另一个吧!在我们作选择之前,让我们先看看各自的特点。
如果您打算采用内核提供的ALSA,以下是优点和缺点:
内核自带的ALSA
优点和缺点
+
不需要安装其他的软件包;内核已经集成了驱动。
+
一揽子解决方案,不需要反复的emerge。
-
也许和alsa-driver使用的版本有些许不同。
如果您采用alsa-driver,
alsa-driver
优点和缺点
+
也许是ALSA项目最新的驱动
+
对开发音频驱动会有帮助。
-
每一次重编内核都需要重新emerge alsa-driver。
-
需要关闭某些内核选性使其能正常工作。
所以……
如上所述,alsa-driver和内核自带的ALSA驱动的差别非常细微;考虑到易用性,我们建议您首先采用内核自带的驱动。在您向
Gentoo Bugzilla
提交任何和声音相关的问题之前,请先试着用alsa-driver重现它们,再提交缺陷报告。
在您开始之前
无论您采用哪种方式,您必须要知道您的声卡用什么驱动。大多数情况下,声卡(板载和独立声卡)基于PCI总线,lspci将帮助您获取所需的信息。如果您没有安装lspci,请emerge sys-apps/pciutils。如果您使用的是USB声卡,sys-apps/usbutils的lsusb或许有用。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支持
。
采用内核提供的ALSA
如果您喜欢简洁,就选择这个方法。
注意: 自从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 --->
(这个选项需要打开)
Sound card support
(确保OSS被禁用)
Open Sound System --->
Open Sound System (DEPRECATED)
(回到上一步进入ALSA)
Advanced Linux Sound Architecture --->
Advanced Linux Sound Architecture
(如果您需要MIDI序列化或者路由,请选择此选项)
Sequencer support
(老式的/dev/mixer*和/dev/dsp*支持。推荐。)
OSS Mixer API
OSS PCM (digital audio) API
(您现在可以要支持的设备。通常您只有一种设备,如果您有多块声卡,请在这里激活全部设备。
(主要用于测试和开发,除非您知道自己在作什么,一般用户不需要启用此选项。)
Generic devices --->
(ISA声卡需要此选项)
ISA devices --->
(如果您有Gravis设备,请选择此选项)
Gravis UltraSound Extreme
(回到上一级进入PCI设备,现在大多数声卡是PCI设备)
PCI devices --->
(我们现在为我们的声卡选择emu10k1驱动)
Emu10k1 (SB Live!, Audigy, E-mu APS)
(或者是Intel的声卡)
Intel/SiS/nVidia/AMD/ALi AC97 Controller
(或者您使用的是VIA的声卡)
VIA 82C686A/B, 8233/8235 AC97 Controller
(如果您的声卡是USB接口,回到上一级,选择
USB Devices --->
现在所有的选项都配置好了,您可以(重新)编译内核,声卡的ALSA支持应该在重启后使用新内核时生效。不要忘了更新您的GRUB配置并使用新编译的内核。您可以前进到
ALSA实用工具
查看是否一切都工作正常。
采用ALSA驱动软件包
所以您决定采用alsa-driver的方法。让我们开始吧。为了保证只编译您的声卡驱动,我们要作一些小的调整。这并非必要,但是可以避免编译不需要的设备驱动。
如果您不清楚您的声卡需要什么样的驱动,请参看本文的
lspci
部分。如果您知道驱动的名字(在此以emu10k1为例),编辑/etc/make.conf,加入变量ALSA_CARDS。
代码 2.4: 编辑/etc/make.conf,加入ALSA_CARDS
(对于一块声卡)
ALSA_CARDS="emu10k1"
(对于多块声卡,用空格分隔名字)
ALSA_CARDS="emu10k1 via82xx"
如果您已经编译了内核,又希望使用alsa-driver,请在执行下一步之前确定下列条件,否则alsa-driver很有可能无法正常工作。下述代码提供了一种检查的方法。
注意: genkernel 可以前进至
安装alsa-driver
, 他们的默认配置符合下列条件。
CONFIG_SOUND被启用。(启用基本的声音支持)
CONFIG_SOUND_PRIME没有被启用。(内置的OSS支持被禁用)
CONFIG_SND没有被启用。(内置的ALSA支持被禁用)
/usr/src/linux指向使用ALSA的内核源代码。
代码 2.5: .config检查
(假设linux符号链接指向正确的内核源代码)
# cd /usr/src/linux
# grep SOUND .config
(1.为真)
CONFIG_SOUND=y
(2.为真)
CONFIG_SOUND_PRIME is not set
# grep SND .config
(并且3.为真)
CONFIG_SND is not set
下一步就是键入魔咒……哦,不,不是abracadabra。
代码 2.6: 安装alsa-driver
# emerge alsa-driver
重要: 请注意,由于先前的驱动会被删除,您必须在(重新)编译内核以后,运行emerge alsa-driver。您可以安装module-rebuild软件包来简化这个步骤。它会跟踪模块包,并为您重新编译它们。首先运行module-rebuild populate来产生列表,然后在每一次(重新)编译内核后,运行module-rebuild rebuild, 所有外置的模块都会重新编译。
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组
(用您的用户替换 )
# gpasswd -a audio
将用户 加入audio组
音量检查!
我们完成了所有的设置和前期工作,让我们启动ALSA吧。如果您已经运行了alsaconf,您可以跳过这一步,因为alsaconf已经完成了下述工作。
代码 3.5: 启动服务
# /etc/init.d/alsasound start
所有的问题都得到了解决,我们要检查一下音量。多数情况下,系统是静音的。我们用alsamixer来调整音量。
代码 3.6: 启动alsamixer
(开启一个控制台程序。仅显示需要的配置)
# alsamixer
重要: 如果您无法启动alsamixer,且收到这样的错误alsamixer: function snd_ctl_open failed for default: No such file or directory,这通常是因为udev无法设置设备。运行killall udevd; udevstart来重新加载/dev下的相关设备文件,然后启动alsamixer。这应该能够解决问题。
这也许是ALSA Mixer在您首次打开时的界面。请注意Master和PCM声道,它们下面都有MM的标记。这意味着它们都被静音了。如果在此状态下,您试图播放任何音频文件,您将无法从您的扬声器里听到任何声音。
![]()
现在,我们要禁止静音,并根据需要设置音量。
警告: 如果您想从您的扬声器里听到任何声音,Master和PCM声道不能设置为静音模式,并且音量必须调整到听得见的水平。
- 使用您的左右箭头键()来转换声道。
- 要静音/禁止静音,移动到该声道,比如说Master,按键盘上的m键。
- 用上下箭头键来增加/减小音量。
注意: 设置低音和颤音的时候请注意,50通常是一个合适的值。除非特制的低音音箱,过强的低音会导致扬声器发出刺耳的杂音。
作完了这些以后,您的ALSA Mixer应该看起来如下。请注意00标记,而非MM标记;而且音量也作了调整。
![]()
声音测试!
终于可以来点音乐了。如果上述一切工作正常,您可以听些不错的音乐了。一个快捷的测试方法是运行像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.conf有midi USE标记。如果没有,请加上它。您需要重新emerge任何使用了midi标记的ALSA软件包,比如alsa-lib,alsa-utils和alsa-driver。
如果您的声卡有板载的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-freepats和timidity-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-tools和alsa-firmware包中获得性能的提升。您只需要简单的emerge。
代码 4.7: 安装ALSA工具
# emerge alsa-tools
多块声卡的支持
如果ALSA被编译为内核模块(或者您安装了alsa-driver),您可以同时在您的系统中使用多块声卡。您仅需要在/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。
资源
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8780/showart_403918.html |
|