UNIX wasn't designed with sound cards in mind, and only a few applications make use of one (DOOM being the most popular). Linux also lets you load a special driver to make use of the PC speaker for more than the occasional beep, useful when you don't have a proper sound card. However, sound cards are a common accessory in PCs, especially those designed for multimedia applications. Making your sound card work under Linux is not difficult, as long as you know the manufacturer and model of your sound card. Software device drivers for the most common models are included with most Linux distribution software packages, and some other drivers are available from FTP and BBS sites. This chapter looks at how you can install the device drivers for your sound card and make sure they work properly under Linux.
Linux doesn't support many DOS sound file formats (such as .WAV and .MID), but relies instead on sound files and commands that are taken from the Sun workstation product line. Sun audio files are the general format for Linux, usually with the .au filetype appended. You can play other sound files, although some may need conversion to Sun format first. Sun workstation device drivers are used as the model for the sound card drivers in Linux, although the drivers are designed to work with standard PC sound cards.
A Linux system can support two sound cards, although most installations will involve only one card. The two cards must be different and cannot have any of the same configuration information (both must have different I/O addresses, IRQs, and DMAs). If you have a separate dedicated card for a MIDI interface, you may want to use two cards. For example, you may have a PC equipped with a Sound Blaster card for the usual game effects and a Roland MIDI card for professional sounding audio. Linux can support both types of devices at the same time. You can't use two cards that both support Sound Blaster, even as emulations, as the drivers will conflict unless you disable one card.
The drivers and software associated with the device drivers for sound cards changes frequently, so check for the latest versions and examine any documentation that accompanies them. It may supersede the information in this chapter. Many versions of Linux now include automated installation scripts for sound cards or support the mkdev sound command. Check for the installation scripts before installing the sound card manually.
The list of sound cards supported by Linux includes most of the popular models, and many others emulate one of these supported models and so can be run in emulation mode without a problem. The most popular supported models of sound cards are the following:
A complete list of supported sound boards is usually supplied with the Linux distribution software. Because the location of the files describing the sound support varies considerably, search for any files to do with sound using the find command. You can do this search easily with a CD-ROM distribution package. Mount the CD-ROM (see Chapter 9, "CD-ROM Drives," for more information) and issue a find command with the string sound as a starting point:
find / -name sound* -print
This search should at last point you to the directories that contain information about the sound boards, drivers, and C source code for the drivers. The sound drivers for the CD-ROM version of Linux included with this book, for example, are stored in /usr/src/linux-1.2.8/drivers/sound. Figure 10.1 shows the output from a find command run against this version of Linux. In this example, the find command reports matches in the DOS filesystem, too, because that is mounted as /dos. You may want to unmount your CD-ROM drive before issuing this command to save time.If you can't search your distribution media, or don't have a complete Linux distribution handy, check the README files that were supplied with your software for potential locations of drivers.
You can search for the sound card drivers by issuing a find command.
Once you have determined that your model of sound card is supported, you can begin the process of making it available to Linux. Install the sound card, if necessary. This procedure usually involves nothing more complex than placing the card in an available slot on the motherboard. Because Linux uses its own device drivers, installing the DOS-based software has no effect on the card under Linux.
When you install the sound card, note the basic configuration information, such as the card's DMA, IRQ, and I/O address. Some cards have more configuration information, including 8-bit and 16-bit DMAs, MIDI addresses, and so on. Most sound cards use the default values without a problem, so you can check the card's documentation for these values. If you had to change some of the default settings to make the card work under DOS, have the changed values readily available for the Linux device configuration.
Later versions of Linux include sound card drivers for the most common cards as part of the basic driver package. In some cases, the setup or installation script includes a sound card configuration section. This script installs the proper drivers and relinks the kernel automatically. If your setup or install script handles the sound card setup for you, there is little else you need to do except reboot the system and test the sound card.
The sound card drivers are stored in different locations, depending on the Linux distribution. A good general location to look for drivers is the directory /usr/src/linux/drivers/sound, although the names tend to change somewhat. A quick method of finding the drivers is to search for the sound directory using the command
find / -name sound -print
If your Linux software is supplied on CD-ROM, you will want to search the CD-ROM as well as the hard disk filesystem because few installation routines copy all the drivers to the hard drive. The Slackware distribution CD-ROM, for example, keeps the sound drivers on the CD-ROM until they are explicitly installed. The Slackware release keeps the drivers in the directory /cdrom/live/usr/src/linux-1.2.8/drivers/sound (the version number changes with each release of Slackware Linux).
Linux uses a number of device files in association with a sound card. Each device driver is in the /dev directory by convention (although it can, in theory, be anywhere). Linux supports up to two different sound cards, so two device driver files are possible for each type of driver.
The system administrator can change the device driver files and their purposes, but the administrator should retain the basic names for ease of integration with applications that require specific device names. The sound card device drivers are the following:
The PC speaker devices (/dev/pcaudio, /dev/pcsp, and /dev/pcmixer) are only used when the PC speaker device driver is loaded into the kernel.
Before you link in the sound card drivers, you must isolate the proper files that the compiler uses to form the device driver that is linked into the kernel. These files are usually supplied as part of the distribution software, or you can obtain them from the FTP or BBS sites. You may be able to skip the compilation step if you can find a precompiled device driver.
Each sound card has several source code files, usually with the .c extension, that take care of various aspects of the sound card support. These files include the device's initialization file and the drivers for the mixer, sequencer, MIDI interface, and so on. As a bare minimum, you need the file that initializes the card. This file is usually named after the sound card itself, such as sb_card.c for the Sound Blaster card or gus_card.c for the Gravis UltraSound card. In addition to the .c files, there are essential matching .h files for each component. You also need the files soundcard.c, soundcard.h, and audio.c (only for later versions of Linux), which are the driver skeletons to which the specific sound card details are linked.
An important component of the sound card device driver is the soundinstall script that constructs the drivers. This script may be supplied as a specific file, or it may be attached to the end of a documentation file. Slackware releases, for example, include a file called Readme.Linux in the sound directory that has the script appended to the end of the file. This script must be cut out and run by itself. The soundinstall script checks for the existence of a current device file, removes it if it exists, and then uses mknod to create a new device file. Of course, you also can perform these steps manually.
To compile the sound card drivers, follow a sequence of steps that places the required files in particular locations (as defined in the compilation script or Makefile), and then invoke the compilation process. The procedure is as follows:
The soundinstall script uses the mknod command to create the device drivers in the /dev directory. If you want to perform the steps manually, these basic mknod commands are required:
mknod -m 666 /dev/mixer c 14 0 mknod -m 666 /dev/sequencer c 14 1 mknod -m 666 /dev/patmgr0 c 14 17 mknod -m 666 /dev/midi00 c 14 2 mknod -m 666 /dev/dsp c 14 3 mknod -m 666 /dev/audio c 14 4 mknod -m 666 /dev/sndstat c 14 6
Some of these commands aren't needed if your sound card doesn't support the functions (such as a MIDI interface or sequencer). The preceding steps are for the first sound card. If you are installing two sound cards, you have to repeat the commands with the second device names. The soundinstall script handles this step automatically.
When the installation process is running, either from an installation script like setup or install or from a compilation of the sound card drivers, you are asked for a number of configuration parameters. These parameters are used to generate a file called local.h that defines the sound card configuration information. You are prompted for the type of sound card, IRQ, DMA, and I/O address, as well as other information pertaining to each type of driver.
If you don't get asked for this kind of information, you must edit the local.h file (if it exists) manually. A file called sound_config.h contains generic configuration information. You can edit this file to complete any configuration parameters that are not prompted for by the configuration routine. Most of the sections of the sound_config.h file are clearly labeled as to their purpose.
The installation procedure should end with the Linux kernel rebuilding, relinking, and then setting the new kernel as the boot image so that the drivers are active when you start Linux. Without this step, none of the changes you made will be effective.
After the kernel has been rebuilt with the sound card drivers embedded, reboot the machine to test the sound card. Watch the startup messages carefully to see the initialization messages. If you miss the messages, you can recall them with the command
which shows all the kernel's startup messages on-screen again.
If the sound card drivers were properly installed in the kernel, Linux tries to contact the sound card and initialize it. In the startup messages, you see a line similar to
snd1 <SoundBlaster Pro> at 0x220 irq 5 drq 1
which, in this case, shows that the driver for a Sound Blaster Pro card (or compatible) was loaded with the I/O address set to 220H, an IRQ of 5, and a DMA of 1. If the sound card had values for any of these parameters that were different from the ones shown, the card initialization would probably fail.
If you are booting Linux for the first time after installing new drivers, some diagnostic, warning, or extra error messages may be displayed. These messages may not be repeated every time you reboot, just the first time. For this reason, you should use the dmesg command to check for these messages after relinking and rebooting the kernel with the sound card driver.
Assuming the drivers are linked properly, the device drivers initialize the card and the Linux registers that use it. All you need to do now is test the sound card with an application that tries to access the card. Any sound file will do. A few samples are usually included with the sound card drivers, or you can obtain sound files from FTP or BBS sites or possibly the Linux distribution disks.
To test the sound card, use the cat command to send the test file to the sound device. For example, if you have a sound file called parrot_sketch.au (many sound files have .au as their extension, although this is far from a convention) and your sound card is called /dev/audio, you can send the file to the sound card with the command
cat parrot_sketch.au > /dev/audio
If you don't hear anything from the sound card (and you have headphones or speakers connected with the volume set properly), the drivers are not communicating with the card properly. (Or your sound file is not properly formatted, in which case a prudent test is to use another sound file to confirm that the problem is the configuration.) Try the steps outlined in the Troubleshooting section later in this chapter. If you hear your sound file played properly, all is well and you have completed your sound card's installation.
If your sound card is capable of recording, and you have linked in a driver that supports recording from the sound card's microphone (or other input), you can test the recording capability of the sound card by recording a few seconds of audio and storing it in a file. The easiest way to do this procedure is to use the command
dd bs=8k count=10 < /dev/audio > test_mic.au
This command records 10 seconds from the input of /dev/audio and stores it in the file test_mic.au. You can then play this sound file back to check the fidelity of the recording with the command
cat test_mic.au > /dev/audio
If you heard whatever sounds you recorded, the input sampling of the sound card is working properly. If you heard silence or got an error message, either the sound card driver doesn't support recording or the settings are incorrect.
Don't have a sound card in your system, or you do have one but it is not supported and you don't want to hassle with drivers? Use the PC speaker instead. The quality of sound from a PC internal speaker is a lot more limited than a sound card, but it isbetter than no sound at all.
The Linux drivers for the PC speaker are usually located in an archive file with the name pcsndrv followed by the version number, such as pcsndrv-0.6.tar.z. You can search your filesystem or distribution media for a file with this name using the command
find / -name pcsndrv* -print
Many Linux software distributions do not include the PC speaker sound drivers, but they are available from almost all FTP and BBS sites. For example, the latest PC speaker sound drivers are located in the directory /pub/Linux/kernel/misc-patches at the sunsite.unc.edu FTP site. Check for the most recent release of the drivers.
Installing the PC speaker sound driver is a matter of linking the device driver into the kernel, and then rebuilding the kernel. The documentation that accompanies the device driver explains the process in detail.
A few Linux applications use sound, and the number is increasing almost daily. This section describes sample applications for each type of sound card function. These applications are generally supplied with Linux distributions. For a complete list of all applications that support music, check the Linux documentation or local download sites. The USENET newsgroups also are helpful for finding the most useful applications for particular purposes.
If you have properly installed the sound card, yet don't hear anything when you try to test it (or get error messages during initialization), it's time to follow a few simple diagnostic and troubleshooting procedures. Follow these steps in the order they're presented to try and isolate the problem.
Check the initialization messages from the kernel. When the machine reboots with the kernel that has the sound drivers linked in, you should see some initialization messages similar to
snd1 <Sound_Card_Name> at 0x330 irq 1 drq 1
where the sound card's name and configuration parameters are shown. Verify the sound card parameters! Incorrect prarmeters are the most common cause of sound card failure, as many users assume default values when the values have been changed. Sometimes the default values are used on the sound card but are incorrectly entered in the configuration information.
If no lines in the bootup messages refer to the sound card driver, then the driver is inactive or not linked to the current boot kernel. Make sure you linked the drivers to the current boot kernel. Some Linux systems don't display any boot messages if the configuration information is correct, and others generate a message telling you the information is correct.
Use the sound card's manual to determine the default settings and compare them to the board. Physically remove the sound board and examine the jumpers, DIPs, or whatever method is used for setting the configuration. Some boards use software configuration, so you should boot your machine in DOS and use the diagnostics supplied with the card to examine and set the board. Write down all the settings, and then check the device driver configuration file to ensure that they match.
A good method of checking settings is to run a DOS application that uses the sound board. If the settings work in DOS, they will work in Linux. However, if a DOS application can't access the sound card properly, that indicates a configuration problem (or the sound card is defective). If the settings are incorrect, re-enter them into the device driver configuration information, recompile and relink the kernel, and then reboot the machine and test the sound card again.
The file /dev/sndstat should contain some basic information about the sound card and its initialization. Not all versions of Linux provide this file, so don't be too surprised if it doesn't exist. In this case, skip this step. If the /dev/sndstat file does exist, the contents should show the name of the configured card and its parameters, as well as any additional installed devices. For example, a file may contain the following lines:
Sound Driver 3.1 HW config: Type 1: SoundBlaster Pro at 0x220 irq 5 drq 1 PCM devices: 0: SoundBlaster Pro 3.2 Synth devices: 0: Yamaha OPL-3 Midi devices: 0: SoundBlaster Mixer(s) installed
This sample file shows the drivers and components that are installed for a typical Sound Blaster Pro card. Additional messages may appear for other drivers or for error conditions. Check the file for anything of use, and verify the configuration parameters with your sound card documentation.
If you can't find the /dev/sndstat file or it is empty, either your Linux version doesn't support that file or the sound card was not recognized during boot. Usually the HW config section is filled in even if the sound card was not found.
If the sound card seems to load but then you can't test it, or you get the error message
No such file or directory
when the sound card tries to initialize or you run an application that uses the sound card, the problem is the device driver files. Typically, these problems mean that the device driver files do not exist or the files are not in the proper location.
Check to ensure the device driver files are linked into the kernel and are in the /dev directory. Check the section "Understanding Sound Card Device Files" earlier in this chapter for a list of the sound card device driver files you should have. If the device driver files exist, check that the major and minor device numbers do not conflict with any other active device.
If you get the error message
No such device
when an application tries to use the sound card, it means the device driver wasn't loaded in the kernel boot process. Check to make sure you did relink the kernel and you have booted the system using the new image.
If you get the message
when an application is running and trying to communicate with the sound card, it means that more than one process is using the sound card at the same time. Linux allows only one process to access the sound card device at a time. You can determine which processes are using the sound card using the fuser command. For example, if the problem is with the /dev/audio device file, issue the command
fuser -v /dev/audio
and examine the output to see which processes are currently using the device. Repeat the command for the /dev/dsp device if the /dev/audio device has no conflict.
If the device busy error message persists, it is likely a DMA error. Make sure you are not using DMA 0 for the sound card. Some sound cards allow this DMA channel to be chosen, but Linux uses DMA 0 as a special refresh channel for DRAM. Change to DMA channel, reconfigure the kernel, relink, rebuild, reboot, and then test again.
If you only hear a small section of a sound file and then the playing abruptly stops, or you get an error message after a file has started to play, the problem is probably an incorrect IRQ or DMA setting. You may see messages that tell you the IRQ or DMA has timed out.
To correct this problem, check the DMA and IRQ values on the sound card and in the configuration files. If the values match, check for a conflict with other devices in your PC. Odds are that the IRQ or DMA is shared with another device (network cards are a common culprit). Change the settings on whichever card is the easiest. (If you already have a network up and running, change the sound card if it will let you.)
Sounds stop and start when playing because the sound card, computer, or hard disk can't keep up with each other. The simplest method of solving this problem is to choose a lower sampling rate or switch to mono. Alternatively, if your system is running many processes (as it will with some games), try eliminating applications you don't need. X applications that run on the desktop are good at gobbling up huge chunks of processor time. Freeing up enough CPU time to support the sound card will help. For a longer-term solution, consider either upgrading your computer to a faster processor or getting a sound card with more capabilities, including on-board RAM.
The sound card is a useful peripheral when it's properly supported by a Linux application. It is also one of the most frustrating devices to get working properly. If you can use an automated installation utility instead of trying to manually build the drivers, do so. They will save you a lot of grief!
A growing number of applications support sound cards, especially games and X applications, so when you have your sound card properly configured and tested, keep your eye out for them. They make using Linux a lot more interesting.