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 current implementation is completely broken. (I think open(), read()
   and write() of the /dev/midi device would make this implementation nearly
   complete...)

   TODO:
   	- Implement correct MIDI output
	- Do not implement a software synthesizer. This should be done
	  using MIDI loopback devices in an external program (like timidity).

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.
