Next Previous Contents

6. 小技巧及问题排除

请先看看声卡驱动程序目录的 FAQ 档. 这一节仍然在增修中.

6.1 编译驱动程序

Linux 核心原始码目录树

如果 ALSA 驱动程序无法成功编译, 出现像找不到 ``version.h'' 或其它引入档(header files)之类的错误, 这是指您没有安装核心的引入档. 先花点时间看看 Kernel-HOWTO, 将最新近的核心解开到 /usr/src 并且下 make config命令.

6.2 载入驱动程序

请检查以下各条:

声卡兼容性

您是否百分之百的确定您的声卡有支持呢? 千万要记得检查. 有时一片叫 X123 的声卡并不全等于叫 X123b 的, 这样可能会浪费您的时间.

在另一方面, 即使是有支持的卡也可能会找您麻烦 - 为了安装一片 CS4237B 的卡, 耗了我两个小时来搞清楚, 结果发现说明文件里有. (原文是 On the other hand, even a supported card can give you troubles - it took me two hours to figure out the installation of a CS4237B which was, after all, just a fine example of RTFM. )

``Device busy'' 或 ``unresolved symbols''

您可能在 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") 那么您必须将音效驱动程序剔除掉.

如果您的核心是 2.2.x版核心, 那么您需要音效驱动程序. 2.2.x 版核心应该将音效驱动程序编译进核心, 但不加入任何声卡的支持. 因此您要选音效支持, 但也确定不要加入任何声卡驱动程序.

又见 Unresolved symbols

另一个造成 "unresolved symbols" 信息的原因可能是新版核心配合旧版驱动程序. 请在重新编译核心之后别忘了也重新编译 ALSA 驱动程序. 如此才可以确定驱动程序能配上您的新核心.

检查 PnP 设定

确定声卡起动(active)了吗? 请另外花点时间读读 PnP-HOWTO, 确认您已正确地致动(activate)了您的声卡.

参数有设对吗?

检查, 再三检查您的声卡设定参数. 请小心: 534 不等于 543, 0x534 也不等于 534.

同时, 有些声卡要载入的模块不是您预期的那个. 休息一下, 喝杯啤酒或什么的, 然后再看看您 modprobe 的结果. 例如 Crystal 4232 应该插入的驱动程序是 snd-card-cs4232, 不是 "snd-cs4231". 而 SoundBlaster PCI64 应该载入的是 "snd-audiopci", 非 snd-es1370. (这些在文件中都有写, 而笔者在写这篇 HOWTO 时, 还曾花了一个晚上试著用 snd-cs4231 让它发出声音.)

6.3 驱动程序载入了... 可是没声音

解除静音

ALSA 驱动程序可以运用多数声卡都有的 "静音" 能力. 如果您载入了音效驱动程序, 一切看起来都还正确, 就是没有声音的话, 那么您可能忘计把静音取消掉了. 要这么做您要用 "amixer" 或 "alsamixer", 两者都附在驱动程序中. 只要键入:

amixer -c 1 master 70:70 unmute
amixer -c 1 pcm 70:70 unmute
amixer -c 1 cd 70:70 unmute
对多数的应用程序应该都有效的.

OSS/Linux 的兼容性

如果这是您首次使用 ALSA 驱动程序, 而您以前使用过核心内建的那个的话, 您可能想要能和过去兼容的能力.(即使用 /dev/pcmX 设备之能力). 这时您需要载入 "OSS 兼容驱动程序". 执行 modprobe snd-pcm1-oss (详见关于载入本驱动程序那一节. ). 请疝N: snd-pcm1-oss 不能于 snd-pcm1. 对旧驱动程序的支持所需要的是 snd-pcm1-oss.

6.4 一般性建言

试著用 "insmod"

用 "insmod" 取代 kerneld 总是有用的. 也许因此您就可以在萤幕上看到错误信息了.

读 INSTALL 档.

在驱动程序目录中的 INSTALL 档可以发现很多信息. 如果您的驱动程序不起作用, 别忘了看看这个档, 也许会有额外的信息.

除错信息

如果以上的方法还是没有用, 您可以重新编译驱动程序, 要求它将除错信息送进 /var/log/messages 档中, 做为最后手段. 下cd /usr/src/alsa-driver-...命令进入驱动程序目录, 然后输入:

./configure --with-debug=detect; make clean; make

移除驱动程序(如果它已经启动的话, 请看后面有提到的移除模块小技巧) 然后用您刚刚用的 "modprobe" 指令安插新编译的驱动程序. 看看 /var/log/messages 里有没有任何相关信息.

如果都没有用呢...

如果您无法由信息中取得线索, 写封 Email 到 ALSA 使用者通信论坛, alsa-user@alsa-project.org.

别忘了加上以下信息:

6.5 回报臭虫

如果您发现了一只臭虫, ALSA 驱动程序开发组希望能够得知(至少)以下信息:

  1. 驱动程序及核心的版本: 'cat /proc/asound/version'
  2. 声卡信息
  3. 所有在 /var/log/messages 中的相关信息
  4. 问题的描述

6.6 小技巧: 听 CD 时...

如果您使用kmod/kerneld 以及 ALSA 驱动程序来听 CD, 那么 kmod/kerneld 可能不会像预期一般载入驱动程序. 这是由于命令列的 CD 放音程序只会叫 CDROM 开始播放, 而不会使用到任何设备, 让 kmod/kerneld 来载入驱动程序. 这个问题的解可能就只有使用 modprobe 了.

6.7 小技巧: 安装 MIDI 序列驱动动程序

通常, 序列设备的 IO 埠会由标准的序列设备驱动程序占有. 所以在您可以进行 "modprobe snd-serial" 以前, 必须让驱动程序释放掉该序列设备.

以下是所需程序.

setserial /dev/ttyS0 uart none
modprobe snd-serial

(如果您的 MIDI 设备使用不一样的设备,将 /dev/ttyS0 换成相对应的 /dev/ttySx)

6.8 小技巧: 换新核心? 换新模块!

当您更新核心后, 您可能需要重新编译 ALSA 驱动程序. 如果它们还在原来的 /usr/src 目录下, 请别忘了在您进行 ./configure, make, make install 之前先下 make clean 命令.

喔! 还有个不太一样的核心版本编号 "2.2.0ac1", 会被 configure 命令档抱怨不是数字. 我想这个在新版的命令档中会解决, 不然您可能得改变原始码中的核心版本编号.

6.9 小技巧: KDE 及 ALSA 驱动程序

如果您使用了 KDE, 但却无法听到诸如开启视窗或改变使用的桌面等系统音效, 不过其它音效动作正常. 也就是您的 CD 播放, MP3 播放以及混音器都很正常, 那么可能只是因为欠缺 "kwmsound" 而已.

所以: 确定在您的启动命令档($KDEDIR/bin/startkde)中有 "kwmsound".

6.10 小技巧: 使用 ALSA 设备

如果您以前有利用过 Linux 的音效支持, 那么您的应用程序可能需要用到 /dev/pcm0, /dev/audio 及 /dev/mixer. 使用 OSS 兼容模块 snd-pcm1-oss 是不错的解决方法, 但如果使用真正的 ALSA 设备(在 /dev/snd/下)的话那更好.

6.11 小技巧: 移除所有模块

要一个一个的移除十几个模块实在不是个好办法. 很幸运的, 所有的模块名都是由 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

请注意: 如果有一个模块依赖另一个模块的话, 您不可以只移除较上层的那个. 这意味著您可能有必要下第二道命令. (我从来没碰到过这种情况; 看起来您可以以依照在 /proc/modules 中的顺序移除 ALSA 模块.)


Next Previous Contents