请查看声卡驱动程序目录中的 FAQ 文件。本节仍在建设中。
如果您的 ALSA 驱动程序编译不正确,并提示您关于 ``version.h'' 或其他找不到的头文件,这可能意味着您没有内核头文件。请查看 kernel-HOWTO,在 /usr/src 中解压缩一个最新的内核,并执行 make config
。
这些工具还包含用 c++ 编写的代码。我们大多数人都有来自 gcc 或 egcs 的 c++ 编译器,但请确保您也安装了 libstdc++-devel 包,否则当您运行这些工具的配置脚本时,您的系统会抛出错误消息,说您的“c++ 编译器无法创建可执行文件”。
请检查以下项目。
ALSA 在 /dev 树中使用特殊设备。请确保您已在 alsa-drivers 源代码目录中运行了 ./snddevices 脚本。
您 100% 确定您的声卡是受支持的吗?请再次检查。有时 X123 并不完全是 X123b,您可能会浪费时间。另一方面,即使是受支持的声卡也可能给您带来麻烦 - 我花了两个小时才弄清楚 CS4237B 的安装,而最终,这只是 RTFM 的一个很好的例子。
您可能有一个内置声卡支持的 2.0.x 内核,或者可能加载了 OSS/Lite(内核)声卡驱动程序(使用 cat /proc/modules
检查)。移除该驱动程序或重新编译内核(查看 Kernel-HOWTO)。
2.0 系列内核中的声卡模块名为 ``sound.o'',并且不应处于活动状态。(ALSA 驱动程序 ``snd.o'' 是可以的)。
如果您有一个没有内置声卡驱动程序的 2.2.x 系列内核,ALSA 驱动程序也无法工作。
我知道这令人困惑,所以请允许我再解释一遍。如果您有一个 2.0.x 系列内核(命令 ``uname -a'' 会告诉您类似 ``Linux penguin 2.0.35 #6 Wed Sep 23 10:19:16 CEST 1998 i686 unknown'' 这样的信息),那么您需要移除内核中的声卡驱动程序。ALSA 0.4.x 及更高版本不适用于 2.0 系列内核
如果您有一个 2.2.x 系列内核,您需要声卡驱动程序。一个 2.2 系列内核应该编译时包含声卡支持,但不包含任何特定的声卡驱动程序。因此,您选择声卡支持,但要确保不会编译任何特定的声卡驱动程序。
驱动程序抱怨设备忙的另一个原因可能是 /etc/conf.modules 文件仍然引用了声卡驱动程序。您应该删除这些引用,只留下对 ALSA 驱动程序的引用。(如果那里有其他非声卡相关的驱动程序,那么您可能可以保留这些)。
“未解析的符号”消息的另一个来源可能是新内核搭配旧驱动程序。请在重新编译新内核后重新编译 ALSA 驱动程序。这将确保驱动程序与您的新内核匹配。
您确定您的声卡已激活吗?再次查看 PnP-HOWTO 并检查您是否正确激活了您的声卡。
检查,仔细检查您的声卡参数。请注意:534 不是 543,0x534 也与 534 不同。
此外,一些声卡必须使用与预期不同的名称加载。休息一下,喝杯啤酒或任何东西,然后再次查看您的“modprobe”命令。例如,Crystal 4232 驱动程序应该通过 modprobe snd-card-cs4232 插入,而不是 “snd-cs4231”,SoundBlaster PCI 64 应该使用 “snd-card-audiopci” 加载,而不是 snd-es1370。(这些都在文档中,即使是我写了 HOWTO,我也曾花了一个晚上试图说服 snd-cs4231 发出声音)。
ALSA 驱动程序可以使用大多数声卡都具有的“静音”功能。如果您加载了声卡驱动程序,一切都正常,但您听不到任何声音,那么您可能忘记取消声卡的静音。您需要 “amixer” 或 “alsamixer” 来执行此操作,它们都来自 ALSA-util 包。只需输入
amixer set -c 1 Master 70 unmute
amixer set -c 1 PCM 70 unmute
amixer set -c 1 CD 70 unmute
应该适用于大多数应用程序。请注意,对于较旧的 amixer 命令,您需要在命令行中省略 “set”。
大多数声卡都有一个单独的混音器部分,用于额外的输入或输出提升。此条目最有可能被称为 “gain”、“in-gain” 用于输入,“out-gain” 用于输出。将此增益设置为适当的级别将大大有助于您从扬声器中获得最大音量(但请考虑您的父母/邻居/耳朵)。所以像这样的命令
amixer set out-gain 100 unmute
可能会有所帮助。
如果这是您第一次使用 ALSA 驱动程序,并且您之前使用过内置声卡驱动程序,您可能希望具有向后兼容的声卡(即使用 /dev/pcmX 设备)。您需要为此加载 “OSS 兼容性驱动程序”。执行 modprobe snd-pcm1-oss && modprobe snd-mixer-oss
。(请参阅有关加载驱动程序的部分末尾)。请注意:snd-pcm1-oss 不等于 snd-pcm1,您需要 snd-pcm1-oss 用于旧式的声卡支持,snd-mixer-oss 用于(您猜对了)混音器。
如果您尝试安装了几个不同的 ALSA 版本,有时可能无法再打开混音器。如果您尝试过 0.3.2 并想降级到 0.3.0-pre4 (IIRC),就会发生这种情况。您应该从 /usr/lib 中删除所有 libasound 文件和链接,然后重新编译库和工具
rm /usr/lib/libasound.*
为了安全起见,之后删除所有 ALSA 声卡驱动程序,然后重新编译、安装并重新加载驱动程序。
从 “insmod” 而不是 kerneld 开始总是很有用的。也许您实际上可以在屏幕上看到错误。
在驱动程序目录中的 INSTALL 文件中可以找到大量信息。如果您的驱动程序无法工作,请检查是否有其他可用信息。
作为最后的手段,您可以重新构建驱动程序,并告诉它将调试信息发送到 /var/log/messages。使用 cd /usr/src/alsa-driver-....
进入驱动程序目录并输入
./configure --with-debug=detect; make clean; make
删除驱动程序(如果它处于活动状态,请参阅下面的通用删除语句)。然后使用您之前使用的 “modprobe” 语句插入新编译的驱动程序。查看 /var/log/messages 中是否有任何消息。
如果这些消息没有帮助您,请向 ALSA 用户邮件列表发送消息,alsa-user@alsa-project.org。
包含以下信息
如果您发现错误,ALSA 开发人员希望了解以下信息(至少):
如果您使用 kmod/kerneld 和 ALSA 驱动程序来播放 CD,那么 kmod/kerneld 可能不会按预期加载驱动程序。这是因为命令行 CD 播放器只告诉 CD 播放器开始播放,而不使用任何告诉 kmod/kerneld 有声音发生的设备。使用 modprobe 可能是解决此问题的唯一方法。
通常,串行设备的 IO 端口由标准串行设备驱动程序拥有。因此,在您可以执行 ``modprobe snd-serial'' 之前,我们必须告诉驱动程序释放串行设备。
以下是步骤。
setserial /dev/ttyS0 uart none
modprobe snd-serial
(如果您的 MIDI 设备使用不同的串行设备,请将 /dev/ttyS0 替换为适当的 /dev/ttySx 设备)。
升级内核后,您可能需要重新编译 ALSA 驱动程序。如果它们仍然在原始的 /usr/src 目录中,那么请不要忘记在执行 ./configure, make, make install 操作之前先执行 make clean
。
哦,还有内核编号中的这个异常:一个 “2.2.0ac1” 内核 “不是一个数字” - 配置脚本会这样说。我认为这在较新的脚本中已得到解决,否则您可能应该在源代码中更改内核版本。
假设您已经启动并运行了 KDE,但您无法让系统声音工作,例如打开窗口、更改桌面等。声音总体上可以工作。如果您的 CD 播放器、mp3 播放器和混音器都可以工作,那么可能只是 “kwmsound” 缺少。
所以:确保 “kwmsound” 在您的启动脚本 ($KDEDIR/bin/startkde) 中
如果您之前在 Linux 中有声卡支持,那么您的应用程序可能会全部指向 /dev/pcm0、/dev/audio 和 /dev/mixer。如果您使用带有 snd-pcm1-oss 模块的 OSS 兼容性,这很好。但是,最好使用真正的 ALSA 设备,即在 /dev/snd/ 中找到的设备。
一个接一个地移除 10 多个模块不是一个好方法。幸运的是,所有模块都以 “snd-” 前缀开头,所以一点命令行编程就可以做到。您可以通过发出类似以下命令来轻松移除 ALSA 声卡
cat /proc/modules|gawk '/^snd-/{print $1}'|xargs -i rmmod {}
Juergen Kahrs 写道:“我有一个脚本也可以移除 soundcore 和 soundlow 以及 sound(如果存在且未使用)。此脚本处理 /proc/modules 三次,因此处理后应该不会剩下太多模块”。他的解决方案是
awk '/^snd/||/^sound/&&($3==0){system("rmmod " $1)}' /proc/modules /proc/modules /proc/modules
请注意:如果某个模块依赖于另一个模块,您不能只是移除 “更高” 的模块。这意味着您可能需要发出第二个移除语句。(但我从未遇到过这种情况,似乎您可以按照 ALSA 模块在 /proc/modules 中出现的顺序移除它们)。