Before beginning the configuration, determine the model of the sound card and the chip it uses. FreeBSD supports a wide variety of sound cards. Check the supported audio devices list of the Hardware Notes to see if the card is supported and which FreeBSD driver it uses.
In order to use the sound device, the proper device driver must be loaded. This may be accomplished in one of two ways. The easiest way is to load a kernel module for the sound card with kldload(8). This example loads the driver for a Creative SoundBlaster® Live! sound card:
#
kldload snd_emu10k1
To automate the loading of this driver at boot time, add the
driver to /boot/loader.conf
. The line for
this driver is:
Other available sound modules are listed in
/boot/defaults/loader.conf
. When unsure
which driver to use, load the snd_driver
module:
#
kldload snd_driver
This is a metadriver which loads all of the most common
sound drivers and can be used to speed up the search for the
correct driver. It is also possible to load all sound drivers
by adding the metadriver to
/boot/loader.conf
.
To determine which driver was selected for the sound card
after loading the snd_driver
metadriver,
type cat /dev/sndstat
.
Users who prefer to statically compile in support for the sound card in a custom kernel should refer to the instructions in the next section. For more information about recompiling a kernel, refer to Chapter 9, Configuring the FreeBSD Kernel.
When using a custom kernel to provide sound support, make sure that the audio framework driver exists in the custom kernel configuration file:
Next, add support for the sound card. Therefore, you need to know which driver supports the card. To continue the example of the Creative SoundBlaster® Live! sound card from the previous section, use the following line in the custom kernel configuration file:
Be sure to read the manual page of the driver for the
syntax to use. The explicit syntax for the kernel
configuration of every supported sound driver can also be
found in /usr/src/sys/conf/NOTES
.
Non-PnP ISA sound cards may require the IRQ and I/O port
settings of the card to be added to
/boot/device.hints
. During the boot
process, loader(8) reads this file and passes the
settings to the kernel. For example, an old Creative
SoundBlaster® 16 ISA non-PnP card will use the
snd_sbc(4) driver in conjunction with
snd_sb16
. For this card, the following
lines must be added to the kernel configuration file:
If the card uses the 0x220
I/O port and
IRQ 5
, these lines must also be added to
/boot/device.hints
:
In this case, the card uses the 0x220
I/O port and the IRQ 5
.
The syntax used in
/boot/device.hints
is described in
sound(4) and the manual page for the driver of the sound
card.
The settings shown above are the defaults. In some cases, the IRQ or other settings may need to be changed to match the card. Refer to snd_sbc(4) for more information about this card.
After rebooting into the custom kernel, or after loading the required module, the sound card should appear in the system message buffer. Run dmesg(8) and look for a message like:
The status of the sound card may also be checked using this command:
#
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)The output may vary between systems. If no
pcm
devices are listed, go back and
review the kernel configuration file and make sure the correct
device driver was chosen. Common problems are listed in Section 8.2.2.1, “Common Problems”.
If all goes well, the sound card should now work in os;. If the CD-ROM or DVD-ROM drive's audio-out pins are properly connected to the sound card, one can insert an audio CD in the drive and play it with cdcontrol(1):
%
cdcontrol -f /dev/acd0 play 1
Various applications, such as audio/workman
provide a friendlier
interface. The audio/mpg123
port can be installed to listen to MP3 audio files.
Another quick way to test the card is to send data to
/dev/dsp
:
%
cat filename
> /dev/dsp
where
can
be any file. This command should produce some noise, confirming
that the sound card is actually working.filename
The /dev/dsp*
device nodes will
be created automatically as needed. When not in use, they
do not exist and will not appear in the output of
ls(1).
Sound card mixer levels can be changed using mixer(8). More details can be found in mixer(8).
Error | Solution |
---|---|
sb_dspwr(XX) timed out | The I/O port is not set correctly. |
bad irq XX | The IRQ is set incorrectly. Make sure that the set IRQ and the sound IRQ are the same. |
xxx: gus pcm not attached, out of memory | There is not enough available memory to use the device. |
xxx: can't open /dev/dsp! | Check with |
Another issue is that modern graphics cards often come
with their own sound driver, for use with
HDMI and similar. This sound device will
sometimes be enumerated before the sound card and the sound
card will subsequently not be used as the default playback
device. To check if this is the case, run
dmesg and look for
pcm
. The output looks something like
this:
Here the graphics card (NVidia
) has
been enumerated before the sound card (Realtek
ALC889
). To use the sound card as the default
playback device, change hw.snd.default_unit
to the unit that should be used for playback:
#
sysctl hw.snd.default_unit=n
Here, n
is the number of the sound
device to use. In this example, it should be
4
. Make this change permanent by adding
the following line to
/etc/sysctl.conf
:
4
It is often desirable to have multiple sources of sound that are able to play simultaneously. FreeBSD uses Virtual Sound Channels, which can be enabled using sysctl(8). Virtual channels allow one to multiplex the sound card's playback by mixing sound in the kernel.
To set the number of virtual channels, three sysctl(8) knobs are available:
#
sysctl dev.pcm.0.play.vchans=4
#
sysctl dev.pcm.0.rec.vchans=4
#
sysctl hw.snd.maxautovchans=4
The above example allocates four virtual channels, which
is a practical number for everyday use. Both
dev.pcm.0.play.vchans=4
and
dev.pcm.0.rec.vchans=4
are the number of
virtual channels pcm0
has for playback
and recording, and are configurable after a device has been
attached. hw.snd.maxautovchans
is the number
of virtual channels a new audio device is given when it is
attached using kldload(8). Since the
pcm
module can be loaded independently
of the hardware drivers, hw.snd.maxautovchans
indicates how many virtual channels will be given to devices
when they are attached. Refer to pcm(4) for more
information.
The number of virtual channels for a device cannot be changed while it is in use. First, close any programs using the device, such as music players or sound daemons.
The correct pcm
device will
automatically be allocated transparently to a program that
requests /dev/dsp0
.
The default values for the different mixer channels are
hardcoded in the source code of the pcm(4) driver. There
are many different applications and daemons that allow values to
be set for the mixer that are remembered between invocations,
but this is not a clean solution. It is possible to set default
mixer values at the driver level. This is accomplished by
defining the appropriate values in
/boot/device.hints
, as seen in this
example:
This will set the volume channel to a default value of
50
when the pcm(4) module is
loaded.
All FreeBSD documents are available for download at http://ftp.FreeBSD.org/pub/FreeBSD/doc/
Questions that are not answered by the
documentation may be
sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.