|
|
/***************************************************************************
* mci.h * * Copyright (c) 1990-1998 Microsoft Corporation * * private include file * * History * * 17 Mar 92 - SteveDav - private file for MCI use * 30 Apr 92 - StephenE - Converted to Unicode * ***************************************************************************/
extern CRITICAL_SECTION mciCritSec; // used to protect process global mci variables
extern UINT cmciCritSec; // enter'ed count
extern UINT uCritSecOwner; // thread id of critical section owner
#define IDI_MCIHWND 100
#define MCI_GLOBAL_PROCESS "MCIHWND.EXE"
#define MCI_SERVER_NAME "MMSNDSRV"
#define SND_FREE 0x80000000
#ifndef DOSWIN32
BOOL ServerInit(VOID); #endif
extern BOOL CreatehwndNotify(VOID);
#if DBG
// Use mciCheckIn to check that we are within the critical section,
// mciCheckOut that we are not in the critical section. Neither
// routine does anything on the free build.
#define mciCheckIn() (WinAssert(uCritSecOwner==GetCurrentThreadId()))
#define mciCheckOut() (WinAssert(uCritSecOwner!=GetCurrentThreadId()))
#define mciEnter(id) dprintf4(("Entering MCI crit sec at %s Current count is %d", id, cmciCritSec)); \
EnterCriticalSection(&mciCritSec), \ uCritSecOwner=GetCurrentThreadId(), \ ++cmciCritSec
#define mciLeave(id) dprintf4(("Leaving MCI crit sec at %s", id)); mciCheckIn(); if(!--cmciCritSec) uCritSecOwner=0; LeaveCriticalSection(&mciCritSec)
#else
// No counting or messages in the retail build
#define mciCheckIn()
#define mciCheckOut()
#define mciEnter(id) EnterCriticalSection(&mciCritSec)
#define mciLeave(id) LeaveCriticalSection(&mciCritSec)
#endif
#define mciFirstEnter(id) { mciCheckOut(); mciEnter(id);}
//
// Define the name of a handler entry point
//
#define MCI_HANDLER_PROC_NAME "DriverProc"
//
// Typedef the entry routine for a driver
//
typedef LONG (HANDLERPROC)(DWORD dwId, UINT msg, LONG lp1, LONG lp2); typedef HANDLERPROC *LPHANDLERPROC;
//
// MCI driver info structure
//
#define MCI_HANDLER_KEY 0x49434D48 // "MCIH"
typedef struct _MCIHANDLERINFO { DWORD dwKey; HANDLE hModule; LPHANDLERPROC lpHandlerProc; DWORD dwOpenId;
} MCIHANDLERINFO, *LPMCIHANDLERINFO;
#ifndef MMNOMCI
#define SetMCIEvent(h) SetEvent(h);
#define ResetMCIEvent(h) ResetEvent(h);
#define LockMCIGlobal EnterCriticalSection(&mciGlobalCritSec);
#define UnlockMCIGlobal LeaveCriticalSection(&mciGlobalCritSec);
// Although having two unicode file name may make this structure fairly
// large it is still less than a page.
typedef struct tagGlobalMci { UINT msg; // Function required
DWORD dwFlags; // sndPlaySound flags
LPCWSTR lszSound; //
WCHAR szSound[MAX_PATH]; //
WCHAR szDefaultSound[MAX_PATH]; // Default sound
} GLOBALMCI, * PGLOBALMCI;
extern PGLOBALMCI base; extern HANDLE hEvent;
/****************************************************************************
MCI support
****************************************************************************/
#define ID_CORE_TABLE 200
#define MCI_VALID_DEVICE_ID(wID) ((wID) > 0 && (wID) < MCI_wNextDeviceID && MCI_lpDeviceList[wID])
// Make sure that no MCI command has more than this number of DWORD parameters
#define MCI_MAX_PARAM_SLOTS 20
/******* WARNING ******** Ascii specific ************************************/ #define MCI_TOLOWER(c) ((WCHAR)((c) >= 'A' && (c) <= 'Z' ? (c) + 0x20 : (c)))
/****************************************************************************/
typedef struct tagCOMMAND_TABLE_TYPE { HANDLE hResource; HANDLE hModule; /* If not NULL then free module */ /* when device is free'd */ UINT wType; PUINT lpwIndex; LPWSTR lpResource; #if DBG
UINT wLockCount; /* Used for debugging */ #endif
} COMMAND_TABLE_TYPE;
typedef struct tagMCI_DEVICE_NODE { LPWSTR lpstrName; /* The name used in subsequent calls to */ /* mciSendString to refer to the device */ LPWSTR lpstrInstallName;/* The device name from system.ini */ DWORD dwMCIOpenFlags; /* Flags set on open may be: */ /* MCI_OPEN_ELEMENT_ID */ /* */ DWORD_PTR lpDriverData; /* DWORD of driver instance data */ DWORD dwElementID; /* The element ID set by MCI_OPEN_ELEMENT_ID */ YIELDPROC fpYieldProc; /* The current yield procedure if any */ DWORD dwYieldData; /* Data send to the current yield procedure */ MCIDEVICEID wDeviceID; /* The ID used in subsequent calls to */ /* mciSendCommand to refer to the device */ UINT wDeviceType; /* The type returned from the DRV_OPEN call */ /* MCI_OPEN_SHAREABLE */ /* MCI_OPEN_ELEMENT_ID */ UINT wCommandTable; /* The device type specific command table */ UINT wCustomCommandTable; /* The custom device command table if */ /* any (-1 if none) */ HANDLE hDriver; /* Module instance handle for the driver */ HTASK hCreatorTask; /* The task context the device is in */ HTASK hOpeningTask; /* The task context which sent the open command */ HANDLE hDrvDriver; /* The installable driver handle */ DWORD dwMCIFlags; /* General flags for this node */ } MCI_DEVICE_NODE; typedef MCI_DEVICE_NODE *LPMCI_DEVICE_NODE;
/* Defines for dwMCIFlags */ #define MCINODE_ISCLOSING 0x00000001 /* Set during close to lock out other commands */
#define MCINODE_ISAUTOCLOSING 0x00010000 /* Set during auto-close to lock out other */
/* commands except an internally generated close */ #define MCINODE_ISAUTOOPENED 0x00020000 /* Device was auto opened */
#define MCINODE_16BIT_DRIVER 0x80000000 // Device is a 16-bit driver
// Macros for accessing the flag bits. Using macros is not normally my
// idea of fun, but this case seems to be justified on the grounds of
// being able to maintain control over who is accessing the flags values.
// Note that the flag value are only needed in the header file.
#define ISCLOSING(node) (((node)->dwMCIFlags) & MCINODE_ISCLOSING)
#define ISAUTOCLOSING(node) (((node)->dwMCIFlags) & MCINODE_ISAUTOCLOSING)
#define ISAUTOOPENED(node) (((node)->dwMCIFlags) & MCINODE_ISAUTOOPENED)
#define SETAUTOCLOSING(node) (((node)->dwMCIFlags) |= MCINODE_ISAUTOCLOSING)
#define SETISCLOSING(node) (((node)->dwMCIFlags) |= MCINODE_ISCLOSING)
typedef struct { LPWSTR lpstrParams; LPWSTR *lpstrPointerList; HANDLE hCallingTask; UINT wParsingError; } MCI_INTERNAL_OPEN_INFO; typedef MCI_INTERNAL_OPEN_INFO *LPMCI_INTERNAL_OPEN_INFO;
typedef struct tagMCI_SYSTEM_MESSAGE { LPWSTR lpstrCommand; DWORD dwAdditionalFlags; /* Used by mciAutoOpenDevice to request */ /* Notify */ LPWSTR lpstrReturnString; UINT uReturnLength; HANDLE hCallingTask; LPWSTR lpstrNewDirectory; /* The current directory of the calling */ /* task - includes the drive letter */ } MCI_SYSTEM_MESSAGE; typedef MCI_SYSTEM_MESSAGE *LPMCI_SYSTEM_MESSAGE;
#define MCI_INIT_DEVICE_LIST_SIZE 4
#define MCI_DEVICE_LIST_GROW_SIZE 4
#define MAX_COMMAND_TABLES 20
extern BOOL MCI_bDeviceListInitialized;
extern LPMCI_DEVICE_NODE *MCI_lpDeviceList; extern UINT MCI_wDeviceListSize;
extern MCIDEVICEID MCI_wNextDeviceID; /* the next device ID to use for a new device */
extern COMMAND_TABLE_TYPE command_tables[MAX_COMMAND_TABLES];
#define mciToLower(lpstrString) CharLower(lpstrString)
extern BOOL mciGlobalInit(void); extern BOOL mciSoundInit(void);
extern BOOL mciInitDeviceList(void);
extern UINT mciOpenDevice( DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenParms, LPMCI_INTERNAL_OPEN_INFO lpOpenInfo);
extern UINT mciCloseDevice( MCIDEVICEID wID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpGeneric, BOOL bCloseDriver);
extern UINT mciLoadTableType(UINT wType);
extern LPWSTR FindCommandInTable (UINT wTable, LPCWSTR lpstrCommand, PUINT lpwMessage);
extern UINT mciEatToken (LPCWSTR *lplpstrInput, WCHAR cSeparater, LPWSTR *lplpstrOutput, BOOL bMustFind);
extern LPWSTR FindCommandItem (MCIDEVICEID wDeviceID, LPCWSTR lpstrType, LPCWSTR lpstrCommand, PUINT lpwMessage, PUINT lpwTable);
extern UINT mciParseParams (UINT uMessage, LPCWSTR lpstrParams, LPCWSTR lpCommandList, LPDWORD lpdwFlags, LPWSTR lpOutputParams, UINT wParamsSize, LPWSTR **lpPointerList, PUINT lpwParsingError);
extern UINT mciParseCommand (MCIDEVICEID wDeviceID, LPWSTR lpstrCommand, LPCWSTR lpstrDeviceName, LPWSTR *lpCommandList, PUINT lpwTable);
extern VOID mciParserFree (LPWSTR *lpstrPointerList);
extern UINT mciEatCommandEntry(LPCWSTR lpEntry, LPDWORD lpValue, PUINT lpID);
extern UINT mciGetParamSize (DWORD dwValue, UINT wID);
extern DWORD mciSysinfo (MCIDEVICEID wDeviceID, DWORD dwFlags, LPMCI_SYSINFO_PARMSW lpSysinfo); extern UINT mciLookUpType (LPCWSTR lpstrTypeName);
extern BOOL mciExtractDeviceType (LPCWSTR lpstrDeviceName, LPWSTR lpstrDeviceType, UINT uBufLen); extern BOOL mciUnlockCommandTable (UINT wCommandTable);
extern UINT mciSetBreakKey (MCIDEVICEID wDeviceID, int nVirtKey, HWND hwndTrap);
/***************************************************************************
MCI memory allocation
***************************************************************************/
#define mciAlloc(cb) winmmAlloc((DWORD)(cb))
#define mciReAlloc(ptr, cb) winmmReAlloc((PVOID)(ptr), (DWORD)(cb))
#define mciFree(ptr) winmmFree((PVOID)(ptr))
/*
// Random stuff for MCI
*/
extern DWORD mciRelaySystemString (LPMCI_SYSTEM_MESSAGE lpMessage); void MciNotify(DWORD wParam, LONG lParam); // in MCI.C
#endif // MMNOMCI
/*
// Some defines introduced to avoid signed/unsigned compares - and to
// remove the need for absolute constants in the code
*/
#define MCI_ERROR_VALUE ((UINT)(-1))
|