📄 alsa-sound-6.html
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>6</title>
</head>
<body>
<table>
<tr>
<td bgColor="#FFFFFF" vAlign="top"><img alt="Next" src="next.gif" width="16" height="16">
<a href="Alsa-sound-5.html"><img alt="Previous" src="prev.gif" width="16" height="16"></a> <a href="Alsa-sound.html#toc6"><img alt="Contents" src="toc.gif" width="16" height="16"></a>
<hr>
<h2><a name="s6">6. 小技巧及问题排除</a></h2>
<p>请先看看音效卡驱动程式目录的 FAQ 档.
这一节仍然在增修中.
<h2><a name="ss6.1">6.1 编译驱动程式</a></h2>
<p>
<h3>Linux 核心原始码目录树</h3>
<p>如果 ALSA 驱动程式无法成功编译, 出现像找不到 ``version.h''
或其它引入档(header files)之类的错误,
这是指您没有安装核心的引入档. 先花点时间看看 Kernel-HOWTO,
将最新近的核心解开到 /usr/src 并且下 <code>make config</code>命令.
<p>
<h2><a name="ss6.2">6.2 载入驱动程式</a></h2>
<p>请检查以下各条:
<p>
<h3>音效卡相容性</h3>
<p>您是否百分之百的确定您的音效卡有支援呢?
千万要记得检查. 有时一片叫 X123 的音效卡并不全等於叫
X123b 的, 这样可能会浪费您的时间.
<p>在另一方面, 即使是有支援的卡也可能会找您麻烦 -
为了安装一片 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. )
<p>
<h3>``Device busy'' 或 ``unresolved symbols''</h3>
<p>您可能在 2.0.x 版核心中将音效卡支援编进核心内,
或是已载入 OSS/Lite(核心的)驱动程式(可用<code>cat
/proc/modules</code>来检查). 移除该驱动程式或重新编译核心(请看
Kernel-HOWTO 後动手).
<p>在 2.0 版核心中的音效模组叫做 "sound.o", <b>不应该</b>被启用.
(虽然 ALSA 的驱动程式 "snd.o" 可以.)
<p>如果您的核心是 2.2.x 版, 而没有将音效支援编译进去,
ALSA 驱动程式也会无法作用.
<p>我也知道这两种不同的状况令人困扰,
所以我在此再作一次解释. 如果您用的是 <b>2.0.x版</b>核心
("uname -a"命令传回像 "Linux penguin 2.0.35 #6 Wed Sep
23 10:19:16 CEST 1998 i686 unknown")
那麽您必须将音效驱动程式<b>剔除</b>掉.
<p>如果您的核心是 <b>2.2.x版核心</b>, 那麽您<b>需要音效驱动程式</b>.
2.2.x 版核心应该<b>将音效驱动程式编译进核心,
但不加入任何音效卡的支援</b>. 因此您要选音效支援,
但也确定不要加入任何音效卡驱动程式.
<p>
<h3>又见 Unresolved symbols</h3>
<p>另一个造成 "unresolved symbols"
讯息的原因可能是新版核心配合旧版驱动程式.
请在重新编译核心之後别忘了也重新编译 ALSA 驱动程式.
如此才可以确定驱动程式能配上您的新核心.
<p>
<h3>检查 PnP 设定</h3>
<p>确定音效卡起动(active)了吗? 请另外花点时间读读 PnP-HOWTO,
确认您已正确地致动(activate)了您的音效卡.
<p>
<h3>参数有设对吗?</h3>
<p>检查, 再三检查您的音效卡设定参数. 请小心: 534
不等於 543, 0x534 也不等於 534.
<p>同时, 有些音效卡要载入的模组不是您预期的那个.
休息一下, 喝杯啤酒或什麽的, 然後再看看您 modprobe
的结果. 例如 Crystal 4232 应该插入的驱动程式是
snd-card-cs4232, 不是 "snd-cs4231". 而 SoundBlaster PCI64
应该载入的是 "snd-audiopci", 非 snd-es1370. (这些在文件中都有写,
而笔者在写这篇 HOWTO 时, 还曾花了一个晚上试著用
snd-cs4231 让它发出声音.)
<p>
<h2><a name="ss6.3">6.3 驱动程式载入了... 可是没声音</a></h2>
<p>
<p>
<h3>解除静音</h3>
<p>ALSA 驱动程式可以运用多数音效卡都有的 "静音"
能力. 如果您载入了音效驱动程式, 一切看起来都还正确,
就是没有声音的话, 那麽您可能忘计把静音取消掉了.
要这麽做您要用 "amixer" 或 "alsamixer",
两者都附在驱动程式中. 只要键入:
<blockquote>
<code>
<pre>amixer -c 1 master 70:70 unmute
amixer -c 1 pcm 70:70 unmute
amixer -c 1 cd 70:70 unmute
</pre>
</code>
</blockquote>
对多数的应用程式应该都有效的.
<p>
<h3>OSS/Linux 的相容性</h3>
<p>如果这是您首次使用 ALSA 驱动程式,
而您以前使用过核心内建的那个的话,
您可能想要能和过去相容的能力.(即使用 /dev/pcmX
设备之能力). 这时您需要载入 "OSS 相容驱动程式".
执行 <code>modprobe snd-pcm1-oss</code> (详见关於载入本驱动程式那一节.
). 请疝N: snd-pcm1-oss 不能於 snd-pcm1.
对旧驱动程式的支援所需要的是 snd-pcm1-oss.
<p>
<h2><a name="ss6.4">6.4 一般性建言</a></h2>
<p>
<p>
<h3>试著用 "insmod"</h3>
<p>用 "insmod" 取代 kerneld 总是有用的.
也许因此您就可以在萤幕上看到错误讯息了.
<p>
<h3>读 INSTALL 档.</h3>
<p>在驱动程式目录中的 INSTALL 档可以发现很多资讯.
如果您的驱动程式不起作用, 别忘了看看这个档,
也许会有额外的资讯.
<p>
<h3>除错讯息</h3>
<p>如果以上的方法还是没有用, 您可以重新编译驱动程式,
要求它将除错讯息送进 /var/log/messages 档中,
做为最後手段. 下<code>cd /usr/src/alsa-driver-...</code>命令进入驱动程式目录,
然後输入:
<p>
<blockquote>
<code>
<pre>./configure --with-debug=detect; make clean; make
</pre>
</code>
</blockquote>
<p>移除驱动程式(如果它已经启动的话,
请看後面有提到的移除模组小技巧) 然後用您刚刚用的
"modprobe" 指令安插新编译的驱动程式. 看看 /var/log/messages
里有没有任何相关讯息.
<p>
<h3>如果都没有用呢...</h3>
<p>如果您无法由讯息中取得线索, 写封 Email 到 ALSA
使用者通信论坛, <a href="mailto:alsa-user@alsa-project.org">alsa-user@alsa-project.org</a>.
<p>别忘了加上以下资讯:
<ul>
<li>您的音效卡的名称以及其使用的晶片.
<li>如果您的音效卡是 ISA PnP 的, 放入 isapnp.conf
中有关的部份.
<li>您的 conf.modules 档或是启动 ALSA 驱动程式的命令行.
<li>所有在 /var/log/messages 中应该和 ALSA
驱动程式有关的讯息.</li>
</ul>
<p>
<h2><a name="ss6.5">6.5 回报臭虫</a></h2>
<p>如果您发现了一只臭虫, ALSA
驱动程式开发组希望能够得知(至少)以下资讯:
<ol>
<li>驱动程式及核心的版本: 'cat /proc/asound/version'
<li>音效卡资讯
<ul>
<li>厂商所标示的音效卡名称
<li>该卡上面的各个晶片标示
<li>'cat /proc/asound/cards' 的执行结果</li>
</ul>
<li>所有在 /var/log/messages 中的相关讯息
<li>问题的描述</li>
</ol>
<p>
<h2><a name="ss6.6">6.6 小技巧: 听 CD 时...</a></h2>
<p>如果您使用kmod/kerneld 以及 ALSA 驱动程式来听 CD, 那麽
kmod/kerneld 可能不会像预期一般载入驱动程式.
这是由於命令列的 CD 放音程式只会叫 CDROM 开始播放,
而不会使用到任何设备, 让 kmod/kerneld 来载入驱动程式.
这个问题的解可能就只有使用 modprobe 了.
<p>
<h2><a name="ss6.7">6.7 小技巧: 安装 MIDI 序列驱动动程式</a></h2>
<p>通常, 序列设备的 IO
埠会由标准的序列设备驱动程式占有. 所以在您可以进行
"modprobe snd-serial" 以前,
必须让驱动程式释放掉该序列设备.
<p>以下是所需程序.
<p>
<blockquote>
<code>
<pre>setserial /dev/ttyS0 uart none
modprobe snd-serial
</pre>
</code>
</blockquote>
<p>(如果您的 MIDI 设备使用不一样的设备,将 /dev/ttyS0
换成相对应的 /dev/ttySx)
<p>
<h2><a name="ss6.8">6.8 小技巧: 换新核心? 换新模组!</a></h2>
<p>当您更新核心後, 您可能需要重新编译 ALSA 驱动程式.
如果它们还在原来的 /usr/src 目录下, 请别忘了在您进行
./configure, make, make install 之前先下 <code>make clean</code>
命令.
<p>喔! 还有个不太一样的核心版本编号 "2.2.0ac1",
会被 configure 命令档抱怨不是数字.
我想这个在新版的命令档中会解决,
不然您可能得改变原始码中的核心版本编号.
<p>
<h2><a name="ss6.9">6.9 小技巧: KDE 及 ALSA 驱动程式</a></h2>
<p>如果您使用了 KDE,
但却无法听到诸如开启视窗或改变使用的桌面等系统音效,
不过其它音效动作正常. 也就是您的 CD 播放, MP3
播放以及混音器都很正常, 那麽可能只是因为欠缺 "kwmsound"
而已.
<p>所以: 确定在您的启动命令档($KDEDIR/bin/startkde)中有
"kwmsound".
<p>
<h2><a name="ss6.10">6.10 小技巧: 使用 ALSA 设备</a></h2>
<p>如果您以前有利用过 Linux 的音效支援,
那麽您的应用程式可能需要用到 /dev/pcm0, /dev/audio 及
/dev/mixer. 使用 OSS 相容模组 snd-pcm1-oss 是不错的解决方法,
但如果使用真正的 ALSA 设备(在 /dev/snd/下)的话那更好.
<p>
<h2><a name="ss6.11">6.11 小技巧: 移除所有模组</a></h2>
<p>要一个一个的移除十几个模组实在不是个好办法.
很幸运的, 所有的模组名都是由 snd- 开始,
所以用一点小小的命令列规划,
您可以轻易的下以下的命令移除 ALSA 音效驱动程式:
<p>
<blockquote>
<code>
<pre>cat /proc/modules|gawk '/^snd-/{print $1}|xargs -i rmmod {}
</pre>
</code>
</blockquote>
<p>Juergen Kahrs 写道: "我有一个命令档可以连 soundcore,
soundlow 以及 sound 都一并消去,
如果它们已载入且没在使用中的话. 这个命令档处理
/proc/modules 三次,
这样在完成後应该不会有太多模组留下来."
他的解法是:
<p>
<blockquote>
<code>
<pre>awk '/^snd/||/^sound/&&($3==0){system("rmmod " $1)}' /proc/modules /proc/modules /proc/modules
</pre>
</code>
</blockquote>
<p>请注意: 如果有一个模组依赖另一个模组的话,
您不可以只移除较上层的那个.
这意味著您可能有必要下第二道命令. (我从来没碰到过这种情况;
看起来您可以以依照在 /proc/modules 中的顺序移除 ALSA
模组.)
<p>
<hr>
<img alt="Next" src="next.gif" width="16" height="16">
<a href="Alsa-sound-5.html"><img alt="Previous" src="prev.gif" width="16" height="16"></a> <a href="Alsa-sound.html#toc6"><img alt="Contents" src="toc.gif" width="16" height="16"></a></td>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -