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 multimedia stuff is split into 3 layers. The lowlevel (device drivers),
midlevel (MCI commands) and highlevel abstraction layers.

1. Lowlevel layers

   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.

   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. For instance:
      Writes and reads 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. Some callbacks are probably done
   incorrectly (there are reports of some broken multimedia applications,
   but I haven't found one yet.)

   TODO:
   	- add asynchronous writes and reads (must use threads)
	- check the callback functions
	- verify all functions for correctness
	- add drivers for other soundsystems (Sun Audio, remote audio systems
	  (using X extensions, ...)

1.2 Mixer

   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.

   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.

1.3 MIDI
	
   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/2patches 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...
        - use better instrument definition for OPL/2 (midiPatch.c)
        - have a look at OPL/3 ?
	- a hack is used in mmsystem.c (setting reserved to the 32 bit linear
	  address of the block whatever the call is made from 16 or 32 bits 
	  code...). this should be in midi.c I think

1.4 Timers

   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.

   TODO:
   	- Implemented asynchronous timers (using a thread probably)

1.5 MMIO
   
   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.
	- ...

1.6 AUX
   
   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.

   The implementation uses the OSS mixer API, and is incomplete.

   TODO:
   	- verify the implementation

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.

   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.

   The implementation is not complete, but works for most cases.
   Win32 support for mciSendCommand is missing (mciSendString works
   in the Win32 case, since the use of strings doesn't differ between
   win16 and win32).

   TODO:
   	- Win32 support
	- support windows MCI drivers (should be possible for they usually 
	  do not use lowlevel calls)
	- MCI command loading support
	- implement other stuff as yet unknown

   WINE implements several MCI midlevel drivers:

2.1 CDAUDIO
   
   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.
   The implementation currently uses only the Linux /dev/cdrom controlling
   functions. (Sun and BSD like should be similair, but are not implemented.)

   A very small example of a cdplayer consists just of the line
   mciSendString("play cdaudio",NULL,0,0);

   TODO:
   	- add support for other cdaudio drivers

2.2 MCIWAVE
   
   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.

   TODO: - check for correctness

2.3 MIDI/SEQUENCER
   
   The implementation can be found in multimedia/midi.c. I am not sure
   about the completeness.
   It uses the lowlevel midi driver and is probably broken too.

   TODO: 
   	- implement it correctly

2.4 MCIANIM

   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.
