Changeset 4748 for trunk/src


Ignore:
Timestamp:
Dec 3, 2000, 11:19:43 PM (25 years ago)
Author:
sandervl
Message:

CW: Ported Wine MCI code

Location:
trunk/src/winmm
Files:
7 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/winmm/driver.cpp

    r4629 r4748  
    1 /* $Id: driver.cpp,v 1.6 2000-11-19 12:46:50 sandervl Exp $ */
     1/* $Id: driver.cpp,v 1.7 2000-12-03 22:18:17 sandervl Exp $ */
    22
    33/*
    44 * Driver multimedia apis
    55 *
     6 * Copyright 1994 Martin Ayotte
     7 * Copyright 1998 Marcus Meissner
    68 * Copyright 1998 Patrick Haller
    7  *
     9 * Copyright 1998/1999 Eric Pouech
     10 * Copyright 2000 Chris Wohlgemuth
    811 *
    912 * Project Odin Software License can be found in LICENSE.TXT
     
    1720
    1821#include <os2win.h>
    19 #include <mmsystem.h>
    2022#include <odinwrap.h>
    2123#include <string.h>
     
    2325#include <unicode.h>
    2426
    25 #include "winmm.h"
    2627#include "os2timer.h"
    2728
    2829#define DBG_LOCALLOG    DBG_driver
    2930#include "dbglocal.h"
     31
     32
     33/* Who said goofy boy ? */
     34#define WINE_DI_MAGIC   0x900F1B01
     35
     36typedef struct tagWINE_DRIVER
     37{
     38    DWORD                       dwMagic;
     39    char                        szAliasName[128];
     40    /* as usual LPWINE_DRIVER == hDriver32 */
     41    HDRVR16                     hDriver16;
     42    union {
     43       struct {
     44          HMODULE16             hModule;
     45          DRIVERPROC16          lpDrvProc;
     46       } d16;
     47       struct {
     48          HMODULE               hModule;
     49          DRIVERPROC            lpDrvProc;
     50       } d32;
     51    } d;
     52    DWORD                       dwDriverID;
     53    DWORD                       dwFlags;
     54    struct tagWINE_DRIVER*      lpPrevItem;
     55    struct tagWINE_DRIVER*      lpNextItem;
     56} WINE_DRIVER, *LPWINE_DRIVER;
     57
     58static LPWINE_DRIVER    DRIVER_RegisterDriver32(LPCSTR, HMODULE,   DRIVERPROC,   LPARAM, BOOL);
     59
     60static LPWINE_DRIVER    lpDrvItemList = NULL;
     61
     62/* TODO list :
     63 *      WINE remark: - LoadModule count and clean up is not handled correctly (it's not a
     64 *        problem as long as FreeLibrary is not working correctly)
     65 *      - shoudln't the allocations be done on a per process basis ?
     66 */
     67
     68static HDRVR DRIVER_OpenDriverA(LPCSTR lpDriverName, LPCSTR lpSectionName, LPARAM lParam) ;
     69static  LPWINE_DRIVER   DRIVER_FindFromHDrvr(HDRVR hDrvr);
     70static BOOL DRIVER_CloseDriver(LPWINE_DRIVER lpDrv, DWORD lParam1, DWORD lParam2);
    3071
    3172ODINDEBUGCHANNEL(WINMM-DRIVER)
     
    3980 *             LONG  lParam2
    4081 * Variables :
    41  * Result    : API returncode
    42  * Remark    :
    43  * Status    :
    44  *
    45  * Author    : Patrick Haller [Tue, 1998/05/05 10:44]
     82 * @return   : API returncode
     83 * Remark    :
     84 * @status   : Completely
     85 *
     86 * @author    : Patrick Haller [Tue, 1998/05/05 10:44]
     87 * @author    : Chris Wohlgemuth [Sun, 2000/11/19]
    4688 *****************************************************************************/
    4789
     
    5294              LONG, lParam2)
    5395{
    54   dprintf(("WINMM: SendDriverMessage not implemented.\n"));
    55   return 0; /* unsuccessful return */
     96    LPWINE_DRIVER       lpDrv;
     97    LRESULT             retval = 0;
     98
     99    dprintf(("Entering SendDriverMessage (%04x, %04X, %08lX, %08lX)\n", hdrvr, msg, lParam1, lParam2));
     100   
     101    lpDrv = DRIVER_FindFromHDrvr(hdrvr);
     102
     103    if (lpDrv != NULL) {
     104        if (lpDrv->dwFlags & WINE_GDF_16BIT) {
     105#if 0
     106      /*We don't use 16 bit */
     107      mapRet = DRIVER_MapMsg32To16(msg, &lParam1, &lParam2);
     108      if (mapRet >= 0) {
     109                TRACE("Before CallDriverProc proc=%p driverID=%08lx hDrv=%u wMsg=%04x p1=%08lx p2=%08lx\n",
     110                      lpDrv->d.d16.lpDrvProc, lpDrv->dwDriverID, lpDrv->hDriver16, msg, lParam1, lParam2);               
     111                retval = DRIVER_CallTo16_long_lwwll((FARPROC16)lpDrv->d.d16.lpDrvProc, lpDrv->dwDriverID,
     112                                            lpDrv->hDriver16, msg, lParam1, lParam2);
     113                if (mapRet >= 1) {
     114          DRIVER_UnMapMsg32To16(msg, lParam1, lParam2);
     115                }
     116      } else {
     117                retval = 0;
     118      }
     119#endif
     120        } else {
     121
     122#if 0
     123      dprintf(("Before func32 call proc=%p driverID=%08lx hDrv=%u wMsg=%04x p1=%08lx p2=%08lx\n",
     124               lpDrv->d.d32.lpDrvProc, lpDrv->dwDriverID, hdrvr, msg, lParam1, lParam2));                 
     125#endif
     126
     127      retval = lpDrv->d.d32.lpDrvProc(lpDrv->dwDriverID, hdrvr, msg, lParam1, lParam2);
     128        }
     129    } else {
     130      dprintf(("Bad driver handle %u\n", hdrvr));
     131    }
     132
     133    dprintf(("(SendDriverMessage) Driver proc returned retval = %ld (0x%lx)\n", retval, retval));
     134   
     135    return retval;
    56136}
    57137
     
    65145 *             LONG    lParam
    66146 * Variables :
    67  * Result    : API returncode
    68  * Remark    :
    69  * Status    :
    70  *
    71  * Author    : Patrick Haller [Tue, 1998/05/05 10:44]
     147 * @return   : API returncode
     148 * Remark    :
     149 * @status   : Stub
     150 *
     151 * @author    : Patrick Haller [Tue, 1998/05/05 10:44]
    72152 *****************************************************************************/
    73153
     
    77157              LONG, lParam)
    78158{
    79   dprintf(("WINMM: OpenDriver %x %x %x not implemented, lpDriverName, lpSectionName"));
     159  dprintf(("WINMM: OpenDriver not implemented.\n"));
    80160  return 0; /* unsuccessful return */
    81161}
     
    90170 *             LONG    lParam
    91171 * Variables :
    92  * Result    : API returncode
    93  * Remark    :
    94  * Status    :
    95  *
    96  * Author    : Patrick Haller [Tue, 1998/05/05 10:44]
     172 * @return   : API returncode
     173 * Remark    :
     174 * @status   : Partially tested
     175 *
     176 * @author    : Patrick Haller [Tue, 1998/05/05 10:44]
    97177 *****************************************************************************/
    98178
     
    102182              LONG, lParam)
    103183{
    104   dprintf(("WINMM: OpenDriverA %s %s %x not implemented, lpDriverName, lpSectionName"));
    105   return 0; /* unsuccessful return */
     184  return DRIVER_OpenDriverA(lpDriverName, lpSectionName,  lParam);
     185  //  return 0; /* unsuccessful return */
    106186}
    107187
     
    114194 *             LONG  lParam2
    115195 * Variables :
    116  * Result    :
    117  * Remark    :
    118  * Status    :
    119  *
    120  * Author    : Patrick Haller [Tue, 1998/05/05 10:44]
     196 * @return   :
     197 * Remark    :
     198 * @status   : Partially tested
     199 *
     200 * @author    : Patrick Haller [Tue, 1998/05/05 10:44]
    121201 *****************************************************************************/
    122202
     
    126206              LONG, lParam2)
    127207{
    128   dprintf(("WINMM: CloseDriver not implemented.\n"));
    129   return 0; /* unsuccessful return */
     208  return DRIVER_CloseDriver(DRIVER_FindFromHDrvr(hDrvr), lParam1, lParam2);//return 0; /* unsuccessful return */
    130209}
    131210
     
    140219 *             LONG  lParam2
    141220 * Variables :
    142  * Result    :
    143  * Remark    :
    144  * Status    :
    145  *
    146  * Author    : Patrick Haller [Tue, 1998/05/05 10:44]
     221 * @return   :
     222 * Remark    :
     223 * @status   : Partially
     224 *
     225 * @author    : Patrick Haller [Tue, 1998/05/05 10:44]
     226 * @author    : Chris Wohlgemuth [Sun, 2000/11/19]
    147227 *****************************************************************************/
    148228
     
    154234              LONG, lParam2)
    155235{
    156   dprintf(("WINMM: DefDriverProc not implemented.\n"));
    157   return 0; /* unsuccessful return */
     236  switch (msg) {
     237  case DRV_LOAD:
     238  case DRV_FREE:
     239  case DRV_ENABLE:
     240  case DRV_DISABLE:
     241    // return 1;
     242  case DRV_INSTALL:
     243  case DRV_REMOVE:
     244    //  return DRV_SUCCESS;
     245  default:
     246    return 0; /* unsuccessful return */
     247  }
     248
    158249}
    159250
     
    168259 *             DWORD dwParam2
    169260 * Variables :
    170  * Result    :
    171  * Remark    :
    172  * Status    :
    173  *
    174  * Author    : Patrick Haller [Tue, 1998/05/05 10:44]
     261 * @return   :
     262 * Remark    :
     263 * @status   : Stub
     264 *
     265 * @author    : Patrick Haller [Tue, 1998/05/05 10:44]
    175266 *****************************************************************************/
    176267
     
    194285 * Parameters: HDRVR hDriver
    195286 * Variables :
    196  * Result    :
    197  * Remark    :
    198  * Status    :
    199  *
    200  * Author    : Patrick Haller [Tue, 1998/05/05 10:44]
     287 * @return   :
     288 * Remark    :
     289 * @status   : Stub
     290 *
     291 * @author    : Patrick Haller [Tue, 1998/05/05 10:44]
    201292 *****************************************************************************/
    202293
     
    216307 *             LONG  lParam2
    217308 * Variables :
    218  * Result    : API returncode
     309 * @return   : API returncode
    219310 * Remark    : Ehm, what's the difference to SendDriverMessage() ?
    220  * Status    :
    221  *
    222  * Author    : Patrick Haller [Tue, 1998/05/05 10:44]
     311 * @status   : Stub
     312 *
     313 * @author    : Patrick Haller [Tue, 1998/05/05 10:44]
    223314 *****************************************************************************/
    224315
     
    239330 * Parameters: HDRVR hDriver
    240331 * Variables :
    241  * Result    :
     332 * @return   :
    242333 * Remark    : What's the difference to DrvGetModuleHandle() ?
    243  * Status    :
    244  *
    245  * Author    : Patrick Haller [Tue, 1998/05/05 10:44]
     334 * @status   : Completely
     335 *
     336 * @author    : Patrick Haller [Tue, 1998/05/05 10:44]
     337 * @author    : Chris Wohlgemuth [Sun, 2000/11/19]
    246338 *****************************************************************************/
    247339
     
    249341              HDRVR, hDriver)
    250342{
    251   dprintf(("WINMM: GetDriverModuleHandle not implemented.\n"));
    252   return 0; /* unsuccessful return */
    253 }
    254 
     343  LPWINE_DRIVER         lpDrv;
     344  HMODULE               hModule = 0;
     345 
     346#if 0
     347  dprintf(("(%04x);\n", hDriver));
     348#endif
     349
     350  lpDrv = DRIVER_FindFromHDrvr(hDriver);
     351  if (lpDrv != NULL && !(lpDrv->dwFlags & WINE_GDF_16BIT)) {
     352        hModule = lpDrv->d.d32.hModule;
     353 
     354}
     355#if 0
     356  dprintf(("=> %d\n", hModule));
     357#endif
     358  return hModule; //return 0; /* unsuccessful return */
     359}
     360
     361
     362
     363/**************************************************************************
     364 *                              GetDriverFlags          [WINMM.13]
     365 * Parameters: HDRVR hDrvr
     366 * Variables :
     367 * @return   :  0x00000000 if hDrvr is an invalid handle
     368 *              0x80000000 if hDrvr is a valid 32 bit driver
     369 * Remark    :
     370 * @status   : Completely
     371 *
     372 * @author    : Chris Wohlgemuth [Sun, 2000/11/19] (ported from WINE)
     373 */
     374ODINFUNCTION1(DWORD, GetDriverFlags,
     375              HDRVR, hDrvr)
     376{
     377    LPWINE_DRIVER       lpDrv;
     378    DWORD               ret = 0;
     379
     380    //TRACE("(%04x)\n", hDrvr);
     381
     382    if ((lpDrv = DRIVER_FindFromHDrvr(hDrvr)) != NULL) {
     383      ret = lpDrv->dwFlags;
     384    }
     385    return ret;
     386}
     387
     388
     389/**************************************************************************/
     390/*              Implementation                                            */
     391/**************************************************************************/
     392
     393/**************************************************************************
     394 *                      DRIVER_GetNumberOfModuleRefs            [internal]
     395 *
     396 * Returns the number of open drivers which share the same module.
     397 */
     398static  WORD    DRIVER_GetNumberOfModuleRefs(LPWINE_DRIVER lpNewDrv)
     399{
     400    LPWINE_DRIVER       lpDrv;
     401    WORD                count = 0;
     402   
     403    for (lpDrv = lpDrvItemList; lpDrv; lpDrv = lpDrv->lpNextItem) {
     404        if (lpDrv->dwFlags & WINE_GDF_16BIT) {
     405            if (lpDrv->d.d16.hModule == lpNewDrv->d.d16.hModule) {
     406                count++;
     407            }
     408        } else {
     409            if (lpDrv->d.d32.hModule == lpNewDrv->d.d32.hModule) {
     410                count++;
     411            }
     412        }
     413    }
     414    return count;
     415}
     416
     417
     418/**************************************************************************
     419 *                              DRIVER_FindFromHDrvr            [internal]
     420 *
     421 * From a hDrvr (being 16 or 32 bits), returns the WINE internal structure.
     422 */
     423static  LPWINE_DRIVER   DRIVER_FindFromHDrvr(HDRVR hDrvr)
     424{   
     425  if (!IsBadWritePtr((void*)hDrvr, sizeof(WINE_DRIVER)) &&
     426      ((LPWINE_DRIVER)hDrvr)->dwMagic == WINE_DI_MAGIC) {
     427        return (LPWINE_DRIVER)hDrvr;
     428  }
     429  return 0;
     430}
     431
     432/**************************************************************************
     433 *                              DRIVER_RemoveFromList           [internal]
     434 *
     435 * Generates all the logic to handle driver closure / deletion
     436 * Removes a driver struct to the list of open drivers.
     437 *
     438 */
     439static  BOOL    DRIVER_RemoveFromList(LPWINE_DRIVER lpDrv)
     440{
     441    lpDrv->dwDriverID = 0;
     442    if (DRIVER_GetNumberOfModuleRefs(lpDrv) == 1) {
     443      SendDriverMessage((HDRVR)lpDrv, DRV_DISABLE, 0L, 0L);
     444      SendDriverMessage((HDRVR)lpDrv, DRV_FREE,    0L, 0L);
     445    }
     446   
     447    if (lpDrv->lpPrevItem)
     448        lpDrv->lpPrevItem->lpNextItem = lpDrv->lpNextItem;
     449    else
     450        lpDrvItemList = lpDrv->lpNextItem;
     451    if (lpDrv->lpNextItem)
     452        lpDrv->lpNextItem->lpPrevItem = lpDrv->lpPrevItem;
     453
     454    return TRUE;
     455}
     456
     457/**************************************************************************
     458 *                              DRIVER_AddToList                [internal]
     459 *
     460 * Adds a driver struct to the list of open drivers.
     461 * Generates all the logic to handle driver creation / open.
     462 *
     463 */
     464static  BOOL    DRIVER_AddToList(LPWINE_DRIVER lpNewDrv, LPARAM lParam, BOOL bCallFrom32)
     465{
     466  lpNewDrv->dwMagic = WINE_DI_MAGIC;
     467  /* First driver to be loaded for this module, need to load correctly the module */
     468
     469  if (DRIVER_GetNumberOfModuleRefs(lpNewDrv) == 0) {
     470        if (SendDriverMessage((HDRVR)lpNewDrv, DRV_LOAD, 0L, 0L) != DRV_SUCCESS) {
     471      dprintf(("DRV_LOAD failed on driver 0x%08lx\n", (DWORD)lpNewDrv));
     472      return FALSE;
     473        }
     474        if (SendDriverMessage((HDRVR)lpNewDrv, DRV_ENABLE, 0L, 0L) != DRV_SUCCESS) {
     475      dprintf(("DRV_ENABLE failed on driver 0x%08lx\n", (DWORD)lpNewDrv));
     476      return FALSE;
     477        }
     478  }
     479 
     480  lpNewDrv->lpNextItem = NULL;
     481  if (lpDrvItemList == NULL) {
     482        lpDrvItemList = lpNewDrv;
     483        lpNewDrv->lpPrevItem = NULL;
     484  } else {
     485        LPWINE_DRIVER   lpDrv = lpDrvItemList;  /* find end of list */
     486        while (lpDrv->lpNextItem != NULL)
     487      lpDrv = lpDrv->lpNextItem;
     488       
     489        lpDrv->lpNextItem = lpNewDrv;
     490        lpNewDrv->lpPrevItem = lpDrv;
     491  }
     492  /* Now just open a new instance of a driver on this module */
     493 
     494  lpNewDrv->dwDriverID = SendDriverMessage((HDRVR)lpNewDrv, DRV_OPEN, 0L, lParam);
     495 
     496  if (lpNewDrv->dwDriverID == 0) {
     497        dprintf(("DRV_OPEN failed on driver 0x%08lx\n", (DWORD)lpNewDrv));
     498        DRIVER_RemoveFromList(lpNewDrv);
     499        return FALSE;
     500  }
     501   
     502  return TRUE;
     503}
     504
     505/**************************************************************************
     506 *                              DRIVER_RegisterDriver32         [internal]
     507 *
     508 * Creates all the WINE internal representations for a 32 bit driver.
     509 * The driver is also open by sending the correct messages.
     510 *
     511 */
     512static LPWINE_DRIVER DRIVER_RegisterDriver32(LPCSTR lpName, HMODULE hModule, DRIVERPROC lpProc,
     513                                      LPARAM lParam, BOOL bCallFrom32)
     514{
     515  LPWINE_DRIVER lpDrv;
     516 
     517  lpDrv = (LPWINE_DRIVER)HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_DRIVER));
     518  if (lpDrv != NULL) {
     519        lpDrv->dwFlags          = WINE_GDF_EXIST;
     520        lpDrv->dwDriverID       = 0;
     521    lpDrv->hDriver16        = 0;  /* We don't support 16 bit */
     522        lstrcpynA(lpDrv->szAliasName, lpName, sizeof(lpDrv->szAliasName));
     523        lpDrv->d.d32.hModule    = hModule;
     524        lpDrv->d.d32.lpDrvProc  = lpProc;
     525
     526        if (!DRIVER_AddToList(lpDrv, lParam, bCallFrom32)) {
     527      HeapFree(GetProcessHeap(), 0, lpDrv);
     528      lpDrv = NULL;
     529        }
     530
     531  }
     532  return lpDrv;
     533}
     534
     535/**************************************************************************
     536 *                              DRIVER_TryOpenDriver32          [internal]
     537 *
     538 * Tries to load a 32 bit driver whose DLL's (module) name is lpFileName.
     539 *
     540 */
     541static  HDRVR   DRIVER_TryOpenDriver32(LPCSTR lpFileName, LPARAM lParam, BOOL bCallFrom32)
     542{
     543    LPWINE_DRIVER       lpDrv = NULL;
     544    LPCSTR              lpSFN;
     545    HMODULE             hModule;
     546    DRIVERPROC          lpProc;
     547   
     548    dprintf(("'Entering DRIVER_TryOpenDriver32: %s', %08lX, %d);\n", lpFileName, lParam, bCallFrom32));
     549   
     550    if (strlen(lpFileName) < 1)
     551      return 0;
     552   
     553    lpSFN = strrchr(lpFileName, '\\');
     554    lpSFN = (lpSFN) ? (lpSFN + 1) : lpFileName;
     555   
     556    if ((hModule = LoadLibraryA(lpFileName)) != 0) {
     557      if ((lpProc = (DRIVERPROC)GetProcAddress(hModule, "DriverProc")) != NULL) {
     558        lpDrv = DRIVER_RegisterDriver32(lpSFN, hModule, lpProc, lParam, bCallFrom32);
     559      } else {
     560            FreeLibrary(hModule);
     561            lpDrv = 0;
     562            dprintf(("DRIVER_TryOpenDriver32: No DriverProc found (line %d)\n",__LINE__));
     563      }
     564    } else {
     565      dprintf(("DRIVER_TryOpenDriver32: Unable to load 32 bit module \"%s\" (line %d)\n", lpFileName,__LINE__));
     566    }
     567
     568    dprintf(("(DRIVER_TryOpenDriver32) driver handle => %p\n", lpDrv));
     569
     570    return (HDRVR)lpDrv;
     571}
     572
     573/**************************************************************************
     574 *                              DRIVER_OpenDriverA                      [internal]
     575 * (0,1,DRV_LOAD  ,0       ,0)
     576 * (0,1,DRV_ENABLE,0       ,0)
     577 * (0,1,DRV_OPEN  ,buf[256],0)
     578 *
     579 */
     580static HDRVR  DRIVER_OpenDriverA(LPCSTR lpDriverName, LPCSTR lpSectionName, LPARAM lParam)
     581{
     582  HDRVR                 hDriver = 0;
     583  char          drvName[128];
     584 
     585  dprintf(("Entering DRIVER_OpenDriverA: lpDriverName: %s lpSectionName: %s\n",lpDriverName,lpSectionName));
     586
     587  if (lpSectionName == NULL) {
     588        lstrcpynA(drvName, lpDriverName, sizeof(drvName));
     589        hDriver = DRIVER_TryOpenDriver32(lpDriverName, lParam, TRUE);
     590        if (!hDriver) {
     591      if (GetPrivateProfileStringA("Drivers32", lpDriverName, "", drvName,
     592                                   sizeof(drvName), "SYSTEM.INI")) {
     593
     594                hDriver = DRIVER_TryOpenDriver32(drvName, lParam, TRUE);               
     595      }
     596        }
     597  } else {/* of if (lpSectionName == NULL) */
     598    //dprintf(("driver name %x '%s'\n",drvName,drvName));
     599    drvName[0]=0;   
     600
     601        if (GetPrivateProfileStringA(lpSectionName, lpDriverName, "", drvName,
     602                                 sizeof(drvName)-1, "SYSTEM.INI")) {
     603#if 0
     604      dprintf(("driver name %x '%s'\n",drvName,drvName));
     605#endif     
     606      hDriver = DRIVER_TryOpenDriver32(drvName, lParam, TRUE);
     607        }/* GetPrivate... */
     608  }
     609  if (!hDriver)
     610        dprintf(("OpenDriverA: Failed to open driver %s from section %s\n", lpDriverName, lpSectionName));
     611
     612  else
     613        dprintf(("OpenDriverA success: Driver handle => %08x\n", hDriver));
     614
     615  return hDriver;
     616}
     617
     618/**************************************************************************
     619 *                              DRIVER_CloseDriver              [internal]
     620 *
     621 *
     622 */
     623static BOOL DRIVER_CloseDriver(LPWINE_DRIVER lpDrv, DWORD lParam1, DWORD lParam2)
     624{
     625  if (lpDrv != NULL) {
     626        SendDriverMessage((HDRVR)lpDrv, DRV_CLOSE, lParam1, lParam2);
     627   
     628        if (DRIVER_RemoveFromList(lpDrv)) {
     629      HeapFree(GetProcessHeap(), 0, lpDrv);
     630      return TRUE;
     631        }
     632  }
     633  dprintf(("Failed to close driver\n"));
     634  return FALSE;
     635}
     636
     637
     638
     639
     640
     641
     642
     643
     644
     645
     646
     647
  • trunk/src/winmm/initterm.cpp

    r3993 r4748  
    1 /* $Id: initterm.cpp,v 1.10 2000-08-11 10:56:27 sandervl Exp $ */
     1/* $Id: initterm.cpp,v 1.11 2000-12-03 22:18:17 sandervl Exp $ */
    22
    33/*
     
    66 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
    77 * Copyright 1998 Peter Fitzsimmons
     8 * Copyright 2000 Chris Wohlgemuth
    89 *
    910 *
     
    4243#include "dbglocal.h"
    4344
     45BOOL MULTIMEDIA_MciInit(void);
     46BOOL    MULTIMEDIA_CreateIData(HINSTANCE hinstDLL);
     47void MULTIMEDIA_DeleteIData(void);
     48
    4449extern "C" {
    4550void IRTMidiShutdown();  // IRTMidi shutdown routine
    4651void CDECL _ctordtorInit( void );
    4752void CDECL _ctordtorTerm( void );
     53
    4854
    4955 //Win32 resource table (produced by wrc)
     
    5662BOOL WINAPI LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
    5763{
    58    switch (fdwReason)
    59    {
    60    case DLL_PROCESS_ATTACH:
     64  static BOOL                   bInitDone = FALSE;
     65 
     66  switch (fdwReason)
     67    {
     68    case DLL_PROCESS_ATTACH:
     69      if (!MULTIMEDIA_CreateIData(hinstDLL))
     70        return FALSE;
     71     
     72      if (!bInitDone) { /* to be done only once */
     73            if (!MULTIMEDIA_MciInit() /*|| !MMDRV_Init() */ ) {
     74          MULTIMEDIA_DeleteIData();
     75          return FALSE;
     76            }
     77        bInitDone = TRUE;       
     78      }
     79     
    6180        return TRUE;
    6281
     
    6685
    6786   case DLL_PROCESS_DETACH:
     87     MULTIMEDIA_DeleteIData();
    6888        auxOS2Close(); /* SvL: Close aux device if necessary */
    6989        IRTMidiShutdown;  /* JT: Shutdown RT Midi subsystem, if running. */
     
    101121         CheckVersionFromHMOD(PE2LX_VERSION, hModule); /*PLF Wed  98-03-18 05:28:48*/
    102122
    103         dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);
     123        dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);
    104124         if(dllHandle == 0)
    105                 return 0UL;
     125           return 0UL;/* Error */
    106126
    107127         break;
     
    123143//******************************************************************************
    124144//******************************************************************************
     145
     146
     147
  • trunk/src/winmm/mci.cpp

    r2812 r4748  
    1 /* $Id: mci.cpp,v 1.5 2000-02-17 14:09:31 sandervl Exp $ */
     1/* $Id: mci.cpp,v 1.6 2000-12-03 22:18:17 sandervl Exp $ */
    22
    33/*
    4  * MCI stubs
     4 * MCI functions
    55 *
    66 * Copyright 1998 Joel Troster
    7  *
     7 * Copyright 1998/1999 Eric Pouech
     8 * Copyright 2000 Chris Wohlgemuth
    89 *
    910 * Project Odin Software License can be found in LICENSE.TXT
     
    1516 * Includes                                                                 *
    1617 ****************************************************************************/
     18
     19#define  INCL_BASE
     20#define  INCL_OS2MM
    1721
    1822#include <os2win.h>
     
    2125#include <string.h>
    2226#include <stdio.h>
     27#include "debugtools.h"
    2328
    2429#include <misc.h>
    2530#include <unicode.h>
    2631
     32#include "mcimm.h"
     33
    2734#include "winmm.h"
    2835
    2936#define DBG_LOCALLOG    DBG_mci
     37
    3038#include "dbglocal.h"
     39
     40
     41/****************************************************************************
     42 * Local functions                                                          *
     43 ****************************************************************************/
     44
     45/* forward declaration */
     46static DWORD  MCI_SendCommand(UINT mciId,
     47              UINT16 uMsg,
     48              DWORD dwParam1,
     49              DWORD dwParam2);
     50
     51static LPWINE_MCIDRIVER MCI_GetDriver(UINT16 wDevID) ;
     52static UINT     MCI_GetDriverFromString(LPCSTR lpstrName);
     53
     54/****************************************************************************/
    3155
    3256ODINDEBUGCHANNEL(WINMM-MCI)
     
    3862              UINT, uStatus)
    3963{
    40   dprintf(("WINMM:mciDriverNotify - stub\n"));
    41   return FALSE;
     64  TRACE("Entering mciDriverNotify (%08X, %04x, %04X)\n", hwndCallback, uDeviceID, uStatus);
     65 
     66  if (!IsWindow(hwndCallback)) {
     67        WARN("bad hwnd for call back (0x%04x)\n", hwndCallback);
     68        return FALSE;
     69  }
     70  TRACE("before PostMessage\n");
     71  PostMessageA(hwndCallback, MM_MCINOTIFY, uStatus, uDeviceID);
     72  return TRUE;
    4273}
    4374
     
    73104              LPCSTR, pszDevice)
    74105{
    75   dprintf(("WINMM:mciGetDeviceIDA - stub\n"));
    76   return 0;
     106  WARN(("WINMM:mciGetDeviceIDA - untested\n"));
     107  return MCI_GetDriverFromString(pszDevice);
    77108}
    78109
     
    100131}
    101132
     133/*****************************************************************************
     134 *             Queries driver data
     135 * Parameters: UINT uDeviceID
     136 * Variables :
     137 * @return   :  Pointer to driver data (as a DWORD)
     138 * Remark    :
     139 * @status   : Completely
     140 *
     141 * @author   : Chris Wohlgemuth [Sun, 2000/11/19]
     142 *****************************************************************************/
    102143ODINFUNCTION1(DWORD, mciGetDriverData,
    103144              UINT, uDeviceID)
    104145{
    105   dprintf(("WINMM:mciGetDriverData - stub\n"));
    106   return 0;
    107 }
    108 
     146  LPWINE_MCIDRIVER      wmd;
     147 
     148  wmd = MCI_GetDriver(uDeviceID);
     149 
     150  if (!wmd) {
     151        dprintf(("WARNING: Bad uDeviceID (mciGetDriverData (mci.cpp line %d)\n",__LINE__));
     152    return 0L; /* Error */
     153  }
     154   
     155  return wmd->dwPrivate;
     156}
     157
     158/*****************************************************************************
     159 *             Converts an error to an error string
     160 * Parameters: MCIERROR mcierr,
     161 *             LPSTR pszText,
     162 *             UINT cchText
     163 * Variables :
     164 * @return   : API returncode (TRUE/FALSE)
     165 * Remark    :
     166 * @status   : Completely
     167 *
     168 * @author   : Wine
     169 *****************************************************************************/
    109170ODINFUNCTION3(BOOL, mciGetErrorStringA,
    110171              MCIERROR, mcierr,
     
    125186}
    126187
     188/*****************************************************************************
     189 *             Converts an error to an error string
     190 * Parameters: MCIERROR mcierr,
     191 *             LPSTR pszText,
     192 *             UINT cchText
     193 * Variables :
     194 * @return   : API returncode (TRUE/FALSE)
     195 * Remark    :
     196 * @status   : Completely
     197 *
     198 * @author   : Wine
     199 *****************************************************************************/
    127200ODINFUNCTION3(BOOL, mciGetErrorStringW,
    128201              MCIERROR, mcierr,
     
    143216}
    144217
     218/*****************************************************************************
     219 *             Converts an error to an error string
     220 * Parameters: MCIERROR mcierr,
     221 *             LPSTR pszText,
     222 *             UINT cchText
     223 * Variables :
     224 * @return    : API returncode
     225 * Remark    :
     226 * @status    : Completely
     227 *
     228 * @author    : Wine
     229 *****************************************************************************/
    145230ODINFUNCTION2(YIELDPROC, mciGetYieldProc,
    146231              MCIDEVICEID, mciId,
    147232              LPDWORD, pdwYieldData)
    148233{
    149   dprintf(("WINMM:mciGetYieldProc - stub\n"));
    150   return 0;
     234  LPWINE_MCIDRIVER      wmd;
     235 
     236  TRACE("Entering mciGetYieldProc (%u, %p) - untested\n", mciId, pdwYieldData);
     237
     238  if (!(wmd = MCI_GetDriver(mciId))) {
     239        WARN("Bad uDeviceID\n");
     240        return NULL;
     241  }
     242  if (!wmd->lpfnYieldProc) {
     243        WARN("No proc set\n");
     244        return NULL;
     245  }
     246  if (!wmd->bIs32) {
     247        WARN("Proc is 32 bit\n");
     248        return NULL;
     249  }
     250  return wmd->lpfnYieldProc;
    151251}
    152252
     
    159259  return 0;
    160260}
     261
    161262
    162263ODINFUNCTION4(MCIERROR, mciSendCommandA,
     
    166267              DWORD, dwParam2)
    167268{
    168   dprintf(("WINMM:mciSendCommandA - stub %X %X %X %X\n", mciId, uMsg, dwParam1, dwParam2));
    169   return(MMSYSERR_NODRIVER);
    170 }
     269  DWORD dwRet;
     270  //  dprintf(("WINMM:mciSendCommandA - entering %X %X %X %X\n", mciId, uMsg, dwParam1, dwParam2));
     271  dwRet= MCI_SendCommand((UINT) mciId,  uMsg,  dwParam1, dwParam2) & 0xFFFF;     
     272  return(dwRet);
     273}
     274
    171275
    172276ODINFUNCTION4(MCIERROR, mciSendCommandW,
     
    187291{
    188292  dprintf(("WINMM:mciSendStringA - stub\n"));
     293  if(lpstrCommand)
     294    dprintf(("WINMM:mciSendStringA command: %s\n",lpstrCommand));
    189295  return(MMSYSERR_NODRIVER);
    190296}
     
    204310              DWORD, dwData)
    205311{
    206   dprintf(("WINMM:mciSetDriverData - stub\n"));
    207   return FALSE;
    208 }
     312  LPWINE_MCIDRIVER      wmd;
     313 
     314  wmd = MCI_GetDriver(uDeviceID);
     315
     316  if (!wmd) {
     317        dprintf(("WARNING: Bad uDeviceID (mciSetDriverData line %d)\n",__LINE__));
     318        return FALSE;
     319  }
     320 
     321  wmd->dwPrivate = dwData;
     322  return TRUE;
     323}
     324
    209325
    210326ODINFUNCTION3(BOOL, mciSetYieldProc,
     
    213329              DWORD, dwYieldData)
    214330{
    215   dprintf(("WINMM:mciSetYieldProc - stub\n"));
    216   return FALSE;
    217 }
    218 
    219 
     331  LPWINE_MCIDRIVER      wmd;
     332 
     333  TRACE("WINMM:mciSetYieldProc (%u, %p, %08lx) - untested\n", mciId, fpYieldProc, dwYieldData);
     334 
     335  if (!(wmd = MCI_GetDriver(mciId))) {
     336        WARN("Bad uDeviceID\n");
     337        return FALSE;
     338  }
     339 
     340  wmd->lpfnYieldProc = fpYieldProc;
     341  wmd->dwYieldData   = dwYieldData;
     342  wmd->bIs32         = TRUE;
     343 
     344  return TRUE;
     345}
     346
     347
     348/**************************************************************************/
     349/*                       heap.c                                           */
     350/**************************************************************************/
     351
     352#ifdef __GNUC__
     353#define GET_EIP()    (__builtin_return_address(0))
     354#define SET_EIP(ptr) ((ARENA_INUSE*)(ptr) - 1)->callerEIP = GET_EIP()
     355#else
     356#define GET_EIP()    0
     357#define SET_EIP(ptr) /* nothing */
     358#endif  /* __GNUC__ */
     359
     360/***********************************************************************
     361 *           HEAP_strdupA
     362 */
     363static LPSTR HEAP_strdupA( HANDLE heap, DWORD flags, LPCSTR str )
     364{
     365    LPSTR p = (LPSTR) HeapAlloc( heap, flags, strlen(str) + 1 );
     366    if(p) {
     367      //SET_EIP(p);
     368      strcpy( p, str );
     369    }
     370    return p;
     371}
     372
     373
     374/**************************************************************************/
     375/*                     mmmsystem.c                                        */
     376/**************************************************************************/
     377
     378static LPWINE_MM_IDATA          lpFirstIData = NULL;
     379
     380static  LPWINE_MM_IDATA MULTIMEDIA_GetIDataNoCheck(void)
     381{
     382    DWORD               pid = GetCurrentProcessId();
     383    LPWINE_MM_IDATA     iData;
     384
     385    for (iData = lpFirstIData; iData; iData = iData->lpNextIData) {
     386      if (iData->dwThisProcess == pid)
     387            break;
     388    }
     389    return iData;
     390}
     391
     392/**************************************************************************
     393 *                      MULTIMEDIA_GetIData                     [internal]
     394 */
     395LPWINE_MM_IDATA MULTIMEDIA_GetIData(void)
     396{
     397    LPWINE_MM_IDATA     iData = MULTIMEDIA_GetIDataNoCheck();
     398
     399    if (!iData) {
     400      dprintf(("MULTIMEDIA_GetIData: IData not found for pid=%08lx. Suicide !!!\n", GetCurrentProcessId()));
     401      ExitProcess(0);
     402    }
     403    return iData;
     404}
     405
     406
     407/**************************************************************************
     408 *                      MULTIMEDIA_CreateIData                  [internal]
     409 */
     410BOOL MULTIMEDIA_CreateIData(HINSTANCE hInstDLL)
     411{
     412    LPWINE_MM_IDATA     iData;
     413       
     414    iData = (LPWINE_MM_IDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MM_IDATA));
     415
     416    if (!iData)
     417      return FALSE;
     418    iData->hWinMM32Instance = hInstDLL;
     419    iData->dwThisProcess = GetCurrentProcessId();
     420    iData->lpNextIData = lpFirstIData;
     421    lpFirstIData = iData;
     422    InitializeCriticalSection(&iData->cs);
     423    dprintf(("Created IData (%p) for pid %08lx\n", iData, iData->dwThisProcess));
     424    return TRUE;
     425}
     426
     427
     428/**************************************************************************
     429 *                      MULTIMEDIA_DeleteIData                  [internal]
     430 */
     431void MULTIMEDIA_DeleteIData(void)
     432{
     433    LPWINE_MM_IDATA     iData = MULTIMEDIA_GetIDataNoCheck();
     434    LPWINE_MM_IDATA*    ppid;
     435           
     436    if (iData) {
     437        for (ppid = &lpFirstIData; *ppid; ppid = &(*ppid)->lpNextIData) {
     438            if (*ppid == iData) {
     439                *ppid = iData->lpNextIData;
     440                break;
     441            }
     442        }
     443        /* FIXME: should also free content and resources allocated
     444         * inside iData */
     445        HeapFree(GetProcessHeap(), 0, iData);
     446    }
     447}
     448
     449
     450/**************************************************************************/
     451/*                     mmmsystem.c                                        */
     452/**************************************************************************/
     453
     454
     455static  int                     MCI_InstalledCount;
     456static  LPSTR                   MCI_lpInstallNames = NULL;
     457
     458
     459/* First MCI valid device ID (0 means error) */
     460#define MCI_MAGIC 0x0001
     461
     462
     463/**************************************************************************
     464 *                              MCI_GetDriver                   [internal]
     465 */
     466static LPWINE_MCIDRIVER MCI_GetDriver(UINT16 wDevID)
     467{
     468    LPWINE_MCIDRIVER    wmd = 0;
     469    LPWINE_MM_IDATA     iData = MULTIMEDIA_GetIData();
     470
     471    EnterCriticalSection(&iData->cs);
     472    for (wmd = iData->lpMciDrvs; wmd; wmd = wmd->lpNext) {
     473        if (wmd->wDeviceID == wDevID)
     474            break;
     475    }
     476    LeaveCriticalSection(&iData->cs);
     477    return wmd;
     478}
     479
     480/**************************************************************************
     481 *                              MCI_GetDriverFromString         [internal]
     482 */
     483static UINT     MCI_GetDriverFromString(LPCSTR lpstrName)
     484{
     485    LPWINE_MCIDRIVER    wmd;
     486    LPWINE_MM_IDATA     iData = MULTIMEDIA_GetIData();
     487    UINT                ret = 0;
     488
     489    if (!lpstrName)
     490      return 0;
     491   
     492    if (!lstrcmpiA(lpstrName, "ALL"))
     493      return MCI_ALL_DEVICE_ID;
     494   
     495    EnterCriticalSection(&iData->cs);
     496    for (wmd = iData->lpMciDrvs; wmd; wmd = wmd->lpNext) {
     497      if (wmd->lpstrElementName && strcmp(wmd->lpstrElementName, lpstrName) == 0) {
     498            ret = wmd->wDeviceID;
     499            break;
     500      }
     501     
     502      if (wmd->lpstrDeviceType && strcmp(wmd->lpstrDeviceType, lpstrName) == 0) {
     503            ret = wmd->wDeviceID;
     504            break;
     505      }
     506     
     507      if (wmd->lpstrAlias && strcmp(wmd->lpstrAlias, lpstrName) == 0) {
     508            ret = wmd->wDeviceID;
     509            break;
     510      }
     511    }
     512    LeaveCriticalSection(&iData->cs);
     513   
     514    return ret;
     515}
     516
     517
     518/**************************************************************************
     519 *                              MCI_GetDevTypeFromFileName      [internal]
     520 */
     521static  DWORD   MCI_GetDevTypeFromFileName(LPCSTR fileName, LPSTR buf, UINT len)
     522{
     523    LPSTR       tmp;
     524
     525    if ((tmp = strrchr(fileName, '.'))) {
     526      GetProfileStringA("mci extensions", tmp + 1, "*", buf, len);
     527      if (strcmp(buf, "*") != 0) {
     528            return 0;
     529      }
     530      dprintf(("No [mci extensions] entry for '%s' found. MCI_GetDevTypeFromFileName: line %d, file 'mci.cpp'\n", tmp, __LINE__));
     531    }
     532    return MCIERR_EXTENSION_NOT_FOUND;
     533}
     534
     535
     536#define MAX_MCICMDTABLE                 20
     537#define MCI_COMMAND_TABLE_NOT_LOADED    0xFFFE
     538
     539
     540
     541/**************************************************************************
     542 *                              MCI_DefYieldProc                [internal]
     543 */
     544//UINT WINAPI MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data)
     545
     546UINT16 WINAPI MCI_DefYieldProc(UINT16 wDevID, DWORD data)
     547{
     548  INT16 ret;
     549
     550#if 0 
     551  dprintf(("(0x%04x, 0x%08lx)\n", wDevID, data));
     552#endif 
     553  if ((HIWORD(data) != 0 && GetActiveWindow() != HIWORD(data)) ||
     554      (GetAsyncKeyState(LOWORD(data)) & 1) == 0) {
     555        /* WINE stuff removed: UserYield16();*/
     556        ret = 0;
     557  } else {
     558        MSG             msg;
     559   
     560        msg.hwnd = HIWORD(data);
     561        while (!PeekMessageA(&msg, HIWORD(data), WM_KEYFIRST, WM_KEYLAST, PM_REMOVE));
     562        ret = -1;
     563  }
     564  return ret;
     565}
     566
     567
     568/**************************************************************************
     569 *                              MCI_UnLoadMciDriver             [internal]
     570 */
     571static  BOOL    MCI_UnLoadMciDriver(LPWINE_MM_IDATA iData, LPWINE_MCIDRIVER wmd)
     572{
     573    LPWINE_MCIDRIVER*           tmp;
     574
     575#if 0
     576    dprintf(("Entering MCI_UnLoadMciDriver...\n"));
     577#endif
     578    if (!wmd)
     579      return TRUE;
     580
     581    if (wmd->hDrv)
     582      CloseDriver(wmd->hDrv, 0, 0);
     583
     584    if (wmd->dwPrivate != 0)
     585      dprintf(("Unloading mci driver with non nul dwPrivate field\n"));
     586
     587    EnterCriticalSection(&iData->cs);
     588    for (tmp = &iData->lpMciDrvs; *tmp; tmp = &(*tmp)->lpNext) {
     589      if (*tmp == wmd) {
     590            *tmp = wmd->lpNext;
     591            break;
     592      }
     593    }
     594    LeaveCriticalSection(&iData->cs);
     595
     596    HeapFree(GetProcessHeap(), 0, wmd->lpstrDeviceType);
     597    HeapFree(GetProcessHeap(), 0, wmd->lpstrAlias);
     598    HeapFree(GetProcessHeap(), 0, wmd->lpstrElementName);
     599
     600    HeapFree(GetProcessHeap(), 0, wmd);
     601    //dprintf(("Leaving MCI_UnLoadMciDriver...\n"));
     602    return TRUE;
     603}
     604
     605/**************************************************************************
     606 *                              MCI_LoadMciDriver               [internal]
     607 */
     608static  DWORD   MCI_LoadMciDriver(LPWINE_MM_IDATA iData, LPCSTR _strDevTyp,
     609                                  LPWINE_MCIDRIVER* lpwmd)
     610{
     611    LPSTR                       strDevTyp = CharUpperA(HEAP_strdupA(GetProcessHeap(), 0, _strDevTyp));
     612    LPWINE_MCIDRIVER            wmd = (LPWINE_MCIDRIVER)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*wmd));
     613    MCI_OPEN_DRIVER_PARMSA      modp;
     614    DWORD                       dwRet = 0;
     615    HDRVR                       hDrv = 0;
     616
     617
     618    dprintf(("Entering MCI_LoadMciDriver...\n"));
     619 
     620    if (!wmd || !strDevTyp) {
     621      dwRet = MCIERR_OUT_OF_MEMORY;
     622      goto errCleanUp;
     623    }
     624
     625    wmd->lpstrDeviceType = strDevTyp;
     626    wmd->lpfnYieldProc = MCI_DefYieldProc;
     627    wmd->dwYieldData = VK_CANCEL;
     628    wmd->hCreatorTask = NULL;
     629
     630
     631    EnterCriticalSection(&iData->cs);
     632    /* wmd must be inserted in list before sending opening the driver, coz' it
     633     * may want to lookup at wDevID
     634     */
     635    wmd->lpNext = iData->lpMciDrvs;
     636    iData->lpMciDrvs = wmd;
     637
     638    for (modp.wDeviceID = MCI_MAGIC;
     639         MCI_GetDriver(modp.wDeviceID) != 0;
     640         modp.wDeviceID++);
     641
     642    wmd->wDeviceID = modp.wDeviceID;
     643
     644    LeaveCriticalSection(&iData->cs);
     645
     646    dprintf(("wDevID=%04X strDevTyp: %s\n", modp.wDeviceID, strDevTyp));
     647
     648    modp.lpstrParams = NULL;
     649
     650    hDrv = OpenDriverA(strDevTyp, "mci", (LPARAM)&modp);
     651   
     652    if (!hDrv) {
     653      dprintf(("Couldn't load driver for type %s.\n"
     654               "If you don't have a windows installation accessible from Wine,\n"
     655               "you perhaps forgot to create a [mci] section in system.ini\n",
     656               strDevTyp));
     657      dwRet = MCIERR_DEVICE_NOT_INSTALLED;
     658      goto errCleanUp;
     659    }                           
     660
     661    /* FIXME: should also check that module's description is of the form
     662     * MODULENAME:[MCI] comment
     663     */
     664
     665    wmd->hDrv = hDrv;
     666    /* some drivers will return 0x0000FFFF, some others 0xFFFFFFFF */
     667    wmd->uSpecificCmdTable = LOWORD(modp.wCustomCommandTable);
     668    wmd->uTypeCmdTable = MCI_COMMAND_TABLE_NOT_LOADED;
     669
     670    dprintf(("Loaded driver %x (%s), type is %d, cmdTable=%08x\n",
     671          hDrv, strDevTyp, modp.wType, modp.wCustomCommandTable));
     672   
     673   
     674    wmd->wType = modp.wType;
     675
     676#if 0   
     677    dprintf(("mcidev=%d, uDevTyp=%04X wDeviceID=%04X !\n",
     678             modp.wDeviceID, modp.wType, modp.wDeviceID));
     679#endif
     680
     681    *lpwmd = wmd;
     682#if 0
     683    dprintf(("Leaving MCI_LoadMciDriver succesful...\n"));
     684#endif
     685    return 0;
     686errCleanUp:
     687    MCI_UnLoadMciDriver(iData, wmd);
     688    //  HeapFree(GetProcessHeap(), 0, strDevTyp);<-- done in MCI_UnloadMciDriver
     689    *lpwmd = 0;
     690    dprintf(("Leaving MCI_LoadMciDriver on error...\n"));
     691    return dwRet;
     692}
     693
     694
     695/**************************************************************************
     696 *                      MCI_SendCommandFrom32                   [internal]
     697 */
     698static DWORD MCI_SendCommandFrom32(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2)
     699{
     700    DWORD               dwRet = MCIERR_DEVICE_NOT_INSTALLED;
     701    LPWINE_MCIDRIVER    wmd = MCI_GetDriver(wDevID);
     702
     703    if (!wmd) {
     704      dwRet = MCIERR_INVALID_DEVICE_ID;
     705    } else {
     706      switch (GetDriverFlags(wmd->hDrv) & (WINE_GDF_EXIST)) {
     707      case WINE_GDF_EXIST:
     708            dwRet = SendDriverMessage(wmd->hDrv, wMsg, dwParam1, dwParam2);
     709            break;
     710      default:
     711            dprintf(("Unknown driver %u\n", wmd->hDrv));
     712            dwRet = MCIERR_DRIVER_INTERNAL;
     713      }
     714    }
     715    return dwRet;
     716}
     717   
     718/**************************************************************************
     719 *                      MCI_FinishOpen                          [internal]
     720 */
     721static  DWORD   MCI_FinishOpen(LPWINE_MCIDRIVER wmd, LPMCI_OPEN_PARMSA lpParms,
     722                               DWORD dwParam)
     723{
     724  if (dwParam & MCI_OPEN_ELEMENT)
     725        wmd->lpstrElementName = HEAP_strdupA(GetProcessHeap(), 0,
     726                                         lpParms->lpstrElementName);
     727 
     728  if (dwParam & MCI_OPEN_ALIAS)
     729        wmd->lpstrAlias = HEAP_strdupA(GetProcessHeap(), 0, lpParms->lpstrAlias);
     730 
     731  lpParms->wDeviceID = wmd->wDeviceID;
     732 
     733  return MCI_SendCommandFrom32(wmd->wDeviceID, MCI_OPEN_DRIVER, dwParam,
     734                               (DWORD)lpParms);
     735}
     736
     737/**************************************************************************
     738 *                      MCI_Open                                [internal]
     739 */
     740static  DWORD MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSA lpParms)
     741{
     742    char                        strDevTyp[128];
     743    DWORD                       dwRet;
     744    LPWINE_MCIDRIVER            wmd = NULL;
     745
     746    LPWINE_MM_IDATA             iData = MULTIMEDIA_GetIData();
     747
     748    dprintf(("Entering MCI_OPEN...\n"));
     749
     750    if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
     751
     752    /* only two low bytes are generic, the other ones are dev type specific */
     753#define WINE_MCIDRIVER_SUPP     (0xFFFF0000|MCI_OPEN_SHAREABLE|MCI_OPEN_ELEMENT| \
     754                         MCI_OPEN_ALIAS|MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID| \
     755                         MCI_NOTIFY|MCI_WAIT)
     756    if ((dwParam & ~WINE_MCIDRIVER_SUPP) != 0) {
     757        dprintf(("Unsupported yet dwFlags=%08lX\n", dwParam & ~WINE_MCIDRIVER_SUPP));
     758    }
     759#undef WINE_MCIDRIVER_SUPP
     760
     761    strDevTyp[0] = 0;
     762
     763    if (dwParam & MCI_OPEN_TYPE) {
     764      if (dwParam & MCI_OPEN_TYPE_ID) {
     765            WORD uDevType = LOWORD((DWORD)lpParms->lpstrDeviceType);
     766        if (uDevType < MCI_DEVTYPE_FIRST ||
     767            uDevType > MCI_DEVTYPE_LAST ||
     768            !LoadStringA(iData->hWinMM32Instance, uDevType, strDevTyp, sizeof(strDevTyp))) /* This gets a name for the device e.g 'cdaudio' */
     769          {
     770            dwRet = MCIERR_BAD_INTEGER;
     771            goto errCleanUp;
     772          }
     773      } else {
     774            LPSTR       ptr;
     775            if (lpParms->lpstrDeviceType == NULL) {
     776          dwRet = MCIERR_NULL_PARAMETER_BLOCK;
     777                goto errCleanUp;
     778            }
     779            strcpy(strDevTyp, lpParms->lpstrDeviceType);
     780            ptr = strchr(strDevTyp, '!');
     781            if (ptr) {
     782                /* this behavior is not documented in windows. However, since, in
     783                 * some occasions, MCI_OPEN handling is translated by WinMM into
     784                 * a call to mciSendString("open <type>"); this code shall be correct
     785                 */
     786                if (dwParam & MCI_OPEN_ELEMENT) {
     787                    dprintf(("Both MCI_OPEN_ELEMENT(%s) and %s are used\n",
     788                        lpParms->lpstrElementName, strDevTyp));
     789                    dwRet = MCIERR_UNRECOGNIZED_KEYWORD;
     790                    goto errCleanUp;
     791                }
     792                dwParam |= MCI_OPEN_ELEMENT;
     793                *ptr++ = 0;
     794                /* FIXME: not a good idea to write in user supplied buffer */
     795                lpParms->lpstrElementName = ptr;
     796            }
     797               
     798      }
     799      dprintf(("MCI_OPEN (MCI_OPEN_TYPE): devType='%s' !\n", strDevTyp));
     800    }
     801   
     802    if (dwParam & MCI_OPEN_ELEMENT) {
     803      dprintf(("lpstrElementName='%s'\n", lpParms->lpstrElementName));
     804
     805      if (dwParam & MCI_OPEN_ELEMENT_ID) {
     806            dprintf(("Unsupported yet flag MCI_OPEN_ELEMENT_ID\n"));
     807            dwRet = MCIERR_UNRECOGNIZED_KEYWORD;
     808            goto errCleanUp;
     809      }
     810
     811      if (!lpParms->lpstrElementName) {
     812            dwRet = MCIERR_NULL_PARAMETER_BLOCK;
     813            goto errCleanUp;
     814      }
     815
     816#if 0
     817      /* Only working on my machine!! CW */
     818      if(lpParms->lpstrElementName[0]=='N') {
     819            dprintf(("Discarding drive N:\n"));
     820        dwRet = MCIERR_UNRECOGNIZED_KEYWORD;
     821            goto errCleanUp;
     822      }
     823#endif
     824     
     825      /* type, if given as a parameter, supersedes file extension */
     826      if (!strDevTyp[0] &&
     827          MCI_GetDevTypeFromFileName(lpParms->lpstrElementName,
     828                                     strDevTyp, sizeof(strDevTyp))) {
     829        if (GetDriveTypeA(lpParms->lpstrElementName) != DRIVE_CDROM) {
     830          dwRet = MCIERR_EXTENSION_NOT_FOUND;
     831          goto errCleanUp;
     832        }
     833        /* FIXME: this will not work if several CDROM drives are installed on the machine */
     834        strcpy(strDevTyp, "CDAUDIO");
     835      }
     836    }
     837   
     838    if (strDevTyp[0] == 0) {
     839      dprintf(("Couldn't load driver (MCI_Open line %d)\n",__LINE__));
     840      dwRet = MCIERR_INVALID_DEVICE_NAME;
     841      goto errCleanUp;
     842    }
     843
     844    if (dwParam & MCI_OPEN_ALIAS) {
     845      dprintf(("MCI_OPEN_ALIAS requested\n"));
     846      if (!lpParms->lpstrAlias) {
     847            dwRet = MCIERR_NULL_PARAMETER_BLOCK;
     848            goto errCleanUp;
     849      }
     850      dprintf(("Alias='%s' !\n", lpParms->lpstrAlias));
     851    }
     852   
     853    if ((dwRet = MCI_LoadMciDriver(iData, strDevTyp, &wmd))) {
     854      goto errCleanUp;
     855    }
     856
     857
     858    if ((dwRet = MCI_FinishOpen(wmd, lpParms, dwParam))) {
     859      dprintf(("Failed to open driver (MCI_OPEN_DRIVER) [%08lx], closing\n", dwRet));
     860      /* FIXME: is dwRet the correct ret code ? */
     861      goto errCleanUp;
     862    }
     863
     864
     865    /* only handled devices fall through */
     866    dprintf(("wDevID=%04X wDeviceID=%d dwRet=%ld\n", wmd->wDeviceID, lpParms->wDeviceID, dwRet));
     867
     868    if (dwParam & MCI_NOTIFY)
     869      // mciDriverNotify16(lpParms->dwCallback, wmd->wDeviceID, MCI_NOTIFY_SUCCESSFUL);
     870      dprintf(("FIXME: MCI_NOTIFY not implemented yet! MCI_Open (line %d)\n",__LINE__));
     871
     872    return 0;
     873
     874errCleanUp:
     875
     876    if (wmd) MCI_UnLoadMciDriver(iData, wmd);
     877
     878    if (dwParam & MCI_NOTIFY)
     879      //  mciDriverNotify16(lpParms->dwCallback, 0, MCI_NOTIFY_FAILURE);
     880      dprintf(("FIXME: MCI_NOTIFY not implemented yet! MCI_Open (line %d)\n",__LINE__));
     881 
     882    dprintf(("Leaving MCI_Open on error...\n"));
     883    return dwRet;
     884}
     885
     886
     887/**************************************************************************
     888 *                      MCI_Close                               [internal]
     889 */
     890static  DWORD MCI_Close(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
     891{
     892  DWORD         dwRet;
     893  LPWINE_MCIDRIVER      wmd;
     894  LPWINE_MM_IDATA       iData = MULTIMEDIA_GetIData();
     895 
     896  //dprintf(("(%04x, %08lX, %p)\n", wDevID, dwParam, lpParms));
     897
     898  if (wDevID == MCI_ALL_DEVICE_ID) {
     899        LPWINE_MCIDRIVER        next;
     900
     901        EnterCriticalSection(&iData->cs);
     902        /* FIXME: shall I notify once after all is done, or for
     903         * each of the open drivers ? if the latest, which notif
     904         * to return when only one fails ?
     905         */
     906        for (wmd = iData->lpMciDrvs; wmd; ) {
     907      next = wmd->lpNext;
     908      MCI_Close(wmd->wDeviceID, dwParam, lpParms);
     909      wmd = next;
     910        }       
     911        LeaveCriticalSection(&iData->cs);
     912        return 0;
     913  }
     914
     915  if (!(wmd = MCI_GetDriver(wDevID))) {
     916        return MCIERR_INVALID_DEVICE_ID;
     917  }
     918
     919  dwRet = MCI_SendCommandFrom32(wDevID, MCI_CLOSE_DRIVER, dwParam, (DWORD)lpParms);
     920 
     921  MCI_UnLoadMciDriver(iData, wmd);
     922 
     923  if (dwParam & MCI_NOTIFY)
     924    dprintf(("FIXME: MCI_NOTIFY not implemented yet! MCI_Close (line %d)\n",__LINE__));
     925    //  mciDriverNotify16(lpParms->dwCallback, wDevID,
     926    //                (dwRet == 0) ? MCI_NOTIFY_SUCCESSFUL : MCI_NOTIFY_FAILURE);
     927 
     928  return dwRet;
     929}
     930
     931
     932/**************************************************************************
     933 *                      MCI_WriteString                         [internal]
     934 */
     935DWORD   MCI_WriteString(LPSTR lpDstStr, DWORD dstSize, LPCSTR lpSrcStr)
     936{
     937    DWORD       ret = 0;
     938
     939    if (lpSrcStr) {
     940        if (dstSize <= strlen(lpSrcStr)) {
     941            lstrcpynA(lpDstStr, lpSrcStr, dstSize - 1);
     942            ret = MCIERR_PARAM_OVERFLOW;
     943        } else {
     944            strcpy(lpDstStr, lpSrcStr);
     945        }       
     946    } else {
     947        *lpDstStr = 0;
     948    }
     949    return ret;
     950}
     951
     952
     953/**************************************************************************
     954 *                      MCI_Sysinfo                             [internal]
     955 */
     956static  DWORD MCI_SysInfo(UINT uDevID, DWORD dwFlags, LPMCI_SYSINFO_PARMSA lpParms)
     957{
     958    DWORD               ret = MCIERR_INVALID_DEVICE_ID;
     959    LPWINE_MCIDRIVER    wmd;
     960    LPWINE_MM_IDATA     iData = MULTIMEDIA_GetIData();
     961
     962    if (lpParms == NULL)                        return MCIERR_NULL_PARAMETER_BLOCK;
     963
     964    TRACE("(%08x, %08lX, %08lX[num=%ld, wDevTyp=%u])\n",
     965          uDevID, dwFlags, (DWORD)lpParms, lpParms->dwNumber, lpParms->wDeviceType);
     966   
     967    switch (dwFlags & ~MCI_SYSINFO_OPEN) {
     968    case MCI_SYSINFO_QUANTITY:
     969      {
     970            DWORD       cnt = 0;
     971           
     972            if (lpParms->wDeviceType < MCI_DEVTYPE_FIRST ||
     973            lpParms->wDeviceType > MCI_DEVTYPE_LAST) {
     974          if (dwFlags & MCI_SYSINFO_OPEN) {
     975                    TRACE("MCI_SYSINFO_QUANTITY: # of open MCI drivers\n");
     976                    EnterCriticalSection(&iData->cs);
     977                    for (wmd = iData->lpMciDrvs; wmd; wmd = wmd->lpNext) {
     978              cnt++;
     979                    }
     980                    LeaveCriticalSection(&iData->cs);
     981          } else {
     982                    TRACE("MCI_SYSINFO_QUANTITY: # of installed MCI drivers\n");
     983                    cnt = MCI_InstalledCount;
     984          }
     985            } else {
     986          if (dwFlags & MCI_SYSINFO_OPEN) {
     987                    TRACE("MCI_SYSINFO_QUANTITY: # of open MCI drivers of type %u\n",
     988                  lpParms->wDeviceType);
     989                    EnterCriticalSection(&iData->cs);
     990                    for (wmd = iData->lpMciDrvs; wmd; wmd = wmd->lpNext) {
     991              if (wmd->wType == lpParms->wDeviceType)
     992                            cnt++;
     993                    }
     994                    LeaveCriticalSection(&iData->cs);
     995          } else {
     996                    TRACE("MCI_SYSINFO_QUANTITY: # of installed MCI drivers of type %u\n",
     997                  lpParms->wDeviceType);
     998                    FIXME("Don't know how to get # of MCI devices of a given type\n");
     999                    cnt = 1;
     1000          }
     1001            }
     1002            *(DWORD*)lpParms->lpstrReturn = cnt;
     1003      }
     1004      TRACE("(%ld) => '%ld'\n", lpParms->dwNumber, *(DWORD*)lpParms->lpstrReturn);
     1005      ret = MCI_INTEGER_RETURNED;
     1006      break;
     1007    case MCI_SYSINFO_INSTALLNAME:
     1008      TRACE("MCI_SYSINFO_INSTALLNAME \n");
     1009      if ((wmd = MCI_GetDriver(uDevID))) {
     1010            ret = MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize,
     1011                              wmd->lpstrDeviceType);
     1012      } else {
     1013            *lpParms->lpstrReturn = 0;
     1014            ret = MCIERR_INVALID_DEVICE_ID;
     1015      }
     1016      TRACE("(%ld) => '%s'\n", lpParms->dwNumber, lpParms->lpstrReturn);
     1017      break;
     1018    case MCI_SYSINFO_NAME:
     1019      TRACE("MCI_SYSINFO_NAME\n");
     1020      if (dwFlags & MCI_SYSINFO_OPEN) {
     1021            FIXME("Don't handle MCI_SYSINFO_NAME|MCI_SYSINFO_OPEN (yet)\n");
     1022            ret = MCIERR_UNRECOGNIZED_COMMAND;
     1023      } else if (lpParms->dwNumber > MCI_InstalledCount) {
     1024            ret = MCIERR_OUTOFRANGE;
     1025      } else {
     1026            DWORD       count = lpParms->dwNumber;
     1027            LPSTR       ptr = MCI_lpInstallNames;
     1028       
     1029            while (--count > 0) ptr += strlen(ptr) + 1;
     1030            ret = MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize, ptr);
     1031      }
     1032      TRACE("(%ld) => '%s'\n", lpParms->dwNumber, lpParms->lpstrReturn);
     1033      break;
     1034    default:
     1035      TRACE("Unsupported flag value=%08lx\n", dwFlags);
     1036      ret = MCIERR_UNRECOGNIZED_COMMAND;
     1037    }
     1038    return ret;
     1039}
     1040
     1041
     1042/**************************************************************************
     1043 *                      MCI_Break                               [internal]
     1044 */
     1045static  DWORD MCI_Break(UINT wDevID, DWORD dwFlags, LPMCI_BREAK_PARMS lpParms)
     1046{
     1047    DWORD       dwRet = 0;
     1048   
     1049    if (lpParms == NULL)        return MCIERR_NULL_PARAMETER_BLOCK;
     1050
     1051    if (dwFlags & MCI_NOTIFY)
     1052      dprintf(("FIXME: MCI_NOTIFY not implemented yet! MCI_Break (line %d)\n",__LINE__));
     1053    //  mciDriverNotify16(lpParms->dwCallback, wDevID,
     1054    //    (dwRet == 0) ? MCI_NOTIFY_SUCCESSFUL : MCI_NOTIFY_FAILURE);
     1055
     1056    return dwRet;
     1057}
     1058
     1059   
     1060/**************************************************************************
     1061 *                      MCI_SendCommand                         [internal]
     1062 */
     1063static DWORD    MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1,
     1064                        DWORD dwParam2)
     1065{
     1066    DWORD               dwRet = MCIERR_UNRECOGNIZED_COMMAND;
     1067
     1068    switch (wMsg) {
     1069    case MCI_OPEN:
     1070      dwRet = MCI_Open(dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
     1071      break;
     1072    case MCI_CLOSE:
     1073      dwRet = MCI_Close(wDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
     1074      break;
     1075    case MCI_SYSINFO:
     1076      dwRet = MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSA)dwParam2);
     1077      break;
     1078    case MCI_BREAK:
     1079      dwRet = MCI_Break(wDevID, dwParam1, (LPMCI_BREAK_PARMS)dwParam2);
     1080      break;
     1081      // case MCI_SOUND:
     1082      /* FIXME: it seems that MCI_SOUND needs the same handling as MCI_BREAK
     1083       * but I couldn't get any doc on this MCI message
     1084       */
     1085      // break;
     1086    default:
     1087      if (wDevID == MCI_ALL_DEVICE_ID) {
     1088            dprintf(("MCI_SendCommand: unhandled MCI_ALL_DEVICE_ID\n"));
     1089            dwRet = MCIERR_CANNOT_USE_ALL;
     1090      } else {
     1091        dwRet=MCI_SendCommandFrom32(wDevID, wMsg, dwParam1, dwParam2);
     1092      }     
     1093      break;
     1094    }
     1095    return dwRet;
     1096}
     1097
     1098
     1099
     1100
     1101/**************************************************************************
     1102 *                      MULTIMEDIA_MciInit                      [internal]
     1103 *
     1104 * Initializes the MCI internal variables.
     1105 *
     1106 */
     1107BOOL MULTIMEDIA_MciInit(void)
     1108{
     1109    LPSTR       ptr1, ptr2;
     1110    HKEY        hWineConf;
     1111    HKEY        hkey;
     1112    DWORD       err;
     1113    DWORD       type;
     1114    DWORD       count = 2048;
     1115
     1116    MCI_InstalledCount = 0;
     1117    ptr1 = MCI_lpInstallNames = (char*) HeapAlloc(GetProcessHeap(), 0, count);
     1118
     1119    if (!MCI_lpInstallNames)
     1120      return FALSE;
     1121
     1122#if 0
     1123    /* FIXME: should do also some registry diving here ? */
     1124    if (!(err = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config", &hWineConf)) &&
     1125        !(err = RegOpenKeyA(hWineConf, "options", &hkey))) {
     1126      err = RegQueryValueExA(hkey, "mci", 0, &type, MCI_lpInstallNames, &count);
     1127      RegCloseKey(hkey);
     1128      FIXME("Registry handling for mci drivers not changed for odin yet. Verbatim copy from WINE (line %d)",__LINE__);
     1129    }
     1130#endif
     1131    FIXME("No Registry querying for mci drivers yet! (line %d)",__LINE__);
     1132    err=1;
     1133    if (!err) {
     1134      TRACE("Wine => '%s' \n", ptr1);
     1135      while ((ptr2 = strchr(ptr1, ':')) != 0) {
     1136            *ptr2++ = 0;
     1137            TRACE("---> '%s' \n", ptr1);
     1138            MCI_InstalledCount++;
     1139            ptr1 = ptr2;
     1140      }
     1141      MCI_InstalledCount++;
     1142      TRACE("---> '%s' \n", ptr1);
     1143      ptr1 += strlen(ptr1) + 1;
     1144    } else {
     1145      GetPrivateProfileStringA("mci", NULL, "", MCI_lpInstallNames, count, "SYSTEM.INI");
     1146      while (strlen(ptr1) > 0) {
     1147            TRACE("---> '%s' \n", ptr1);
     1148            ptr1 += strlen(ptr1) + 1;
     1149            MCI_InstalledCount++;
     1150      }
     1151    }
     1152    //RegCloseKey(hWineConf);
     1153    return TRUE;
     1154}
  • trunk/src/winmm/winmmrsrc.orc

    r3031 r4748  
    1 /* $Id: winmmrsrc.orc,v 1.1 2000-03-06 23:39:17 bird Exp $ */
     1/* $Id: winmmrsrc.orc,v 1.2 2000-12-03 22:18:19 sandervl Exp $ */
    22
    33#include "winuser.h"
    44#include "odinrsrc.h"
     5#include "mmddk.h"
     6#include "winnls.h"
    57
    68
     
    4042    END
    4143END
     44
     45
     46/* Add your language specific defines here */
     47#include "winmm_En.orc"
     48#include "winmm_Fr.orc"
     49#include "winmm_Nl.orc"
     50#include "winmm_Pt.orc"
     51#include "winmm_Es.orc"
     52#include "winmm_Ru.orc"
     53
     54
     55/* do not add NLS specific stuff below that line */
     56
     57CORE RCDATA
     58BEGIN
     59"open\0", 0x00000803L, MCI_COMMAND_HEAD,
     60"\0", 0x00000002L, MCI_RETURN,
     61"notify\0", 0x00000001L, MCI_FLAG,
     62"wait\0", 0x00000002L, MCI_FLAG,
     63"type\0", 0x00002000L, MCI_STRING,
     64"element\0", 0x00000200L, MCI_STRING,
     65"alias\0", 0x00000400L, MCI_STRING,
     66"shareable\0", 0x00000100L, MCI_FLAG,
     67"\0", 0x00000000L, MCI_END_COMMAND,
     68"close\0", 0x00000804L, MCI_COMMAND_HEAD,
     69"notify\0", 0x00000001L, MCI_FLAG,
     70"wait\0", 0x00000002L, MCI_FLAG,
     71"\0", 0x00000000L, MCI_END_COMMAND,
     72"play\0", 0x00000806L, MCI_COMMAND_HEAD,
     73"notify\0", 0x00000001L, MCI_FLAG,
     74"wait\0", 0x00000002L, MCI_FLAG,
     75"from\0", 0x00000004L, MCI_INTEGER,
     76"to\0", 0x00000008L, MCI_INTEGER,
     77"\0", 0x00000000L, MCI_END_COMMAND,
     78"record\0", 0x0000080fL, MCI_COMMAND_HEAD,
     79"notify\0", 0x00000001L, MCI_FLAG,
     80"wait\0", 0x00000002L, MCI_FLAG,
     81"from\0", 0x00000004L, MCI_INTEGER,
     82"to\0", 0x00000008L, MCI_INTEGER,
     83"insert\0", 0x00000100L, MCI_FLAG,
     84"overwrite\0", 0x00000200L, MCI_FLAG,
     85"\0", 0x00000000L, MCI_END_COMMAND,
     86"seek\0", 0x00000807L, MCI_COMMAND_HEAD,
     87"notify\0", 0x00000001L, MCI_FLAG,
     88"wait\0", 0x00000002L, MCI_FLAG,
     89"to start\0", 0x00000100L, MCI_FLAG,
     90"to end\0", 0x00000200L, MCI_FLAG,
     91"to\0", 0x00000008L, MCI_INTEGER,
     92"\0", 0x00000000L, MCI_END_COMMAND,
     93"stop\0", 0x00000808L, MCI_COMMAND_HEAD,
     94"notify\0", 0x00000001L, MCI_FLAG,
     95"wait\0", 0x00000002L, MCI_FLAG,
     96"\0", 0x00000000L, MCI_END_COMMAND,
     97"pause\0", 0x00000809L, MCI_COMMAND_HEAD,
     98"notify\0", 0x00000001L, MCI_FLAG,
     99"wait\0", 0x00000002L, MCI_FLAG,
     100"\0", 0x00000000L, MCI_END_COMMAND,
     101"status\0", 0x00000814L, MCI_COMMAND_HEAD,
     102"\0", 0x00000002L, MCI_RETURN,
     103"notify\0", 0x00000001L, MCI_FLAG,
     104"wait\0", 0x00000002L, MCI_FLAG,
     105"\0", 0x00000100L, MCI_CONSTANT,
     106"position\0", 0x00000002L, MCI_INTEGER,
     107"length\0", 0x00000001L, MCI_INTEGER,
     108"number of tracks\0", 0x00000003L, MCI_INTEGER,
     109"ready\0", 0x00000007L, MCI_INTEGER,
     110"mode\0", 0x00000004L, MCI_INTEGER,
     111"time format\0", 0x00000006L, MCI_INTEGER,
     112"current track\0", 0x00000008L, MCI_INTEGER,
     113"\0", 0x00000000L, MCI_END_CONSTANT,
     114"track\0", 0x00000010L, MCI_INTEGER,
     115"start\0", 0x00000200L, MCI_FLAG,
     116"\0", 0x00000000L, MCI_END_COMMAND,
     117"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
     118"\0", 0x00000002L, MCI_RETURN,
     119"notify\0", 0x00000001L, MCI_FLAG,
     120"wait\0", 0x00000002L, MCI_FLAG,
     121"\0", 0x00000100L, MCI_CONSTANT,
     122"can record\0", 0x00000001L, MCI_INTEGER,
     123"has audio\0", 0x00000002L, MCI_INTEGER,
     124"has video\0", 0x00000003L, MCI_INTEGER,
     125"uses files\0", 0x00000005L, MCI_INTEGER,
     126"compound device\0", 0x00000006L, MCI_INTEGER,
     127"device type\0", 0x00000004L, MCI_INTEGER,
     128"can eject\0", 0x00000007L, MCI_INTEGER,
     129"can play\0", 0x00000008L, MCI_INTEGER,
     130"can save\0", 0x00000009L, MCI_INTEGER,
     131"\0", 0x00000000L, MCI_END_CONSTANT,
     132"\0", 0x00000000L, MCI_END_COMMAND,
     133"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
     134"\0", 0x00000001L, MCI_RETURN,
     135"notify\0", 0x00000001L, MCI_FLAG,
     136"wait\0", 0x00000002L, MCI_FLAG,
     137"product\0", 0x00000100L, MCI_FLAG,
     138"\0", 0x00000000L, MCI_END_COMMAND,
     139"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
     140"notify\0", 0x00000001L, MCI_FLAG,
     141"wait\0", 0x00000002L, MCI_FLAG,
     142"time format\0", 0x00000400L, MCI_CONSTANT,
     143"milliseconds\0", 0x00000000L, MCI_INTEGER,
     144"ms\0", 0x00000000L, MCI_INTEGER,
     145"\0", 0x00000000L, MCI_END_CONSTANT,
     146"door open\0", 0x00000100L, MCI_FLAG,
     147"door closed\0", 0x00000200L, MCI_FLAG,
     148"audio\0", 0x00000800L, MCI_CONSTANT,
     149"all\0", 0x00000000L, MCI_INTEGER,
     150"left\0", 0x00000001L, MCI_INTEGER,
     151"right\0", 0x00000002L, MCI_INTEGER,
     152"\0", 0x00000000L, MCI_END_CONSTANT,
     153"video\0", 0x00001000L, MCI_FLAG,
     154"on\0", 0x00002000L, MCI_FLAG,
     155"off\0", 0x00004000L, MCI_FLAG,
     156"\0", 0x00000000L, MCI_END_COMMAND,
     157"sysinfo\0", 0x00000810L, MCI_COMMAND_HEAD,
     158"\0", 0x00000001L, MCI_RETURN,
     159"notify\0", 0x00000001L, MCI_FLAG,
     160"wait\0", 0x00000002L, MCI_FLAG,
     161"quantity\0", 0x00000100L, MCI_FLAG,
     162"open\0", 0x00000200L, MCI_FLAG,
     163"installname\0", 0x00000800L, MCI_FLAG,
     164"name\0", 0x00000400L, MCI_INTEGER,
     165"\0", 0x00000000L, MCI_END_COMMAND,
     166"break\0", 0x00000811L, MCI_COMMAND_HEAD,
     167"notify\0", 0x00000001L, MCI_FLAG,
     168"wait\0", 0x00000002L, MCI_FLAG,
     169"on\0", 0x00000100L, MCI_INTEGER,
     170"off\0", 0x00000400L, MCI_FLAG,
     171"\0", 0x00000000L, MCI_END_COMMAND,
     172"sound\0", 0x00000812L, MCI_COMMAND_HEAD,
     173"notify\0", 0x00000001L, MCI_FLAG,
     174"wait\0", 0x00000002L, MCI_FLAG,
     175"\0", 0x00000000L, MCI_END_COMMAND,
     176"save\0", 0x00000813L, MCI_COMMAND_HEAD,
     177"notify\0", 0x00000001L, MCI_FLAG,
     178"wait\0", 0x00000002L, MCI_FLAG,
     179"\0", 0x00000100L, MCI_STRING,
     180"\0", 0x00000000L, MCI_END_COMMAND,
     181"load\0", 0x00000850L, MCI_COMMAND_HEAD,
     182"notify\0", 0x00000001L, MCI_FLAG,
     183"wait\0", 0x00000002L, MCI_FLAG,
     184"\0", 0x00000100L, MCI_STRING,
     185"\0", 0x00000000L, MCI_END_COMMAND,
     186"resume\0", 0x00000855L, MCI_COMMAND_HEAD,
     187"notify\0", 0x00000001L, MCI_FLAG,
     188"wait\0", 0x00000002L, MCI_FLAG,
     189"\0", 0x00000000L, MCI_END_COMMAND,
     190"\0", 0x00000000L, MCI_END_COMMAND_LIST
     191END
     192
     193VIDEODISC RCDATA
     194BEGIN
     195"play\0", 0x00000806L, MCI_COMMAND_HEAD,
     196"notify\0", 0x00000001L, MCI_FLAG,
     197"wait\0", 0x00000002L, MCI_FLAG,
     198"from\0", 0x00000004L, MCI_INTEGER,
     199"to\0", 0x00000008L, MCI_INTEGER,
     200"fast\0", 0x00020000L, MCI_FLAG,
     201"slow\0", 0x00100000L, MCI_FLAG,
     202"speed\0", 0x00040000L, MCI_INTEGER,
     203"reverse\0", 0x00010000L, MCI_FLAG,
     204"scan\0", 0x00080000L, MCI_FLAG,
     205"\0", 0x00000000L, MCI_END_COMMAND,
     206"seek\0", 0x00000807L, MCI_COMMAND_HEAD,
     207"notify\0", 0x00000001L, MCI_FLAG,
     208"wait\0", 0x00000002L, MCI_FLAG,
     209"reverse\0", 0x00010000L, MCI_FLAG,
     210"to start\0", 0x00000100L, MCI_FLAG,
     211"to end\0", 0x00000200L, MCI_FLAG,
     212"to\0", 0x00000008L, MCI_INTEGER,
     213"\0", 0x00000000L, MCI_END_COMMAND,
     214"spin\0", 0x0000080cL, MCI_COMMAND_HEAD,
     215"notify\0", 0x00000001L, MCI_FLAG,
     216"wait\0", 0x00000002L, MCI_FLAG,
     217"up\0", 0x00010000L, MCI_FLAG,
     218"down\0", 0x00020000L, MCI_FLAG,
     219"\0", 0x00000000L, MCI_END_COMMAND,
     220"step\0", 0x0000080eL, MCI_COMMAND_HEAD,
     221"notify\0", 0x00000001L, MCI_FLAG,
     222"wait\0", 0x00000002L, MCI_FLAG,
     223"reverse\0", 0x00020000L, MCI_FLAG,
     224"by\0", 0x00010000L, MCI_INTEGER,
     225"\0", 0x00000000L, MCI_END_COMMAND,
     226"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
     227"notify\0", 0x00000001L, MCI_FLAG,
     228"wait\0", 0x00000002L, MCI_FLAG,
     229"time format\0", 0x00000400L, MCI_CONSTANT,
     230"milliseconds\0", 0x00000000L, MCI_INTEGER,
     231"ms\0", 0x00000000L, MCI_INTEGER,
     232"frames\0", 0x00000003L, MCI_INTEGER,
     233"hms\0", 0x00000001L, MCI_INTEGER,
     234"track\0", 0x00004001L, MCI_INTEGER,
     235"\0", 0x00000000L, MCI_END_CONSTANT,
     236"door open\0", 0x00000100L, MCI_FLAG,
     237"door closed\0", 0x00000200L, MCI_FLAG,
     238"audio\0", 0x00000800L, MCI_CONSTANT,
     239"all\0", 0x00000000L, MCI_INTEGER,
     240"left\0", 0x00000001L, MCI_INTEGER,
     241"right\0", 0x00000002L, MCI_INTEGER,
     242"\0", 0x00000000L, MCI_END_CONSTANT,
     243"video\0", 0x00001000L, MCI_FLAG,
     244"on\0", 0x00002000L, MCI_FLAG,
     245"off\0", 0x00004000L, MCI_FLAG,
     246"\0", 0x00000000L, MCI_END_COMMAND,
     247"status\0", 0x00000814L, MCI_COMMAND_HEAD,
     248"\0", 0x00000002L, MCI_RETURN,
     249"notify\0", 0x00000001L, MCI_FLAG,
     250"wait\0", 0x00000002L, MCI_FLAG,
     251"\0", 0x00000100L, MCI_CONSTANT,
     252"position\0", 0x00000002L, MCI_INTEGER,
     253"length\0", 0x00000001L, MCI_INTEGER,
     254"number of tracks\0", 0x00000003L, MCI_INTEGER,
     255"mode\0", 0x00000004L, MCI_INTEGER,
     256"media present\0", 0x00000005L, MCI_INTEGER,
     257"speed\0", 0x00004002L, MCI_INTEGER,
     258"forward\0", 0x00004003L, MCI_INTEGER,
     259"media type\0", 0x00004004L, MCI_INTEGER,
     260"ready\0", 0x00000007L, MCI_INTEGER,
     261"side\0", 0x00004005L, MCI_INTEGER,
     262"disc size\0", 0x00004006L, MCI_INTEGER,
     263"time format\0", 0x00000006L, MCI_INTEGER,
     264"current track\0", 0x00000008L, MCI_INTEGER,
     265"\0", 0x00000000L, MCI_END_CONSTANT,
     266"track\0", 0x00000010L, MCI_INTEGER,
     267"start\0", 0x00000200L, MCI_FLAG,
     268"\0", 0x00000000L, MCI_END_COMMAND,
     269"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
     270"\0", 0x00000002L, MCI_RETURN,
     271"notify\0", 0x00000001L, MCI_FLAG,
     272"wait\0", 0x00000002L, MCI_FLAG,
     273"clv\0", 0x00010000L, MCI_FLAG,
     274"cav\0", 0x00020000L, MCI_FLAG,
     275"\0", 0x00000100L, MCI_CONSTANT,
     276"can record\0", 0x00000001L, MCI_INTEGER,
     277"has audio\0", 0x00000002L, MCI_INTEGER,
     278"has video\0", 0x00000003L, MCI_INTEGER,
     279"device type\0", 0x00000004L, MCI_INTEGER,
     280"uses files\0", 0x00000005L, MCI_INTEGER,
     281"compound device\0", 0x00000006L, MCI_INTEGER,
     282"can eject\0", 0x00000007L, MCI_INTEGER,
     283"can reverse\0", 0x00004002L, MCI_INTEGER,
     284"can play\0", 0x00000008L, MCI_INTEGER,
     285"can save\0", 0x00000009L, MCI_INTEGER,
     286"fast play rate\0", 0x00004003L, MCI_INTEGER,
     287"slow play rate\0", 0x00004004L, MCI_INTEGER,
     288"normal play rate\0", 0x00004005L, MCI_INTEGER,
     289"\0", 0x00000000L, MCI_END_CONSTANT,
     290"\0", 0x00000000L, MCI_END_COMMAND,
     291"escape\0", 0x00000805L, MCI_COMMAND_HEAD,
     292"notify\0", 0x00000001L, MCI_FLAG,
     293"wait\0", 0x00000002L, MCI_FLAG,
     294"\0", 0x00000100L, MCI_STRING,
     295"\0", 0x00000000L, MCI_END_COMMAND,
     296"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
     297"\0", 0x00000001L, MCI_RETURN,
     298"notify\0", 0x00000001L, MCI_FLAG,
     299"wait\0", 0x00000002L, MCI_FLAG,
     300"product\0", 0x00000100L, MCI_FLAG,
     301"identity\0", 0x00000800L, MCI_FLAG,
     302"\0", 0x00000000L, MCI_END_COMMAND,
     303"\0", 0x00000000L, MCI_END_COMMAND_LIST
     304END
     305
     306WAVEAUDIO RCDATA
     307BEGIN
     308"open\0", 0x00000803L, MCI_COMMAND_HEAD,
     309"\0", 0x00000002L, MCI_RETURN,
     310"notify\0", 0x00000001L, MCI_FLAG,
     311"wait\0", 0x00000002L, MCI_FLAG,
     312"type\0", 0x00002000L, MCI_STRING,
     313"element\0", 0x00000200L, MCI_STRING,
     314"alias\0", 0x00000400L, MCI_STRING,
     315"shareable\0", 0x00000100L, MCI_FLAG,
     316"buffer\0", 0x00010000L, MCI_INTEGER,
     317"\0", 0x00000000L, MCI_END_COMMAND,
     318"status\0", 0x00000814L, MCI_COMMAND_HEAD,
     319"\0", 0x00000002L, MCI_RETURN,
     320"notify\0", 0x00000001L, MCI_FLAG,
     321"wait\0", 0x00000002L, MCI_FLAG,
     322"\0", 0x00000100L, MCI_CONSTANT,
     323"position\0", 0x00000002L, MCI_INTEGER,
     324"length\0", 0x00000001L, MCI_INTEGER,
     325"number of tracks\0", 0x00000003L, MCI_INTEGER,
     326"media present\0", 0x00000005L, MCI_INTEGER,
     327"mode\0", 0x00000004L, MCI_INTEGER,
     328"format tag\0", 0x00004001L, MCI_INTEGER,
     329"channels\0", 0x00004002L, MCI_INTEGER,
     330"samplespersec\0", 0x00004003L, MCI_INTEGER,
     331"bytespersec\0", 0x00004004L, MCI_INTEGER,
     332"alignment\0", 0x00004005L, MCI_INTEGER,
     333"bitspersample\0", 0x00004006L, MCI_INTEGER,
     334"input\0", 0x00400000L, MCI_INTEGER,
     335"output\0", 0x00800000L, MCI_INTEGER,
     336"level\0", 0x00004007L, MCI_INTEGER,
     337"ready\0", 0x00000007L, MCI_INTEGER,
     338"time format\0", 0x00000006L, MCI_INTEGER,
     339"current track\0", 0x00000008L, MCI_INTEGER,
     340"\0", 0x00000000L, MCI_END_CONSTANT,
     341"track\0", 0x00000010L, MCI_INTEGER,
     342"start\0", 0x00000200L, MCI_FLAG,
     343"\0", 0x00000000L, MCI_END_COMMAND,
     344"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
     345"notify\0", 0x00000001L, MCI_FLAG,
     346"wait\0", 0x00000002L, MCI_FLAG,
     347"any input\0", 0x04000000L, MCI_FLAG,
     348"any output\0", 0x08000000L, MCI_FLAG,
     349"time format\0", 0x00000400L, MCI_CONSTANT,
     350"milliseconds\0", 0x00000000L, MCI_INTEGER,
     351"ms\0", 0x00000000L, MCI_INTEGER,
     352"bytes\0", 0x00000008L, MCI_INTEGER,
     353"samples\0", 0x00000009L, MCI_INTEGER,
     354"\0", 0x00000000L, MCI_END_CONSTANT,
     355"audio\0", 0x00000800L, MCI_CONSTANT,
     356"all\0", 0x00000000L, MCI_INTEGER,
     357"left\0", 0x00000001L, MCI_INTEGER,
     358"right\0", 0x00000002L, MCI_INTEGER,
     359"\0", 0x00000000L, MCI_END_CONSTANT,
     360"video\0", 0x00001000L, MCI_FLAG,
     361"on\0", 0x00002000L, MCI_FLAG,
     362"off\0", 0x00004000L, MCI_FLAG,
     363"door open\0", 0x00000100L, MCI_FLAG,
     364"door closed\0", 0x00000200L, MCI_FLAG,
     365"input\0", 0x00400000L, MCI_INTEGER,
     366"output\0", 0x00800000L, MCI_INTEGER,
     367"format tag\0", 0x00010000L, MCI_CONSTANT,
     368"pcm\0", 0x00000001L, MCI_INTEGER,
     369"\0", 0x00000000L, MCI_END_CONSTANT,
     370"channels\0", 0x00020000L, MCI_INTEGER,
     371"samplespersec\0", 0x00040000L, MCI_INTEGER,
     372"bytespersec\0", 0x00080000L, MCI_INTEGER,
     373"alignment\0", 0x00100000L, MCI_INTEGER,
     374"bitspersample\0", 0x00200000L, MCI_INTEGER,
     375"\0", 0x00000000L, MCI_END_COMMAND,
     376"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
     377"\0", 0x00000002L, MCI_RETURN,
     378"notify\0", 0x00000001L, MCI_FLAG,
     379"wait\0", 0x00000002L, MCI_FLAG,
     380"\0", 0x00000100L, MCI_CONSTANT,
     381"can record\0", 0x00000001L, MCI_INTEGER,
     382"has audio\0", 0x00000002L, MCI_INTEGER,
     383"has video\0", 0x00000003L, MCI_INTEGER,
     384"device type\0", 0x00000004L, MCI_INTEGER,
     385"uses files\0", 0x00000005L, MCI_INTEGER,
     386"compound device\0", 0x00000006L, MCI_INTEGER,
     387"can eject\0", 0x00000007L, MCI_INTEGER,
     388"can play\0", 0x00000008L, MCI_INTEGER,
     389"can save\0", 0x00000009L, MCI_INTEGER,
     390"inputs\0", 0x00004001L, MCI_INTEGER,
     391"outputs\0", 0x00004002L, MCI_INTEGER,
     392"\0", 0x00000000L, MCI_END_CONSTANT,
     393"\0", 0x00000000L, MCI_END_COMMAND,
     394"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
     395"\0", 0x00000001L, MCI_RETURN,
     396"notify\0", 0x00000001L, MCI_FLAG,
     397"wait\0", 0x00000002L, MCI_FLAG,
     398"product\0", 0x00000100L, MCI_FLAG,
     399"input\0", 0x00400000L, MCI_FLAG,
     400"output\0", 0x00800000L, MCI_FLAG,
     401"file\0", 0x00000200L, MCI_FLAG,
     402"\0", 0x00000000L, MCI_END_COMMAND,
     403"cue\0", 0x00000830L, MCI_COMMAND_HEAD,
     404"notify\0", 0x00000001L, MCI_FLAG,
     405"wait\0", 0x00000002L, MCI_FLAG,
     406"input\0", 0x00400000L, MCI_FLAG,
     407"output\0", 0x00800000L, MCI_FLAG,
     408"\0", 0x00000000L, MCI_END_COMMAND,
     409"delete\0", 0x00000856L, MCI_COMMAND_HEAD,
     410"notify\0", 0x00000001L, MCI_FLAG,
     411"wait\0", 0x00000002L, MCI_FLAG,
     412"from\0", 0x00000004L, MCI_INTEGER,
     413"to\0", 0x00000008L, MCI_INTEGER,
     414"\0", 0x00000000L, MCI_END_COMMAND,
     415"\0", 0x00000000L, MCI_END_COMMAND_LIST
     416END
     417
     418CDAUDIO RCDATA
     419BEGIN
     420"atus\0", 0x00000814L, MCI_COMMAND_HEAD,
     421"\0", 0x00000002L, MCI_RETURN,
     422"notify\0", 0x00000001L, MCI_FLAG,
     423"wait\0", 0x00000002L, MCI_FLAG,
     424"\0", 0x00000100L, MCI_CONSTANT,
     425"position\0", 0x00000002L, MCI_INTEGER,
     426"length\0", 0x00000001L, MCI_INTEGER,
     427"number of tracks\0", 0x00000003L, MCI_INTEGER,
     428"ready\0", 0x00000007L, MCI_INTEGER,
     429"mode\0", 0x00000004L, MCI_INTEGER,
     430"media present\0", 0x00000005L, MCI_INTEGER,
     431"time format\0", 0x00000006L, MCI_INTEGER,
     432"current track\0", 0x00000008L, MCI_INTEGER,
     433"type\0", 0x00004001L, MCI_INTEGER,
     434"\0", 0x00000000L, MCI_END_CONSTANT,
     435"track\0", 0x00000010L, MCI_INTEGER,
     436"start\0", 0x00000200L, MCI_FLAG,
     437"\0", 0x00000000L, MCI_END_COMMAND,
     438"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
     439"notify\0", 0x00000001L, MCI_FLAG,
     440"wait\0", 0x00000002L, MCI_FLAG,
     441"time format\0", 0x00000400L, MCI_CONSTANT,
     442"msf\0", 0x00000002L, MCI_INTEGER,
     443"tmsf\0", 0x0000000aL, MCI_INTEGER,
     444"milliseconds\0", 0x00000000L, MCI_INTEGER,
     445"ms\0", 0x00000000L, MCI_INTEGER,
     446"\0", 0x00000000L, MCI_END_CONSTANT,
     447"audio\0", 0x00000800L, MCI_CONSTANT,
     448"all\0", 0x00000000L, MCI_INTEGER,
     449"left\0", 0x00000001L, MCI_INTEGER,
     450"right\0", 0x00000002L, MCI_INTEGER,
     451"\0", 0x00000000L, MCI_END_CONSTANT,
     452"video\0", 0x00001000L, MCI_FLAG,
     453"on\0", 0x00002000L, MCI_FLAG,
     454"off\0", 0x00004000L, MCI_FLAG,
     455"door open\0", 0x00000100L, MCI_FLAG,
     456"door closed\0", 0x00000200L, MCI_FLAG,
     457"\0", 0x00000000L, MCI_END_COMMAND,
     458"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
     459"\0", 0x00000001L, MCI_RETURN,
     460"notify\0", 0x00000001L, MCI_FLAG,
     461"wait\0", 0x00000002L, MCI_FLAG,
     462"product\0", 0x00000100L, MCI_FLAG,
     463"upc\0", 0x00000400L, MCI_FLAG,
     464"identity\0", 0x00000800L, MCI_FLAG,
     465"\0", 0x00000000L, MCI_END_COMMAND,
     466"\0", 0x00000000L, MCI_END_COMMAND_LIST
     467END
     468
     469SEQUENCER RCDATA
     470BEGIN
     471"atus\0", 0x00000814L, MCI_COMMAND_HEAD,
     472"\0", 0x00000002L, MCI_RETURN,
     473"notify\0", 0x00000001L, MCI_FLAG,
     474"wait\0", 0x00000002L, MCI_FLAG,
     475"\0", 0x00000100L, MCI_CONSTANT,
     476"position\0", 0x00000002L, MCI_INTEGER,
     477"mode\0", 0x00000004L, MCI_INTEGER,
     478"length\0", 0x00000001L, MCI_INTEGER,
     479"number of tracks\0", 0x00000003L, MCI_INTEGER,
     480"media present\0", 0x00000005L, MCI_INTEGER,
     481"ready\0", 0x00000007L, MCI_INTEGER,
     482"tempo\0", 0x00004002L, MCI_INTEGER,
     483"port\0", 0x00004003L, MCI_INTEGER,
     484"slave\0", 0x00004007L, MCI_INTEGER,
     485"master\0", 0x00004008L, MCI_INTEGER,
     486"offset\0", 0x00004009L, MCI_INTEGER,
     487"division type\0", 0x0000400aL, MCI_INTEGER,
     488"time format\0", 0x00000006L, MCI_INTEGER,
     489"current track\0", 0x00000008L, MCI_INTEGER,
     490"\0", 0x00000000L, MCI_END_CONSTANT,
     491"track\0", 0x00000010L, MCI_INTEGER,
     492"start\0", 0x00000200L, MCI_FLAG,
     493"\0", 0x00000000L, MCI_END_COMMAND,
     494"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
     495"notify\0", 0x00000001L, MCI_FLAG,
     496"wait\0", 0x00000002L, MCI_FLAG,
     497"time format\0", 0x00000400L, MCI_CONSTANT,
     498"milliseconds\0", 0x00000000L, MCI_INTEGER,
     499"ms\0", 0x00000000L, MCI_INTEGER,
     500"smpte 30 drop\0", 0x00000007L, MCI_INTEGER,
     501"smpte 30\0", 0x00000006L, MCI_INTEGER,
     502"smpte 25\0", 0x00000005L, MCI_INTEGER,
     503"smpte 24\0", 0x00000004L, MCI_INTEGER,
     504"song pointer\0", 0x00004001L, MCI_INTEGER,
     505"\0", 0x00000000L, MCI_END_CONSTANT,
     506"audio\0", 0x00000800L, MCI_CONSTANT,
     507"all\0", 0x00000000L, MCI_INTEGER,
     508"left\0", 0x00000001L, MCI_INTEGER,
     509"right\0", 0x00000002L, MCI_INTEGER,
     510"\0", 0x00000000L, MCI_END_CONSTANT,
     511"video\0", 0x00001000L, MCI_FLAG,
     512"on\0", 0x00002000L, MCI_FLAG,
     513"off\0", 0x00004000L, MCI_FLAG,
     514"tempo\0", 0x00010000L, MCI_INTEGER,
     515"port\0", 0x00020000L, MCI_CONSTANT,
     516"none\0", 0x0000fffdL, MCI_INTEGER,
     517"mapper\0", 0x0000ffffL, MCI_INTEGER,
     518"\0", 0x00000000L, MCI_END_CONSTANT,
     519"slave\0", 0x00040000L, MCI_CONSTANT,
     520"smpte\0", 0x00004004L, MCI_INTEGER,
     521"midi\0", 0x00004003L, MCI_INTEGER,
     522"none\0", 0x0000fffdL, MCI_INTEGER,
     523"file\0", 0x00004002L, MCI_INTEGER,
     524"\0", 0x00000000L, MCI_END_CONSTANT,
     525"master\0", 0x00080000L, MCI_CONSTANT,
     526"smpte\0", 0x00004004L, MCI_INTEGER,
     527"midi\0", 0x00004003L, MCI_INTEGER,
     528"none\0", 0x0000fffdL, MCI_INTEGER,
     529"\0", 0x00000000L, MCI_END_CONSTANT,
     530"offset\0", 0x01000000L, MCI_INTEGER,
     531"door open\0", 0x00000100L, MCI_FLAG,
     532"door closed\0", 0x00000200L, MCI_FLAG,
     533"\0", 0x00000000L, MCI_END_COMMAND,
     534"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
     535"\0", 0x00000001L, MCI_RETURN,
     536"notify\0", 0x00000001L, MCI_FLAG,
     537"wait\0", 0x00000002L, MCI_FLAG,
     538"product\0", 0x00000100L, MCI_FLAG,
     539"file\0", 0x00000200L, MCI_FLAG,
     540"name\0", 0x00001000L, MCI_FLAG,
     541"copyright\0", 0x00002000L, MCI_FLAG,
     542"\0", 0x00000000L, MCI_END_COMMAND,
     543"\0", 0x00000000L, MCI_END_COMMAND_LIST
     544END
     545
     546ANIMATION RCDATA
     547BEGIN
     548"open\0", 0x00000803L, MCI_COMMAND_HEAD,
     549"\0", 0x00000002L, MCI_RETURN,
     550"notify\0", 0x00000001L, MCI_FLAG,
     551"wait\0", 0x00000002L, MCI_FLAG,
     552"type\0", 0x00002000L, MCI_STRING,
     553"element\0", 0x00000200L, MCI_STRING,
     554"alias\0", 0x00000400L, MCI_STRING,
     555"shareable\0", 0x00000100L, MCI_FLAG,
     556"style\0", 0x00010000L, MCI_CONSTANT,
     557"overlapped\0", 0x00cf0000L, MCI_INTEGER,
     558"popup\0", 0x80880000L, MCI_INTEGER,
     559"child\0", 0x40000000L, MCI_INTEGER,
     560"\0", 0x00000000L, MCI_END_CONSTANT,
     561"parent\0", 0x00020000L, MCI_INTEGER,
     562"nostatic\0", 0x00040000L, MCI_FLAG,
     563"\0", 0x00000000L, MCI_END_COMMAND,
     564"play\0", 0x00000806L, MCI_COMMAND_HEAD,
     565"notify\0", 0x00000001L, MCI_FLAG,
     566"wait\0", 0x00000002L, MCI_FLAG,
     567"from\0", 0x00000004L, MCI_INTEGER,
     568"to\0", 0x00000008L, MCI_INTEGER,
     569"fast\0", 0x00040000L, MCI_FLAG,
     570"slow\0", 0x00080000L, MCI_FLAG,
     571"scan\0", 0x00100000L, MCI_FLAG,
     572"reverse\0", 0x00020000L, MCI_FLAG,
     573"speed\0", 0x00010000L, MCI_INTEGER,
     574"\0", 0x00000000L, MCI_END_COMMAND,
     575"step\0", 0x0000080eL, MCI_COMMAND_HEAD,
     576"notify\0", 0x00000001L, MCI_FLAG,
     577"wait\0", 0x00000002L, MCI_FLAG,
     578"reverse\0", 0x00010000L, MCI_FLAG,
     579"by\0", 0x00020000L, MCI_INTEGER,
     580"\0", 0x00000000L, MCI_END_COMMAND,
     581"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
     582"notify\0", 0x00000001L, MCI_FLAG,
     583"wait\0", 0x00000002L, MCI_FLAG,
     584"time format\0", 0x00000400L, MCI_CONSTANT,
     585"milliseconds\0", 0x00000000L, MCI_INTEGER,
     586"ms\0", 0x00000000L, MCI_INTEGER,
     587"frames\0", 0x00000003L, MCI_INTEGER,
     588"\0", 0x00000000L, MCI_END_CONSTANT,
     589"audio\0", 0x00000800L, MCI_CONSTANT,
     590"all\0", 0x00000000L, MCI_INTEGER,
     591"left\0", 0x00000001L, MCI_INTEGER,
     592"right\0", 0x00000002L, MCI_INTEGER,
     593"\0", 0x00000000L, MCI_END_CONSTANT,
     594"video\0", 0x00001000L, MCI_FLAG,
     595"on\0", 0x00002000L, MCI_FLAG,
     596"off\0", 0x00004000L, MCI_FLAG,
     597"door open\0", 0x00000100L, MCI_FLAG,
     598"door closed\0", 0x00000200L, MCI_FLAG,
     599"\0", 0x00000000L, MCI_END_COMMAND,
     600"status\0", 0x00000814L, MCI_COMMAND_HEAD,
     601"\0", 0x00000002L, MCI_RETURN,
     602"notify\0", 0x00000001L, MCI_FLAG,
     603"wait\0", 0x00000002L, MCI_FLAG,
     604"\0", 0x00000100L, MCI_CONSTANT,
     605"position\0", 0x00000002L, MCI_INTEGER,
     606"length\0", 0x00000001L, MCI_INTEGER,
     607"number of tracks\0", 0x00000003L, MCI_INTEGER,
     608"mode\0", 0x00000004L, MCI_INTEGER,
     609"ready\0", 0x00000007L, MCI_INTEGER,
     610"speed\0", 0x00004001L, MCI_INTEGER,
     611"forward\0", 0x00004002L, MCI_INTEGER,
     612"window handle\0", 0x00004003L, MCI_INTEGER,
     613"palette handle\0", 0x00004004L, MCI_INTEGER,
     614"media present\0", 0x00000005L, MCI_INTEGER,
     615"time format\0", 0x00000006L, MCI_INTEGER,
     616"current track\0", 0x00000008L, MCI_INTEGER,
     617"stretch\0", 0x00004005L, MCI_INTEGER,
     618"\0", 0x00000000L, MCI_END_CONSTANT,
     619"track\0", 0x00000010L, MCI_INTEGER,
     620"start\0", 0x00000200L, MCI_FLAG,
     621"\0", 0x00000000L, MCI_END_COMMAND,
     622"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
     623"\0", 0x00000001L, MCI_RETURN,
     624"notify\0", 0x00000001L, MCI_FLAG,
     625"wait\0", 0x00000002L, MCI_FLAG,
     626"product\0", 0x00000100L, MCI_FLAG,
     627"file\0", 0x00000200L, MCI_FLAG,
     628"window text\0", 0x00010000L, MCI_FLAG,
     629"\0", 0x00000000L, MCI_END_COMMAND,
     630"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
     631"\0", 0x00000002L, MCI_RETURN,
     632"notify\0", 0x00000001L, MCI_FLAG,
     633"wait\0", 0x00000002L, MCI_FLAG,
     634"\0", 0x00000100L, MCI_CONSTANT,
     635"can record\0", 0x00000001L, MCI_INTEGER,
     636"has audio\0", 0x00000002L, MCI_INTEGER,
     637"has video\0", 0x00000003L, MCI_INTEGER,
     638"device type\0", 0x00000004L, MCI_INTEGER,
     639"uses files\0", 0x00000005L, MCI_INTEGER,
     640"compound device\0", 0x00000006L, MCI_INTEGER,
     641"can eject\0", 0x00000007L, MCI_INTEGER,
     642"can play\0", 0x00000008L, MCI_INTEGER,
     643"can save\0", 0x00000009L, MCI_INTEGER,
     644"can reverse\0", 0x00004001L, MCI_INTEGER,
     645"fast play rate\0", 0x00004002L, MCI_INTEGER,
     646"slow play rate\0", 0x00004003L, MCI_INTEGER,
     647"normal play rate\0", 0x00004004L, MCI_INTEGER,
     648"uses palettes\0", 0x00004006L, MCI_INTEGER,
     649"can stretch\0", 0x00004007L, MCI_INTEGER,
     650"windows\0", 0x00004008L, MCI_INTEGER,
     651"\0", 0x00000000L, MCI_END_CONSTANT,
     652"\0", 0x00000000L, MCI_END_COMMAND,
     653"realize\0", 0x00000840L, MCI_COMMAND_HEAD,
     654"notify\0", 0x00000001L, MCI_FLAG,
     655"wait\0", 0x00000002L, MCI_FLAG,
     656"normal\0", 0x00010000L, MCI_FLAG,
     657"background\0", 0x00020000L, MCI_FLAG,
     658"\0", 0x00000000L, MCI_END_COMMAND,
     659"window\0", 0x00000841L, MCI_COMMAND_HEAD,
     660"notify\0", 0x00000001L, MCI_FLAG,
     661"wait\0", 0x00000002L, MCI_FLAG,
     662"handle\0", 0x00010000L, MCI_CONSTANT,
     663"default\0", 0x00000000L, MCI_INTEGER,
     664"\0", 0x00000000L, MCI_END_CONSTANT,
     665"state\0", 0x00040000L, MCI_CONSTANT,
     666"hide\0", 0x00000000L, MCI_INTEGER,
     667"minimize\0", 0x00000006L, MCI_INTEGER,
     668"show\0", 0x00000005L, MCI_INTEGER,
     669"maximized\0", 0x00000003L, MCI_INTEGER,
     670"minimized\0", 0x00000002L, MCI_INTEGER,
     671"iconic\0", 0x00000007L, MCI_INTEGER,
     672"no action\0", 0x00000008L, MCI_INTEGER,
     673"no activate\0", 0x00000004L, MCI_INTEGER,
     674"normal\0", 0x00000001L, MCI_INTEGER,
     675"\0", 0x00000000L, MCI_END_CONSTANT,
     676"text\0", 0x00080000L, MCI_STRING,
     677"stretch\0", 0x00100000L, MCI_FLAG,
     678"fixed\0", 0x00200000L, MCI_FLAG,
     679"\0", 0x00000000L, MCI_END_COMMAND,
     680"put\0", 0x00000842L, MCI_COMMAND_HEAD,
     681"notify\0", 0x00000001L, MCI_FLAG,
     682"wait\0", 0x00000002L, MCI_FLAG,
     683"at\0", 0x00010000L, MCI_RECT,
     684"source\0", 0x00020000L, MCI_FLAG,
     685"destination\0", 0x00040000L, MCI_FLAG,
     686"\0", 0x00000000L, MCI_END_COMMAND,
     687"where\0", 0x00000843L, MCI_COMMAND_HEAD,
     688"\0", 0x00000007L, MCI_RETURN,
     689"notify\0", 0x00000001L, MCI_FLAG,
     690"wait\0", 0x00000002L, MCI_FLAG,
     691"source\0", 0x00020000L, MCI_FLAG,
     692"destination\0", 0x00040000L, MCI_FLAG,
     693"\0", 0x00000000L, MCI_END_COMMAND,
     694"update\0", 0x00000854L, MCI_COMMAND_HEAD,
     695"notify\0", 0x00000001L, MCI_FLAG,
     696"wait\0", 0x00000002L, MCI_FLAG,
     697"at\0", 0x00010000L, MCI_RECT,
     698"hdc\0", 0x00020000L, MCI_INTEGER,
     699"\0", 0x00000000L, MCI_END_COMMAND,
     700"\0", 0x00000000L, MCI_END_COMMAND_LIST
     701END
     702
     703OVERLAY RCDATA
     704BEGIN
     705"open\0", 0x00000803L, MCI_COMMAND_HEAD,
     706"\0", 0x00000002L, MCI_RETURN,
     707"notify\0", 0x00000001L, MCI_FLAG,
     708"wait\0", 0x00000002L, MCI_FLAG,
     709"type\0", 0x00002000L, MCI_STRING,
     710"element\0", 0x00000200L, MCI_STRING,
     711"alias\0", 0x00000400L, MCI_STRING,
     712"shareable\0", 0x00000100L, MCI_FLAG,
     713"style\0", 0x00010000L, MCI_CONSTANT,
     714"overlapped\0", 0x00cf0000L, MCI_INTEGER,
     715"popup\0", 0x80880000L, MCI_INTEGER,
     716"child\0", 0x40000000L, MCI_INTEGER,
     717"\0", 0x00000000L, MCI_END_CONSTANT,
     718"parent\0", 0x00020000L, MCI_INTEGER,
     719"\0", 0x00000000L, MCI_END_COMMAND,
     720"status\0", 0x00000814L, MCI_COMMAND_HEAD,
     721"\0", 0x00000002L, MCI_RETURN,
     722"notify\0", 0x00000001L, MCI_FLAG,
     723"wait\0", 0x00000002L, MCI_FLAG,
     724"\0", 0x00000100L, MCI_CONSTANT,
     725"position\0", 0x00000002L, MCI_INTEGER,
     726"length\0", 0x00000001L, MCI_INTEGER,
     727"number of tracks\0", 0x00000003L, MCI_INTEGER,
     728"mode\0", 0x00000004L, MCI_INTEGER,
     729"ready\0", 0x00000007L, MCI_INTEGER,
     730"window handle\0", 0x00004001L, MCI_INTEGER,
     731"media present\0", 0x00000005L, MCI_INTEGER,
     732"stretch\0", 0x00004002L, MCI_INTEGER,
     733"\0", 0x00000000L, MCI_END_CONSTANT,
     734"track\0", 0x00000010L, MCI_INTEGER,
     735"start\0", 0x00000200L, MCI_FLAG,
     736"\0", 0x00000000L, MCI_END_COMMAND,
     737"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
     738"\0", 0x00000001L, MCI_RETURN,
     739"notify\0", 0x00000001L, MCI_FLAG,
     740"wait\0", 0x00000002L, MCI_FLAG,
     741"product\0", 0x00000100L, MCI_FLAG,
     742"file\0", 0x00000200L, MCI_FLAG,
     743"window text\0", 0x00010000L, MCI_FLAG,
     744"\0", 0x00000000L, MCI_END_COMMAND,
     745"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
     746"\0", 0x00000002L, MCI_RETURN,
     747"notify\0", 0x00000001L, MCI_FLAG,
     748"wait\0", 0x00000002L, MCI_FLAG,
     749"\0", 0x00000100L, MCI_CONSTANT,
     750"can record\0", 0x00000001L, MCI_INTEGER,
     751"has audio\0", 0x00000002L, MCI_INTEGER,
     752"has video\0", 0x00000003L, MCI_INTEGER,
     753"device type\0", 0x00000004L, MCI_INTEGER,
     754"uses files\0", 0x00000005L, MCI_INTEGER,
     755"compound device\0", 0x00000006L, MCI_INTEGER,
     756"can eject\0", 0x00000007L, MCI_INTEGER,
     757"can play\0", 0x00000008L, MCI_INTEGER,
     758"can save\0", 0x00000009L, MCI_INTEGER,
     759"can stretch\0", 0x00004001L, MCI_INTEGER,
     760"can freeze\0", 0x00004002L, MCI_INTEGER,
     761"windows\0", 0x00004003L, MCI_INTEGER,
     762"\0", 0x00000000L, MCI_END_CONSTANT,
     763"\0", 0x00000000L, MCI_END_COMMAND,
     764"window\0", 0x00000841L, MCI_COMMAND_HEAD,
     765"notify\0", 0x00000001L, MCI_FLAG,
     766"wait\0", 0x00000002L, MCI_FLAG,
     767"handle\0", 0x00010000L, MCI_CONSTANT,
     768"default\0", 0x00000000L, MCI_INTEGER,
     769"\0", 0x00000000L, MCI_END_CONSTANT,
     770"state\0", 0x00040000L, MCI_CONSTANT,
     771"hide\0", 0x00000000L, MCI_INTEGER,
     772"minimize\0", 0x00000006L, MCI_INTEGER,
     773"show\0", 0x00000005L, MCI_INTEGER,
     774"maximized\0", 0x00000003L, MCI_INTEGER,
     775"minimized\0", 0x00000002L, MCI_INTEGER,
     776"iconic\0", 0x00000007L, MCI_INTEGER,
     777"no action\0", 0x00000008L, MCI_INTEGER,
     778"no activate\0", 0x00000004L, MCI_INTEGER,
     779"normal\0", 0x00000001L, MCI_INTEGER,
     780"\0", 0x00000000L, MCI_END_CONSTANT,
     781"text\0", 0x00080000L, MCI_STRING,
     782"stretch\0", 0x00100000L, MCI_FLAG,
     783"fixed\0", 0x00200000L, MCI_FLAG,
     784"\0", 0x00000000L, MCI_END_COMMAND,
     785"put\0", 0x00000842L, MCI_COMMAND_HEAD,
     786"notify\0", 0x00000001L, MCI_FLAG,
     787"wait\0", 0x00000002L, MCI_FLAG,
     788"at\0", 0x00010000L, MCI_RECT,
     789"source\0", 0x00020000L, MCI_FLAG,
     790"destination\0", 0x00040000L, MCI_FLAG,
     791"frame\0", 0x00080000L, MCI_FLAG,
     792"video\0", 0x00100000L, MCI_FLAG,
     793"\0", 0x00000000L, MCI_END_COMMAND,
     794"where\0", 0x00000843L, MCI_COMMAND_HEAD,
     795"\0", 0x00000007L, MCI_RETURN,
     796"notify\0", 0x00000001L, MCI_FLAG,
     797"wait\0", 0x00000002L, MCI_FLAG,
     798"source\0", 0x00020000L, MCI_FLAG,
     799"destination\0", 0x00040000L, MCI_FLAG,
     800"frame\0", 0x00080000L, MCI_FLAG,
     801"video\0", 0x00100000L, MCI_FLAG,
     802"\0", 0x00000000L, MCI_END_COMMAND,
     803"save\0", 0x00000813L, MCI_COMMAND_HEAD,
     804"notify\0", 0x00000001L, MCI_FLAG,
     805"wait\0", 0x00000002L, MCI_FLAG,
     806"\0", 0x00000100L, MCI_STRING,
     807"at\0", 0x00010000L, MCI_RECT,
     808"\0", 0x00000000L, MCI_END_COMMAND,
     809"load\0", 0x00000850L, MCI_COMMAND_HEAD,
     810"notify\0", 0x00000001L, MCI_FLAG,
     811"wait\0", 0x00000002L, MCI_FLAG,
     812"\0", 0x00000100L, MCI_STRING,
     813"at\0", 0x00010000L, MCI_RECT,
     814"\0", 0x00000000L, MCI_END_COMMAND,
     815"freeze\0", 0x00000844L, MCI_COMMAND_HEAD,
     816"notify\0", 0x00000001L, MCI_FLAG,
     817"wait\0", 0x00000002L, MCI_FLAG,
     818"at\0", 0x00010000L, MCI_RECT,
     819"\0", 0x00000000L, MCI_END_COMMAND,
     820"unfreeze\0", 0x00000845L, MCI_COMMAND_HEAD,
     821"notify\0", 0x00000001L, MCI_FLAG,
     822"wait\0", 0x00000002L, MCI_FLAG,
     823"at\0", 0x00010000L, MCI_RECT,
     824"\0", 0x00000000L, MCI_END_COMMAND,
     825"\0", 0x00000000L, MCI_END_COMMAND_LIST
     826END
     827
     828STRINGTABLE
     829BEGIN
     830
     831MCI_DEVTYPE_VCR,                "vcr"
     832MCI_DEVTYPE_VIDEODISC,          "videodisc"
     833MCI_DEVTYPE_OVERLAY,            "overlay"
     834MCI_DEVTYPE_CD_AUDIO,           "cdaudio"
     835MCI_DEVTYPE_DAT,                "dat"
     836MCI_DEVTYPE_SCANNER,            "scanner"
     837MCI_DEVTYPE_ANIMATION,          "animation"
     838MCI_DEVTYPE_DIGITAL_VIDEO,      "digitalvideo"
     839MCI_DEVTYPE_OTHER,              "other"
     840MCI_DEVTYPE_WAVEFORM_AUDIO,     "waveaudio"
     841MCI_DEVTYPE_SEQUENCER,          "sequencer"
     842
     843MCI_MODE_NOT_READY,             "not ready"
     844MCI_MODE_STOP,                  "stopped"
     845MCI_MODE_PLAY,                  "playing"
     846MCI_MODE_RECORD,                "recording"
     847MCI_MODE_SEEK,                  "seeking"
     848MCI_MODE_PAUSE,                 "paused"
     849MCI_MODE_OPEN,                  "open"
     850MCI_FALSE,                      "false"
     851MCI_TRUE,                       "true"
     852MCI_FORMAT_MILLISECONDS_S,      "milliseconds"
     853MCI_FORMAT_HMS_S,               "hms"
     854MCI_FORMAT_MSF_S,               "msf"
     855MCI_FORMAT_FRAMES_S,            "frames"
     856MCI_FORMAT_SMPTE_24_S,          "smpte 24"
     857MCI_FORMAT_SMPTE_25_S,          "smpte 25"
     858MCI_FORMAT_SMPTE_30_S,          "smpte 30"
     859MCI_FORMAT_SMPTE_30DROP_S,      "smpte 30 drop"
     860MCI_FORMAT_BYTES_S,             "bytes"
     861MCI_FORMAT_SAMPLES_S,           "samples"
     862MCI_FORMAT_TMSF_S,              "tmsf"
     863
     864MCI_VD_MODE_PARK,               "parked"
     865MCI_VD_MEDIA_CLV,               "CLV"
     866MCI_VD_MEDIA_CAV,               "CAV"
     867MCI_VD_MEDIA_OTHER              "other"
     868
     869MCI_VD_FORMAT_TRACK_S,          "track"
     870
     871MCI_SEQ_DIV_PPQN,               "PPQN"
     872MCI_SEQ_DIV_SMPTE_24            "SMPTE 24 Frame"
     873MCI_SEQ_DIV_SMPTE_25            "SMPTE 25 Frame"
     874MCI_SEQ_DIV_SMPTE_30DROP        "SMPTE 30 Drop Frame"
     875MCI_SEQ_DIV_SMPTE_30            "SMPTE 30 Frame"
     876
     877MCI_SEQ_FILE_S,                 "file"
     878MCI_SEQ_MIDI_S,                 "midi"
     879MCI_SEQ_SMPTE_S,                "smpte"
     880MCI_SEQ_FORMAT_SONGPTR_S,       "song pointer"
     881MCI_SEQ_NONE_S,                 "none"
     882MCI_SEQ_MAPPER_S,               "mapper"
     883WAVE_FORMAT_PCM_S,              "pcm"
     884WAVE_MAPPER_S,                  "mapper"
     885END
     886
     887
     888
     889
     890
     891
     892
     893
     894
     895
     896
     897
Note: See TracChangeset for help on using the changeset viewer.