下一步 上一步 目录

6. 测试和使用

现在你应该测试一下声卡驱动是否真的可用,然后尝试使用它。

6.1 /proc 文件系统

你可以在 /proc 子目录中找到很多关于你系统的有用信息。/proc 是一个“虚拟”文件系统,意味着它在现实中并不存在,而仅仅是对你电脑中各种进程和任务的映射。为了使 /proc 工作,你需要将对它的支持编译到你的内核中。大多数 Linux 发行版默认都包含了这个支持,但是如果你编译内核时忽略了 /proc,那么 /proc 中显然不会有任何内容。

/proc/modules 提供了关于已加载模块的信息。一旦 ALSA 声卡驱动加载完成,如果你输入 cat /proc/modules,你应该看到类似这样的内容:

snd-pcm1-oss      4            0
snd-sb16          1            1
snd-sb-dsp        4    [snd-sb16]      0
snd-pcm1          4    [snd-pcm1-oss snd-sb-dsp]      0
snd-pcm           3    [snd-pcm1-oss snd-sb16 snd-sb-dsp snd-pcm1]    0
snd-mixer         3    [snd-pcm1-oss snd-sb16 snd-sb-dsp]      1
snd-mpu401-uart   1    [snd-sb16]      0
snd-midi          4    [snd-sb16 snd-sb-dsp snd-mpu401-uart]   0
snd-opl3          1    [snd-sb16]      0
snd-synth         1    [snd-sb16 snd-opl3]     0
snd-timer         1    [snd-opl3]      0
snd               8    [snd-pcm1-oss snd-sb16 snd-sb-dsp snd-pcm1 snd-pcm snd-mixer snd-mpu401-uart snd-midi snd-opl3 snd-synth snd-timer]    0
如果在驱动安装过程中出现问题,你仍然会看到几个 "snd" 设备,但是不会有声音支持。

例如(注意:你永远不应该像下面这样发出此命令,cs4236 驱动需要选项)

win3:~# modprobe snd-card-cs4236
/lib/modules/2.0.35/misc/snd-card-cs4236.o: init_module: Device or resource busy
snd-mixer: Device or resource busy
win3:~# cat /proc/modules
snd-cs4236        2           0
snd-cs4231        3    [snd-cs4236]    0
snd-timer         1    [snd-cs4231]    0
snd-pcm1          4    [snd-cs4236 snd-cs4231] 0
snd-mixer         3    [snd-cs4236 snd-cs4231] 0
snd-pcm           3    [snd-cs4236 snd-cs4231 snd-pcm1]       0
snd-mpu401-uart   1           0
snd-midi          4    [snd-mpu401-uart]       0
snd-opl3          1           0
snd-synth         1    [snd-opl3]      0
snd-timer         1    [snd-cs4231 snd-opl3]   0
snd               8    [snd-cs4231 snd-timer snd-pcm1 snd-mixer snd-pcm]     0
你可以通过查看 /proc/asound/cards 来检查声卡是否存在。例如
bash$ cat /proc/asound/cards
0 [card1          : SB16 - Sound Blaster 16
                    Sound Blaster 16 at 0x220, irq 5, dma 1&5
在之前的例子中(我忘记了选项),输出将会是
win3:~# cat /proc/asound/cards
--- no soundcards ---
一个工作的 CS4236 声卡会产生
0 [card1         ]: CS4236 - CS4237B
                    CS4237B at 0x534, irq 7, dma 1&0
如果你检查并再三检查了你的设置,但仍然没有看到声卡,请查看故障排除部分。

/proc/asound/ 虚拟目录显示了关于驱动程序的许多其他信息。请注意,/proc/asound/ 只会在你插入第一个 ALSA 模块后才会存在。如果没有 /proc/asound,则仅仅意味着 "snd" 模块没有正确加载。你可以在 /proc/asound/cards 中找到已安装的声卡,然后在 /proc/asound/0 中找到关于 card0 的信息,/proc/asound/1 中找到关于 card1 的信息,等等。

如果 cat /proc/asound/card1/pcm0 显示类似这样的内容

      ES1370 DAC2/ADC
      Playback isn't active.
      Record isn't active.
这意味着你的驱动程序已准备就绪,但目前没有做任何事情。(所以一切顺利)。

对于 2.0.x 内核的用户,还有第三种方法可以找到关于声卡设备的信息,也就是如果你插入了 OSS 兼容驱动程序,则会有一个 /dev/sndstat 设备。ALSA 驱动程序友好地请求你不要依赖此信息,因为它仅为了与 OSS 驱动程序的兼容性而存在,并且可以从 /proc/asound/ 轻松获得更好的信息。在内核 2.2.x 中,ALSA 使用内核 soundcore,因此无法模拟 /dev/sndstat,因为它会干扰 OSS 驱动程序。

6.2 混音器

一旦你的声卡驱动程序安装完成,并且你的 /proc 文件系统告诉你安装成功,你就可以尝试发出真正的声音了。要做到这一点,你需要将混音器音量设置为合理的值。你需要 alsa-utils 包中的 ``amixer'' 工具。首先,安装实用程序包,或者至少将 "amixer" 命令放在某个合理的位置(例如 /usr/local/bin)。

0.3.2 及更高版本具有与 OSS 驱动程序不同的界面。如果你只输入 ``amixer'',你将看到混音器元素及其值。这些元素之一可能是“Master volume”(主音量),可能看起来像

Group 'Master',0
  Capabilities: volume
  Channels: Front-Left Front-Right 
  Limits: min = 0, max = 31
  Front-Left: 31 [100%] [on] [---]
  Front-Right: 26 [84%] [on] [---]

不幸的是,我不知道如何独立设置左右声道音量。使用 amixer,你可以使用 ``amixer set'' 命令更改音量。例如,要更改主音量,你将发出

amixer set Master 15

请注意,不同类型的声卡,元素的名称可能会有所不同。还要注意 amixer 是区分大小写的,因此 ``amixer set masteR 10'' 将不起作用。有关更多信息,请查看 amixer 的 man 手册。

如果你使用的是 0.3.0-pre4 ALSA,那么 amixer 的工作方式就像普通的混音器程序一样。你可以通过输入 ``amixer'' 来查看混音器设置。此命令列出“混音器设置”,或者你通常称之为声卡各个部分的音量设置。amixer 的输出可能因声卡而异。我的 Soundblaster 16 显示

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)

如果你只收到类似 ``amixer: Specify command...'' 的消息,那么你正在使用 ALSA 3.2 工具。我建议你升级到 0.4.1e 或更高版本,或者退回到 0.3.0-pre4。

播放的混音器设置

你可能已经注意到某些设备的“Mute”(静音)条目。这意味着无论你使用什么音量设置,此特定设备都将被归零。某些声卡(示例中的 CS4237B)甚至会将其主通道静音。因此,对于 CS4237B,我必须输入

amixer set "Master d" unmute

才能发出任何声音。Soundblaster 没有静音输出,但是

amixer set Master 100 unmute

会将音量设置为 100% - 并在静音时取消静音。你可以使用数字、像 "mute" 或 "unmute" 这样的词,或者两者都用。输入

amixer set "Master d" 100; amixer set PCM 100 unmute

将 CS4237B 声卡设置为主音量最大,取消 PCM 音量静音并将其设置为最大值。

如果你使用旧版本的 amixer,你需要省略命令的 ``set'' 部分,所以你只需输入

amixer "master d" 100

混音器部件

如果你不了解数字声音制作,各种混音器部件可能会让你感到困惑。sound-HOWTO 可能会有所帮助,但这里有一个非常简短的介绍。

你可能只需要几个混音器元素:其中之一是 ``CD'' 设置(这是你的 CD 播放器的模拟声音,大多数 CD 播放器都使用 3 或 4 线红/白/黑电缆连接)。

``PCM'' 设置用于大多数应用程序。像 mpg123、xmms、speakfreely、realplayer 和大多数其他程序都使用 PCM 通道。

``MIC'' 代表麦克风,``line-in'' 是声卡背面(可选的)额外的输入。

各种 ``gain'' 部件为各种用途提供额外的放大,并且非常容易理解。(例如:record-gain 是录音通道的额外放大,如果你使用麦克风,这可能很有用)。

录音的混音器设置

你可以通过输入以下内容将 CD 通道设置为录音

amixer set CD capture

并通过输入以下内容再次停止录音设置

amixer set CD nocapture.

请注意,旧版本的 amixer 程序使用 ``amixer CD rec'' 和 ``amixer CD norec'' 来实现此目的。

如果你想从麦克风录制一些内容,你可能会使用

amixer set "Input Gain" 100; amixer set Mic 100 capture mute.

(如果你的麦克风再次从扬声器中拾取其自身信号,则使用未静音的麦克风输入会产生响亮的高音调声音)。大多数麦克风都有一个 ``gain'' 设置来提升麦克风音量;你很可能需要它才能从麦克风中拾取任何声音。

同样,旧版本的 amixer 程序使用 ``amixer "input gain" 100; amixer mic 100 rec mute''。

其他混音器设置

不幸的是,我无法使用 amixer 0.3.0-pre4 更改 "3d center" 和 "3d space" 设置的音量。我还没有尝试过 0.4.1e(这台特定的机器仍在运行 2.0.38)。如果有人成功了,请告诉我。我可以使用 alsamixer 来完成这项工作,但 alsamixer 尚未移植到 0.4.1e 版本。

ALSA FAQ 说可以使用 cat <file> > /proc/asound/#/mixerC0D0 恢复混音器设置,其中 <file> 是从 /proc/asound/#/mixerC0D0 获取的。我未能重现这一点,因为我的系统抱怨设备不存在。然后还有 ``alsactl'' 程序,我没有使用它。我邀请你(是的,就是你!)来编写这一部分。

6.3 /dev/snd/ 设备

alsa 驱动程序在 /dev/snd/ 目录中有原生声卡设备。如果你有一张声卡,你可能会看到以下设备

/dev/snd/pcmC0D0 - the raw audio device for the card
/dev/snd/mixerC0D0 - the mixer for card 0
/dev/snd/controlC0D0 - the control device for card 0
第一个数字表示声卡的编号,第二个数字(如果有)是设备的编号。具有两个 PCM 设备的声卡将具有 pcmC0D0 和 pcmC0D1 设备。请注意:ALSA 设备在前一个版本之间发生了变化。旧版本的 ALSA 驱动程序使用 /dev/snd/pcm00(第一个数字是声卡,第二个数字是设备)。如果本 HOWTO 使用了较旧的表示法,请给我留言,以便我更正它。

现在你可以将任何你想要的声音文件放入第一张声卡的 PCM 设备中。所以尝试将任何文本文件(任何文件)cat 到 /dev/snd/pcmC0D0,像这样:cat <filename> > /dev/snd/pcmC0D0。文件名可以是任何文件,只要它有一定的长度。如果你有声音文件,你可以尝试一下。你也可以从 http://www.ldp.org/sounds/english.au 获取文件,这是 Linus Torvalds 讲述如何发音 Linux。

你的声卡设备的默认设置是 8000 Hz,8 位。这意味着上面提到的 "english.au" 文件会产生语音,其他测试文件可能只会产生噪音。如果你没有听到任何声音,请检查你的扬声器,尝试再次运行 "amixer" 或咨询医生。(稍后你可以轻松使用声卡的完整 48 KHz、16 位功能,通过使用你最喜欢的音频播放器,如 sox 或 mpg123)。

如果你加载了 ``snd-pcm1-oss'' 模块,你也可以使用 OSS 兼容性来访问你的声卡。进行了以下映射

/dev/snd/pcmC0D0 -> /dev/audio0 (/dev/audio) -> minor 4
/dev/snd/pcmC0D0 -> /dev/dsp0 (/dev/dsp) -> minor 3
/dev/snd/pcmC0D1 -> /dev/adsp0 (/dev/adsp) -> minor 12
/dev/snd/pcmC1D0 -> /dev/audio1 -> minor 4+16 = 20
/dev/snd/pcmC1D0 -> /dev/dsp1 -> minor 3+16 = 19
/dev/snd/pcmC1D1 -> /dev/adsp1 -> minor 12+16 = 28
/dev/snd/pcmC2D0 -> /dev/audio2 -> minor 4+32 = 36
/dev/snd/pcmC2D0 -> /dev/dsp2 -> minor 3+32 = 35
/dev/snd/pcmC2D1 -> /dev/adsp2 -> minor 12+32 = 44

你可能也想使用 ``snd-mixer-oss'' 模块,这样你就可以使用向后兼容的混音器。

6.4 附加信息

ALSA 驱动程序目录中的 INSTALL 文件提到了一些技巧,可以告诉驱动程序要使用哪些设置。你是否需要这些命令将取决于你用于播放声音的应用程序。常规的声音播放应用程序,如 mpg123、sox(通常使用 ``play'' 命令调用)或 X11 应用程序,如 RealPlayer,可能在没有这些命令的情况下也能正常工作。我从来没有使用过这些。

/proc/asound/#/pcm#0

"Playback erase" - erase all additional informations about OSS applications
"Playback <app_name> <fragments> <fragment_size> [<options>]"
"Record erase" - erase all additional informations about OSS applications
"Record <app_name> <fragments> <fragment_size> [<options>]"

<app_name> - 应用程序名称(具有更高优先级)或不带路径

<fragments> - 片段数,如果自动则为零

<fragment_size> - 片段大小(字节),如果自动则为零

<options> - 可选参数

WR_ONLY - 如果应用程序尝试使用 O_RDWR 打开 pcm 设备,驱动程序会将此重写为 O_WRONLY(播放) - 适用于 Quake 等...

示例

echo "Playback x11amp 128 16384" > /proc/asound/0/pcm0o
echo "Playback squake 0 0 WR_ONLY" > /proc/asound/0/pcm0o

/proc/asound/#card#/sb16

"Playback 8" -> driver will use always 8-bit DMA channel for playback.
"Playback 16" -> driver will use always 16-bit DMA channel for playback.
"Playback auto" (default) -> driver will use auto mode (first opened direction will use 16-bit DMA channel).
"Record 8" -> driver will use always 8-bit DMA channel for record.
"Record 16" -> driver will use always 16-bit DMA channel for record.
"Record auto" (default) -> driver will use auto mode (first opened direction will use 16-bit DMA channel).

示例:echo "Record 16" > /proc/asound/0/sb16

有关更多参考,请查阅 INSTALL 文件。


下一步 上一步 目录