| <chapter id="multimedia"> |
| <title>Wine and Multimedia</title> |
| |
| <para> |
| This file contains information about the implementation of the |
| multimedia layer of Wine. |
| </para> |
| |
| <para> |
| The implementation can be found in the |
| <filename>dlls/winmm/</filename> directory (and in many of its |
| subdirectories), but also in <filename>dlls/msacm/</filename> |
| (for the audio compression/decompression manager) and |
| <filename>dlls/msvideo/</filename> (for the video |
| compression/decompression manager). |
| </para> |
| |
| <sect1 id="mm-overview"> |
| <title>Overview</title> |
| |
| <para> |
| The multimedia stuff is split into 3 layers. The low level (device |
| drivers), mid level (MCI commands) and high level abstraction layers. |
| The low level layer has also some helper DLLs (like the MSACM/MSACM32 |
| and MSVIDEO/MSVFW32 pairs). |
| </para> |
| |
| <para> |
| All of those components are defined as DLLs (one by one). |
| </para> |
| |
| <para> |
| The low level layer may depend on current hardware and OS services |
| (like OSS on Unix). It provides the core of playback/record |
| using fine grain objects (audio/midi streams...). |
| </para> |
| <para> |
| Mid level (MCI) and high level layers must be written independently from |
| the hardware and OS services. |
| </para> |
| |
| <para> |
| MCI level provides some coarser grain operations (like playing |
| a Midi file, or playing a video stream). |
| </para> |
| |
| </sect1> |
| |
| <sect1 id="mm-arch"> |
| <title>Multimedia architecture</title> |
| |
| <sect2> |
| <title>Windows 95 multimedia architecture</title> |
| |
| <screen> |
| | |
| Kernel space | Client applications |
| | |
| | | | ^ ^ | | | | |
| | 16>| |<32 16>| |<32 16>| |<32 16>| |<32 |
| | | v | | | v | v |
| | +----|-----------|---------|------------|-------+ |
| | | | | | | | WinMM.dll |
| | | | | | | | 32 bit |
| | +----|-----------|---------|------------|-------+ |
| | | | | ^ | | | |
| | +------+ | |<16 | | | |<16 | |
| | | 16>| | | | | | | | |
| | | v v v | | v v v |
| | | +---------------+---+-------------+-------------+ |
| | | | waveInXXX | | mciXXX | *playSound* | |
| | | | waveOutXXX | | | mmioXXX | |
| | | | midiInXXX | | | timeXXX | |
| | | | midiOutXXX | | | driverXXX | |
| | | | midiStreamXXX | | | | MMSystem.dll |
| | | | mixerXXX | | | | 16 bit |
| +--------+ | | | auxXXX +---+ +---+ mmThread| | |
| |MMDEVLDR|<------->| joyXXX | Call back | mmTask | | |
| +--------+ | | +-----------+-----------+---------+-------------+ |
| ^ | | | ^ ^ | ^ |
| | | | 16>| |<16>| 16>| |<16 |
| v | | v | | v | |
| +--------+ | | +-------------+ +----------+ |
| | VxD |<------->| *.drv | | mci*.drv | |
| +--------+ | | +--------------+ +-----------+ |
| | | | msacm.drv | | mciwave | |
| | | +--------------+ +-----------+ |
| | | | midimap.drv | | mcimidi | |
| | | +-------------+ +-----------+ |
| | | Low-level drivers | ... | MCI drivers |
| | | +----------+ |
| | | | |
| | | |<16 |
| | +-------------------------------+ |
| | |
| </screen> |
| |
| <para> |
| The important points to notice are: |
| <itemizedlist> |
| <listitem> |
| <para> |
| all drivers (and most of the core code) is 16 bit |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| all hardware (or most of it) dependent code reside in the kernel |
| space (which is not surprising) |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| |
| </sect2> |
| |
| <sect2> |
| <title>Windows NT multimedia architecture</title> |
| |
| <para> |
| Note that Win 98 has mixed 95/NT architecture, so when |
| speaking about Windows 95 (resp. NT) architecture, it refers |
| to the type of architecture, not what's actually |
| implemented. For example, Windows 98 implements both types |
| of architectures. |
| </para> |
| |
| <para> |
| The important points to notice (compared to the Windows 95 |
| architecture) are: |
| <itemizedlist> |
| <listitem> |
| <para> |
| drivers (low level, MCIs...) are 32 bit and Unicode |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| the interfaces between kernel and user drivers has |
| changed, but it doesn't impact much Wine. Those |
| changes allow some good things (like kernel mixing, |
| where different apps share the audio hardware) and of |
| course bad things (like kernel mixing, which adds |
| latency). |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </sect2> |
| |
| <sect2> |
| <title>Wine multimedia architecture</title> |
| |
| <screen> |
| | |
| Kernel space | Client applications |
| | |
| | | | ^ ^ | | | | |
| | 16>| |<32 16>| |<32 16>| |<32 16>| |<32 |
| | | | | | | | | | |
| | +------+ | | | | | | | | |
| | |32/16>| | | | | | | | | |
| | | v v v | | v v v v |
| | | +---------------+---+-------------+-------------+ |
| | | | waveInXXX | | mciXXX | *playSound* | |
| | | | waveOutXXX | | | mmioXXX | WinMM.dll |
| | | | midiInXXX | | | timeXXX | 32 bit |
| | | | midiOutXXX | | | driverXXX | |
| | | | midiStreamXXX | | | | MMSystem.dll |
| | | | mixerXXX | | | | 16 bit |
| | | | auxXXX +---+ +---+ mmThread| | |
| | | | joyXXX | Call back | mmTask | | |
| | | +-----------+-----------+---------+-------------+ |
| | | || ^ ^ | ^ |
| | | 16>||<32 |<16>| 16>| |<16 |
| | | vv |<32>| 32>v |<32 |
| +---------+ | | +-------------+ +----------+ |
| |HW driver|<------->| *.drv | | mci*.drv | |
| +---------+ | | +--------------+ +-----------+ |
| | | | msacm.drv | | mciwave | |
| | | +--------------+ +-----------+ |
| | | | midimap.drv | | mcimidi | |
| | | +-------------+ +-----------+ |
| | | Low-level drivers | ... | MCI drivers |
| | | +----------+ |
| | | | |
| | | |<32/16 |
| | +-------------------------------+ |
| | |
| </screen> |
| |
| <para> |
| From the previous drawings, the most noticeable differences are: |
| <itemizedlist> |
| <listitem> |
| <para> |
| low-level drivers can either be 16 or 32 bit (in fact, |
| Wine supports only native wave and audio mappers). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| MCI drivers can either be 16 or 32 bit |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| all built-in drivers (low-level and MCI) will be written as 32 bit |
| drivers |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| |
| <para> |
| Wine's WinMM automatically adapts the messages to be sent to |
| a driver so that it can convert it to 16 or 32 bit |
| interfaces. |
| </para> |
| |
| </sect2> |
| |
| </sect1> |
| |
| <sect1 id="mm-low"> |
| <title>Low level layers</title> |
| |
| <para> |
| The low level drivers abstract the hardware specific features |
| from the rest of the multimedia code. Those are implemented with a |
| well defined set of APIs, as windows do. |
| </para> |
| |
| <para> |
| Please note that native low level drivers are not currently supported |
| in Wine, because they either access hardware components or require |
| VxDs to be loaded; Wine does not correctly supports those two so far. |
| </para> |
| |
| <para> |
| There are two specific low level drivers (msacm.drv for wave input/output, |
| midimap.drv for MIDI output only). These drivers (also present |
| in Windows) allow: |
| <itemizedlist> |
| <listitem> |
| <para> |
| choosing one low level driver between many (we'll |
| discuss how the choice is made later on) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| add the possibility to convert stream's format (ie ADPCM => |
| PCM) (this is useful if the format required by the |
| application for playback isn't supported by the soundcard). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| add the possibility to filter a stream (adding echo, equalizer... |
| to a wave stream, or modify the instruments that have to be |
| played for a MIDI stream). |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| |
| <sect2> |
| <title>Hardware-bound low level drivers</title> |
| |
| <para> |
| Each low lever driver has to implement at least one of the |
| following functionality, through the named function: |
| <itemizedlist> |
| <listitem> |
| <para> |
| Waveform audio: out for playback, and in for |
| recording. MMSYSTEM and WINMM call the real low level |
| audio driver using the driver's |
| <function>wodMessage</function> and |
| <function>widMessage</function> functions which handle |
| the different requests. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| MIDI (Musical Instrument Digital Interface): out for |
| playback, and in for recording. MMSYSTEM and WINMM |
| call the low level driver functions using the driver's |
| <function>midMessage</function> and the |
| <function>modMessage</function> functions. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Mixer: this allows setting the volume for each one of |
| the other functionnality (and also some specific |
| attributes, like left/right balance for stereo |
| streams...). MMSYSTEM and WINMM call the low level |
| driver functions using the |
| <function>mxdMessage</function> function. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Aux: this is the predecessor of the mixer |
| functionnality (introduced in Win 95). Its usage has |
| been deprecated in favor of mixer interfaces. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| |
| <para> |
| Wine currently supports the following (kernel) multimedia |
| interfaces. |
| <itemizedlist> |
| <listitem> |
| <para> |
| Open Sound System (OSS) as supplied in the Linux and |
| FreeBSD kernels by <ulink |
| url="http://www.4front-tech.com/">4Front |
| Technologies</ulink>. The presence of this driver is |
| checked by configure (depends on the |
| <sys/soundcard.h> file). Source code resides in |
| <filename>dlls/winmm/wineoss</filename>. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Advanced Linux Sound Architecture (<ulink |
| url="http://www.alsa-project.org/">ALSA</ulink>) as |
| supplied in the Linux kernel. Source code resides in |
| <filename>dlls/winmm/winealsa</filename>. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Analog RealTime Synthetizer (<ulink |
| url="http://www.arts-project.org/">aRts</ulink>): a |
| network server (and virtual mixer) used in the KDE project. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Network Audio Server (<ulink |
| url="http://radscan.com/nas.html">NAS</ulink>): an |
| audio server. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <ulink |
| url="http://jackit.sourceforge.net/">Jack</ulink>: a |
| low latency audio server. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| AudioIO: the native Solaris audio interface. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| |
| <para> |
| The supported functionnalities per driver is as follows |
| (this table lists the available features of the products, |
| not exactly what's actually implemented on Wine): |
| <table frame="all"> |
| <title>Wine multimedia drivers' functionalities</title> |
| <tgroup cols="6" align="left" colsep="1" rowsep="1"> |
| <thead> |
| <row> |
| <entry>Driver</entry> |
| <entry>Wave Out</entry> |
| <entry>Wave In</entry> |
| <entry>Midi Out</entry> |
| <entry>Midi In</entry> |
| <entry>Mixer (and Aux)</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row> |
| <entry>OSS</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| </row> |
| <row> |
| <entry>ALSA</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| </row> |
| <row> |
| <entry>aRts</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>No</entry> |
| <entry>No</entry> |
| <entry>Yes</entry> |
| </row> |
| <row> |
| <entry>NAS</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>No</entry> |
| <entry>No</entry> |
| <entry>Yes</entry> |
| </row> |
| <row> |
| <entry>AudioIO</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>No</entry> |
| <entry>No</entry> |
| <entry>Yes</entry> |
| </row> |
| <row> |
| <entry>Jack</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>No</entry> |
| <entry>No</entry> |
| <entry>Yes</entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </table> |
| </para> |
| |
| <para> |
| Lots of listed drivers won't support Midi (in a short time) |
| because the exposed "Un*x" native interfaces don't. This |
| would require using some kind as software synthesis (as |
| Timidity), but we cannot incorporate as it's GPL'ed. |
| </para> |
| |
| </sect2> |
| |
| <sect2> |
| <title>Wave mapper (msacm.drv)</title> |
| |
| <para> |
| The Wave mapper device allows to load on-demand audio codecs |
| in order to perform software conversion for the types the |
| actual low level driver (hardware). Those codecs are |
| provided through the standard ACM drivers in MSACM32.DLL. |
| </para> |
| |
| <para> |
| Wave mapper driver implementation can be found in |
| <filename>dlls/winmm/wavemap/</filename> directory. This |
| driver heavily relies on MSACM and MSACM32 DLLs which can be |
| found in <filename>dlls/msacm</filename> and |
| <filename>dlls/msacm32</filename>. Those DLLs load ACM |
| drivers which provide the conversion to PCM format (which is |
| normally supported by low level drivers). A Law, uLaw, |
| ADPCM, MP3... fit into the category of non PCM formats. |
| </para> |
| |
| </sect2> |
| |
| <sect2> |
| <title>MIDI mapper (midimap.drv)</title> |
| |
| <para> |
| 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 definitions |
| (XM, GM...). It also permits to output on a per channel |
| basis to different MIDI renderers. |
| </para> |
| |
| <para> |
| A built-in MIDI mapper can be found in |
| <filename>dlls/winmm/midimap/</filename>. It partly provides |
| the same functionality as the Windows' one. It allows to |
| pick up destination channels: you can map a given channel to |
| a specific playback device channel (see the configuration |
| bits for more details). |
| </para> |
| |
| </sect2> |
| |
| </sect1> |
| |
| <sect1 id="mm-mci"> |
| <title>Mid level drivers (MCI)</title> |
| |
| <para> |
| The mid level drivers are represented by some common API |
| functions, mostly <function>mciSendCommand</function> and |
| <function>mciSendString</function>. Wine implements several |
| MCI mid level drivers. |
| </para> |
| |
| <para> |
| <table frame="all"> |
| <title>Wine MCI drivers</title> |
| <tgroup cols="4" align="left" colsep="1" rowsep="1"> |
| <thead> |
| <row> |
| <entry>MCI Name</entry> |
| <entry>DLL Name</entry> |
| <entry>Role</entry> |
| <entry>Location</entry> |
| <entry>Comments</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row> |
| <entry>CdAudio</entry> |
| <entry>MciCDA.drv</entry> |
| <entry>MCI interface to a CD audio player</entry> |
| <entry><filename>dlls/winmm/mcicda/</filename></entry> |
| <entry> |
| Relies on NTDLL CdRom raw interface (through |
| <function>DeviceIoControl</function>). |
| </entry> |
| </row> |
| <row> |
| <entry>WaveAudio</entry> |
| <entry>MciWave.drv</entry> |
| <entry> |
| MCI interface for wave playback and record |
| </entry> |
| <entry><filename>dlls/winmm/mciwave/</filename></entry> |
| <entry>It uses the low level audio API.</entry> |
| </row> |
| <row> |
| <entry>Sequencer</entry> |
| <entry>MciSeq.drv</entry> |
| <entry>Midi Sequencer (playback)</entry> |
| <entry><filename>dlls/winmm/mciseq/</filename></entry> |
| <entry>It uses the low level midi APIs</entry> |
| </row> |
| <row> |
| <entry>AviVideo</entry> |
| <entry>MciAvi.drv</entry> |
| <entry>AVI playback and record</entry> |
| <entry><filename>dlls/winmm/mciavi/</filename></entry> |
| <entry> |
| It rather heavily relies on MSVIDEO/MSVFW32 DLLs |
| pair to work. |
| </entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </table> |
| The MCI Name column is the name of the MCI driver, as it is |
| searched in configuration. The DLL Name column is the name of |
| the DLL the configuration provides as a value. The name listed |
| here is the default one (see the configuration section for the |
| details). |
| </para> |
| |
| <para> |
| Adding a new MCI driver is just a matter of writing the |
| corresponding DLL with the correct interface (see existing MCI |
| drivers for the details), and to provide the relevant setup |
| information for <filename>wine.inf</filename> |
| </para> |
| |
| </sect1> |
| |
| <sect1 id="mm-high"> |
| <title>High level layers</title> |
| |
| <sect2> |
| <title>WINMM (and MMSYSTEM)</title> |
| |
| <para> |
| The high level layers encompass basically the MMSYSTEM and |
| WINMM DLLs exported APIs. It also provides the skeleton for |
| the core functionality for multimedia playback and |
| recording. Note that native MMSYSTEM and WINMM do not |
| currently work under Wine and there is no plan to support |
| them (it would require to also fully support VxD, which is |
| not done yet). |
| </para> |
| |
| <para> |
| WINMM and MMSYSTEM in Wine can handle both 16 bit and 32 bit |
| drivers (for low level and MCI drivers). It will handle all |
| the conversions transparently for the all the calls to WINMM |
| and MMSYSTEM, as it knows what the driver interface is (16 |
| bit or 32 bit) and it manages the information sent |
| accordingly. |
| </para> |
| |
| <para> |
| MCI drivers are seen as regular Wine modules, and can be |
| loaded (with a correct load order between builtin, native), |
| as any other DLL. Please note, that MCI drivers module names |
| must bear the <filename>.drv</filename> extension to be |
| correctly understood. |
| </para> |
| |
| <para> |
| Multimedia timers are implemented with a dedicated thread, |
| run in the context of the calling process, which should |
| correctly mimic Windows behavior. The only drawback is that |
| the thread will appear the calling process if it enumerates |
| the running processes. |
| </para> |
| |
| </sect2> |
| |
| <sect2> |
| <title>DSOUND</title> |
| |
| <para> |
| Wine also provide a DSound (DirectX) DLL with the proper |
| COM implementation. |
| </para> |
| |
| <para> |
| Note that a Wine specific flag has been added to the |
| <function>wodOpen</function> function, so that the DSound |
| DLL can get a reference to a COM sound object from a given |
| WINMM wave output device. This should be changed in the |
| future. |
| </para> |
| |
| </sect2> |
| |
| </sect1> |
| |
| <sect1 id="msacm"> |
| <title>MS ACM Dlls</title> |
| |
| <sect2> |
| <title>Contents</title> |
| |
| <para> |
| The MSACM32 (and its 16 bit sibbling MSACM) provide a way to |
| map a given wave format to another format. It also provides |
| filtering capabilities. Those DLLs only implement the proper |
| switch between a caller and a driver providing the |
| implementation of the requested format change or filter |
| operation. |
| </para> |
| |
| <para> |
| There's nothing specific in Wine's implementation compared |
| to Windows' one. Here's however a list of the builtin format |
| change drivers (there's no filter driver yet): |
| <table frame="all"> |
| <title>Wine ACM drivers</title> |
| <tgroup cols="2" align="left" colsep="1" rowsep="1"> |
| <thead> |
| <row> |
| <entry>Name</entry> |
| <entry>Provides</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row> |
| <entry>imaadp32</entry> |
| <entry>IMA ADPCM (adaptative PCM)</entry> |
| </row> |
| <row> |
| <entry>msadp32</entry> |
| <entry>Microsoft's ADPCM (adaptative PCM)</entry> |
| </row> |
| <row> |
| <entry>msg711</entry> |
| <entry>Microsoft's G.711 (A-Law and µ-Law)</entry> |
| </row> |
| <row> |
| <entry>winemp3</entry> |
| <entry> |
| Wine's MP3 (MPEG Layer 3), based on mpglib library |
| </entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </table> |
| </para> |
| |
| <para> |
| Note that Wine also supports native audio codecs as |
| well. |
| </para> |
| |
| <para> |
| All builtin ACM drivers are 32 bit Unicode DLLs |
| </para> |
| |
| </sect2> |
| |
| <sect2> |
| <title>Caching</title> |
| |
| <para> |
| The MSACM/MSACM32 keeps some data cached for all known ACM |
| drivers. Under the key |
| <screen> |
| Software\Microsoft\AudioCompressionManager\DriverCache\<driver name> |
| </screen> |
| , are kept for values: |
| <itemizedlist> |
| <listitem> |
| <para> |
| <literal>aFormatTagCache</literal> which |
| contains an array of <literal>DWORD</literal>. There |
| are two <literal>DWORD</literal>s per <literal>cFormatTags</literal> |
| entry. The first <literal>DWORD</literal> contains a |
| format tag value, and the second the associated |
| maximum size for a <literal>WAVEFORMATEX</literal> structure. |
| (Fields <literal>dwFormatTag</literal> and <literal>cbFormatSize</literal> from |
| ACMFORMATDETAILS) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>cFilterTags</literal> contains the number of tags supported by the driver |
| for filtering. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>cFormatTags</literal> contains the number of tags support |
| by the driver for conversions. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <literal>fdwSupport</literal> (the same as the one returned from |
| <function>acmDriverDetails</function>). |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| |
| <para> |
| The <literal>cFilterTags</literal>, |
| <literal>cFormatTags</literal>, |
| <literal>fdwSupport</literal> are the same values as the |
| ones returned from <function>acmDriverDetails</function> |
| function. |
| </para> |
| </sect2> |
| </sect1> |
| |
| <sect1 id="msvfw32"> |
| <title>MS Video Dlls</title> |
| |
| <sect2> |
| <title>Contents</title> |
| |
| <para> |
| The MSVFW32 (and its 16 bit sibbling MSVIDEO) provide |
| encode/decode video streams. Those DLLs only implement the |
| proper switch between a caller and a driver providing the |
| implementation of the requested format coding/decoding |
| operation. |
| </para> |
| |
| <para> |
| There's nothing specific in Wine's implementation compared |
| to Windows' one. Here's however a list of the builtin |
| decoding drivers: |
| <table frame="all"> |
| <title>Wine VIDC drivers</title> |
| <tgroup cols="2" align="left" colsep="1" rowsep="1"> |
| <thead> |
| <row> |
| <entry>Name</entry> |
| <entry>Provides</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row> |
| <entry>msrle32</entry> |
| <entry>Microsoft's RLE (Run-Length encoded)</entry> |
| </row> |
| <row> |
| <entry>msvidc32</entry> |
| <entry>Microsoft's Video-1</entry> |
| </row> |
| <row> |
| <entry>iccvid</entry> |
| <entry>Radius Cinepak Video Decoder</entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </table> |
| </para> |
| |
| <para> |
| Note that Wine also supports native video codecs as well. |
| </para> |
| |
| <para> |
| All builtin VIDC drivers are 32 bit Unicode DLLs |
| </para> |
| |
| </sect2> |
| |
| </sect1> |
| |
| <sect1 id="mm-conf"> |
| <title>Multimedia configuration</title> |
| |
| <para> |
| Unfortunately, multimedia configuration evolved over time: |
| <itemizedlist> |
| <listitem> |
| <para> |
| In the early days on Windows 3.x, configuration was |
| stored in <filename>system.in</filename> file, under |
| various sections (<literal>[drivers]</literal> for low |
| level drivers, <literal>[mci]</literal> |
| (resp. <literal>[mci32]</literal>) for 16 bit (resp. 32 |
| bit) MCI drivers...). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| With the apparition of the registry, in Windows 95, |
| configuration as been duplicated there, under the key |
| <screen> |
| HKLM\System\CurrentControlSet\Control\MediaResources |
| </screen> |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Windows NT also adopted the registry, but decided to |
| store the configuration information under another key |
| than Windows 9x did. |
| <screen> |
| HKLM\Software\Microsoft\Windows NT\CurrentVersion |
| </screen> |
| And with a different layout of keys and values beneath |
| this key. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| |
| <para> |
| Currently, Wine tries to load first a driver (low-level or |
| MCI) from the NT registry settings. If it fails, it will try |
| the <filename>system.ini</filename> configuration. |
| </para> |
| |
| <para> |
| An out-of-the-box configuration is provided in |
| <filename>wine.inf</filename>, and shall be stored in registry |
| and <filename>system.ini</filename> at Wine installation |
| time. It will setup correctly the MCI drivers' configuration |
| (as well as the wave and MIDI mappers). As the low-level |
| drivers depend on hardware, their setup will be handled by |
| <filename>winecfg</filename>. |
| </para> |
| |
| <table frame="all"> |
| <title>Wine multimedia configuration scheme</title> |
| <tgroup cols="5" align="left" colsep="1" rowsep="1"> |
| <thead> |
| <row> |
| <entry>Driver</entry> |
| <entry>Read from NT registry</entry> |
| <entry>Read from <filename>system.ini</filename></entry> |
| <entry>Setup by <filename>wine.inf</filename></entry> |
| <entry>Setup by <filename>winecfg</filename></entry> |
| </row> |
| </thead> |
| <tbody> |
| <row> |
| <entry>MCI drivers</entry> |
| <entry>Yes (1)</entry> |
| <entry>Yes (2)</entry> |
| <entry>Yes</entry> |
| <entry>No</entry> |
| </row> |
| <row> |
| <entry>Wave and MIDI mappers</entry> |
| <entry>Yes</entry> |
| <entry>No</entry> |
| <entry>Yes</entry> |
| <entry>No</entry> |
| </row> |
| <row> |
| <entry>Hardware-bound low level drivers</entry> |
| <entry>Yes</entry> |
| <entry>No</entry> |
| <entry>No</entry> |
| <entry>Yes</entry> |
| </row> |
| <row> |
| <entry>ACM and VIDC drivers (audio & video codecs)</entry> |
| <entry>No</entry> |
| <entry>Yes</entry> |
| <entry>Yes</entry> |
| <entry>No</entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </table> |
| |
| <para> |
| This will allow most settings to be correctly loaded and |
| handled. However, it won't if an app tries to search directly |
| the registry for the actual configuration, as the three |
| potential configuration places may not be in sync. |
| </para> |
| |
| <para> |
| It still lacks a correct installation scheme (as any |
| multimedia device under Windows), so that all the correct |
| keys are created in the registry. This requires an advanced |
| model since, for example, the number of wave out devices can |
| only be known on the destination system (depends on the |
| sound card driven by the OSS interface). |
| </para> |
| |
| <para> |
| The following sections describe which type of information |
| (depending on the location) Wine's multimedia DLLs understand. |
| </para> |
| |
| <sect2> |
| <title>NT configuration</title> |
| |
| <para> |
| Under the |
| <screen> |
| HKLM\Software\Microsoft\Windows NT\CurrentVersion |
| </screen> |
| key, are stored the names of the DLLs to be loaded for each |
| MCI driver name: |
| <screen> |
| "cdaudio"="mcicda.drv" |
| "sequencer"="mciseq.drv" |
| "waveaudio"="mciwave.drv" |
| "avivideo"="mciavi.drv" |
| "videodisc"="mcipionr.drv" |
| "vcr"="mcivisca.drv" |
| "MPEGVideo"="mciqtz.drv" |
| </screen> |
| </para> |
| </sect2> |
| |
| <sect2> |
| <title><filename>system.ini</filename></title> |
| |
| <para> |
| Wine will read the MCI drivers from the |
| <literal>[mci]</literal> or <literal>[mci32]</literal> |
| section. Wine won't make any difference between the two. |
| </para> |
| |
| <para> |
| Here's a sample configuration: |
| <screen> |
| [mci] |
| cdaudio=mcicda.drv |
| sequencer=mciseq.drv |
| waveaudio=mciwave.drv |
| avivideo=mciavi.drv |
| videodisc=mcipionr.drv |
| vcr=mcivisca.drv |
| MPEGVideo=mciqtz.drv |
| </screen> |
| </para> |
| |
| <para> |
| ACM drivers' configuration is read (only so far) from the |
| <filename>system.ini</filename> (and setup at Wine |
| installation from the <filename>wine.inf</filename> file). |
| <screen> |
| [drivers32] |
| MSACM.imaadpcm=imaadp32.acm |
| MSACM.msadpcm=msadp32.acm |
| MSACM.msg711=msg711.acm |
| MSACM.winemp3=winemp3.acm |
| </screen> |
| </para> |
| |
| <para> |
| Video (aka vidc) drivers' configuration is read (only so |
| far) from the <filename>system.ini</filename> (and setup at |
| Wine installation from the <filename>wine.inf</filename> |
| file). |
| <screen> |
| [drivers32] |
| VIDC.MRLE=msrle32.dll |
| VIDC.MSVC=msvidc32.dll |
| VIDC.CVID=iccvid.dll |
| </screen> |
| </para> |
| |
| <para> |
| See also the configuration part of the User's Guide for |
| other information on low level drivers. |
| </para> |
| |
| </sect2> |
| |
| <sect2> |
| <title>Per driver/DLL configuration</title> |
| |
| <sect3> |
| <title>Midi mapper</title> |
| |
| <para> |
| The Midi mapper configuration is the same as on Windows |
| 9x. Under the key: |
| <screen> |
| HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Multimedia\MIDIMap |
| </screen> |
| if the <literal>UseScheme</literal> value is not set, or |
| is set to a null value, the MIDI mapper will always use |
| the driver identified by the |
| <literal>CurrentInstrument</literal> value. Note: Wine |
| (for simplicity while installing) allows to define |
| <literal>CurrentInstrument</literal> as |
| <literal>#n</literal> (where n is a number), whereas |
| Windows only allows the real device name here. If |
| <literal>UseScheme</literal> is set to a non null value, |
| <literal>CurrentScheme</literal> defines the name of the |
| scheme to map the different channels. All the schemes are |
| available with keys like |
| <screen> |
| HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\MediaProperties\PrivateProperties\Midi\Schemes\%name_of_scheme% |
| </screen> |
| For every scheme, under this key, will be a sub-key (which |
| name is usually a two digit index, starting at 00). Its |
| default value is the name of the output driver, and the |
| value <literal>Channels</literal> lists all channels (of |
| the 16 standard MIDI ones) which have to be copied to this |
| driver. |
| </para> |
| |
| <para> |
| To provide enhanced configuration and mapping |
| capabilities, each driver can define under the key |
| <screen> |
| HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\MediaProperties\PrivateProperties\Midi\Ports\%driver_name% |
| </screen> |
| a link to and <filename>.IDF</filename> file which allows |
| to remap channels internally (for example 9 -> 16), to |
| change instruments identification, event controllers |
| values. See the source file |
| <filename>dlls/winmm/midimap/midimap.c</filename> for the |
| details (this isn't implemented yet). |
| </para> |
| |
| </sect3> |
| |
| </sect2> |
| |
| </sect1> |
| |
| </chapter> |
| |
| <!-- Keep this comment at the end of the file |
| Local variables: |
| mode: sgml |
| sgml-parent-document:("wine-devel.sgml" "set" "book" "part" "chapter" "") |
| End: |
| --> |