| 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. |
| |
| 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 |
| |
| 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 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. |
| |
| TODO: |
| - add asynchronous writes (must use threads) |
| - 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 |
| |
| 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/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... |
| - 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 |
| |
| 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 the service thread) |
| |
| 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. |
| |
| 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: |
| - 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: |
| |
| 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. |
| |
| It makes use of misc/cdrom.c Wine internal cdrom interface. This |
| interface has been ported on Linux, FreeBSD and NetBSD. |
| (Sun 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); |
| |
| Native MCICDA is starting to output sounds... It uses the mscdex |
| traps (on int 2f). |
| |
| 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 |
| - better use of asynchronous playback from low level |
| |
| Native MCIWAVE has been working but is currently blocked by |
| scheduling issues. |
| |
| 2.3 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). |
| |
| TODO: |
| - implement it correctly |
| - finish asynchronous commands |
| |
| Native MCIMIDI has been working but is currently blocked by |
| scheduling issues. |
| |
| 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. |
| |
| 2.5 MCIAVI |
| |
| 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. |
| |
| 3 High-level layers |
| |
| The rest (basically the MMSYSTEM and WINMM DLLs entry points). |