237 lines
8.4 KiB
Plaintext
237 lines
8.4 KiB
Plaintext
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).
|