Next Previous Contents

5. 测试及使用

现在应该是试试驱动程序是不是真能用的时候了. 接者就是使用它.

5.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 找到关于 0 号卡, /proc/asound/1 中关于 1 号卡的信息.

如果 cat /proc/asound/ 显示像

      ES1370 DAC2/ADC
      Playback isn't active.
      Record isn't active.
这是说您的驱动程序一切都很好, 但目前并没有事做(所以一切正常).

还有第三种找音效设备的方法, 就是如果您有 OSS 兼容驱动程序, 那么就有 /dev/sndstat 设备档. ALSA 驱动程序会体贴的提醒您不要依赖这些信息, 它只是为跟 OSS 兼容而做的. 由 /proc/asound 可以简单的得到更好的信息.

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 <file> > /proc/asound/#/mixerC0D0 命令来回复混音设定, 其中 <file> 的内容是由 /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 <filename> > /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 的兼容性来存取声卡. 两者间有以下的对应关系:

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

5.4 额外的信息

在 ALSA 驱动程序目录中的 INSTALL 档也提到了一些小技巧, 告诉驱动程序要作何调整设定. 依照播放声音的用途, 您可能需要用这些命令. 一般的播放程序, 如 mpg123, sox(常以 ``play'' 命令来执行), 或 X11 应用程序如 RealPlayer都不必用到这些. 我本人也从没用过.

/proc/asound/#/pcm#0

"Playback erase" - 清除所有关于 OSS 应用程序的额外信息.
"Playback <app_name> <fragments> <fragment_size> [<options>]"
"Record erase" - 清除所有关于 OSS 应用程序的额外信息.
"Record <app_name> <fragments> <fragment_size> [<options>]"

<app_name> - 应用程序名称, 包含(较优先假定)或不包含路径.

<fragments> - 片断(fragment)数, 给 0 则自动选择.

<fragment_size> - 一个片断的 byte 数, 或 0 选择自动.

<options> - 选择性的参数

WR_ONLY - 如果有个应用程序设开启模式为O_RDWR, 实际的权限将改为 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" -> 驱动程序播放时只使用 8-bit DMA 通道.
"Playback 16" -> 驱动程序播放时只使用 16-bit DMA 通道.
"Playback auto" (default) -> 驱动程序自动选择(会先尝试使用 16-bit DMA 通道)
"Record 8" -> 驱动程序录音时只使用 8-bit DMA 通道.
"Record 16" -> 驱动程序录音时只使用 16-bit DMA 通道.
"Record auto" (default) -> 驱动程序自动选择(会先尝试使用 16-bit DMA 通道)

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

更进一步的信息请参考 INSTALL 档.


Next Previous Contents