7.2. 安装声卡

贡献者 Moses Moore. Enhanced for FreeBSD 5.X by Marc Fonvieille.

7.2.1. 配置系统

在开始之前,您应该清楚声卡类型、所用的芯片以及它是 PCI 还是 ISA 卡。 FreeBSD 支持种类繁多的 PCI 和 ISA 卡。检查 Hardware Notes 中支持的音频设备列表看看是否支持您的声卡。 这份文档也只论及支持您的声卡的驱动程序。

要使用声卡,您就应装载正确的驱动程序。完成的方式有两种: 最简单的是使用命令 kldload(8) 来装载一个内核模块,在命令行输入

# kldload snd_emu10k1

或者在文件 /boot/loader.conf 里加入一行,内容如下

snd_emu10k1_load="YES"

上边实例用于 Creative SoundBlaster® Live! 声卡。 其它可装载的模块列在文件/boot/defaults/loader.conf里边。 如果不知道应该使用哪个驱动, 您可以尝试加载 snd_driver module:

# kldload snd_driver

这是个 meta 驱动,一次加载了最常见的设备驱动。 这会提高搜索正确驱动的速度。也可以通过 /boot/loader.conf 工具来加载所有的声卡驱动。

Note: 在 FreeBSD 4.X 下,要加载所有的声卡驱动,您必须加载 snd 模块而不是 snd_driver 模块。

另外,您也可以把支持您声卡的代码静态地编译到内核里去。 下面的部份就采用这种方式支持硬件给出提示。关于重新编译内核,请参考 Chapter 8

7.2.1.1. 配置包含声音支持的定制内核

要做的第一件事情就是添加通用音频驱动 sound(4) 到内核中,您需要添加下面这行到内核配置文件中:

device sound

在 FreeBSD 4.X 下,使用下面这行:

device pcm

之后我们必须添加对我们的声卡的支持。 因此,我们需要知道哪一个驱动支持我们的声卡。检查 Hardware Notes 的支持的音频设备列表, 确定您声卡的正确驱动。比如,一个 Creative SoundBlaster Live! 声卡由 snd_emu10k1(4) 驱动来支持。要添加这个卡的支持, 使用下面这行:

device snd_emu10k1

一定要阅读驱动的联机手册了解要使用的语法。 关于内核配置文件中声卡驱动的语法的信息,也可以在 /usr/src/sys/conf/NOTES 文件 (对于 FreeBSD 4.X 是 /usr/src/sys/i386/conf/LINT)。

非-PnP ISA 卡可能要求您提供给内核声卡的设置信息(IRQ、I/O 端口等等),可以通过 /boot/device.hints 文件来做。在系统启动时, loader(8) 会读取这个文件并把设定传给内核。比如, 一个古老的 Creative SoundBlaster 16 ISA 非-PnP 卡使用 snd_sbc(4) 驱动,添加下面这行道内核配置文件中:

device sbc

还有下面这些到 /boot/device.hints中:

hint.sbc.0.at="isa"
hint.sbc.0.port="0x220"
hint.sbc.0.irq="5"
hint.sbc.0.drq="1"
hint.sbc.0.flags="0x15"

这样,声卡使用 0x220 I/O 端口和 IRQ 5

/boot/device.hints 文件使用的语法在声卡驱动的联机手册中描述。 在 FreeBSD 4.X 上,这些设定直接写进内核配置文件中。 对于我们的 ISA 卡这种情况,我们只要使用这行:

device sbc0 at isa? port 0x220 irq 5 drq 1 flags 0x15

上面展示的设定是默认的。有时候, 您可能需要更改 IRQ 或者其他的设定来匹配您的卡。 查看 snd_sbc(4) 联机手册了解更多信息。

Note: 在 FreeBSD 4.X 下, 一些主板内建声卡设备的系统需要在内核配置文件中配置下面的选项:

options PNPBIOS

7.2.2. 测试声卡

用修改过的内核重起,或者加载了需要的模块之后, 声卡将会出现在您的系统消息缓存中 (dmesg(8)),就像这样:

pcm0: <Intel ICH3 (82801CA)> port 0xdc80-0xdcbf,0xd800-0xd8ff irq 5 at device 31.5 on pci0
pcm0: [GIANT-LOCKED]
pcm0: <Cirrus Logic CS4205 AC97 Codec>

声卡的状态可以通过 /dev/sndstat 文件来查询:

# cat /dev/sndstat
FreeBSD Audio Driver (newpcm)
Installed devices:
pcm0: <Intel ICH3 (82801CA)> at io 0xd800, 0xdc80 irq 5 bufsz 16384
kld snd_ich (1p/2r/0v channels duplex default)

您系统的输出可能与此不同。如果没有看到 pcm 设备,回顾并检查一下前面做的。 重新检查您的内核配置文件并保证选择了正确的设备。 常见问题列在Section 7.2.2.1一节。

如果一切正常,您现在应该拥有一个多功能声卡了。 如果您的 CD-ROM 或者 DVD-ROM 驱动器适当的与声卡相关联, 您可以把 CD 放入驱动器并用 cdcontrol(1) 来播放:

% cdcontrol -f /dev/acd0 play 1

许多应用程序,比如 audio/workman 可以提供一个友好的界面。 您可能想要安装一个应用程序比如 audio/mpg123 来听 MP3 音频文件。一个快速的测试声卡正在发送数据到 /dev/dsp 的方式,像这样做:

% cat filename > /dev/dsp

这里 filename 可以是任意文件。 这行命令会产生一些噪音,证明声卡果真在工作。

Note: FreeBSD 4.X 用户需要创建声卡设备节点才能使用。 如果在消息缓存中展示出来的卡是 pcm0, 您必须以 root 来运行下面这两行:

# cd /dev
# sh MAKEDEV snd0

如果检测的声卡返回 pcm1, 做上面展示的同样的步骤,只是要用 snd1 来取代 snd0

MAKEDEV 会创建一组设备节点让相关联应用程序的不同声音使用。

声卡混音级别可以通过 mixer(8) 命令更改。 更多细节可以在 mixer(8) 联机手册中找到。

7.2.2.1. 常见问题

错误信息 解决方法
``unsupported subdevice XX''

一个或多个设备节点没有正确地建立。重复上面的步骤。

``sb_dspwr(XX) timed out''

I/O端口没有设置正确。

``bad irq XX''

IRQ设置不正确。确信设定的IRQ和声卡的IRQ是一样的。

``xxx: gus pcm not attached, out of memory''

没有足够的内存空间供设置使用。

``xxx: can't open /dev/dsp!''

使用命令 fstat | grep dsp 进行检查是否有其它的程序打开了设备。 值得注意的是 esoundKDE 提供的声卡支持经常是造成麻烦的祸根。

7.2.3. 利用多个声源

贡献者Munish Chopra.

同时有多个声源的声音在播放, 这是完全可能的, 例如当 esound 或者 artsd 不支持与其它程序共享音频设备时。

FreeBSD可以通过 虚拟声道(Virtual Sound Channels) 来达到, 具体设置用工具 sysctl(8) 来完成。 虚拟的声道可以能过在内核里混合声音来混合声卡里播放的声道。

使用两条sysctl命令来设置虚拟声道的数目。 如果您是 root 用户, 执行下面的操作:

# sysctl hw.snd.pcm0.vchans=4
# sysctl hw.snd.maxautovchans=4

上面的实例设定了4个虚拟声道,这也是实际上所使用的数目。hw.snd.pcm0.vchanspcm0的虚拟声道数,一当链接上一个设备它就可配置了。 hw.snd.maxautovchans是分配给新的音频设备的虚拟声道数, 此时这个设备要用 kldload(8) 来链接。 因为 pcm 模块可以独立装载许多硬件驱动程序, 因此 hw.snd.maxautovchans 也就可以存储分配给以后链接到的设备的虚拟声道数。

如果不使用 devfs(5), 就必须把应用程序指向 /dev/dsp0.x, 这里x 为0到3, 因为在上面的例子里 hw.snd.pcm.0.vchans 被设为了4。 在使用devfs(5)的系统里,上边那些会自动分配给用户。

7.2.4. 如何设置混音器通道值

这一节的作者是 Josef El-Rayes.

不同的混音通道的默认音量是硬编码进 pcm(4) 驱动程序的。 同时,也有很多应用或服务程序提供了允许用户直接设置并记住这些值的功能。 不过这并不是一个很好的解决方案, 您可能希望在驱动一级有一个可以设置的默认值。 这可以通过在 /boot/device.hints 定义适当的值来实现。 例如:

hint.pcm.0.vol="100"

pcm(4) 加载时,这一设置将改变音量通道原本是100的默认值。

Note: 只有 FreeBSD 5.3 和更高版本才支持这一功能。