Updated to reflect current status.

diff --git a/documentation/status/multimedia b/documentation/status/multimedia
index a30741c..0174d3e 100644
--- a/documentation/status/multimedia
+++ b/documentation/status/multimedia
@@ -1,179 +1,185 @@
-This file contains information about the implementation of the multimedia
-layer of WINE.
+This file contains information about the implementation of the
+multimedia layer of WINE.
 
-The libraries consist of MMSYSTEM.DLL (win16), WINMM.DLL (win32) and some
-(abstracted, not Windows compatible) lowlevel drivers. The implementation
-can be found in the multimedia/ subdirectory.
+The libraries consist of MMSYSTEM.DLL (win16), WINMM.DLL (win32) and
+some (abstracted, not Windows compatible) lowlevel drivers. The
+implementation can be found in the multimedia/ subdirectory.
 
-The multimedia stuff is split into 3 layers. The lowlevel (device drivers),
-midlevel (MCI commands) and highlevel abstraction layers.
+The multimedia stuff is split into 3 layers. The lowlevel (device
+drivers), midlevel (MCI commands) and highlevel abstraction layers.
 
-The lowlevel may depend on current hardware and OS services (like OSS). 
-Mid-level and high-level must be written independantly from the hardware and OS
-services.
+The lowlevel may depend on current hardware and OS services (like
+OSS). Mid-level and high-level must be written independantly from the
+hardware and OS services.
 
 1. Lowlevel layers
+==================
+
+   Please note that native low-level drivers are not currently
+   supported in WINE, because they either access hardware composants
+   or require VxDs to be loaded; WINE does not correctly supports
+   those two so far. 
 
    Following lowlevel layers are implemented:
 
 1.1 (Waveform) Audio
+--------------------
 
-   The API consists of the waveIn*/waveOut* functions found in
-   multimedia/mmsystem.c. They call the real lowlevel audiodriver using
-   the wodMessage/widMessage function in multimedia/audio.c, which handles
-   the different requests.
+   MMSYSTEM and WINMM call the real lowlevel audiodriver using
+   the wodMessage/widMessage function in multimedia/audio.c, which
+   handles the different requests.
 
-   The lowlevel audio driver is currently only implemented for the
-   OpenSoundSystem (OSS) as supplied in the Linux and FreeBSD kernels by
-   4Front Technologies (http://www.4front-tech.com/). The presence of this
-   driver is checked by configure (depends on the <sys/soundcard.h> file).
+1.1.1 OSS implementation
 
-   The implementation contains all features commonly used, but has several
-   problems. For instance:
-      Writes are not done asynchronously as they are supposed to be done.
-   This breaks some programs (soundrec.exe from the Windows applets),
-   but doesn't worry other programs. 
+   The lowlevel audio driver is currently only implemented for the 
+   OpenSoundSystem (OSS) as supplied in the Linux and FreeBSD kernels
+   by 4Front Technologies (http://www.4front-tech.com/). The presence
+   of this driver is checked by configure (depends on the
+   <sys/soundcard.h> file). 
+
+   The implementation contains all features commonly used, but has
+   several problems (see TODO list).
 
    TODO:
-   	- add asynchronous writes (must use threads)
+   	- add asynchronous reads (must use threads) as done for writes
 	- verify all functions for correctness
-	- add drivers for other soundsystems (Sun Audio, remote audio systems
-	  (using X extensions, ...), ALSA
-	- WaveHdr must be sent though mmsystem.c to get the linear address
-	  set correctly. An application calling directly (wod|wid)Message
-	  will fail
+	- add drivers for other soundsystems (Sun Audio, remote audio
+          systems (using X extensions, ...), ALSA
+	- WaveHdr must be sent though mmsystem.c to get the linear
+          address set correctly. An application calling directly
+          (wod|wid)Message will fail
 
-1.2 Mixer
+1.1.2 Wave mapper
+ 
+   The Wave mapper device allows to load on-demand codecs to perform
+   software conversion for the types the actual low level driver
+   (hardware) does not support. Those codecs are provided thru the
+   standard ACM drivers. 
 
-   The API consists of the mixer* functions found in multimedia/mmsystem.c.
-   They call the lowlevel driver functions in multimedia/mixer.c using the
-   mixMessage function.
+   Wave mapper driver implementation has not started. Core DLL for ACM
+   support can be found in dlls/msacm
 
-   The current implementation tries to use the OpenSoundSystem mixer, but is
-   missing nearly everything. There is no report of a working application.
-   
    TODO:
-   	- implement mixing functionality for OSS correctly.
-	- implement mixing lowlevel drivers for other mixers.
+	- implement wave mapper
+	- don't forget to fix builtin ms acm drivers loading which has 
+          been disabled.
 
-1.3 MIDI
+1.2 MIDI
+--------
+
+   MMSYSTEM and WINMM call the lowlevel driver functions in
+   multimedia/midi.c using the midMessage and the modMessage
+   functions. 
+
+1.2.1 OSS driver
 	
-   The API consists of the midi* functions found in multimedia/mmsystem.c.
-   They call the lowlevel driver functions in multimedia/midi.c using the
-   midMessage and the modMessage functions.
-
-   The lowlevel audio driver is currently only implemented for the
-   OpenSoundSystem (OSS) as supplied in the Linux and FreeBSD kernels by
-   4Front Technologies (http://www.4front-tech.com/). The presence of this
-   driver is checked by configure (depends on the <sys/soundcard.h> file).
-   Both Midi in and Midi out are provided. The type of MIDI devices supported
-   is external MIDI port (requires an MIDI capable device - keyboard...) and
-   OPL/2 synthesis (the OPL/2 patches for all instruments are in midiPatch.c).
+   The lowlevel audio driver is currently only implemented for the 
+   OpenSoundSystem (OSS) as supplied in the Linux and FreeBSD kernels
+   by 4Front Technologies (http://www.4front-tech.com/). The presence
+   of this driver is checked by configure (depends on the
+   <sys/soundcard.h> file, and also some specfic defines because MIDI
+   is not supported on all OSes by OSS).
+   Both Midi in and Midi out are provided. The type of MIDI devices
+   supported is external MIDI port (requires an MIDI capable device -
+   keyboard...) and OPL/2 synthesis (the OPL/2 patches for all
+   instruments are in midiPatch.c). 
 
    TODO:
 	- Do not implement a software synthesizer. This should be done
-	  using MIDI loopback devices in an external program (like timidity).
-	  the only trouble is that timidity is GPL'ed...
+	  using MIDI loopback devices in an external program (like
+          timidity). The only trouble is that timidity is GPL'ed...
         - use better instrument definition for OPL/2 (midiPatch.c) or
           use existing instrument definition (from playmidi or kmid)
           with a .winerc option
         - have a look at OPL/3 ?
-	- MidiHdr must be sent though mmsystem.c to get the linear address
-	  set correctly. An application calling directly (wod|wid)Message
-	  will fail
-	- implement asynchronous playback of MidiHdr 
+	- MidiHdr must be sent though mmsystem.c to get the linear
+          address set correctly. An application calling directly
+          (wod|wid)Message will fail
+	- implement asynchronous playback of MidiHdr (regular and/or
+          stream) 
+	- use a more accurate read mechanism than the one of snooping
+          on timers
 
-1.4 Timers
+1.2.2 MIDI mapper
 
-   The API consists of the timer* functions found in multimedia/timer.c. 
-   There is currently only one implementation, which uses normal windows timers.
-   The implementation works for most cases found. The only problem is that
-   it doesn't support asynchronous timer events (as it is supposed to do).
-
-   There is a workaround for this lack in timeGetTime() to make Diablo work
-   and 'Pinball! SpaceCadet' at least start up.
+   Midi mapper allows to map each one of 16 MIDI channels to a
+   specific instrument on an installed sound card. This allows for
+   example to support different MIDI instrument definition (XM,
+   GM...). It also permits to output on a per channel basis to
+   different MIDI renderers. 
 
    TODO:
-   	- Implemented asynchronous timers (using the service thread)
+	- implement the Midi mapper
 
-1.5 MMIO
+1.3 Mixer
+---------
+
+   MMSYSTEM and WINMM call the lowlevel driver functions in
+   multimedia/mixer.c using the mixMessage function.
+
+1.3.1 OSS implementation
+
+   The current implementation uses the OpenSoundSystem mixer.
    
-   The API consists of the mmio* functions found in multimedia/mmio.c.
-
-   FIXME: I am not sure about the status of this implementation.
-
    TODO:
-   	- add win32 support.
-	- ...
+   	- implement mixing mute functionality for OSS.
+	- implement mixing lowlevel drivers for other mixers (ALSA...)
+	- implement notification mechanism when state of mixer's
+          controls change
+	- handlers used for mixer are currently poorly implemented
 
-1.6 AUX
+1.4 AUX
+-------
    
-   The API consists of the aux* functions found in multimedia/mmsystem.c.
-   They call auxMessage in multimedia/mmaux.c.
+   The API consists of the aux* functions found in
+   multimedia/mmsystem.c. They call auxMessage in multimedia/mmaux.c.
 
    The aux* functions are the predecessor of the mixer* functions.
 
+1.4.1 OSS driver
+
    The implementation uses the OSS mixer API, and is incomplete.
 
    TODO:
    	- verify the implementation
+	- check with what is done in mixer
+	- open question: shall we implement it on top of the low level 
+	  mixer functions ?
 
 1.7 JOYSTICK
+------------
    
-   The API consists of the joy* functions found in multimedia/joystick.c.
-   The implementation currently uses the Linux joystick device driver API.
-   It is lacking support for enhanced joysticks and has not been extensively
-   tested.
+   The API consists of the joy* functions found in
+   multimedia/joystick.c. The implementation currently uses the Linux
+   joystick device driver API. It is lacking support for enhanced
+   joysticks and has not been extensively tested.
 
    TODO:
    	- better support of enhanced joysticks
 	- support more joystick drivers (like the XInput extension)
 
 2. Midlevel drivers (MCI)
+=========================
    
    The midlevel drivers are represented by some common API functions, 
-   mostly mciSendCommand and mciSendString. The mciSendString function
-   uses commandstrings, which are translated into normal MCI commands as
-   used by mciSendCommand. The API can be found in multimedia/mmsystem.c
-   and multimedia/mcistring.c.
-   The functions there (mciOpen,mciSysInfo) handle midlevel driver
-   allocation and calls.
+   mostly mciSendCommand and mciSendString.
+   See status in chapter 3 for more information.
 
-   The implementation is not complete.
- 
-   MCI drivers are seen as regular WINE modules, and can be loaded 
-   (with a correct loadorder between builtin, native, elfdll, so), as
-   any other DLL. Please note, that MCI drivers module names must
-   bear the .drv extension to be correctly understood.
+   WINE implements several MCI midlevel drivers (status is given for 
+   both builtin and native implementation):
 
-   The list of available MCI drivers is obtained as follows:
-	1/ key 'mci' in [option] section from .winerc (or wineconf)
-		mci=CDAUDIO:SEQUENCER
-	  gives the list of MCI drivers (names, in uppercase only) to
-	  be used in WINE.
-	2/ This list, when defined, supercedes the mci
-	  key in c:\windows\system.ini
-
-   TODO:
-	- support windows MCI drivers (should be possible for they usually 
-	  do not use lowlevel calls)
-	- MCI command loading support
-	- better implement non waiting command (without the MCI_WAIT flag). 
-	  First shot is present in midi.c but requires much more work (and
-	  will impact sndPlaySound() as well which shall be written as
-	  as set of MCI commands).
-	- implement other stuff as yet unknown
-	- in mciString(), make use of hiword from mciSendMessage
-          return value to convert value into string...
-	- move mci drivers as regular DLLs (loading in wine, elfglue...)
-
-   WINE implements several MCI midlevel drivers:
+   TODO: (apply to all builtin MCI drivers)
+	- move mci drivers as regular DLLs (loading in wine,
+          elfglue...) 
 
 2.1 CDAUDIO
+-----------
    
+2.1.1 Builtin
+
    The currently best implementation is the MCI CDAUDIO driver that can
-   be found in multimedia/mcicda.c. The implementation is mostly complete,
-   there have been no reports of errors.
+   be found in multimedia/mcicda.c. The implementation is mostly
+   complete, there have been no reports of errors.
 
    It makes use of misc/cdrom.c Wine internal cdrom interface. This
    interface has been ported on Linux, FreeBSD and NetBSD.
@@ -182,55 +188,171 @@
    A very small example of a cdplayer consists just of the line
    mciSendString("play cdaudio",NULL,0,0);
 
-   Native MCICDA is starting to output sounds... It uses the mscdex
-   traps (on int 2f).
+2.1.2 Native
+
+   Native MCICDA works also correctly... It uses the mscdex traps (on
+   int 2f). 
 
    TODO:
-   	- add support for other cdaudio drivers
+   	- add support for other cdaudio drivers (Solaris...)
 
 2.2 MCIWAVE
+-----------
    
+2.2.1 Builtin
+
    The implementation is rather complete and can be found in 
    multimedia/audio.c.
-   It uses the lowlevel audio API (although not abstracted correctly).
-   FIXME: The MCI_STATUS command is broken.
+   It uses the lowlevel audio API (although not abstracted
+   correctly). 
+
+   FIXME: 
+	- The MCI_STATUS command is broken.
 
    TODO: 
 	- check for correctness
 	- better use of asynchronous playback from low level
+	- record has to be checked
+	- MCI_CUE command is broken
+	- better implement non waiting command (without the MCI_WAIT
+          flag). 
    
-   Native MCIWAVE has been working but is currently blocked by
-   scheduling issues.
+2.2.2 Native
 
-2.3 MIDI/SEQUENCER
+   Native MCIWAVE works also correctly.
+
+2.3 MCISEQ (MIDI sequencer)
+---------------------------
    
-   The implementation can be found in multimedia/midi.c. Except from the
-   Record command, should be close to completion (except for non blocking
-   commands).
+2.3.1 Builtin
+
+   The implementation can be found in multimedia/midi.c. Except from
+   the Record command, should be close to completion (except for non
+   blocking commands).
 
    TODO: 
    	- implement it correctly
-	- finish asynchronous commands
+	- finish asynchronous commands (especially for reading/record) 
+	- better implement non waiting command (without the MCI_WAIT
+          flag). 
+
+2.3.2 Native
 
    Native MCIMIDI has been working but is currently blocked by
-   scheduling issues.
+   scheduling issues (mmTaskXXX no longer work). 
 
 2.4 MCIANIM
+-----------
 
-   The implementation consists of stubs and is in multimedia/mcianim.c.
+2.4.1 Builtin
+
+   The implementation consists of stubs and is in
+   multimedia/mcianim.c. 
 
    TODO: 
-   	- implement it, probably using xanim or something similair. Could
-	  also be implemented by using the Windows MCI video drivers.
+   	- implement it, probably using xanim or something similair.
+
+2.4.2 Native
+
+   Native MCIANIM is reported to work (but requires native video DLLs 
+   also).
 
 2.5 MCIAVI
+----------
+
+2.5.1 Builtin
 
    The implementation consists of stubs and is in multimedia/mciavi.c.
 
    TODO: 
-   	- implement it, probably using xanim or something similair. Could
-	  also be implemented by using the Windows MCI video drivers.
+   	- implement it, probably using xanim or something similair.
+
+2.5.2 Native
+
+   Native MCIAVI is reported to work (but requires native video DLLs
+   also). Some files exhibit some deadlock issues anyway.
 
 3 High-level layers
+===================
 
    The rest (basically the MMSYSTEM and WINMM DLLs entry points).
+   It also provides the skeletton for the core functionnalites for 
+   multimedia rendering.
+
+   Note that native mmsystem and WINMM do not currently under WINE
+   and there is no plan to support them (it would require to also
+   fully support VxD, which is not done yet).
+
+   TODO:
+	- allow a dynamic loading of low level driver (should have one 
+	  for OSS, another one for ALSA...)
+	- add clean-up mechanisms when process detach from MM DLLs
+	- reimplement the sndPlay??? functions using MCI commands
+          rather than rewriting everything from scratch.
+	- prepare for the 16/32 bit split
+	- check thread-safeness for MMSYSTEM and WINMM entry points 
+
+3.1 MCI skeletton
+-----------------
+
+   Implementation of what is needed to load/unload MCI drivers, and 
+   to pass correct information to them. This is implemented in 
+   multimedia/mci.c and multimedia/mcistring.c
+
+   The mciSendString function uses commandstrings, which are 
+   translated into normal MCI commands as used by mciSendCommand. 
+   The API can be found in multimedia/mmsystem.c and 
+   multimedia/mcistring.c. The functions there (mciOpen,mciSysInfo) 
+   handle midlevel driver allocation and calls.
+
+   The implementation is not complete.
+ 
+   MCI drivers are seen as regular WINE modules, and can be loaded 
+   (with a correct loadorder between builtin, native, elfdll, so), as 
+   any other DLL. Please note, that MCI drivers module names must
+   bear the .drv extension to be correctly understood.
+
+   The list of available MCI drivers is obtained as follows:
+	1/ key 'mci' in [option] section from .winerc (or wineconf)
+		mci=CDAUDIO:SEQUENCER
+	  gives the list of MCI drivers (names, in uppercase only) to 
+	  be used in WINE.
+	2/ This list, when defined, supercedes the mci
+	  key in c:\windows\system.ini
+
+   TODO:
+	- MCI command loading support mci(Load|Free)Command
+	- implement other stuff as yet unknown
+	- in mciString(), make use of hiword from mciSendMessage
+          return value to convert value into string...
+	- mmTaskXXX functions are currently broken because the 16
+          loader does not support binary command lines.
+
+3.2 MCI multi-tasking
+---------------------
+   Multi-tasking capabilities used for the MCI drivers are provided 
+   in multimedia/mmsystem.c
+
+3.3 Timers
+----------
+
+   It currently uses a service thread, run in the context of the calling
+   process, which should correctly mimic Windows behaviour.
+
+   TODO:
+   	- Check if minimal time is satisfactory for most programs.
+
+3.4 MMIO
+--------
+   
+   The API consists of the mmio* functions found in multimedia/mmio.c.
+
+   Seems to work ok in most of the cases.
+
+   TODO:
+	- ...
+
+@------------------------------------@
+@     Last updated: 12, May 1999     @
+@ Eric Pouech <eric.pouech@lemel.fr> @
+@------------------------------------@