Introduction	Notes on Modular Sound Drivers and Soundcore
Wade Hampton 
2/14/2001

Purpose:  
========
This document provides some general notes on the modular 
sound drivers and their configuration, along with the 
support modules sound.o and soundcore.o.

Note, some of this probably should be added to the Sound-HOWTO!

Note, soundlow.o was present with 2.2 kernels but is not 
required for 2.4.x kernels.  References have been removed
to this.


Copying:
========
none


History:
========
0.1.0  11/20/1998  First version, draft
1.0.0  11/1998     Alan Cox changes, incorporation in 2.2.0
                   as Documentation/sound/oss/Introduction
1.1.0  6/30/1999   Second version, added notes on making the drivers,
                   added info on multiple sound cards of similar types,]
                   added more diagnostics info, added info about esd.
                   added info on OSS and ALSA.
1.1.1  19991031	   Added notes on sound-slot- and sound-service.
			(Alan Cox)
1.1.2  20000920    Modified for Kernel 2.4 (Christoph Hellwig)
1.1.3  20010214    Minor notes and corrections (Wade Hampton)
                   Added examples of sound-slot-0, etc.


Modular Sound Drivers:
======================

Thanks to the GREAT work by Alan Cox (alan@lxorguk.ukuu.org.uk),

[And Oleg Drokin, Thomas Sailer, Andrew Veliath and more than a few 
 others - not to mention Hannu's original code being designed well
 enough to cope with that kind of chopping up](Alan)

the standard Linux kernels support a modular sound driver.  From
Alan's comments in linux/drivers/sound/README.FIRST:

  The modular sound driver patches were funded by Red Hat Software 
  (www.redhat.com). The sound driver here is thus a modified version of 
  Hannu's code. Please bear that in mind when considering the appropriate
  forums for bug reporting.

The modular sound drivers may be loaded via insmod or modprobe.  
To support all the various sound modules, there are two general 
support modules that must be loaded first:
 
   soundcore.o:   Top level handler for the sound system, provides
                  a set of functions for registration of devices
                  by type.

   sound.o:       Common sound functions required by all modules.

For the specific sound modules (e.g., sb.o for the Soundblaster), 
read the documentation on that module to determine what options
are available, for example IRQ, address, DMA.

Warning, the options for different cards sometime use different names 
for the same or a similar feature (dma1= versus dma16=).  As a last 
resort, inspect the code (search for module_param).

Notes:

1.  There is a new OpenSource sound driver called ALSA which is
    currently under development:  http://www.alsa-project.org/
    The ALSA drivers support some newer hardware that may not 
    be supported by this sound driver and also provide some 
    additional features.

2.  The commercial OSS driver may be obtained from the site:
    http://www.opensound.com.  This may be used for cards that
    are unsupported by the kernel driver, or may be used
    by other operating systems.  

3.  The enlightenment sound daemon may be used for playing
    multiple sounds at the same time via a single card, eliminating
    some of the requirements for multiple sound card systems.  For
    more information, see:  http://www.tux.org/~ricdude/EsounD.html  
    The "esd" program may be used with the real-player and mpeg 
    players like mpg123 and x11amp.  The newer real-player 
    and some games even include built-in support for ESD!


Building the Modules:
=====================

This document does not provide full details on building the 
kernel, etc.  The notes below apply only to making the kernel
sound modules.   If this conflicts with the kernel's README,
the README takes precedence. 

1.  To make the kernel sound modules, cd to your /usr/src/linux
    directory (typically) and type make config, make menuconfig, 
    or make xconfig (to start the command line, dialog, or x-based
    configuration tool).  

2.  Select the Sound option and a dialog will be displayed.  

3.  Select M (module) for "Sound card support".

4.  Select your sound driver(s) as a module.  For ProAudio, Sound
    Blaster, etc., select M (module) for OSS sound modules.
    [thanks to Marvin Stodolsky <stodolsk@erols.com>]A

5.  Make the kernel (e.g., make bzImage), and install the kernel.

6.  Make the modules and install them (make modules; make modules_install).

Note, for 2.5.x kernels, make sure you have the newer module-init-tools 
installed or modules will not be loaded properly.  2.5.x requires an
updated module-init-tools.


Plug and Play (PnP:
===================

If the sound card is an ISA PnP card, isapnp may be used
to configure the card.  See the file isapnp.txt in the 
directory one level up (e.g., /usr/src/linux/Documentation).

Also the 2.4.x kernels provide PnP capabilities, see the 
file NEWS in this directory.

PCI sound cards are highly recommended, as they are far 
easier to configure and from what I have read, they use
less resources and are more CPU efficient.


INSMOD:
=======

If loading via insmod, the common modules must be loaded in the 
order below BEFORE loading the other sound modules.  The card-specific
modules may then be loaded (most require parameters).  For example,
I use the following via a shell script to load my SoundBlaster:

SB_BASE=0x240
SB_IRQ=9
SB_DMA=3
SB_DMA2=5
SB_MPU=0x300
#
echo Starting sound
/sbin/insmod soundcore
/sbin/insmod sound  
#
echo Starting sound blaster....
/sbin/insmod uart401
/sbin/insmod sb io=$SB_BASE irq=$SB_IRQ dma=$SB_DMA dma16=$SB_DMA2 mpu_io=$SB_MP

When using sound as a module, I typically put these commands
in a file such as /root/soundon.sh.


MODPROBE:
=========

If loading via modprobe, these common files are automatically loaded 
when requested by modprobe.  For example, my /etc/modprobe.conf contains:

alias sound sb 
options sb io=0x240 irq=9 dma=3 dma16=5 mpu_io=0x300

All you need to do to load the module is:

	/sbin/modprobe sb


Sound Status:
=============

The status of sound may be read/checked by:
        cat (anyfile).au >/dev/audio

[WWH:  This may not work properly for SoundBlaster PCI 128 cards
such as the es1370/1 (see the es1370/1 files in this directory) 
as they do not automatically support uLaw on /dev/audio.]

The status of the modules and which modules depend on 
which other modules may be checked by:
	/sbin/lsmod

/sbin/lsmod should show something like the following:
	sb                     26280   0 
	uart401                 5640   0  [sb]
	sound                  57112   0  [sb uart401]
	soundcore               1968   8  [sb sound]


Removing Sound: 
=============== 

Sound may be removed by using /sbin/rmmod in the reverse order
in which you load the modules.  Note, if a program has a sound device
open (e.g., xmixer), that module (and the modules on which it 
depends) may not be unloaded.

For example, I use the following to remove my Soundblaster (rmmod
in the reverse order in which I loaded the modules):

/sbin/rmmod sb
/sbin/rmmod uart401
/sbin/rmmod sound
/sbin/rmmod soundcore

When using sound as a module, I typically put these commands
in a script such as /root/soundoff.sh.


Removing Sound for use with OSS: 
================================ 

If you get really stuck or have a card that the kernel modules
will not support, you can get a commercial sound driver from
http://www.opensound.com.  Before loading the commercial sound
driver, you should do the following:

1.  remove sound modules (detailed above)
2.  remove the sound modules from /etc/modprobe.conf
3.  move the sound modules from /lib/modules/<kernel>/misc
    (for example, I make a /lib/modules/<kernel>/misc/tmp
    directory and copy the sound module files to that 
    directory).


Multiple Sound Cards:
=====================

The sound drivers will support multiple sound cards and there
are some great applications like multitrack that support them.  
Typically, you need two sound cards of different types.  Note, this
uses more precious interrupts and DMA channels and sometimes 
can be a configuration nightmare.  I have heard reports of 3-4
sound cards (typically I only use 2).  You can sometimes use
multiple PCI sound cards of the same type.

On my machine I have two sound cards (cs4232 and Soundblaster Vibra
16).  By loading sound as modules, I can control which is the first
sound device (/dev/dsp, /dev/audio, /dev/mixer) and which is 
the second.  Normally, the cs4232 (Dell sound on the motherboard) 
would be the first sound device, but I prefer the Soundblaster.  
All you have to do is to load the one you want as /dev/dsp 
first (in my case "sb") and then load the other one
(in my case "cs4232").

If you have two cards of the same type that are jumpered 
cards or different PnP revisions, you may load the same 
module twice.  For example, I have a SoundBlaster vibra 16
and an older SoundBlaster 16 (jumpers).  To load the module
twice, you need to do the following:

1.  Copy the sound modules to a new name.  For example
    sb.o could be copied (or symlinked) to sb1.o for the
    second SoundBlaster.

2.  Make a second entry in /etc/modprobe.conf, for example,
    sound1 or sb1.  This second entry should refer to the
    new module names for example sb1, and should include
    the I/O, etc. for the second sound card.

3.  Update your soundon.sh script, etc.

Warning:  I have never been able to get two PnP sound cards of the
same type to load at the same time.  I have tried this several times
with the Soundblaster Vibra 16 cards.  OSS has indicated that this
is a PnP problem....  If anyone has any luck doing this, please 
send me an E-MAIL.  PCI sound cards should not have this problem.a
Since this was originally release, I have received a couple of 
mails from people who have accomplished this!

NOTE: In Linux 2.4 the Sound Blaster driver (and only this one yet)
supports multiple cards with one module by default.
Read the file 'Soundblaster' in this directory for details.


Sound Problems:
===============

First RTFM (including the troubleshooting section 
in the Sound-HOWTO). 

1)  If you are having problems loading the modules (for
    example, if you get device conflict errors) try the
    following:

  A)  If you have Win95 or NT on the same computer,  
      write down what addresses, IRQ, and DMA channels
      those were using for the same hardware.  You probably 
      can use these addresses, IRQs, and DMA channels.
      You should really do this BEFORE attempting to get
      sound working!
  
  B)  Check (cat) /proc/interrupts, /proc/ioports,
      and /proc/dma.  Are you trying to use an address,
      IRQ or DMA port that another device is using?
  
  C)  Check (cat) /proc/isapnp
  
  D)  Inspect your /var/log/messages file.  Often that will 
      indicate what IRQ or IO port could not be obtained.
  
  E)  Try another port or IRQ.  Note this may involve 
      using the PnP tools to move the sound card to 
      another location.  Sometimes this is the only way 
      and it is more or less trial and error.

2)  If you get motor-boating (the same sound or part of a 
    sound clip repeated), you probably have either an IRQ
    or DMA conflict.  Move the card to another IRQ or DMA
    port.  This has happened to me when playing long files 
    when I had an IRQ conflict.

3.  If you get dropouts or pauses when playing high sample
    rate files such as using mpg123 or x11amp/xmms, you may 
    have too slow of a CPU and may have to use the options to 
    play the files at 1/2 speed.  For example, you may use
    the -2 or -4 option on mpg123.  You may also get this
    when trying to play mpeg files stored on a CD-ROM
    (my Toshiba T8000 PII/366 sometimes has this problem).

4.  If you get "cannot access device" errors, your /dev/dsp
    files, etc. may be set to owner root, mode 600.  You 
    may have to use the command:
      chmod 666 /dev/dsp /dev/mixer /dev/audio

5.  If you get "device busy" errors, another program has the
    sound device open.  For example, if using the Enlightenment
    sound daemon "esd", the "esd" program has the sound device.
    If using "esd", please RTFM the docs on ESD.  For example,
    esddsp <program> may be used to play files via a non-esd
    aware program.

6)  Ask for help on the sound list or send E-MAIL to the
    sound driver author/maintainer.

7)  Turn on debug in drivers/sound/sound_config.h (DEB, DDB, MDB).

8)  If the system reports insufficient DMA memory then you may want to
    load sound with the "dmabufs=1" option. Or in /etc/conf.modules add
	
	preinstall sound dmabufs=1

    This makes the sound system allocate its buffers and hang onto them.

    You may also set persistent DMA when building a 2.4.x kernel.


Configuring Sound:
==================

There are several ways of configuring your sound:

1)  On the kernel command line (when using the sound driver(s)
    compiled in the kernel). Check the driver source and
    documentation for details.

2)  On the command line when using insmod or in a bash script
    using command line calls to load sound.

3)  In /etc/modprobe.conf when using modprobe.

4)  Via Red Hat's GPL'd /usr/sbin/sndconfig program (text based).

5)  Via the OSS soundconf program (with the commercial version
    of the OSS driver.

6)  By just loading the module and let isapnp do everything relevant
    for you. This works only with a few drivers yet and - of course -
    only with isapnp hardware.

And I am sure, several other ways.  

Anyone want to write a linuxconf module for configuring sound?


Module Loading:
===============

When a sound card is first referenced and sound is modular, the sound system
will ask for the sound devices to be loaded. Initially it requests that
the driver for the sound system is loaded. It then will ask for 
sound-slot-0, where 0 is the first sound card. (sound-slot-1 the second and
so on). Thus you can do

alias sound-slot-0 sb

To load a soundblaster at this point. If the slot loading does not provide
the desired device - for example a soundblaster does not directly provide
a midi synth in all cases then it will request "sound-service-0-n" where n
is

  0	Mixer

  2  	MIDI

  3, 4	DSP audio


For example, I use the following to load my Soundblaster PCI 128
(ES 1371) card first, followed by my SoundBlaster Vibra 16 card,
then by my TV card:

# Load the Soundblaster PCI 128 as /dev/dsp, /dev/dsp1, /dev/mixer
alias sound-slot-0 es1371

# Load the Soundblaster Vibra 16 as /dev/dsp2, /dev/mixer1
alias sound-slot-1 sb
options sb io=0x240 irq=5 dma=1 dma16=5 mpu_io=0x330

# Load the BTTV (TV card) as /dev/mixer2
alias sound-slot-2 bttv
alias sound-service-2-0 tvmixer

pre-install bttv  modprobe tuner ; modprobe tvmixer
pre-install tvmixer modprobe msp3400; modprobe tvaudio 
options tuner debug=0 type=8 
options bttv  card=0 radio=0 pll=0


For More Information (RTFM):
============================
1)  Information on kernel modules: manual pages for insmod and modprobe.

2)  Information on PnP, RTFM manual pages for isapnp.

3)  Sound-HOWTO and Sound-Playing-HOWTO.

4)  OSS's WWW site at http://www.opensound.com.

5)  All the files in Documentation/sound.

6)  The comments and code in linux/drivers/sound.

7)  The sndconfig and rhsound documentation from Red Hat.

8)  The Linux-sound mailing list:  sound-list@redhat.com.

9)  Enlightenment documentation (for info on esd)
    http://www.tux.org/~ricdude/EsounD.html.

10) ALSA home page:  http://www.alsa-project.org/


Contact Information:
====================
Wade Hampton:  (whampton@staffnet.com)

