当前位置:Linux教程 - Linux - Alsa-sound-mini-HOWTO(五)

Alsa-sound-mini-HOWTO(五)


5.2 混音器
一旦您的音效卡装好, 而 /proc 档案系统也这麽显示後, 您可以试试真正发出声音. 首先呢, 安装公用程式套件, 或至少把 ""amixer"" 命令放到一些合理的地方(如 /usr/local/bin). 先用 ""amixer"" 看看混音器设定. amixer 的输出会随卡的不同而有很大变化, 我的 SoundBlaster16 显示:

Master 0 % (-14.00dB) : 0 % (-14.00dB)
Bass 0 % (-14.00dB) : 0 % (-14.00dB)
Treble 0 % (-14.00dB) : 0 % (-14.00dB)
Synth 0 % (-62.00dB) : 0 % (-62.00dB)
PCM 0 % (-62.00dB) : 0 % (-62.00dB)
Line-In 0 % (-62.00dB) : 0 % (-62.00dB) Mute
MIC 0 % (-62.00dB) : 0 % (-62.00dB) Mute
CD 0 % (-62.00dB) : 0 % (-62.00dB) Mute
In-Gain 0 % (-18.00dB) : 0 % (-18.00dB)
Out-Gain 0 % (-18.00dB) : 0 % (-18.00dB)
PC Speaker 0 % (-18.00dB) : 0 % (-18.00dB)

而我的 Crystal 4237B 的音效卡有很多其它选项:
Master D 0 % (-22.00dB) : 0 % (-22.00dB) Mute
3D Center 0 % (-22.50dB) : 0 % (-22.50dB)
3D Space 0 % (-22.50dB) : 0 % (-22.50dB) Mute
Synth 0 % (-94.50dB) : 0 % (-94.50dB) Mute
FM 0 % (-94.50dB) : 0 % (-94.50dB) Mute
DSP 0 % (-94.50dB) : 0 % (-94.50dB) Mute
PCM 0 % (-94.50dB) : 0 % (-94.50dB) Mute
Line-In 0 % (-34.50dB) : 0 % (-34.50dB) Mute
MIC 0 % (-22.50dB) : 0 % (-22.50dB) Mute
CD 0 % (-34.50dB) : 0 % (-34.50dB) Mute
Record-Gain 0 % ( 0.00dB) : 0 % ( 0.00dB)
In-Gain 0 % (-18.00dB) : 0 % (-18.00dB)
Loopback 0 % (-94.50dB) : 0 % (-94.50dB) Mute
Mono 0 % (-45.00dB) : 0 % (-45.00dB) Mute
Aux A 0 % (-34.50dB) : 0 % (-34.50dB) Mute

注意一下 ""Mute"" 那一栏, CS4237B 甚至连主音量也调静音了. 对 CS4237B, 我还要先打 amixer ""master d"" unmute 以後才能发出声音. SoundBlaster 的输出就没有静音, 不过 amixer master 100 unmute 会将主音量解除静音, 还设为 100%. 您可以用数字, 或像 ""mute"" 及 ""unmute"" 的文字, 或都打, 来控制. 打 amixer ""master d"" 100; amixer pcm 100 unmute 可以将 CS4237B 卡的主音量设最大, 并将 PCM 音量解除静音并设为最大. 如果左右要不一样, 可以用冒号, 如 amixer CD 25:50.(不, 我不晓得那一个是指左右声道, 不过我强调一下这也和您的喇叭摆放位置有密切关系.)

您应该下 amixer cd rec 以将 CD 当做录音的音源. 然後後下 amixer cd norec命令解除此设定. 如果您想要经由麦克风来录些东西, 您也许可以下 amixer record-gain 100; amixer mic 100 rec mute(如果不将麦克风输入的放音设为静音的话, 麦克风会从喇叭收到本身的信号, 会造成高音部份音量降低.) 然而不幸的是我没能够用 amixer 来改变 3D center 及 3D space 的音量设定. 如果有人成功了, 请告知我. 这工作可由 alsamixer 来进行.

ALSA FAQ 上面表示可以用 cat > /proc/asound/#/mixerC0D0 命令来回复混音设定, 其中 的内容是由 /proc/asound/#/mixerC0D0 中取得. 我无法重现相同的结果, 我的电脑抱怨此设备找不到.

5.3 /dev/snd/ 下的设备
ALSA 驱动程式在 /dev/snd/ 目录下有自己的驱动程式. 如果您有一片音效卡, 您可能看到以下设备:


/dev/snd/pcmC0D0 - 这张音效卡的原生音效设备.
/dev/snd/mixerC0D0 - 第""零""号卡的混音器设备.
/dev/snd/controlC0D0 - 第""零""号卡的控制设备.

第一个号码是指第几号音效卡. 第二个号码是代表单卡上的设备号码. 一张有两个 PCM 设备的音效卡应该有 pcmC0D0 及 pcmc0D1 设备.
请疝N: ALSA 的设备档名和旧版已经不一样了. 旧的 ALSA 驱动程式用 /dev/snd/pcm00 (第一个是卡, 第二个是设备号). 如果看到本 HOWTO 中还有用旧的档名的, 请写封 Email 给我以便更正.

现在您可以将任何您想听的音效档丢进第一片卡的 PCM 设备中了. 现在试试用 cat 把任何文字档(或任何档案)送进 /dev/snd/pcmC0D0, 就像这样: cat > /dev/snd/pcmC0D0. 其中 filename 可以是任意档案, 只要它够大. 如果您已有现成的音效档, 也可以试试. 您也可以抓 http://www.ldp.org/sounds/english.au. 这是 Linux Torvalds 讲 Linux 这个字如何发音的话.

音效设备预先被设定为 8000Hz, 8 位元. 这意味着刚提到的 ""english.au"" 会发出讲话声, 而其它档可能只会发出噪音. 如果您听不到, 请检查您的喇叭, 或再执行 amixer 一遍或去看医师(该不会是... 您的耳朵聋了!?) . (稍後您可以用您喜欢的播放程式如 sox 或 mpg123 , 简单的来放完全的 48KHz, 16 位元声音.)

如果您载入了 ""snd-pcm1-oss"" 模组, 您也可以利用 OSS 的相容性来存取音效卡.
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 让它发出声音.)