vwsnd - Sound driver for the Silicon Graphics 320 and 540 Visual
Workstations' onboard audio.

Copyright 1999 Silicon Graphics, Inc.  All rights reserved.


At the time of this writing, March 1999, there are two models of
Visual Workstation, the 320 and the 540.  This document only describes
those models.  Future Visual Workstation models may have different
sound capabilities, and this driver will probably not work on those
boxes.

The Visual Workstation has an Analog Devices AD1843 "SoundComm" audio
codec chip.  The AD1843 is accessed through the Cobalt I/O ASIC, also
known as Lithium.  This driver programs both both chips.

==============================================================================
QUICK CONFIGURATION

	# insmod soundcore
	# insmod vwsnd

==============================================================================
I/O CONNECTIONS

On the Visual Workstation, only three of the AD1843 inputs are hooked
up.  The analog line in jacks are connected to the AD1843's AUX1
input.  The CD audio lines are connected to the AD1843's AUX2 input.
The microphone jack is connected to the AD1843's MIC input.  The mic
jack is mono, but the signal is delivered to both the left and right
MIC inputs.  You can record in stereo from the mic input, but you will
get the same signal on both channels (within the limits of A/D
accuracy).  Full scale on the Line input is +/- 2.0 V.  Full scale on
the MIC input is 20 dB less, or +/- 0.2 V.

The AD1843's LOUT1 outputs are connected to the Line Out jacks.  The
AD1843's HPOUT outputs are connected to the speaker/headphone jack.
LOUT2 is not connected.  Line out's maximum level is +/- 2.0 V peak to
peak.  The speaker/headphone out's maximum is +/- 4.0 V peak to peak.

The AD1843's PCM input channel and one of its output channels (DAC1)
are connected to Lithium.  The other output channel (DAC2) is not
connected.

==============================================================================
CAPABILITIES

The AD1843 has PCM input and output (Pulse Code Modulation, also known
as wavetable).  PCM input and output can be mono or stereo in any of
four formats.  The formats are 16 bit signed and 8 bit unsigned,
u-Law, and A-Law format.  Any sample rate from 4 KHz to 49 KHz is
available, in 1 Hz increments.

The AD1843 includes an analog mixer that can mix all three input
signals (line, mic and CD) into the analog outputs.  The mixer has a
separate gain control and mute switch for each input.

There are two outputs, line out and speaker/headphone out.  They
always produce the same signal, and the speaker always has 3 dB more
gain than the line out.  The speaker/headphone output can be muted,
but this driver does not export that function.

The hardware can sync audio to the video clock, but this driver does
not have a way to specify syncing to video.

==============================================================================
PROGRAMMING

This section explains the API supported by the driver.  Also see the
Open Sound Programming Guide at http://www.opensound.com/pguide/ .
This section assumes familiarity with that document.

The driver has two interfaces, an I/O interface and a mixer interface.
There is no MIDI or sequencer capability.

==============================================================================
PROGRAMMING PCM I/O

The I/O interface is usually accessed as /dev/audio or /dev/dsp.
Using the standard Open Sound System (OSS) ioctl calls, the sample
rate, number of channels, and sample format may be set within the
limitations described above.  The driver supports triggering.  It also
supports getting the input and output pointers with one-sample
accuracy.

The SNDCTL_DSP_GETCAP ioctl returns these capabilities.

	DSP_CAP_DUPLEX - driver supports full duplex.

	DSP_CAP_TRIGGER - driver supports triggering.

	DSP_CAP_REALTIME - values returned by SNDCTL_DSP_GETIPTR
	and SNDCTL_DSP_GETOPTR are accurate to a few samples.

Memory mapping (mmap) is not implemented.

The driver permits subdivided fragment sizes from 64 to 4096 bytes.
The number of fragments can be anything from 3 fragments to however
many fragments fit into 124 kilobytes.  It is up to the user to
determine how few/small fragments can be used without introducing
glitches with a given workload.  Linux is not realtime, so we can't
promise anything.  (sigh...)

When this driver is switched into or out of mu-Law or A-Law mode on
output, it may produce an audible click.  This is unavoidable.  To
prevent clicking, use signed 16-bit mode instead, and convert from
mu-Law or A-Law format in software.

==============================================================================
PROGRAMMING THE MIXER INTERFACE

The mixer interface is usually accessed as /dev/mixer.  It is accessed
through ioctls.  The mixer allows the application to control gain or
mute several audio signal paths, and also allows selection of the
recording source.

Each of the constants described here can be read using the
MIXER_READ(SOUND_MIXER_xxx) ioctl.  Those that are not read-only can
also be written using the MIXER_WRITE(SOUND_MIXER_xxx) ioctl.  In most
cases, <sys/soundcard.h> defines constants SOUND_MIXER_READ_xxx and
SOUND_MIXER_WRITE_xxx which work just as well.

SOUND_MIXER_CAPS	Read-only

This is a mask of optional driver capabilities that are implemented.
This driver's only capability is SOUND_CAP_EXCL_INPUT, which means
that only one recording source can be active at a time.

SOUND_MIXER_DEVMASK	Read-only

This is a mask of the sound channels.  This driver's channels are PCM,
LINE, MIC, CD, and RECLEV.

SOUND_MIXER_STEREODEVS	Read-only

This is a mask of which sound channels are capable of stereo.  All
channels are capable of stereo.  (But see caveat on MIC input in I/O
CONNECTIONS section above).

SOUND_MIXER_OUTMASK	Read-only

This is a mask of channels that route inputs through to outputs.
Those are LINE, MIC, and CD.

SOUND_MIXER_RECMASK	Read-only

This is a mask of channels that can be recording sources.  Those are
PCM, LINE, MIC, CD.

SOUND_MIXER_PCM		Default: 0x5757 (0 dB)

This is the gain control for PCM output.  The left and right channel
gain are controlled independently.  This gain control has 64 levels,
which range from -82.5 dB to +12.0 dB in 1.5 dB steps.  Those 64
levels are mapped onto 100 levels at the ioctl, see below.

SOUND_MIXER_LINE	Default: 0x4a4a (0 dB)

This is the gain control for mixing the Line In source into the
outputs.  The left and right channel gain are controlled
independently.  This gain control has 32 levels, which range from
-34.5 dB to +12.0 dB in 1.5 dB steps.  Those 32 levels are mapped onto
100 levels at the ioctl, see below.

SOUND_MIXER_MIC		Default: 0x4a4a (0 dB)

This is the gain control for mixing the MIC source into the outputs.
The left and right channel gain are controlled independently.  This
gain control has 32 levels, which range from -34.5 dB to +12.0 dB in
1.5 dB steps.  Those 32 levels are mapped onto 100 levels at the
ioctl, see below.

SOUND_MIXER_CD		Default: 0x4a4a (0 dB)

This is the gain control for mixing the CD audio source into the
outputs.  The left and right channel gain are controlled
independently.  This gain control has 32 levels, which range from
-34.5 dB to +12.0 dB in 1.5 dB steps.  Those 32 levels are mapped onto
100 levels at the ioctl, see below.

SOUND_MIXER_RECLEV	 Default: 0 (0 dB)

This is the gain control for PCM input (RECording LEVel).  The left
and right channel gain are controlled independently.  This gain
control has 16 levels, which range from 0 dB to +22.5 dB in 1.5 dB
steps.  Those 16 levels are mapped onto 100 levels at the ioctl, see
below.

SOUND_MIXER_RECSRC	 Default: SOUND_MASK_LINE

This is a mask of currently selected PCM input sources (RECording
SouRCes).  Because the AD1843 can only have a single recording source
at a time, only one bit at a time can be set in this mask.  The
allowable values are SOUND_MASK_PCM, SOUND_MASK_LINE, SOUND_MASK_MIC,
or SOUND_MASK_CD.  Selecting SOUND_MASK_PCM sets up internal
resampling which is useful for loopback testing and for hardware
sample rate conversion.  But software sample rate conversion is
probably faster, so I don't know how useful that is.

SOUND_MIXER_OUTSRC	DEFAULT: SOUND_MASK_LINE|SOUND_MASK_MIC|SOUND_MASK_CD

This is a mask of sources that are currently passed through to the
outputs.  Those sources whose bits are not set are muted.

==============================================================================
GAIN CONTROL

There are five gain controls listed above.  Each has 16, 32, or 64
steps.  Each control has 1.5 dB of gain per step.  Each control is
stereo.

The OSS defines the argument to a channel gain ioctl as having two
components, left and right, each of which ranges from 0 to 100.  The
two components are packed into the same word, with the left side gain
in the least significant byte, and the right side gain in the second
least significant byte.  In C, we would say this.

	#include <assert.h>

	...

	 	assert(leftgain >= 0 && leftgain <= 100);
		assert(rightgain >= 0 && rightgain <= 100);
		arg = leftgain | rightgain << 8;

So each OSS gain control has 101 steps.  But the hardware has 16, 32,
or 64 steps.  The hardware steps are spread across the 101 OSS steps
nearly evenly.  The conversion formulas are like this, given N equals
16, 32, or 64.

	int round = N/2 - 1;
	OSS_gain_steps = (hw_gain_steps * 100 + round) / (N - 1);
	hw_gain_steps = (OSS_gain_steps * (N - 1) + round) / 100;

Here is a snippet of C code that will return the left and right gain
of any channel in dB.  Pass it one of the predefined gain_desc_t
structures to access any of the five channels' gains.

	typedef struct gain_desc {
		float min_gain;
		float gain_step;
		int nbits;
		int chan;
	} gain_desc_t;

	const gain_desc_t gain_pcm    = { -82.5, 1.5, 6, SOUND_MIXER_PCM    };
	const gain_desc_t gain_line   = { -34.5, 1.5, 5, SOUND_MIXER_LINE   };
	const gain_desc_t gain_mic    = { -34.5, 1.5, 5, SOUND_MIXER_MIC    };
	const gain_desc_t gain_cd     = { -34.5, 1.5, 5, SOUND_MIXER_CD     };
	const gain_desc_t gain_reclev = {   0.0, 1.5, 4, SOUND_MIXER_RECLEV };

	int get_gain_dB(int fd, const gain_desc_t *gp,
			float *left, float *right)
	{
		int word;
		int lg, rg;
		int mask = (1 << gp->nbits) - 1;

		if (ioctl(fd, MIXER_READ(gp->chan), &word) != 0)
			return -1;	/* fail */
		lg = word & 0xFF;
		rg = word >> 8 & 0xFF;
		lg = (lg * mask + mask / 2) / 100;
		rg = (rg * mask + mask / 2) / 100;
		*left = gp->min_gain + gp->gain_step * lg;
		*right = gp->min_gain + gp->gain_step * rg;
		return 0;
	}	

And here is the corresponding routine to set a channel's gain in dB.

	int set_gain_dB(int fd, const gain_desc_t *gp, float left, float right)
	{
		float max_gain =
			gp->min_gain + (1 << gp->nbits) * gp->gain_step;
		float round = gp->gain_step / 2;
		int mask = (1 << gp->nbits) - 1;
		int word;
		int lg, rg;

		if (left < gp->min_gain || right < gp->min_gain)
			return EINVAL;
		lg = (left - gp->min_gain + round) / gp->gain_step;
		rg = (right - gp->min_gain + round) / gp->gain_step;
		if (lg >= (1 << gp->nbits) || rg >= (1 << gp->nbits))
			return EINVAL;
		lg = (100 * lg + mask / 2) / mask;
		rg = (100 * rg + mask / 2) / mask;
		word = lg | rg << 8;

		return ioctl(fd, MIXER_WRITE(gp->chan), &word);
	}

