A sound driver implements RageSoundDriver, and must implement:

 void StartMixing(RageSound *snd);
 void StopMixing(RageSound *snd);
 int GetPosition(const RageSound *snd) const;

A sound driver may implement, if needed:

 void Update(float)

Details:

When a sound is playing, call RageSound::GetPCM(buf, size, pos) to get data.
"buf" will receive signed, 16-bit stereo PCM data.  "pos" must be the position
at which this sound will be played, in samples relative to GetPosition().
(That is, when GetPosition() == pos, the first sample is being heard.)
GetPCM returns the number of bytes placed in buf.

If GetPCM returns less than size, it has no more data.  When this happens, 
1. Do not call GetPCM again unless StartMixing() is called again. (It's
   done; it has no more to say.)
2. When all data has been flushed from the sound buffer (eg. all sound
   has been heard), call Sound->StopPlaying().  (This tells the sound that
   it's *really* stopped, and can be reused.)

Notes:

If StopMixing(snd) is called, do *not* call snd->StopPlaying.  It's already
stopped.  Only call snd->StopPlaying when the sound is stopped by a small
GetPCM return value.

If there's latency between StartMixing(snd) being called and the sound
actually being heard, GetPosition can return time less than "pos".  For
example, if the first GetPCM call has a pos of 1000, and it'll take time
before any sound is actually heard, GetPosition may return values
less than 1000 if it's called before the sound is heard.  (RageSound will
cope with this.)

Likewise, GetPosition may return values that havn't actually been queued
in underrun conditions.  For example, if the last GetPCM call had a pos
of 1000, and returned 100 samples (so it returned samples 1000 through
1100), GetPosition may return values greater than 1100 in underrun
conditions.

A global lock on the sound system can be acquired:

	LockMut(SOUNDMAN->lock);

The simplest sound driver is WaveOut; use it as an example.
