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 工具来加载所有的声卡驱动。

  如果希望在加载了 snd_driver meta 驱动之后了解到底选择了哪种声卡, 可以通过使用 cat /dev/sndstat 来查询 /dev/sndstat 文件。

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

7.2.1.1 定制内核使其支持声卡

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

device sound

  接下来就是加入对我们所用声卡的支持了。 首先需要确定我们的声卡需要使用哪一个驱动。 您可以参考 硬件兼容列表 所列出的音频设备, 以确定您声卡的驱动。 例如, Creative SoundBlaster Live! 声卡由 snd_emu10k1(4) 驱动来支持。 要添加它, 需要在内核编译配置文件中加入下面一行:

device snd_emu10k1

  一定要阅读驱动的联机手册了解如何使用它们。 关于内核配置文件中声卡驱动的写法, 也可以在 /usr/src/sys/conf/NOTES 文件。

  非即插即用的 ISA 卡可能需要您为内核提供一些关于声卡配置的信息 (IRQ、 I/O 端口, 等等)。 这项工作可以通过 /boot/device.hints 文件来完成。 系统启动时, loader(8) 将读取这个文件, 并将其中的配置传给内核。 例如, 旧式的 Creative SoundBlaster 16 ISA 非即插即用卡需要使用 snd_sbc(4) 驱动并配合 snd_sb16(4)。 您可以在内核编译配置文件中增加如下配置:

device snd_sbc
device snd_sb16

  还有下面这些到 /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 上, 这些配置只能直接写进内核配置文件中。

  上面所展示的是默认的配置。 有时候, 您可能需要更改 IRQ 或其他配置, 以适应声卡的实际情况。 查看 snd_sbc(4) 联机手册了解更多信息。

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 设备,回顾并检查一下前面做的。 重新检查您的内核配置文件并保证选择了正确的设备。 常见问题列在第 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 可以是任意文件。 这行命令会产生一些噪音,证明声卡果真在工作。

  声卡混音级别可以通过 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 进行检查是否有其它的程序打开了设备。 值得注意的是 esound 和 KDE 提供的声卡支持经常是造成麻烦的祸根。

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.vchans 是pcm0的虚拟声道数,一当链接上一个设备它就可配置了。 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.

注意: 只有 FreeBSD 5.3-RELEASE 和更新的版本中才支持这一功能。

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

hint.pcm.0.vol="100"

  这将在 pcm(4) 模块加载时, 将通道音量设置为默认的 100。

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<[email protected]>.
关于本文档的问题请发信联系 <[email protected]>.