7.2. 设定声卡

Contributed by Moses Moore.
Enhanced by Marc Fonvieille.

开始设定之前,必须先知道你的声卡型号、芯片为何。FreeBSD支持许多种声卡,请检查支持的音效硬体表Hardware Notes,以确认你的声卡是否支持以及如何在FreeBSD上驱动。

要使用音效装置,必须要加载正确的驱动程序才行。最简单方式就是以kldload(8)来加载内核模块。以下示例示范加载Intel规格内置的音效芯片驱动程序:

# kldload snd_hda

要开机时自动加载驱动程序,需将驱动程序加到/boot/loader.conf档,以此驱动程序为例:

snd_hda_load="YES"

其他可用的声卡模块清单列于/boot/defaults/loader.conf。当不确认要使用何种驱动程序时,可加载snd_driver模块:

# kldload snd_driver

它是metadriver会加载所有最通用的音效驱动程序并且用来加速寻找正确的驱动程序。也可以把metadriver加入/boot/loader.conf档来加载所有音效驱动程序。

要知道加载snd_driver metadriver后使用了那个声卡驱动程序,请输入cat /dev/sndstat

7.2.1. 设定自定义核心支持音效

本节适用于希望将声卡驱动静态编译进内核的用户。有关重新编译内核的详细信息,请参阅第 8 章 配置 FreeBSD 内核

使用自定义内核提供声音支持时,请确保自定义内核配置文件中存在音频框架驱动程序:

device sound

接下来就是加入对我们所用声卡的支持了。假设我们使用的是上节冲提到的 Intel 声卡芯片组,需要在内核编译配置文件中加入下面一行:

device snd_hda

一定要阅读驱动的联机手册了解如何使用它们。 关于内核配置文件中声卡驱动的具体写法, 也可以在 /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

如果声卡使用0x220 I/O 端口和 IRQ 5,则必须将这些行添加到/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"

/boot/device.hints 文件中所使用的语法, 在 sound(4) 联机手册中以及所用的具体声卡驱动的联机手册中, 会进行进一步的讲解。

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

7.2.2. 测试音效

用修改过的内核重起,或者加载了需要的模块之后, 声卡将会出现在您的系统消息缓存中(dmesg(8)),执行 dmesg | grep pcm 确认系统是否检测到声卡。本例使用 Conexant CX20590 芯片组:

pcm0: <NVIDIA (0x001c) (HDMI/DP 8ch)> at nid 5 on hdaa0
pcm1: <NVIDIA (0x001c) (HDMI/DP 8ch)> at nid 6 on hdaa0
pcm2: <Conexant CX20590 (Analog 2.0+HP/2.0)> at nid 31,25 and 35,27 on hdaa1

声卡状态可以使用此命令查询:

# cat /dev/sndstat
FreeBSD Audio Driver (newpcm: 64bit 2009061500/amd64)
Installed devices:
pcm0: <NVIDIA (0x001c) (HDMI/DP 8ch)> (play)
pcm1: <NVIDIA (0x001c) (HDMI/DP 8ch)> (play)
pcm2: <Conexant CX20590 (Analog 2.0+HP/2.0)> (play/rec) default

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

如果一切正常,声卡应该可以用了。如果您的 CD-ROM 或者 DVD-ROM 驱动器的音频输出线已经与声卡连在一起,您可以把 CD 放入驱动器并用 cdcontrol(1) 播放它:

% cdcontrol -f /dev/acd0 play 1

警告:

音频 CD 具有专门的编码,这意味着不应使用mount(8)挂载它们。

许多应用程序,比如 audio/workman 可以提供一个友好的界面。 您可能想要安装一个应用程序比如 audio/mpg123 来听 MP3 音频文件。

另一种快速测试声卡的方法是将数据发送到 /dev/dsp,像这样:

% cat filename > /dev/dsp

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

注意:

设备节点 /dev/dsp* 会在需要的时候自动产生。 如果没有使用它们, 则它们不会出现在 ls(1) 的输出中。

7.2.3. 设置蓝牙音箱

连接到蓝牙设备不在本章的范围之内。更多信息请参考第 31.5 节 “蓝牙”

要让FreeBSD 声音系统与蓝牙音箱一起正常工作,用户需安装audio/virtual_oss

# pkg install virtual_oss

audio/virtual_oss 需要内核加载 cuse 模块:

# kldload cuse

cuse在系统启动时加载,运行此命令:

# sysrc -f /boot/loader.conf cuse_load=yes

要将耳机用作audio/virtual_oss的声音接收器,用户需要在连接到蓝牙音频设备后创建虚拟设备:

# virtual_oss -C 2 -c 2 -r 48000 -b 16 -s 768 -R /dev/null -P /dev/bluetooth/headphones -d dsp

注意:

本例中headphones/etc/bluetooth/hosts的主机名。可以改用BT_ADDR

更多信息请参阅virtual_oss(8)

7.2.4. 疑难解答

表 7.1 “常见错误讯息”列出了一些常见的错误消息及其解决方案:

表 7.1. 常见错误讯息
错误解决方式
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 提供的声卡支持经常是造成麻烦的祸根。


另一个问题是许多新式的显卡本身包含它们自己的声音驱动, 用以配合 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

7.2.5. 使用多个音效来源

Contributed by Munish Chopra.

有时我们希望多个音源能同时播放,FreeBSD 使用虚拟声音信道虚拟声道在内核里混合声音来混合声卡里播放的声道。

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

# sysctl dev.pcm.0.play.vchans=4
# sysctl dev.pcm.0.rec.vchans=4
# sysctl hw.snd.maxautovchans=4

此示例分配四个虚拟通道,平常一般只用这么多。dev.pcm.0.play.vchans=4 and dev.pcm.0.rec.vchans=4 都可以在连接设备后进行调整,并表示 pcm0 用于回放和录制的虚拟通道数。 由于pcm 模块可以独立于硬件驱动程序加载,因此 hw.snd.maxautovchans 表示连接时音频设备将提供多少个虚拟通道。 更多信息请参阅 pcm(4)

注意:

您不能在使用某个设备的时候改变其虚拟通道数。 首先需要关闭所有使用该设备的程序, 如音乐播放器或声音服务。

当应用程序请求 /dev/dsp0 时, 系统会自动为其分配正确的 pcm 设备。

7.2.6. 设定混音器频道的预设值

Contributed by Josef El-Rayes.

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

hint.pcm.0.vol="50"

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

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

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.