windows-nt/Source/XPSP1/NT/multimedia/media/winmm/mci.h
2020-09-26 16:20:57 +08:00

305 lines
11 KiB
C

/***************************************************************************
* 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))