The low level drivers abstract the hardware specific features from the rest of the multimedia code. Those are implemented with a well defined set of APIs, as windows do.
Please note that native low level drivers are not currently supported in Wine, because they either access hardware components or require VxDs to be loaded; Wine does not correctly supports those two so far.
There are two specific low level drivers (msacm.drv for wave input/output, midimap.drv for MIDI output only). These drivers (also present in Windows) allow:
choosing one low level driver between many (we'll discuss how the choice is made later on)
add the possibility to convert stream's format (ie ADPCM => PCM) (this is useful if the format required by the application for playback isn't supported by the soundcard).
add the possibility to filter a stream (adding echo, equalizer... to a wave stream, or modify the instruments that have to be played for a MIDI stream).
Each low lever driver has to implement at least one of the following functionality, through the named function:
Waveform audio: out for playback, and in for
recording. MMSYSTEM and WINMM call the real low level
audio driver using the driver's
wodMessage and
widMessage functions which handle
the different requests.
MIDI (Musical Instrument Digital Interface): out for
playback, and in for recording. MMSYSTEM and WINMM
call the low level driver functions using the driver's
midMessage and the
modMessage functions.
Mixer: this allows setting the volume for each one of the other functionnality (and also some specific attributes, like left/right balance for stereo >