在开始之前,您应该清楚声卡类型、所用的芯片以及它是 PCI 还是 ISA 卡。 FreeBSD 支持种类繁多的 PCI 和 ISA 卡。检查 硬件兼容说明 中支持的音频设备列表看看是否支持您的声卡, 硬件兼容说明也会说明支持您声卡的是哪个驱动程序。
要使用声卡, 就应装载正确的驱动程序。完成的方式有两种: 最简单的是使用命令 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
文件。
另外,您也可以把支持您声卡的代码静态地编译到内核里去。 下一节就采用这种方式支持硬件给出提示。 关于重新编译内核,请参考 第 9 章 配置FreeBSD的内核。
要做的第一件事情就是添加通用音频框架驱动 sound(4) 到内核中, 您需要添加下面这行到内核配置文件中:
device sound
接下来就是加入对我们所用声卡的支持了。 首先需要确定我们的声卡需要使用哪一个驱动。 您可以参考 硬件兼容列表 所列出的音频设备, 以确定您声卡的驱动。 例如, Creative SoundBlaster® Live! 声卡由 snd_emu10k1(4) 驱动来支持。 要添加它, 需要在内核编译配置文件中加入下面一行:
device snd_emu10k1
一定要阅读驱动的联机手册了解如何使用它们。
关于内核配置文件中声卡驱动的具体写法, 也可以在
/usr/src/sys/conf/NOTES
文件中找到。
非即插即用的 ISA 卡可能需要您为内核提供一些关于声卡配置的信息
(IRQ、 I/O 端口, 等等), 这一点与其他不支持即插即用的 ISA 卡类似。 这项工作可以通过
/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
文件中所使用的语法, 在
sound(4) 联机手册中以及所用的具体声卡驱动的联机手册中,
会进行进一步的讲解。
上面所展示的是默认的配置。 有时候, 您可能需要更改 IRQ 或其他配置, 以适应声卡的实际情况。 查看 snd_sbc(4) 联机手册了解更多信息。
用修改过的内核重起,或者加载了需要的模块之后, 声卡将会出现在您的系统消息缓存中 (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
设备,回顾并检查一下前面做的。
重新检查您的内核配置文件并保证选择了正确的设备。
常见问题列在 第 8.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
可以是任意文件。
这行命令会产生一些噪音,证明声卡果真在工作。
设备节点 /dev/dsp*
会在需要的时候自动产生。
如果没有使用它们, 则它们不会出现在
ls(1) 的输出中。
声卡混音级别可以通过 mixer(8) 命令更改。 更多细节可以在 mixer(8) 联机手册中找到。
错误信息 | 解决方法 |
---|---|
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! | 使用命令 |
另一个问题是许多新式的显卡本身包含它们自己的声音驱动,
用以配合 HDMI 这样的设备使用。
这个声音设备有时会在真正的声卡之前被探测到,
从而成为默认的回放设备, 而使真正的声卡无法发声。
要检查这种情况, 运行
dmesg 并观察 pcm
。
其输出类似下面这样:
... hdac0: HDA Driver Revision: 20100226_0142 hdac1: HDA Driver Revision: 20100226_0142 hdac0: HDA Codec #0: NVidia (Unknown) hdac0: HDA Codec #1: NVidia (Unknown) hdac0: HDA Codec #2: NVidia (Unknown) hdac0: HDA Codec #3: NVidia (Unknown) pcm0: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 0 nid 1 on hdac0 pcm1: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 1 nid 1 on hdac0 pcm2: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 2 nid 1 on hdac0 pcm3: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 3 nid 1 on hdac0 hdac1: HDA Codec #2: Realtek ALC889 pcm4: <HDA Realtek ALC889 PCM #0 Analog> at cad 2 nid 1 on hdac1 pcm5: <HDA Realtek ALC889 PCM #1 Analog> at cad 2 nid 1 on hdac1 pcm6: <HDA Realtek ALC889 PCM #2 Digital> at cad 2 nid 1 on hdac1 pcm7: <HDA Realtek ALC889 PCM #3 Digital> at cad 2 nid 1 on hdac1 ...
此处显卡 (NVidia
) 先于真正的声卡
(Realtek ALC889
) 被探测到。
要使用声卡作为默认的回放设备, 将
hw.snd.default_unit
改为对应的设备编号:
#
sysctl hw.snd.default_unit=n
这里的 n
是希望使用的声音设备编号,
在这个例子中是 4
。 您可以在
/etc/sysctl.conf
中写上这个配置来令其永久性生效:
hw.snd.default_unit=4
通常而言, 会希望多个音源能够同时播放, 例如, esound 或者 artsd 就可能不支持与其它程序共享音频设备。
FreeBSD 可以通过 虚拟声道(Virtual Sound Channels) 来达到这样的效果, 它可以用 sysctl(8) 来启用。 虚拟的声道可以能过在内核里混合声音来混合声卡里播放的声道。
使用三条sysctl命令来设置虚拟声道的数目。 如果您是
root
用户, 执行下面的操作:
#
sysctl dev.pcm.0.play.vchans=4
#
sysctl dev.pcm.0.rec.vchans=4
#
sysctl hw.snd.maxautovchans=4
上面的实例设定了4个虚拟声道,这也是实际上所使用的数目。
dev.pcm.0.play.vchans=4
和
dev.pcm.0.rec.vchans=4
是 pcm0
用来播放与录音的虚拟声道数,
一当链接上一个设备它就可配置了。
hw.snd.maxautovchans
是分配给新的音频设备的虚拟声道数,
此时这个设备要用 kldload(8) 来链接。 因为 pcm
模块可以独立装载许多硬件驱动程序, 因此 hw.snd.maxautovchans
也就可以存储分配给以后链接到的设备的虚拟声道数。
可参阅 pcm(4) 手册页义获取更多细节。
您不能在使用某个设备的时候改变其虚拟通道数。 首先需要关闭所有使用该设备的程序, 如音乐播放器或声音服务。
当应用程序请求 /dev/dsp0
时, 系统会自动为其分配正确的 pcm
设备。
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<[email protected]>.
关于本文档的问题请发信联系
<[email protected]>.