From 5e04ada19652e79bc90a881c198979980c2f5cf4 Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 7 Sep 2006 17:57:24 +0000 Subject: [PATCH] add directx files to remove sdk dependencies. dunno if this is the right thing to do, but it will get more people compiling forn ow --- src/drivers/win/ddraw.h | 5792 ++++++++++++++++++++++++++++++++++ src/drivers/win/dinput.h | 4417 ++++++++++++++++++++++++++ src/drivers/win/dsound.h | 2358 ++++++++++++++ src/drivers/win/input.cpp | 2 +- src/drivers/win/joystick.cpp | 2 +- src/drivers/win/keyboard.cpp | 2 +- src/drivers/win/main.cpp | 6 +- vc8/fceux.vcproj | 4 +- vc_libs/x86/ddraw.lib | Bin 0 -> 4540 bytes vc_libs/x86/dinput.lib | Bin 0 -> 161464 bytes vc_libs/x86/dsound.lib | Bin 0 -> 4042 bytes vc_libs/x86/dxguid.lib | Bin 0 -> 565850 bytes 12 files changed, 12575 insertions(+), 8 deletions(-) create mode 100644 src/drivers/win/ddraw.h create mode 100644 src/drivers/win/dinput.h create mode 100644 src/drivers/win/dsound.h create mode 100644 vc_libs/x86/ddraw.lib create mode 100644 vc_libs/x86/dinput.lib create mode 100644 vc_libs/x86/dsound.lib create mode 100644 vc_libs/x86/dxguid.lib diff --git a/src/drivers/win/ddraw.h b/src/drivers/win/ddraw.h new file mode 100644 index 00000000..0f204f84 --- /dev/null +++ b/src/drivers/win/ddraw.h @@ -0,0 +1,5792 @@ +/*==========================================================================; + * + * Copyright (C) Microsoft Corporation. All Rights Reserved. + * + * File: ddraw.h + * Content: DirectDraw include file + * + ***************************************************************************/ + +#ifndef __DDRAW_INCLUDED__ +#define __DDRAW_INCLUDED__ + +//Disable the nameless union warning when building internally +#undef ENABLE_NAMELESS_UNION_PRAGMA +#ifdef DIRECTX_REDIST +#define ENABLE_NAMELESS_UNION_PRAGMA +#endif + +#ifdef ENABLE_NAMELESS_UNION_PRAGMA +#pragma warning(disable:4201) +#endif + +/* + * If you wish an application built against the newest version of DirectDraw + * to run against an older DirectDraw run time then define DIRECTDRAW_VERSION + * to be the earlies version of DirectDraw you wish to run against. For, + * example if you wish an application to run against a DX 3 runtime define + * DIRECTDRAW_VERSION to be 0x0300. + */ +#ifndef DIRECTDRAW_VERSION +#define DIRECTDRAW_VERSION 0x0700 +#endif /* DIRECTDRAW_VERSION */ + +#if defined( _WIN32 ) && !defined( _NO_COM ) +#define COM_NO_WINDOWS_H +#include +#else +#define IUnknown void +#if !defined( NT_BUILD_ENVIRONMENT ) && !defined(WINNT) + #define CO_E_NOTINITIALIZED 0x800401F0L +#endif +#endif + +#define _FACDD 0x876 +#define MAKE_DDHRESULT( code ) MAKE_HRESULT( 1, _FACDD, code ) + +#ifdef __cplusplus +extern "C" { +#endif + +// +// For compilers that don't support nameless unions, do a +// +// #define NONAMELESSUNION +// +// before #include +// +#ifndef DUMMYUNIONNAMEN +#if defined(__cplusplus) || !defined(NONAMELESSUNION) +#define DUMMYUNIONNAMEN(n) +#else +#define DUMMYUNIONNAMEN(n) u##n +#endif +#endif + +#ifndef MAKEFOURCC + #define MAKEFOURCC(ch0, ch1, ch2, ch3) \ + ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \ + ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 )) +#endif //defined(MAKEFOURCC) + +/* + * FOURCC codes for DX compressed-texture pixel formats + */ +#define FOURCC_DXT1 (MAKEFOURCC('D','X','T','1')) +#define FOURCC_DXT2 (MAKEFOURCC('D','X','T','2')) +#define FOURCC_DXT3 (MAKEFOURCC('D','X','T','3')) +#define FOURCC_DXT4 (MAKEFOURCC('D','X','T','4')) +#define FOURCC_DXT5 (MAKEFOURCC('D','X','T','5')) + +/* + * GUIDS used by DirectDraw objects + */ +#if defined( _WIN32 ) && !defined( _NO_COM ) + +DEFINE_GUID( CLSID_DirectDraw, 0xD7B70EE0,0x4340,0x11CF,0xB0,0x63,0x00,0x20,0xAF,0xC2,0xCD,0x35 ); +DEFINE_GUID( CLSID_DirectDraw7, 0x3c305196,0x50db,0x11d3,0x9c,0xfe,0x00,0xc0,0x4f,0xd9,0x30,0xc5 ); +DEFINE_GUID( CLSID_DirectDrawClipper, 0x593817A0,0x7DB3,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xb9,0x33,0x56 ); +DEFINE_GUID( IID_IDirectDraw, 0x6C14DB80,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 ); +DEFINE_GUID( IID_IDirectDraw2, 0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56 ); +DEFINE_GUID( IID_IDirectDraw4, 0x9c59509a,0x39bd,0x11d1,0x8c,0x4a,0x00,0xc0,0x4f,0xd9,0x30,0xc5 ); +DEFINE_GUID( IID_IDirectDraw7, 0x15e65ec0,0x3b9c,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b ); +DEFINE_GUID( IID_IDirectDrawSurface, 0x6C14DB81,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 ); +DEFINE_GUID( IID_IDirectDrawSurface2, 0x57805885,0x6eec,0x11cf,0x94,0x41,0xa8,0x23,0x03,0xc1,0x0e,0x27 ); +DEFINE_GUID( IID_IDirectDrawSurface3, 0xDA044E00,0x69B2,0x11D0,0xA1,0xD5,0x00,0xAA,0x00,0xB8,0xDF,0xBB ); +DEFINE_GUID( IID_IDirectDrawSurface4, 0x0B2B8630,0xAD35,0x11D0,0x8E,0xA6,0x00,0x60,0x97,0x97,0xEA,0x5B ); +DEFINE_GUID( IID_IDirectDrawSurface7, 0x06675a80,0x3b9b,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b ); +DEFINE_GUID( IID_IDirectDrawPalette, 0x6C14DB84,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 ); +DEFINE_GUID( IID_IDirectDrawClipper, 0x6C14DB85,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 ); +DEFINE_GUID( IID_IDirectDrawColorControl, 0x4B9F0EE0,0x0D7E,0x11D0,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8 ); +DEFINE_GUID( IID_IDirectDrawGammaControl, 0x69C11C3E,0xB46B,0x11D1,0xAD,0x7A,0x00,0xC0,0x4F,0xC2,0x9B,0x4E ); + +#endif + +/*============================================================================ + * + * DirectDraw Structures + * + * Various structures used to invoke DirectDraw. + * + *==========================================================================*/ + +struct IDirectDraw; +struct IDirectDrawSurface; +struct IDirectDrawPalette; +struct IDirectDrawClipper; + +typedef struct IDirectDraw FAR *LPDIRECTDRAW; +typedef struct IDirectDraw2 FAR *LPDIRECTDRAW2; +typedef struct IDirectDraw4 FAR *LPDIRECTDRAW4; +typedef struct IDirectDraw7 FAR *LPDIRECTDRAW7; +typedef struct IDirectDrawSurface FAR *LPDIRECTDRAWSURFACE; +typedef struct IDirectDrawSurface2 FAR *LPDIRECTDRAWSURFACE2; +typedef struct IDirectDrawSurface3 FAR *LPDIRECTDRAWSURFACE3; +typedef struct IDirectDrawSurface4 FAR *LPDIRECTDRAWSURFACE4; +typedef struct IDirectDrawSurface7 FAR *LPDIRECTDRAWSURFACE7; +typedef struct IDirectDrawPalette FAR *LPDIRECTDRAWPALETTE; +typedef struct IDirectDrawClipper FAR *LPDIRECTDRAWCLIPPER; +typedef struct IDirectDrawColorControl FAR *LPDIRECTDRAWCOLORCONTROL; +typedef struct IDirectDrawGammaControl FAR *LPDIRECTDRAWGAMMACONTROL; + +typedef struct _DDFXROP FAR *LPDDFXROP; +typedef struct _DDSURFACEDESC FAR *LPDDSURFACEDESC; +typedef struct _DDSURFACEDESC2 FAR *LPDDSURFACEDESC2; +typedef struct _DDCOLORCONTROL FAR *LPDDCOLORCONTROL; + +/* + * API's + */ +#if (defined (WIN32) || defined( _WIN32 ) ) && !defined( _NO_COM ) +//#if defined( _WIN32 ) && !defined( _NO_ENUM ) + typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKA)(GUID FAR *, LPSTR, LPSTR, LPVOID); + typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKW)(GUID FAR *, LPWSTR, LPWSTR, LPVOID); + extern HRESULT WINAPI DirectDrawEnumerateW( LPDDENUMCALLBACKW lpCallback, LPVOID lpContext ); + extern HRESULT WINAPI DirectDrawEnumerateA( LPDDENUMCALLBACKA lpCallback, LPVOID lpContext ); + /* + * Protect against old SDKs + */ + #if !defined(HMONITOR_DECLARED) && (WINVER < 0x0500) + #define HMONITOR_DECLARED + DECLARE_HANDLE(HMONITOR); + #endif + typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKEXA)(GUID FAR *, LPSTR, LPSTR, LPVOID, HMONITOR); + typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKEXW)(GUID FAR *, LPWSTR, LPWSTR, LPVOID, HMONITOR); + extern HRESULT WINAPI DirectDrawEnumerateExW( LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags); + extern HRESULT WINAPI DirectDrawEnumerateExA( LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags); + typedef HRESULT (WINAPI * LPDIRECTDRAWENUMERATEEXA)( LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags); + typedef HRESULT (WINAPI * LPDIRECTDRAWENUMERATEEXW)( LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags); + + #ifdef UNICODE + typedef LPDDENUMCALLBACKW LPDDENUMCALLBACK; + #define DirectDrawEnumerate DirectDrawEnumerateW + typedef LPDDENUMCALLBACKEXW LPDDENUMCALLBACKEX; + typedef LPDIRECTDRAWENUMERATEEXW LPDIRECTDRAWENUMERATEEX; + #define DirectDrawEnumerateEx DirectDrawEnumerateExW + #else + typedef LPDDENUMCALLBACKA LPDDENUMCALLBACK; + #define DirectDrawEnumerate DirectDrawEnumerateA + typedef LPDDENUMCALLBACKEXA LPDDENUMCALLBACKEX; + typedef LPDIRECTDRAWENUMERATEEXA LPDIRECTDRAWENUMERATEEX; + #define DirectDrawEnumerateEx DirectDrawEnumerateExA + #endif + extern HRESULT WINAPI DirectDrawCreate( GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter ); + extern HRESULT WINAPI DirectDrawCreateEx( GUID FAR * lpGuid, LPVOID *lplpDD, REFIID iid,IUnknown FAR *pUnkOuter ); + extern HRESULT WINAPI DirectDrawCreateClipper( DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR *lplpDDClipper, IUnknown FAR *pUnkOuter ); +#endif +/* + * Flags for DirectDrawEnumerateEx + * DirectDrawEnumerateEx supercedes DirectDrawEnumerate. You must use GetProcAddress to + * obtain a function pointer (of type LPDIRECTDRAWENUMERATEEX) to DirectDrawEnumerateEx. + * By default, only the primary display device is enumerated. + * DirectDrawEnumerate is equivalent to DirectDrawEnumerate(,,DDENUM_NONDISPLAYDEVICES) + */ + +/* + * This flag causes enumeration of any GDI display devices which are part of + * the Windows Desktop + */ +#define DDENUM_ATTACHEDSECONDARYDEVICES 0x00000001L + +/* + * This flag causes enumeration of any GDI display devices which are not + * part of the Windows Desktop + */ +#define DDENUM_DETACHEDSECONDARYDEVICES 0x00000002L + +/* + * This flag causes enumeration of non-display devices + */ +#define DDENUM_NONDISPLAYDEVICES 0x00000004L + + +#define REGSTR_KEY_DDHW_DESCRIPTION "Description" +#define REGSTR_KEY_DDHW_DRIVERNAME "DriverName" +#define REGSTR_PATH_DDHW "Hardware\\DirectDrawDrivers" + +#define DDCREATE_HARDWAREONLY 0x00000001l +#define DDCREATE_EMULATIONONLY 0x00000002l + +#if defined(WINNT) || !defined(WIN32) +typedef long HRESULT; +#endif + +//#ifndef WINNT +typedef HRESULT (FAR PASCAL * LPDDENUMMODESCALLBACK)(LPDDSURFACEDESC, LPVOID); +typedef HRESULT (FAR PASCAL * LPDDENUMMODESCALLBACK2)(LPDDSURFACEDESC2, LPVOID); +typedef HRESULT (FAR PASCAL * LPDDENUMSURFACESCALLBACK)(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, LPVOID); +typedef HRESULT (FAR PASCAL * LPDDENUMSURFACESCALLBACK2)(LPDIRECTDRAWSURFACE4, LPDDSURFACEDESC2, LPVOID); +typedef HRESULT (FAR PASCAL * LPDDENUMSURFACESCALLBACK7)(LPDIRECTDRAWSURFACE7, LPDDSURFACEDESC2, LPVOID); +//#endif + +/* + * Generic pixel format with 8-bit RGB and alpha components + */ +typedef struct _DDARGB +{ + BYTE blue; + BYTE green; + BYTE red; + BYTE alpha; +} DDARGB; + +typedef DDARGB FAR *LPDDARGB; + +/* + * This version of the structure remains for backwards source compatibility. + * The DDARGB structure is the one that should be used for all DirectDraw APIs. + */ +typedef struct _DDRGBA +{ + BYTE red; + BYTE green; + BYTE blue; + BYTE alpha; +} DDRGBA; + +typedef DDRGBA FAR *LPDDRGBA; + + +/* + * DDCOLORKEY + */ +typedef struct _DDCOLORKEY +{ + DWORD dwColorSpaceLowValue; // low boundary of color space that is to + // be treated as Color Key, inclusive + DWORD dwColorSpaceHighValue; // high boundary of color space that is + // to be treated as Color Key, inclusive +} DDCOLORKEY; + +typedef DDCOLORKEY FAR* LPDDCOLORKEY; + +/* + * DDBLTFX + * Used to pass override information to the DIRECTDRAWSURFACE callback Blt. + */ +typedef struct _DDBLTFX +{ + DWORD dwSize; // size of structure + DWORD dwDDFX; // FX operations + DWORD dwROP; // Win32 raster operations + DWORD dwDDROP; // Raster operations new for DirectDraw + DWORD dwRotationAngle; // Rotation angle for blt + DWORD dwZBufferOpCode; // ZBuffer compares + DWORD dwZBufferLow; // Low limit of Z buffer + DWORD dwZBufferHigh; // High limit of Z buffer + DWORD dwZBufferBaseDest; // Destination base value + DWORD dwZDestConstBitDepth; // Bit depth used to specify Z constant for destination + union + { + DWORD dwZDestConst; // Constant to use as Z buffer for dest + LPDIRECTDRAWSURFACE lpDDSZBufferDest; // Surface to use as Z buffer for dest + } DUMMYUNIONNAMEN(1); + DWORD dwZSrcConstBitDepth; // Bit depth used to specify Z constant for source + union + { + DWORD dwZSrcConst; // Constant to use as Z buffer for src + LPDIRECTDRAWSURFACE lpDDSZBufferSrc; // Surface to use as Z buffer for src + } DUMMYUNIONNAMEN(2); + DWORD dwAlphaEdgeBlendBitDepth; // Bit depth used to specify constant for alpha edge blend + DWORD dwAlphaEdgeBlend; // Alpha for edge blending + DWORD dwReserved; + DWORD dwAlphaDestConstBitDepth; // Bit depth used to specify alpha constant for destination + union + { + DWORD dwAlphaDestConst; // Constant to use as Alpha Channel + LPDIRECTDRAWSURFACE lpDDSAlphaDest; // Surface to use as Alpha Channel + } DUMMYUNIONNAMEN(3); + DWORD dwAlphaSrcConstBitDepth; // Bit depth used to specify alpha constant for source + union + { + DWORD dwAlphaSrcConst; // Constant to use as Alpha Channel + LPDIRECTDRAWSURFACE lpDDSAlphaSrc; // Surface to use as Alpha Channel + } DUMMYUNIONNAMEN(4); + union + { + DWORD dwFillColor; // color in RGB or Palettized + DWORD dwFillDepth; // depth value for z-buffer + DWORD dwFillPixel; // pixel value for RGBA or RGBZ + LPDIRECTDRAWSURFACE lpDDSPattern; // Surface to use as pattern + } DUMMYUNIONNAMEN(5); + DDCOLORKEY ddckDestColorkey; // DestColorkey override + DDCOLORKEY ddckSrcColorkey; // SrcColorkey override +} DDBLTFX; + +typedef DDBLTFX FAR* LPDDBLTFX; + + + +/* + * DDSCAPS + */ +typedef struct _DDSCAPS +{ + DWORD dwCaps; // capabilities of surface wanted +} DDSCAPS; + +typedef DDSCAPS FAR* LPDDSCAPS; + + +/* + * DDOSCAPS + */ +typedef struct _DDOSCAPS +{ + DWORD dwCaps; // capabilities of surface wanted +} DDOSCAPS; + +typedef DDOSCAPS FAR* LPDDOSCAPS; + +/* + * This structure is used internally by DirectDraw. + */ +typedef struct _DDSCAPSEX +{ + DWORD dwCaps2; + DWORD dwCaps3; + union + { + DWORD dwCaps4; + DWORD dwVolumeDepth; + } DUMMYUNIONNAMEN(1); +} DDSCAPSEX, FAR * LPDDSCAPSEX; + +/* + * DDSCAPS2 + */ +typedef struct _DDSCAPS2 +{ + DWORD dwCaps; // capabilities of surface wanted + DWORD dwCaps2; + DWORD dwCaps3; + union + { + DWORD dwCaps4; + DWORD dwVolumeDepth; + } DUMMYUNIONNAMEN(1); +} DDSCAPS2; + +typedef DDSCAPS2 FAR* LPDDSCAPS2; + +/* + * DDCAPS + */ +#define DD_ROP_SPACE (256/32) // space required to store ROP array +/* + * NOTE: Our choosen structure number scheme is to append a single digit to + * the end of the structure giving the version that structure is associated + * with. + */ + +/* + * This structure represents the DDCAPS structure released in DirectDraw 1.0. It is used internally + * by DirectDraw to interpret caps passed into ddraw by drivers written prior to the release of DirectDraw 2.0. + * New applications should use the DDCAPS structure defined below. + */ +typedef struct _DDCAPS_DX1 +{ + DWORD dwSize; // size of the DDDRIVERCAPS structure + DWORD dwCaps; // driver specific capabilities + DWORD dwCaps2; // more driver specific capabilites + DWORD dwCKeyCaps; // color key capabilities of the surface + DWORD dwFXCaps; // driver specific stretching and effects capabilites + DWORD dwFXAlphaCaps; // alpha driver specific capabilities + DWORD dwPalCaps; // palette capabilities + DWORD dwSVCaps; // stereo vision capabilities + DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 + DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 + DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 + DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 + DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 + DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 + DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 + DWORD dwVidMemTotal; // total amount of video memory + DWORD dwVidMemFree; // amount of free video memory + DWORD dwMaxVisibleOverlays; // maximum number of visible overlays + DWORD dwCurrVisibleOverlays; // current number of visible overlays + DWORD dwNumFourCCCodes; // number of four cc codes + DWORD dwAlignBoundarySrc; // source rectangle alignment + DWORD dwAlignSizeSrc; // source rectangle byte size + DWORD dwAlignBoundaryDest; // dest rectangle alignment + DWORD dwAlignSizeDest; // dest rectangle byte size + DWORD dwAlignStrideAlign; // stride alignment + DWORD dwRops[DD_ROP_SPACE]; // ROPS supported + DDSCAPS ddsCaps; // DDSCAPS structure has all the general capabilities + DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 + DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 + DWORD dwMinLiveVideoStretch; // OBSOLETE! This field remains for compatability reasons only + DWORD dwMaxLiveVideoStretch; // OBSOLETE! This field remains for compatability reasons only + DWORD dwMinHwCodecStretch; // OBSOLETE! This field remains for compatability reasons only + DWORD dwMaxHwCodecStretch; // OBSOLETE! This field remains for compatability reasons only + DWORD dwReserved1; // reserved + DWORD dwReserved2; // reserved + DWORD dwReserved3; // reserved +} DDCAPS_DX1; + +typedef DDCAPS_DX1 FAR* LPDDCAPS_DX1; + +/* + * This structure is the DDCAPS structure as it was in version 2 and 3 of Direct X. + * It is present for back compatability. + */ +typedef struct _DDCAPS_DX3 +{ + DWORD dwSize; // size of the DDDRIVERCAPS structure + DWORD dwCaps; // driver specific capabilities + DWORD dwCaps2; // more driver specific capabilites + DWORD dwCKeyCaps; // color key capabilities of the surface + DWORD dwFXCaps; // driver specific stretching and effects capabilites + DWORD dwFXAlphaCaps; // alpha driver specific capabilities + DWORD dwPalCaps; // palette capabilities + DWORD dwSVCaps; // stereo vision capabilities + DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 + DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 + DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 + DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 + DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 + DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 + DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 + DWORD dwVidMemTotal; // total amount of video memory + DWORD dwVidMemFree; // amount of free video memory + DWORD dwMaxVisibleOverlays; // maximum number of visible overlays + DWORD dwCurrVisibleOverlays; // current number of visible overlays + DWORD dwNumFourCCCodes; // number of four cc codes + DWORD dwAlignBoundarySrc; // source rectangle alignment + DWORD dwAlignSizeSrc; // source rectangle byte size + DWORD dwAlignBoundaryDest; // dest rectangle alignment + DWORD dwAlignSizeDest; // dest rectangle byte size + DWORD dwAlignStrideAlign; // stride alignment + DWORD dwRops[DD_ROP_SPACE]; // ROPS supported + DDSCAPS ddsCaps; // DDSCAPS structure has all the general capabilities + DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 + DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 + DWORD dwMinLiveVideoStretch; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 + DWORD dwMaxLiveVideoStretch; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 + DWORD dwMinHwCodecStretch; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 + DWORD dwMaxHwCodecStretch; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 + DWORD dwReserved1; // reserved + DWORD dwReserved2; // reserved + DWORD dwReserved3; // reserved + DWORD dwSVBCaps; // driver specific capabilities for System->Vmem blts + DWORD dwSVBCKeyCaps; // driver color key capabilities for System->Vmem blts + DWORD dwSVBFXCaps; // driver FX capabilities for System->Vmem blts + DWORD dwSVBRops[DD_ROP_SPACE];// ROPS supported for System->Vmem blts + DWORD dwVSBCaps; // driver specific capabilities for Vmem->System blts + DWORD dwVSBCKeyCaps; // driver color key capabilities for Vmem->System blts + DWORD dwVSBFXCaps; // driver FX capabilities for Vmem->System blts + DWORD dwVSBRops[DD_ROP_SPACE];// ROPS supported for Vmem->System blts + DWORD dwSSBCaps; // driver specific capabilities for System->System blts + DWORD dwSSBCKeyCaps; // driver color key capabilities for System->System blts + DWORD dwSSBFXCaps; // driver FX capabilities for System->System blts + DWORD dwSSBRops[DD_ROP_SPACE];// ROPS supported for System->System blts + DWORD dwReserved4; // reserved + DWORD dwReserved5; // reserved + DWORD dwReserved6; // reserved +} DDCAPS_DX3; +typedef DDCAPS_DX3 FAR* LPDDCAPS_DX3; + +/* + * This structure is the DDCAPS structure as it was in version 5 of Direct X. + * It is present for back compatability. + */ +typedef struct _DDCAPS_DX5 +{ +/* 0*/ DWORD dwSize; // size of the DDDRIVERCAPS structure +/* 4*/ DWORD dwCaps; // driver specific capabilities +/* 8*/ DWORD dwCaps2; // more driver specific capabilites +/* c*/ DWORD dwCKeyCaps; // color key capabilities of the surface +/* 10*/ DWORD dwFXCaps; // driver specific stretching and effects capabilites +/* 14*/ DWORD dwFXAlphaCaps; // alpha driver specific capabilities +/* 18*/ DWORD dwPalCaps; // palette capabilities +/* 1c*/ DWORD dwSVCaps; // stereo vision capabilities +/* 20*/ DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 +/* 24*/ DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 +/* 28*/ DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 +/* 2c*/ DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 +/* 30*/ DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 +/* 34*/ DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 +/* 38*/ DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 +/* 3c*/ DWORD dwVidMemTotal; // total amount of video memory +/* 40*/ DWORD dwVidMemFree; // amount of free video memory +/* 44*/ DWORD dwMaxVisibleOverlays; // maximum number of visible overlays +/* 48*/ DWORD dwCurrVisibleOverlays; // current number of visible overlays +/* 4c*/ DWORD dwNumFourCCCodes; // number of four cc codes +/* 50*/ DWORD dwAlignBoundarySrc; // source rectangle alignment +/* 54*/ DWORD dwAlignSizeSrc; // source rectangle byte size +/* 58*/ DWORD dwAlignBoundaryDest; // dest rectangle alignment +/* 5c*/ DWORD dwAlignSizeDest; // dest rectangle byte size +/* 60*/ DWORD dwAlignStrideAlign; // stride alignment +/* 64*/ DWORD dwRops[DD_ROP_SPACE]; // ROPS supported +/* 84*/ DDSCAPS ddsCaps; // DDSCAPS structure has all the general capabilities +/* 88*/ DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 8c*/ DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 90*/ DWORD dwMinLiveVideoStretch; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 94*/ DWORD dwMaxLiveVideoStretch; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 98*/ DWORD dwMinHwCodecStretch; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 9c*/ DWORD dwMaxHwCodecStretch; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* a0*/ DWORD dwReserved1; // reserved +/* a4*/ DWORD dwReserved2; // reserved +/* a8*/ DWORD dwReserved3; // reserved +/* ac*/ DWORD dwSVBCaps; // driver specific capabilities for System->Vmem blts +/* b0*/ DWORD dwSVBCKeyCaps; // driver color key capabilities for System->Vmem blts +/* b4*/ DWORD dwSVBFXCaps; // driver FX capabilities for System->Vmem blts +/* b8*/ DWORD dwSVBRops[DD_ROP_SPACE];// ROPS supported for System->Vmem blts +/* d8*/ DWORD dwVSBCaps; // driver specific capabilities for Vmem->System blts +/* dc*/ DWORD dwVSBCKeyCaps; // driver color key capabilities for Vmem->System blts +/* e0*/ DWORD dwVSBFXCaps; // driver FX capabilities for Vmem->System blts +/* e4*/ DWORD dwVSBRops[DD_ROP_SPACE];// ROPS supported for Vmem->System blts +/*104*/ DWORD dwSSBCaps; // driver specific capabilities for System->System blts +/*108*/ DWORD dwSSBCKeyCaps; // driver color key capabilities for System->System blts +/*10c*/ DWORD dwSSBFXCaps; // driver FX capabilities for System->System blts +/*110*/ DWORD dwSSBRops[DD_ROP_SPACE];// ROPS supported for System->System blts +// Members added for DX5: +/*130*/ DWORD dwMaxVideoPorts; // maximum number of usable video ports +/*134*/ DWORD dwCurrVideoPorts; // current number of video ports used +/*138*/ DWORD dwSVBCaps2; // more driver specific capabilities for System->Vmem blts +/*13c*/ DWORD dwNLVBCaps; // driver specific capabilities for non-local->local vidmem blts +/*140*/ DWORD dwNLVBCaps2; // more driver specific capabilities non-local->local vidmem blts +/*144*/ DWORD dwNLVBCKeyCaps; // driver color key capabilities for non-local->local vidmem blts +/*148*/ DWORD dwNLVBFXCaps; // driver FX capabilities for non-local->local blts +/*14c*/ DWORD dwNLVBRops[DD_ROP_SPACE]; // ROPS supported for non-local->local blts +} DDCAPS_DX5; +typedef DDCAPS_DX5 FAR* LPDDCAPS_DX5; + +typedef struct _DDCAPS_DX6 +{ +/* 0*/ DWORD dwSize; // size of the DDDRIVERCAPS structure +/* 4*/ DWORD dwCaps; // driver specific capabilities +/* 8*/ DWORD dwCaps2; // more driver specific capabilites +/* c*/ DWORD dwCKeyCaps; // color key capabilities of the surface +/* 10*/ DWORD dwFXCaps; // driver specific stretching and effects capabilites +/* 14*/ DWORD dwFXAlphaCaps; // alpha caps +/* 18*/ DWORD dwPalCaps; // palette capabilities +/* 1c*/ DWORD dwSVCaps; // stereo vision capabilities +/* 20*/ DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 +/* 24*/ DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 +/* 28*/ DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 +/* 2c*/ DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 +/* 30*/ DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 +/* 34*/ DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 +/* 38*/ DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 +/* 3c*/ DWORD dwVidMemTotal; // total amount of video memory +/* 40*/ DWORD dwVidMemFree; // amount of free video memory +/* 44*/ DWORD dwMaxVisibleOverlays; // maximum number of visible overlays +/* 48*/ DWORD dwCurrVisibleOverlays; // current number of visible overlays +/* 4c*/ DWORD dwNumFourCCCodes; // number of four cc codes +/* 50*/ DWORD dwAlignBoundarySrc; // source rectangle alignment +/* 54*/ DWORD dwAlignSizeSrc; // source rectangle byte size +/* 58*/ DWORD dwAlignBoundaryDest; // dest rectangle alignment +/* 5c*/ DWORD dwAlignSizeDest; // dest rectangle byte size +/* 60*/ DWORD dwAlignStrideAlign; // stride alignment +/* 64*/ DWORD dwRops[DD_ROP_SPACE]; // ROPS supported +/* 84*/ DDSCAPS ddsOldCaps; // Was DDSCAPS ddsCaps. ddsCaps is of type DDSCAPS2 for DX6 +/* 88*/ DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 8c*/ DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 90*/ DWORD dwMinLiveVideoStretch; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 94*/ DWORD dwMaxLiveVideoStretch; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 98*/ DWORD dwMinHwCodecStretch; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 9c*/ DWORD dwMaxHwCodecStretch; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* a0*/ DWORD dwReserved1; // reserved +/* a4*/ DWORD dwReserved2; // reserved +/* a8*/ DWORD dwReserved3; // reserved +/* ac*/ DWORD dwSVBCaps; // driver specific capabilities for System->Vmem blts +/* b0*/ DWORD dwSVBCKeyCaps; // driver color key capabilities for System->Vmem blts +/* b4*/ DWORD dwSVBFXCaps; // driver FX capabilities for System->Vmem blts +/* b8*/ DWORD dwSVBRops[DD_ROP_SPACE];// ROPS supported for System->Vmem blts +/* d8*/ DWORD dwVSBCaps; // driver specific capabilities for Vmem->System blts +/* dc*/ DWORD dwVSBCKeyCaps; // driver color key capabilities for Vmem->System blts +/* e0*/ DWORD dwVSBFXCaps; // driver FX capabilities for Vmem->System blts +/* e4*/ DWORD dwVSBRops[DD_ROP_SPACE];// ROPS supported for Vmem->System blts +/*104*/ DWORD dwSSBCaps; // driver specific capabilities for System->System blts +/*108*/ DWORD dwSSBCKeyCaps; // driver color key capabilities for System->System blts +/*10c*/ DWORD dwSSBFXCaps; // driver FX capabilities for System->System blts +/*110*/ DWORD dwSSBRops[DD_ROP_SPACE];// ROPS supported for System->System blts +/*130*/ DWORD dwMaxVideoPorts; // maximum number of usable video ports +/*134*/ DWORD dwCurrVideoPorts; // current number of video ports used +/*138*/ DWORD dwSVBCaps2; // more driver specific capabilities for System->Vmem blts +/*13c*/ DWORD dwNLVBCaps; // driver specific capabilities for non-local->local vidmem blts +/*140*/ DWORD dwNLVBCaps2; // more driver specific capabilities non-local->local vidmem blts +/*144*/ DWORD dwNLVBCKeyCaps; // driver color key capabilities for non-local->local vidmem blts +/*148*/ DWORD dwNLVBFXCaps; // driver FX capabilities for non-local->local blts +/*14c*/ DWORD dwNLVBRops[DD_ROP_SPACE]; // ROPS supported for non-local->local blts +// Members added for DX6 release +/*16c*/ DDSCAPS2 ddsCaps; // Surface Caps +} DDCAPS_DX6; +typedef DDCAPS_DX6 FAR* LPDDCAPS_DX6; + +typedef struct _DDCAPS_DX7 +{ +/* 0*/ DWORD dwSize; // size of the DDDRIVERCAPS structure +/* 4*/ DWORD dwCaps; // driver specific capabilities +/* 8*/ DWORD dwCaps2; // more driver specific capabilites +/* c*/ DWORD dwCKeyCaps; // color key capabilities of the surface +/* 10*/ DWORD dwFXCaps; // driver specific stretching and effects capabilites +/* 14*/ DWORD dwFXAlphaCaps; // alpha driver specific capabilities +/* 18*/ DWORD dwPalCaps; // palette capabilities +/* 1c*/ DWORD dwSVCaps; // stereo vision capabilities +/* 20*/ DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 +/* 24*/ DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 +/* 28*/ DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 +/* 2c*/ DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 +/* 30*/ DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 +/* 34*/ DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 +/* 38*/ DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 +/* 3c*/ DWORD dwVidMemTotal; // total amount of video memory +/* 40*/ DWORD dwVidMemFree; // amount of free video memory +/* 44*/ DWORD dwMaxVisibleOverlays; // maximum number of visible overlays +/* 48*/ DWORD dwCurrVisibleOverlays; // current number of visible overlays +/* 4c*/ DWORD dwNumFourCCCodes; // number of four cc codes +/* 50*/ DWORD dwAlignBoundarySrc; // source rectangle alignment +/* 54*/ DWORD dwAlignSizeSrc; // source rectangle byte size +/* 58*/ DWORD dwAlignBoundaryDest; // dest rectangle alignment +/* 5c*/ DWORD dwAlignSizeDest; // dest rectangle byte size +/* 60*/ DWORD dwAlignStrideAlign; // stride alignment +/* 64*/ DWORD dwRops[DD_ROP_SPACE]; // ROPS supported +/* 84*/ DDSCAPS ddsOldCaps; // Was DDSCAPS ddsCaps. ddsCaps is of type DDSCAPS2 for DX6 +/* 88*/ DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 8c*/ DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 90*/ DWORD dwMinLiveVideoStretch; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 94*/ DWORD dwMaxLiveVideoStretch; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 98*/ DWORD dwMinHwCodecStretch; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* 9c*/ DWORD dwMaxHwCodecStretch; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 +/* a0*/ DWORD dwReserved1; // reserved +/* a4*/ DWORD dwReserved2; // reserved +/* a8*/ DWORD dwReserved3; // reserved +/* ac*/ DWORD dwSVBCaps; // driver specific capabilities for System->Vmem blts +/* b0*/ DWORD dwSVBCKeyCaps; // driver color key capabilities for System->Vmem blts +/* b4*/ DWORD dwSVBFXCaps; // driver FX capabilities for System->Vmem blts +/* b8*/ DWORD dwSVBRops[DD_ROP_SPACE];// ROPS supported for System->Vmem blts +/* d8*/ DWORD dwVSBCaps; // driver specific capabilities for Vmem->System blts +/* dc*/ DWORD dwVSBCKeyCaps; // driver color key capabilities for Vmem->System blts +/* e0*/ DWORD dwVSBFXCaps; // driver FX capabilities for Vmem->System blts +/* e4*/ DWORD dwVSBRops[DD_ROP_SPACE];// ROPS supported for Vmem->System blts +/*104*/ DWORD dwSSBCaps; // driver specific capabilities for System->System blts +/*108*/ DWORD dwSSBCKeyCaps; // driver color key capabilities for System->System blts +/*10c*/ DWORD dwSSBFXCaps; // driver FX capabilities for System->System blts +/*110*/ DWORD dwSSBRops[DD_ROP_SPACE];// ROPS supported for System->System blts +/*130*/ DWORD dwMaxVideoPorts; // maximum number of usable video ports +/*134*/ DWORD dwCurrVideoPorts; // current number of video ports used +/*138*/ DWORD dwSVBCaps2; // more driver specific capabilities for System->Vmem blts +/*13c*/ DWORD dwNLVBCaps; // driver specific capabilities for non-local->local vidmem blts +/*140*/ DWORD dwNLVBCaps2; // more driver specific capabilities non-local->local vidmem blts +/*144*/ DWORD dwNLVBCKeyCaps; // driver color key capabilities for non-local->local vidmem blts +/*148*/ DWORD dwNLVBFXCaps; // driver FX capabilities for non-local->local blts +/*14c*/ DWORD dwNLVBRops[DD_ROP_SPACE]; // ROPS supported for non-local->local blts +// Members added for DX6 release +/*16c*/ DDSCAPS2 ddsCaps; // Surface Caps +} DDCAPS_DX7; +typedef DDCAPS_DX7 FAR* LPDDCAPS_DX7; + + +#if DIRECTDRAW_VERSION <= 0x300 + typedef DDCAPS_DX3 DDCAPS; +#elif DIRECTDRAW_VERSION <= 0x500 + typedef DDCAPS_DX5 DDCAPS; +#elif DIRECTDRAW_VERSION <= 0x600 + typedef DDCAPS_DX6 DDCAPS; +#else + typedef DDCAPS_DX7 DDCAPS; +#endif + +typedef DDCAPS FAR* LPDDCAPS; + + + +/* + * DDPIXELFORMAT + */ +typedef struct _DDPIXELFORMAT +{ + DWORD dwSize; // size of structure + DWORD dwFlags; // pixel format flags + DWORD dwFourCC; // (FOURCC code) + union + { + DWORD dwRGBBitCount; // how many bits per pixel + DWORD dwYUVBitCount; // how many bits per pixel + DWORD dwZBufferBitDepth; // how many total bits/pixel in z buffer (including any stencil bits) + DWORD dwAlphaBitDepth; // how many bits for alpha channels + DWORD dwLuminanceBitCount; // how many bits per pixel + DWORD dwBumpBitCount; // how many bits per "buxel", total + DWORD dwPrivateFormatBitCount;// Bits per pixel of private driver formats. Only valid in texture + // format list and if DDPF_D3DFORMAT is set + } DUMMYUNIONNAMEN(1); + union + { + DWORD dwRBitMask; // mask for red bit + DWORD dwYBitMask; // mask for Y bits + DWORD dwStencilBitDepth; // how many stencil bits (note: dwZBufferBitDepth-dwStencilBitDepth is total Z-only bits) + DWORD dwLuminanceBitMask; // mask for luminance bits + DWORD dwBumpDuBitMask; // mask for bump map U delta bits + DWORD dwOperations; // DDPF_D3DFORMAT Operations + } DUMMYUNIONNAMEN(2); + union + { + DWORD dwGBitMask; // mask for green bits + DWORD dwUBitMask; // mask for U bits + DWORD dwZBitMask; // mask for Z bits + DWORD dwBumpDvBitMask; // mask for bump map V delta bits + struct + { + WORD wFlipMSTypes; // Multisample methods supported via flip for this D3DFORMAT + WORD wBltMSTypes; // Multisample methods supported via blt for this D3DFORMAT + } MultiSampleCaps; + + } DUMMYUNIONNAMEN(3); + union + { + DWORD dwBBitMask; // mask for blue bits + DWORD dwVBitMask; // mask for V bits + DWORD dwStencilBitMask; // mask for stencil bits + DWORD dwBumpLuminanceBitMask; // mask for luminance in bump map + } DUMMYUNIONNAMEN(4); + union + { + DWORD dwRGBAlphaBitMask; // mask for alpha channel + DWORD dwYUVAlphaBitMask; // mask for alpha channel + DWORD dwLuminanceAlphaBitMask;// mask for alpha channel + DWORD dwRGBZBitMask; // mask for Z channel + DWORD dwYUVZBitMask; // mask for Z channel + } DUMMYUNIONNAMEN(5); +} DDPIXELFORMAT; + +typedef DDPIXELFORMAT FAR* LPDDPIXELFORMAT; + +/* + * DDOVERLAYFX + */ +typedef struct _DDOVERLAYFX +{ + DWORD dwSize; // size of structure + DWORD dwAlphaEdgeBlendBitDepth; // Bit depth used to specify constant for alpha edge blend + DWORD dwAlphaEdgeBlend; // Constant to use as alpha for edge blend + DWORD dwReserved; + DWORD dwAlphaDestConstBitDepth; // Bit depth used to specify alpha constant for destination + union + { + DWORD dwAlphaDestConst; // Constant to use as alpha channel for dest + LPDIRECTDRAWSURFACE lpDDSAlphaDest; // Surface to use as alpha channel for dest + } DUMMYUNIONNAMEN(1); + DWORD dwAlphaSrcConstBitDepth; // Bit depth used to specify alpha constant for source + union + { + DWORD dwAlphaSrcConst; // Constant to use as alpha channel for src + LPDIRECTDRAWSURFACE lpDDSAlphaSrc; // Surface to use as alpha channel for src + } DUMMYUNIONNAMEN(2); + DDCOLORKEY dckDestColorkey; // DestColorkey override + DDCOLORKEY dckSrcColorkey; // DestColorkey override + DWORD dwDDFX; // Overlay FX + DWORD dwFlags; // flags +} DDOVERLAYFX; + +typedef DDOVERLAYFX FAR *LPDDOVERLAYFX; + + +/* + * DDBLTBATCH: BltBatch entry structure + */ +typedef struct _DDBLTBATCH +{ + LPRECT lprDest; + LPDIRECTDRAWSURFACE lpDDSSrc; + LPRECT lprSrc; + DWORD dwFlags; + LPDDBLTFX lpDDBltFx; +} DDBLTBATCH; + +typedef DDBLTBATCH FAR * LPDDBLTBATCH; + + +/* + * DDGAMMARAMP + */ +typedef struct _DDGAMMARAMP +{ + WORD red[256]; + WORD green[256]; + WORD blue[256]; +} DDGAMMARAMP; +typedef DDGAMMARAMP FAR * LPDDGAMMARAMP; + +/* + * This is the structure within which DirectDraw returns data about the current graphics driver and chipset + */ + +#define MAX_DDDEVICEID_STRING 512 + +typedef struct tagDDDEVICEIDENTIFIER +{ + /* + * These elements are for presentation to the user only. They should not be used to identify particular + * drivers, since this is unreliable and many different strings may be associated with the same + * device, and the same driver from different vendors. + */ + char szDriver[MAX_DDDEVICEID_STRING]; + char szDescription[MAX_DDDEVICEID_STRING]; + + /* + * This element is the version of the DirectDraw/3D driver. It is legal to do <, > comparisons + * on the whole 64 bits. Caution should be exercised if you use this element to identify problematic + * drivers. It is recommended that guidDeviceIdentifier is used for this purpose. + * + * This version has the form: + * wProduct = HIWORD(liDriverVersion.HighPart) + * wVersion = LOWORD(liDriverVersion.HighPart) + * wSubVersion = HIWORD(liDriverVersion.LowPart) + * wBuild = LOWORD(liDriverVersion.LowPart) + */ +#ifdef _WIN32 + LARGE_INTEGER liDriverVersion; /* Defined for applications and other 32 bit components */ +#else + DWORD dwDriverVersionLowPart; /* Defined for 16 bit driver components */ + DWORD dwDriverVersionHighPart; +#endif + + + /* + * These elements can be used to identify particular chipsets. Use with extreme caution. + * dwVendorId Identifies the manufacturer. May be zero if unknown. + * dwDeviceId Identifies the type of chipset. May be zero if unknown. + * dwSubSysId Identifies the subsystem, typically this means the particular board. May be zero if unknown. + * dwRevision Identifies the revision level of the chipset. May be zero if unknown. + */ + DWORD dwVendorId; + DWORD dwDeviceId; + DWORD dwSubSysId; + DWORD dwRevision; + + /* + * This element can be used to check changes in driver/chipset. This GUID is a unique identifier for the + * driver/chipset pair. Use this element if you wish to track changes to the driver/chipset in order to + * reprofile the graphics subsystem. + * This element can also be used to identify particular problematic drivers. + */ + GUID guidDeviceIdentifier; +} DDDEVICEIDENTIFIER, * LPDDDEVICEIDENTIFIER; + +typedef struct tagDDDEVICEIDENTIFIER2 +{ + /* + * These elements are for presentation to the user only. They should not be used to identify particular + * drivers, since this is unreliable and many different strings may be associated with the same + * device, and the same driver from different vendors. + */ + char szDriver[MAX_DDDEVICEID_STRING]; + char szDescription[MAX_DDDEVICEID_STRING]; + + /* + * This element is the version of the DirectDraw/3D driver. It is legal to do <, > comparisons + * on the whole 64 bits. Caution should be exercised if you use this element to identify problematic + * drivers. It is recommended that guidDeviceIdentifier is used for this purpose. + * + * This version has the form: + * wProduct = HIWORD(liDriverVersion.HighPart) + * wVersion = LOWORD(liDriverVersion.HighPart) + * wSubVersion = HIWORD(liDriverVersion.LowPart) + * wBuild = LOWORD(liDriverVersion.LowPart) + */ +#ifdef _WIN32 + LARGE_INTEGER liDriverVersion; /* Defined for applications and other 32 bit components */ +#else + DWORD dwDriverVersionLowPart; /* Defined for 16 bit driver components */ + DWORD dwDriverVersionHighPart; +#endif + + + /* + * These elements can be used to identify particular chipsets. Use with extreme caution. + * dwVendorId Identifies the manufacturer. May be zero if unknown. + * dwDeviceId Identifies the type of chipset. May be zero if unknown. + * dwSubSysId Identifies the subsystem, typically this means the particular board. May be zero if unknown. + * dwRevision Identifies the revision level of the chipset. May be zero if unknown. + */ + DWORD dwVendorId; + DWORD dwDeviceId; + DWORD dwSubSysId; + DWORD dwRevision; + + /* + * This element can be used to check changes in driver/chipset. This GUID is a unique identifier for the + * driver/chipset pair. Use this element if you wish to track changes to the driver/chipset in order to + * reprofile the graphics subsystem. + * This element can also be used to identify particular problematic drivers. + */ + GUID guidDeviceIdentifier; + + /* + * This element is used to determine the Windows Hardware Quality Lab (WHQL) + * certification level for this driver/device pair. + */ + DWORD dwWHQLLevel; + +} DDDEVICEIDENTIFIER2, * LPDDDEVICEIDENTIFIER2; + +/* + * Flags for the IDirectDraw4::GetDeviceIdentifier method + */ + +/* + * This flag causes GetDeviceIdentifier to return information about the host (typically 2D) adapter in a system equipped + * with a stacked secondary 3D adapter. Such an adapter appears to the application as if it were part of the + * host adapter, but is typically physcially located on a separate card. The stacked secondary's information is + * returned when GetDeviceIdentifier's dwFlags field is zero, since this most accurately reflects the qualities + * of the DirectDraw object involved. + */ +#define DDGDI_GETHOSTIDENTIFIER 0x00000001L + +/* + * Macros for interpretting DDEVICEIDENTIFIER2.dwWHQLLevel + */ +#define GET_WHQL_YEAR( dwWHQLLevel ) \ + ( (dwWHQLLevel) / 0x10000 ) +#define GET_WHQL_MONTH( dwWHQLLevel ) \ + ( ( (dwWHQLLevel) / 0x100 ) & 0x00ff ) +#define GET_WHQL_DAY( dwWHQLLevel ) \ + ( (dwWHQLLevel) & 0xff ) + + +/* + * callbacks + */ +typedef DWORD (FAR PASCAL *LPCLIPPERCALLBACK)(LPDIRECTDRAWCLIPPER lpDDClipper, HWND hWnd, DWORD code, LPVOID lpContext ); +#ifdef STREAMING +typedef DWORD (FAR PASCAL *LPSURFACESTREAMINGCALLBACK)(DWORD); +#endif + + +/* + * INTERACES FOLLOW: + * IDirectDraw + * IDirectDrawClipper + * IDirectDrawPalette + * IDirectDrawSurface + */ + +/* + * IDirectDraw + */ +#if defined( _WIN32 ) && !defined( _NO_COM ) +#undef INTERFACE +#define INTERFACE IDirectDraw +DECLARE_INTERFACE_( IDirectDraw, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDraw methods ***/ + STDMETHOD(Compact)(THIS) PURE; + STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE; + STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE; + STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC, LPDIRECTDRAWSURFACE FAR *, IUnknown FAR *) PURE; + STDMETHOD(DuplicateSurface)( THIS_ LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR * ) PURE; + STDMETHOD(EnumDisplayModes)( THIS_ DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK ) PURE; + STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK ) PURE; + STDMETHOD(FlipToGDISurface)(THIS) PURE; + STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE; + STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC) PURE; + STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD, LPDWORD ) PURE; + STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE FAR *) PURE; + STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE; + STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE; + STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL ) PURE; + STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE; + STDMETHOD(RestoreDisplayMode)(THIS) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE; + STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD) PURE; + STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE ) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDraw_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) +#define IDirectDraw_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDraw_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDraw_Compact(p) (p)->lpVtbl->Compact(p) +#define IDirectDraw_CreateClipper(p, a, b, c) (p)->lpVtbl->CreateClipper(p, a, b, c) +#define IDirectDraw_CreatePalette(p, a, b, c, d) (p)->lpVtbl->CreatePalette(p, a, b, c, d) +#define IDirectDraw_CreateSurface(p, a, b, c) (p)->lpVtbl->CreateSurface(p, a, b, c) +#define IDirectDraw_DuplicateSurface(p, a, b) (p)->lpVtbl->DuplicateSurface(p, a, b) +#define IDirectDraw_EnumDisplayModes(p, a, b, c, d) (p)->lpVtbl->EnumDisplayModes(p, a, b, c, d) +#define IDirectDraw_EnumSurfaces(p, a, b, c, d) (p)->lpVtbl->EnumSurfaces(p, a, b, c, d) +#define IDirectDraw_FlipToGDISurface(p) (p)->lpVtbl->FlipToGDISurface(p) +#define IDirectDraw_GetCaps(p, a, b) (p)->lpVtbl->GetCaps(p, a, b) +#define IDirectDraw_GetDisplayMode(p, a) (p)->lpVtbl->GetDisplayMode(p, a) +#define IDirectDraw_GetFourCCCodes(p, a, b) (p)->lpVtbl->GetFourCCCodes(p, a, b) +#define IDirectDraw_GetGDISurface(p, a) (p)->lpVtbl->GetGDISurface(p, a) +#define IDirectDraw_GetMonitorFrequency(p, a) (p)->lpVtbl->GetMonitorFrequency(p, a) +#define IDirectDraw_GetScanLine(p, a) (p)->lpVtbl->GetScanLine(p, a) +#define IDirectDraw_GetVerticalBlankStatus(p, a) (p)->lpVtbl->GetVerticalBlankStatus(p, a) +#define IDirectDraw_Initialize(p, a) (p)->lpVtbl->Initialize(p, a) +#define IDirectDraw_RestoreDisplayMode(p) (p)->lpVtbl->RestoreDisplayMode(p) +#define IDirectDraw_SetCooperativeLevel(p, a, b) (p)->lpVtbl->SetCooperativeLevel(p, a, b) +#define IDirectDraw_SetDisplayMode(p, a, b, c) (p)->lpVtbl->SetDisplayMode(p, a, b, c) +#define IDirectDraw_WaitForVerticalBlank(p, a, b) (p)->lpVtbl->WaitForVerticalBlank(p, a, b) +#else +#define IDirectDraw_QueryInterface(p, a, b) (p)->QueryInterface(a, b) +#define IDirectDraw_AddRef(p) (p)->AddRef() +#define IDirectDraw_Release(p) (p)->Release() +#define IDirectDraw_Compact(p) (p)->Compact() +#define IDirectDraw_CreateClipper(p, a, b, c) (p)->CreateClipper(a, b, c) +#define IDirectDraw_CreatePalette(p, a, b, c, d) (p)->CreatePalette(a, b, c, d) +#define IDirectDraw_CreateSurface(p, a, b, c) (p)->CreateSurface(a, b, c) +#define IDirectDraw_DuplicateSurface(p, a, b) (p)->DuplicateSurface(a, b) +#define IDirectDraw_EnumDisplayModes(p, a, b, c, d) (p)->EnumDisplayModes(a, b, c, d) +#define IDirectDraw_EnumSurfaces(p, a, b, c, d) (p)->EnumSurfaces(a, b, c, d) +#define IDirectDraw_FlipToGDISurface(p) (p)->FlipToGDISurface() +#define IDirectDraw_GetCaps(p, a, b) (p)->GetCaps(a, b) +#define IDirectDraw_GetDisplayMode(p, a) (p)->GetDisplayMode(a) +#define IDirectDraw_GetFourCCCodes(p, a, b) (p)->GetFourCCCodes(a, b) +#define IDirectDraw_GetGDISurface(p, a) (p)->GetGDISurface(a) +#define IDirectDraw_GetMonitorFrequency(p, a) (p)->GetMonitorFrequency(a) +#define IDirectDraw_GetScanLine(p, a) (p)->GetScanLine(a) +#define IDirectDraw_GetVerticalBlankStatus(p, a) (p)->GetVerticalBlankStatus(a) +#define IDirectDraw_Initialize(p, a) (p)->Initialize(a) +#define IDirectDraw_RestoreDisplayMode(p) (p)->RestoreDisplayMode() +#define IDirectDraw_SetCooperativeLevel(p, a, b) (p)->SetCooperativeLevel(a, b) +#define IDirectDraw_SetDisplayMode(p, a, b, c) (p)->SetDisplayMode(a, b, c) +#define IDirectDraw_WaitForVerticalBlank(p, a, b) (p)->WaitForVerticalBlank(a, b) +#endif + +#endif + +#if defined( _WIN32 ) && !defined( _NO_COM ) +#undef INTERFACE +#define INTERFACE IDirectDraw2 +DECLARE_INTERFACE_( IDirectDraw2, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDraw methods ***/ + STDMETHOD(Compact)(THIS) PURE; + STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE; + STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE; + STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC, LPDIRECTDRAWSURFACE FAR *, IUnknown FAR *) PURE; + STDMETHOD(DuplicateSurface)( THIS_ LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR * ) PURE; + STDMETHOD(EnumDisplayModes)( THIS_ DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK ) PURE; + STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK ) PURE; + STDMETHOD(FlipToGDISurface)(THIS) PURE; + STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE; + STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC) PURE; + STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD, LPDWORD ) PURE; + STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE FAR *) PURE; + STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE; + STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE; + STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL ) PURE; + STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE; + STDMETHOD(RestoreDisplayMode)(THIS) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE; + STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD, DWORD, DWORD) PURE; + STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE ) PURE; + /*** Added in the v2 interface ***/ + STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS, LPDWORD, LPDWORD) PURE; +}; +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDraw2_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) +#define IDirectDraw2_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDraw2_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDraw2_Compact(p) (p)->lpVtbl->Compact(p) +#define IDirectDraw2_CreateClipper(p, a, b, c) (p)->lpVtbl->CreateClipper(p, a, b, c) +#define IDirectDraw2_CreatePalette(p, a, b, c, d) (p)->lpVtbl->CreatePalette(p, a, b, c, d) +#define IDirectDraw2_CreateSurface(p, a, b, c) (p)->lpVtbl->CreateSurface(p, a, b, c) +#define IDirectDraw2_DuplicateSurface(p, a, b) (p)->lpVtbl->DuplicateSurface(p, a, b) +#define IDirectDraw2_EnumDisplayModes(p, a, b, c, d) (p)->lpVtbl->EnumDisplayModes(p, a, b, c, d) +#define IDirectDraw2_EnumSurfaces(p, a, b, c, d) (p)->lpVtbl->EnumSurfaces(p, a, b, c, d) +#define IDirectDraw2_FlipToGDISurface(p) (p)->lpVtbl->FlipToGDISurface(p) +#define IDirectDraw2_GetCaps(p, a, b) (p)->lpVtbl->GetCaps(p, a, b) +#define IDirectDraw2_GetDisplayMode(p, a) (p)->lpVtbl->GetDisplayMode(p, a) +#define IDirectDraw2_GetFourCCCodes(p, a, b) (p)->lpVtbl->GetFourCCCodes(p, a, b) +#define IDirectDraw2_GetGDISurface(p, a) (p)->lpVtbl->GetGDISurface(p, a) +#define IDirectDraw2_GetMonitorFrequency(p, a) (p)->lpVtbl->GetMonitorFrequency(p, a) +#define IDirectDraw2_GetScanLine(p, a) (p)->lpVtbl->GetScanLine(p, a) +#define IDirectDraw2_GetVerticalBlankStatus(p, a) (p)->lpVtbl->GetVerticalBlankStatus(p, a) +#define IDirectDraw2_Initialize(p, a) (p)->lpVtbl->Initialize(p, a) +#define IDirectDraw2_RestoreDisplayMode(p) (p)->lpVtbl->RestoreDisplayMode(p) +#define IDirectDraw2_SetCooperativeLevel(p, a, b) (p)->lpVtbl->SetCooperativeLevel(p, a, b) +#define IDirectDraw2_SetDisplayMode(p, a, b, c, d, e) (p)->lpVtbl->SetDisplayMode(p, a, b, c, d, e) +#define IDirectDraw2_WaitForVerticalBlank(p, a, b) (p)->lpVtbl->WaitForVerticalBlank(p, a, b) +#define IDirectDraw2_GetAvailableVidMem(p, a, b, c) (p)->lpVtbl->GetAvailableVidMem(p, a, b, c) +#else +#define IDirectDraw2_QueryInterface(p, a, b) (p)->QueryInterface(a, b) +#define IDirectDraw2_AddRef(p) (p)->AddRef() +#define IDirectDraw2_Release(p) (p)->Release() +#define IDirectDraw2_Compact(p) (p)->Compact() +#define IDirectDraw2_CreateClipper(p, a, b, c) (p)->CreateClipper(a, b, c) +#define IDirectDraw2_CreatePalette(p, a, b, c, d) (p)->CreatePalette(a, b, c, d) +#define IDirectDraw2_CreateSurface(p, a, b, c) (p)->CreateSurface(a, b, c) +#define IDirectDraw2_DuplicateSurface(p, a, b) (p)->DuplicateSurface(a, b) +#define IDirectDraw2_EnumDisplayModes(p, a, b, c, d) (p)->EnumDisplayModes(a, b, c, d) +#define IDirectDraw2_EnumSurfaces(p, a, b, c, d) (p)->EnumSurfaces(a, b, c, d) +#define IDirectDraw2_FlipToGDISurface(p) (p)->FlipToGDISurface() +#define IDirectDraw2_GetCaps(p, a, b) (p)->GetCaps(a, b) +#define IDirectDraw2_GetDisplayMode(p, a) (p)->GetDisplayMode(a) +#define IDirectDraw2_GetFourCCCodes(p, a, b) (p)->GetFourCCCodes(a, b) +#define IDirectDraw2_GetGDISurface(p, a) (p)->GetGDISurface(a) +#define IDirectDraw2_GetMonitorFrequency(p, a) (p)->GetMonitorFrequency(a) +#define IDirectDraw2_GetScanLine(p, a) (p)->GetScanLine(a) +#define IDirectDraw2_GetVerticalBlankStatus(p, a) (p)->GetVerticalBlankStatus(a) +#define IDirectDraw2_Initialize(p, a) (p)->Initialize(a) +#define IDirectDraw2_RestoreDisplayMode(p) (p)->RestoreDisplayMode() +#define IDirectDraw2_SetCooperativeLevel(p, a, b) (p)->SetCooperativeLevel(a, b) +#define IDirectDraw2_SetDisplayMode(p, a, b, c, d, e) (p)->SetDisplayMode(a, b, c, d, e) +#define IDirectDraw2_WaitForVerticalBlank(p, a, b) (p)->WaitForVerticalBlank(a, b) +#define IDirectDraw2_GetAvailableVidMem(p, a, b, c) (p)->GetAvailableVidMem(a, b, c) +#endif + +#endif + +#if defined( _WIN32 ) && !defined( _NO_COM ) +#undef INTERFACE +#define INTERFACE IDirectDraw4 +DECLARE_INTERFACE_( IDirectDraw4, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDraw methods ***/ + STDMETHOD(Compact)(THIS) PURE; + STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE; + STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE; + STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC2, LPDIRECTDRAWSURFACE4 FAR *, IUnknown FAR *) PURE; + STDMETHOD(DuplicateSurface)( THIS_ LPDIRECTDRAWSURFACE4, LPDIRECTDRAWSURFACE4 FAR * ) PURE; + STDMETHOD(EnumDisplayModes)( THIS_ DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2 ) PURE; + STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC2, LPVOID,LPDDENUMSURFACESCALLBACK2 ) PURE; + STDMETHOD(FlipToGDISurface)(THIS) PURE; + STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE; + STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC2) PURE; + STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD, LPDWORD ) PURE; + STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE4 FAR *) PURE; + STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE; + STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE; + STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL ) PURE; + STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE; + STDMETHOD(RestoreDisplayMode)(THIS) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE; + STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD, DWORD, DWORD) PURE; + STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE ) PURE; + /*** Added in the v2 interface ***/ + STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS2, LPDWORD, LPDWORD) PURE; + /*** Added in the V4 Interface ***/ + STDMETHOD(GetSurfaceFromDC) (THIS_ HDC, LPDIRECTDRAWSURFACE4 *) PURE; + STDMETHOD(RestoreAllSurfaces)(THIS) PURE; + STDMETHOD(TestCooperativeLevel)(THIS) PURE; + STDMETHOD(GetDeviceIdentifier)(THIS_ LPDDDEVICEIDENTIFIER, DWORD ) PURE; +}; +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDraw4_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) +#define IDirectDraw4_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDraw4_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDraw4_Compact(p) (p)->lpVtbl->Compact(p) +#define IDirectDraw4_CreateClipper(p, a, b, c) (p)->lpVtbl->CreateClipper(p, a, b, c) +#define IDirectDraw4_CreatePalette(p, a, b, c, d) (p)->lpVtbl->CreatePalette(p, a, b, c, d) +#define IDirectDraw4_CreateSurface(p, a, b, c) (p)->lpVtbl->CreateSurface(p, a, b, c) +#define IDirectDraw4_DuplicateSurface(p, a, b) (p)->lpVtbl->DuplicateSurface(p, a, b) +#define IDirectDraw4_EnumDisplayModes(p, a, b, c, d) (p)->lpVtbl->EnumDisplayModes(p, a, b, c, d) +#define IDirectDraw4_EnumSurfaces(p, a, b, c, d) (p)->lpVtbl->EnumSurfaces(p, a, b, c, d) +#define IDirectDraw4_FlipToGDISurface(p) (p)->lpVtbl->FlipToGDISurface(p) +#define IDirectDraw4_GetCaps(p, a, b) (p)->lpVtbl->GetCaps(p, a, b) +#define IDirectDraw4_GetDisplayMode(p, a) (p)->lpVtbl->GetDisplayMode(p, a) +#define IDirectDraw4_GetFourCCCodes(p, a, b) (p)->lpVtbl->GetFourCCCodes(p, a, b) +#define IDirectDraw4_GetGDISurface(p, a) (p)->lpVtbl->GetGDISurface(p, a) +#define IDirectDraw4_GetMonitorFrequency(p, a) (p)->lpVtbl->GetMonitorFrequency(p, a) +#define IDirectDraw4_GetScanLine(p, a) (p)->lpVtbl->GetScanLine(p, a) +#define IDirectDraw4_GetVerticalBlankStatus(p, a) (p)->lpVtbl->GetVerticalBlankStatus(p, a) +#define IDirectDraw4_Initialize(p, a) (p)->lpVtbl->Initialize(p, a) +#define IDirectDraw4_RestoreDisplayMode(p) (p)->lpVtbl->RestoreDisplayMode(p) +#define IDirectDraw4_SetCooperativeLevel(p, a, b) (p)->lpVtbl->SetCooperativeLevel(p, a, b) +#define IDirectDraw4_SetDisplayMode(p, a, b, c, d, e) (p)->lpVtbl->SetDisplayMode(p, a, b, c, d, e) +#define IDirectDraw4_WaitForVerticalBlank(p, a, b) (p)->lpVtbl->WaitForVerticalBlank(p, a, b) +#define IDirectDraw4_GetAvailableVidMem(p, a, b, c) (p)->lpVtbl->GetAvailableVidMem(p, a, b, c) +#define IDirectDraw4_GetSurfaceFromDC(p, a, b) (p)->lpVtbl->GetSurfaceFromDC(p, a, b) +#define IDirectDraw4_RestoreAllSurfaces(p) (p)->lpVtbl->RestoreAllSurfaces(p) +#define IDirectDraw4_TestCooperativeLevel(p) (p)->lpVtbl->TestCooperativeLevel(p) +#define IDirectDraw4_GetDeviceIdentifier(p,a,b) (p)->lpVtbl->GetDeviceIdentifier(p,a,b) +#else +#define IDirectDraw4_QueryInterface(p, a, b) (p)->QueryInterface(a, b) +#define IDirectDraw4_AddRef(p) (p)->AddRef() +#define IDirectDraw4_Release(p) (p)->Release() +#define IDirectDraw4_Compact(p) (p)->Compact() +#define IDirectDraw4_CreateClipper(p, a, b, c) (p)->CreateClipper(a, b, c) +#define IDirectDraw4_CreatePalette(p, a, b, c, d) (p)->CreatePalette(a, b, c, d) +#define IDirectDraw4_CreateSurface(p, a, b, c) (p)->CreateSurface(a, b, c) +#define IDirectDraw4_DuplicateSurface(p, a, b) (p)->DuplicateSurface(a, b) +#define IDirectDraw4_EnumDisplayModes(p, a, b, c, d) (p)->EnumDisplayModes(a, b, c, d) +#define IDirectDraw4_EnumSurfaces(p, a, b, c, d) (p)->EnumSurfaces(a, b, c, d) +#define IDirectDraw4_FlipToGDISurface(p) (p)->FlipToGDISurface() +#define IDirectDraw4_GetCaps(p, a, b) (p)->GetCaps(a, b) +#define IDirectDraw4_GetDisplayMode(p, a) (p)->GetDisplayMode(a) +#define IDirectDraw4_GetFourCCCodes(p, a, b) (p)->GetFourCCCodes(a, b) +#define IDirectDraw4_GetGDISurface(p, a) (p)->GetGDISurface(a) +#define IDirectDraw4_GetMonitorFrequency(p, a) (p)->GetMonitorFrequency(a) +#define IDirectDraw4_GetScanLine(p, a) (p)->GetScanLine(a) +#define IDirectDraw4_GetVerticalBlankStatus(p, a) (p)->GetVerticalBlankStatus(a) +#define IDirectDraw4_Initialize(p, a) (p)->Initialize(a) +#define IDirectDraw4_RestoreDisplayMode(p) (p)->RestoreDisplayMode() +#define IDirectDraw4_SetCooperativeLevel(p, a, b) (p)->SetCooperativeLevel(a, b) +#define IDirectDraw4_SetDisplayMode(p, a, b, c, d, e) (p)->SetDisplayMode(a, b, c, d, e) +#define IDirectDraw4_WaitForVerticalBlank(p, a, b) (p)->WaitForVerticalBlank(a, b) +#define IDirectDraw4_GetAvailableVidMem(p, a, b, c) (p)->GetAvailableVidMem(a, b, c) +#define IDirectDraw4_GetSurfaceFromDC(p, a, b) (p)->GetSurfaceFromDC(a, b) +#define IDirectDraw4_RestoreAllSurfaces(p) (p)->RestoreAllSurfaces() +#define IDirectDraw4_TestCooperativeLevel(p) (p)->TestCooperativeLevel() +#define IDirectDraw4_GetDeviceIdentifier(p,a,b) (p)->GetDeviceIdentifier(a,b) +#endif + +#endif + +#if defined( _WIN32 ) && !defined( _NO_COM ) +#undef INTERFACE +#define INTERFACE IDirectDraw7 +DECLARE_INTERFACE_( IDirectDraw7, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDraw methods ***/ + STDMETHOD(Compact)(THIS) PURE; + STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE; + STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE; + STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC2, LPDIRECTDRAWSURFACE7 FAR *, IUnknown FAR *) PURE; + STDMETHOD(DuplicateSurface)( THIS_ LPDIRECTDRAWSURFACE7, LPDIRECTDRAWSURFACE7 FAR * ) PURE; + STDMETHOD(EnumDisplayModes)( THIS_ DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2 ) PURE; + STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC2, LPVOID,LPDDENUMSURFACESCALLBACK7 ) PURE; + STDMETHOD(FlipToGDISurface)(THIS) PURE; + STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE; + STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC2) PURE; + STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD, LPDWORD ) PURE; + STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE7 FAR *) PURE; + STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE; + STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE; + STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL ) PURE; + STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE; + STDMETHOD(RestoreDisplayMode)(THIS) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE; + STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD, DWORD, DWORD) PURE; + STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE ) PURE; + /*** Added in the v2 interface ***/ + STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS2, LPDWORD, LPDWORD) PURE; + /*** Added in the V4 Interface ***/ + STDMETHOD(GetSurfaceFromDC) (THIS_ HDC, LPDIRECTDRAWSURFACE7 *) PURE; + STDMETHOD(RestoreAllSurfaces)(THIS) PURE; + STDMETHOD(TestCooperativeLevel)(THIS) PURE; + STDMETHOD(GetDeviceIdentifier)(THIS_ LPDDDEVICEIDENTIFIER2, DWORD ) PURE; + STDMETHOD(StartModeTest)(THIS_ LPSIZE, DWORD, DWORD ) PURE; + STDMETHOD(EvaluateMode)(THIS_ DWORD, DWORD * ) PURE; +}; +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDraw7_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) +#define IDirectDraw7_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDraw7_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDraw7_Compact(p) (p)->lpVtbl->Compact(p) +#define IDirectDraw7_CreateClipper(p, a, b, c) (p)->lpVtbl->CreateClipper(p, a, b, c) +#define IDirectDraw7_CreatePalette(p, a, b, c, d) (p)->lpVtbl->CreatePalette(p, a, b, c, d) +#define IDirectDraw7_CreateSurface(p, a, b, c) (p)->lpVtbl->CreateSurface(p, a, b, c) +#define IDirectDraw7_DuplicateSurface(p, a, b) (p)->lpVtbl->DuplicateSurface(p, a, b) +#define IDirectDraw7_EnumDisplayModes(p, a, b, c, d) (p)->lpVtbl->EnumDisplayModes(p, a, b, c, d) +#define IDirectDraw7_EnumSurfaces(p, a, b, c, d) (p)->lpVtbl->EnumSurfaces(p, a, b, c, d) +#define IDirectDraw7_FlipToGDISurface(p) (p)->lpVtbl->FlipToGDISurface(p) +#define IDirectDraw7_GetCaps(p, a, b) (p)->lpVtbl->GetCaps(p, a, b) +#define IDirectDraw7_GetDisplayMode(p, a) (p)->lpVtbl->GetDisplayMode(p, a) +#define IDirectDraw7_GetFourCCCodes(p, a, b) (p)->lpVtbl->GetFourCCCodes(p, a, b) +#define IDirectDraw7_GetGDISurface(p, a) (p)->lpVtbl->GetGDISurface(p, a) +#define IDirectDraw7_GetMonitorFrequency(p, a) (p)->lpVtbl->GetMonitorFrequency(p, a) +#define IDirectDraw7_GetScanLine(p, a) (p)->lpVtbl->GetScanLine(p, a) +#define IDirectDraw7_GetVerticalBlankStatus(p, a) (p)->lpVtbl->GetVerticalBlankStatus(p, a) +#define IDirectDraw7_Initialize(p, a) (p)->lpVtbl->Initialize(p, a) +#define IDirectDraw7_RestoreDisplayMode(p) (p)->lpVtbl->RestoreDisplayMode(p) +#define IDirectDraw7_SetCooperativeLevel(p, a, b) (p)->lpVtbl->SetCooperativeLevel(p, a, b) +#define IDirectDraw7_SetDisplayMode(p, a, b, c, d, e) (p)->lpVtbl->SetDisplayMode(p, a, b, c, d, e) +#define IDirectDraw7_WaitForVerticalBlank(p, a, b) (p)->lpVtbl->WaitForVerticalBlank(p, a, b) +#define IDirectDraw7_GetAvailableVidMem(p, a, b, c) (p)->lpVtbl->GetAvailableVidMem(p, a, b, c) +#define IDirectDraw7_GetSurfaceFromDC(p, a, b) (p)->lpVtbl->GetSurfaceFromDC(p, a, b) +#define IDirectDraw7_RestoreAllSurfaces(p) (p)->lpVtbl->RestoreAllSurfaces(p) +#define IDirectDraw7_TestCooperativeLevel(p) (p)->lpVtbl->TestCooperativeLevel(p) +#define IDirectDraw7_GetDeviceIdentifier(p,a,b) (p)->lpVtbl->GetDeviceIdentifier(p,a,b) +#define IDirectDraw7_StartModeTest(p,a,b,c) (p)->lpVtbl->StartModeTest(p,a,b,c) +#define IDirectDraw7_EvaluateMode(p,a,b) (p)->lpVtbl->EvaluateMode(p,a,b) +#else +#define IDirectDraw7_QueryInterface(p, a, b) (p)->QueryInterface(a, b) +#define IDirectDraw7_AddRef(p) (p)->AddRef() +#define IDirectDraw7_Release(p) (p)->Release() +#define IDirectDraw7_Compact(p) (p)->Compact() +#define IDirectDraw7_CreateClipper(p, a, b, c) (p)->CreateClipper(a, b, c) +#define IDirectDraw7_CreatePalette(p, a, b, c, d) (p)->CreatePalette(a, b, c, d) +#define IDirectDraw7_CreateSurface(p, a, b, c) (p)->CreateSurface(a, b, c) +#define IDirectDraw7_DuplicateSurface(p, a, b) (p)->DuplicateSurface(a, b) +#define IDirectDraw7_EnumDisplayModes(p, a, b, c, d) (p)->EnumDisplayModes(a, b, c, d) +#define IDirectDraw7_EnumSurfaces(p, a, b, c, d) (p)->EnumSurfaces(a, b, c, d) +#define IDirectDraw7_FlipToGDISurface(p) (p)->FlipToGDISurface() +#define IDirectDraw7_GetCaps(p, a, b) (p)->GetCaps(a, b) +#define IDirectDraw7_GetDisplayMode(p, a) (p)->GetDisplayMode(a) +#define IDirectDraw7_GetFourCCCodes(p, a, b) (p)->GetFourCCCodes(a, b) +#define IDirectDraw7_GetGDISurface(p, a) (p)->GetGDISurface(a) +#define IDirectDraw7_GetMonitorFrequency(p, a) (p)->GetMonitorFrequency(a) +#define IDirectDraw7_GetScanLine(p, a) (p)->GetScanLine(a) +#define IDirectDraw7_GetVerticalBlankStatus(p, a) (p)->GetVerticalBlankStatus(a) +#define IDirectDraw7_Initialize(p, a) (p)->Initialize(a) +#define IDirectDraw7_RestoreDisplayMode(p) (p)->RestoreDisplayMode() +#define IDirectDraw7_SetCooperativeLevel(p, a, b) (p)->SetCooperativeLevel(a, b) +#define IDirectDraw7_SetDisplayMode(p, a, b, c, d, e) (p)->SetDisplayMode(a, b, c, d, e) +#define IDirectDraw7_WaitForVerticalBlank(p, a, b) (p)->WaitForVerticalBlank(a, b) +#define IDirectDraw7_GetAvailableVidMem(p, a, b, c) (p)->GetAvailableVidMem(a, b, c) +#define IDirectDraw7_GetSurfaceFromDC(p, a, b) (p)->GetSurfaceFromDC(a, b) +#define IDirectDraw7_RestoreAllSurfaces(p) (p)->RestoreAllSurfaces() +#define IDirectDraw7_TestCooperativeLevel(p) (p)->TestCooperativeLevel() +#define IDirectDraw7_GetDeviceIdentifier(p,a,b) (p)->GetDeviceIdentifier(a,b) +#define IDirectDraw7_StartModeTest(p,a,b,c) (p)->lpVtbl->StartModeTest(a,b,c) +#define IDirectDraw7_EvaluateMode(p,a,b) (p)->lpVtbl->EvaluateMode(a,b) +#endif + +#endif + + +/* + * IDirectDrawPalette + */ +#if defined( _WIN32 ) && !defined( _NO_COM ) +#undef INTERFACE +#define INTERFACE IDirectDrawPalette +DECLARE_INTERFACE_( IDirectDrawPalette, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDrawPalette methods ***/ + STDMETHOD(GetCaps)(THIS_ LPDWORD) PURE; + STDMETHOD(GetEntries)(THIS_ DWORD,DWORD,DWORD,LPPALETTEENTRY) PURE; + STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, DWORD, LPPALETTEENTRY) PURE; + STDMETHOD(SetEntries)(THIS_ DWORD,DWORD,DWORD,LPPALETTEENTRY) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDrawPalette_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) +#define IDirectDrawPalette_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDrawPalette_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDrawPalette_GetCaps(p, a) (p)->lpVtbl->GetCaps(p, a) +#define IDirectDrawPalette_GetEntries(p, a, b, c, d) (p)->lpVtbl->GetEntries(p, a, b, c, d) +#define IDirectDrawPalette_Initialize(p, a, b, c) (p)->lpVtbl->Initialize(p, a, b, c) +#define IDirectDrawPalette_SetEntries(p, a, b, c, d) (p)->lpVtbl->SetEntries(p, a, b, c, d) +#else +#define IDirectDrawPalette_QueryInterface(p, a, b) (p)->QueryInterface(a, b) +#define IDirectDrawPalette_AddRef(p) (p)->AddRef() +#define IDirectDrawPalette_Release(p) (p)->Release() +#define IDirectDrawPalette_GetCaps(p, a) (p)->GetCaps(a) +#define IDirectDrawPalette_GetEntries(p, a, b, c, d) (p)->GetEntries(a, b, c, d) +#define IDirectDrawPalette_Initialize(p, a, b, c) (p)->Initialize(a, b, c) +#define IDirectDrawPalette_SetEntries(p, a, b, c, d) (p)->SetEntries(a, b, c, d) +#endif + +#endif + + +/* + * IDirectDrawClipper + */ +#if defined( _WIN32 ) && !defined( _NO_COM ) +#undef INTERFACE +#define INTERFACE IDirectDrawClipper +DECLARE_INTERFACE_( IDirectDrawClipper, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDrawClipper methods ***/ + STDMETHOD(GetClipList)(THIS_ LPRECT, LPRGNDATA, LPDWORD) PURE; + STDMETHOD(GetHWnd)(THIS_ HWND FAR *) PURE; + STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, DWORD) PURE; + STDMETHOD(IsClipListChanged)(THIS_ BOOL FAR *) PURE; + STDMETHOD(SetClipList)(THIS_ LPRGNDATA,DWORD) PURE; + STDMETHOD(SetHWnd)(THIS_ DWORD, HWND ) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDrawClipper_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) +#define IDirectDrawClipper_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDrawClipper_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDrawClipper_GetClipList(p, a, b, c) (p)->lpVtbl->GetClipList(p, a, b, c) +#define IDirectDrawClipper_GetHWnd(p, a) (p)->lpVtbl->GetHWnd(p, a) +#define IDirectDrawClipper_Initialize(p, a, b) (p)->lpVtbl->Initialize(p, a, b) +#define IDirectDrawClipper_IsClipListChanged(p, a) (p)->lpVtbl->IsClipListChanged(p, a) +#define IDirectDrawClipper_SetClipList(p, a, b) (p)->lpVtbl->SetClipList(p, a, b) +#define IDirectDrawClipper_SetHWnd(p, a, b) (p)->lpVtbl->SetHWnd(p, a, b) +#else +#define IDirectDrawClipper_QueryInterface(p, a, b) (p)->QueryInterface(a, b) +#define IDirectDrawClipper_AddRef(p) (p)->AddRef() +#define IDirectDrawClipper_Release(p) (p)->Release() +#define IDirectDrawClipper_GetClipList(p, a, b, c) (p)->GetClipList(a, b, c) +#define IDirectDrawClipper_GetHWnd(p, a) (p)->GetHWnd(a) +#define IDirectDrawClipper_Initialize(p, a, b) (p)->Initialize(a, b) +#define IDirectDrawClipper_IsClipListChanged(p, a) (p)->IsClipListChanged(a) +#define IDirectDrawClipper_SetClipList(p, a, b) (p)->SetClipList(a, b) +#define IDirectDrawClipper_SetHWnd(p, a, b) (p)->SetHWnd(a, b) +#endif + +#endif + +/* + * IDirectDrawSurface and related interfaces + */ +#if defined( _WIN32 ) && !defined( _NO_COM ) +#undef INTERFACE +#define INTERFACE IDirectDrawSurface +DECLARE_INTERFACE_( IDirectDrawSurface, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDrawSurface methods ***/ + STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE) PURE; + STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; + STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE, LPRECT,DWORD, LPDDBLTFX) PURE; + STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; + STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE, LPRECT,DWORD) PURE; + STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE) PURE; + STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK) PURE; + STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK) PURE; + STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE, DWORD) PURE; + STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE FAR *) PURE; + STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; + STDMETHOD(GetCaps)(THIS_ LPDDSCAPS) PURE; + STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; + STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; + STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; + STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; + STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; + STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; + STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; + STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC) PURE; + STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC) PURE; + STDMETHOD(IsLost)(THIS) PURE; + STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC,DWORD,HANDLE) PURE; + STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; + STDMETHOD(Restore)(THIS) PURE; + STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; + STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; + STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; + STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; + STDMETHOD(Unlock)(THIS_ LPVOID) PURE; + STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE,LPRECT,DWORD, LPDDOVERLAYFX) PURE; + STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; + STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDrawSurface_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectDrawSurface_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDrawSurface_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDrawSurface_AddAttachedSurface(p,a) (p)->lpVtbl->AddAttachedSurface(p,a) +#define IDirectDrawSurface_AddOverlayDirtyRect(p,a) (p)->lpVtbl->AddOverlayDirtyRect(p,a) +#define IDirectDrawSurface_Blt(p,a,b,c,d,e) (p)->lpVtbl->Blt(p,a,b,c,d,e) +#define IDirectDrawSurface_BltBatch(p,a,b,c) (p)->lpVtbl->BltBatch(p,a,b,c) +#define IDirectDrawSurface_BltFast(p,a,b,c,d,e) (p)->lpVtbl->BltFast(p,a,b,c,d,e) +#define IDirectDrawSurface_DeleteAttachedSurface(p,a,b) (p)->lpVtbl->DeleteAttachedSurface(p,a,b) +#define IDirectDrawSurface_EnumAttachedSurfaces(p,a,b) (p)->lpVtbl->EnumAttachedSurfaces(p,a,b) +#define IDirectDrawSurface_EnumOverlayZOrders(p,a,b,c) (p)->lpVtbl->EnumOverlayZOrders(p,a,b,c) +#define IDirectDrawSurface_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) +#define IDirectDrawSurface_GetAttachedSurface(p,a,b) (p)->lpVtbl->GetAttachedSurface(p,a,b) +#define IDirectDrawSurface_GetBltStatus(p,a) (p)->lpVtbl->GetBltStatus(p,a) +#define IDirectDrawSurface_GetCaps(p,b) (p)->lpVtbl->GetCaps(p,b) +#define IDirectDrawSurface_GetClipper(p,a) (p)->lpVtbl->GetClipper(p,a) +#define IDirectDrawSurface_GetColorKey(p,a,b) (p)->lpVtbl->GetColorKey(p,a,b) +#define IDirectDrawSurface_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) +#define IDirectDrawSurface_GetFlipStatus(p,a) (p)->lpVtbl->GetFlipStatus(p,a) +#define IDirectDrawSurface_GetOverlayPosition(p,a,b) (p)->lpVtbl->GetOverlayPosition(p,a,b) +#define IDirectDrawSurface_GetPalette(p,a) (p)->lpVtbl->GetPalette(p,a) +#define IDirectDrawSurface_GetPixelFormat(p,a) (p)->lpVtbl->GetPixelFormat(p,a) +#define IDirectDrawSurface_GetSurfaceDesc(p,a) (p)->lpVtbl->GetSurfaceDesc(p,a) +#define IDirectDrawSurface_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectDrawSurface_IsLost(p) (p)->lpVtbl->IsLost(p) +#define IDirectDrawSurface_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) +#define IDirectDrawSurface_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) +#define IDirectDrawSurface_Restore(p) (p)->lpVtbl->Restore(p) +#define IDirectDrawSurface_SetClipper(p,a) (p)->lpVtbl->SetClipper(p,a) +#define IDirectDrawSurface_SetColorKey(p,a,b) (p)->lpVtbl->SetColorKey(p,a,b) +#define IDirectDrawSurface_SetOverlayPosition(p,a,b) (p)->lpVtbl->SetOverlayPosition(p,a,b) +#define IDirectDrawSurface_SetPalette(p,a) (p)->lpVtbl->SetPalette(p,a) +#define IDirectDrawSurface_Unlock(p,b) (p)->lpVtbl->Unlock(p,b) +#define IDirectDrawSurface_UpdateOverlay(p,a,b,c,d,e) (p)->lpVtbl->UpdateOverlay(p,a,b,c,d,e) +#define IDirectDrawSurface_UpdateOverlayDisplay(p,a) (p)->lpVtbl->UpdateOverlayDisplay(p,a) +#define IDirectDrawSurface_UpdateOverlayZOrder(p,a,b) (p)->lpVtbl->UpdateOverlayZOrder(p,a,b) +#else +#define IDirectDrawSurface_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectDrawSurface_AddRef(p) (p)->AddRef() +#define IDirectDrawSurface_Release(p) (p)->Release() +#define IDirectDrawSurface_AddAttachedSurface(p,a) (p)->AddAttachedSurface(a) +#define IDirectDrawSurface_AddOverlayDirtyRect(p,a) (p)->AddOverlayDirtyRect(a) +#define IDirectDrawSurface_Blt(p,a,b,c,d,e) (p)->Blt(a,b,c,d,e) +#define IDirectDrawSurface_BltBatch(p,a,b,c) (p)->BltBatch(a,b,c) +#define IDirectDrawSurface_BltFast(p,a,b,c,d,e) (p)->BltFast(a,b,c,d,e) +#define IDirectDrawSurface_DeleteAttachedSurface(p,a,b) (p)->DeleteAttachedSurface(a,b) +#define IDirectDrawSurface_EnumAttachedSurfaces(p,a,b) (p)->EnumAttachedSurfaces(a,b) +#define IDirectDrawSurface_EnumOverlayZOrders(p,a,b,c) (p)->EnumOverlayZOrders(a,b,c) +#define IDirectDrawSurface_Flip(p,a,b) (p)->Flip(a,b) +#define IDirectDrawSurface_GetAttachedSurface(p,a,b) (p)->GetAttachedSurface(a,b) +#define IDirectDrawSurface_GetBltStatus(p,a) (p)->GetBltStatus(a) +#define IDirectDrawSurface_GetCaps(p,b) (p)->GetCaps(b) +#define IDirectDrawSurface_GetClipper(p,a) (p)->GetClipper(a) +#define IDirectDrawSurface_GetColorKey(p,a,b) (p)->GetColorKey(a,b) +#define IDirectDrawSurface_GetDC(p,a) (p)->GetDC(a) +#define IDirectDrawSurface_GetFlipStatus(p,a) (p)->GetFlipStatus(a) +#define IDirectDrawSurface_GetOverlayPosition(p,a,b) (p)->GetOverlayPosition(a,b) +#define IDirectDrawSurface_GetPalette(p,a) (p)->GetPalette(a) +#define IDirectDrawSurface_GetPixelFormat(p,a) (p)->GetPixelFormat(a) +#define IDirectDrawSurface_GetSurfaceDesc(p,a) (p)->GetSurfaceDesc(a) +#define IDirectDrawSurface_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectDrawSurface_IsLost(p) (p)->IsLost() +#define IDirectDrawSurface_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) +#define IDirectDrawSurface_ReleaseDC(p,a) (p)->ReleaseDC(a) +#define IDirectDrawSurface_Restore(p) (p)->Restore() +#define IDirectDrawSurface_SetClipper(p,a) (p)->SetClipper(a) +#define IDirectDrawSurface_SetColorKey(p,a,b) (p)->SetColorKey(a,b) +#define IDirectDrawSurface_SetOverlayPosition(p,a,b) (p)->SetOverlayPosition(a,b) +#define IDirectDrawSurface_SetPalette(p,a) (p)->SetPalette(a) +#define IDirectDrawSurface_Unlock(p,b) (p)->Unlock(b) +#define IDirectDrawSurface_UpdateOverlay(p,a,b,c,d,e) (p)->UpdateOverlay(a,b,c,d,e) +#define IDirectDrawSurface_UpdateOverlayDisplay(p,a) (p)->UpdateOverlayDisplay(a) +#define IDirectDrawSurface_UpdateOverlayZOrder(p,a,b) (p)->UpdateOverlayZOrder(a,b) +#endif + +/* + * IDirectDrawSurface2 and related interfaces + */ +#undef INTERFACE +#define INTERFACE IDirectDrawSurface2 +DECLARE_INTERFACE_( IDirectDrawSurface2, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDrawSurface methods ***/ + STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE2) PURE; + STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; + STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE2, LPRECT,DWORD, LPDDBLTFX) PURE; + STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; + STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE2, LPRECT,DWORD) PURE; + STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE2) PURE; + STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK) PURE; + STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK) PURE; + STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE2, DWORD) PURE; + STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE2 FAR *) PURE; + STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; + STDMETHOD(GetCaps)(THIS_ LPDDSCAPS) PURE; + STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; + STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; + STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; + STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; + STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; + STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; + STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; + STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC) PURE; + STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC) PURE; + STDMETHOD(IsLost)(THIS) PURE; + STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC,DWORD,HANDLE) PURE; + STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; + STDMETHOD(Restore)(THIS) PURE; + STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; + STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; + STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; + STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; + STDMETHOD(Unlock)(THIS_ LPVOID) PURE; + STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE2,LPRECT,DWORD, LPDDOVERLAYFX) PURE; + STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; + STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE2) PURE; + /*** Added in the v2 interface ***/ + STDMETHOD(GetDDInterface)(THIS_ LPVOID FAR *) PURE; + STDMETHOD(PageLock)(THIS_ DWORD) PURE; + STDMETHOD(PageUnlock)(THIS_ DWORD) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDrawSurface2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectDrawSurface2_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDrawSurface2_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDrawSurface2_AddAttachedSurface(p,a) (p)->lpVtbl->AddAttachedSurface(p,a) +#define IDirectDrawSurface2_AddOverlayDirtyRect(p,a) (p)->lpVtbl->AddOverlayDirtyRect(p,a) +#define IDirectDrawSurface2_Blt(p,a,b,c,d,e) (p)->lpVtbl->Blt(p,a,b,c,d,e) +#define IDirectDrawSurface2_BltBatch(p,a,b,c) (p)->lpVtbl->BltBatch(p,a,b,c) +#define IDirectDrawSurface2_BltFast(p,a,b,c,d,e) (p)->lpVtbl->BltFast(p,a,b,c,d,e) +#define IDirectDrawSurface2_DeleteAttachedSurface(p,a,b) (p)->lpVtbl->DeleteAttachedSurface(p,a,b) +#define IDirectDrawSurface2_EnumAttachedSurfaces(p,a,b) (p)->lpVtbl->EnumAttachedSurfaces(p,a,b) +#define IDirectDrawSurface2_EnumOverlayZOrders(p,a,b,c) (p)->lpVtbl->EnumOverlayZOrders(p,a,b,c) +#define IDirectDrawSurface2_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) +#define IDirectDrawSurface2_GetAttachedSurface(p,a,b) (p)->lpVtbl->GetAttachedSurface(p,a,b) +#define IDirectDrawSurface2_GetBltStatus(p,a) (p)->lpVtbl->GetBltStatus(p,a) +#define IDirectDrawSurface2_GetCaps(p,b) (p)->lpVtbl->GetCaps(p,b) +#define IDirectDrawSurface2_GetClipper(p,a) (p)->lpVtbl->GetClipper(p,a) +#define IDirectDrawSurface2_GetColorKey(p,a,b) (p)->lpVtbl->GetColorKey(p,a,b) +#define IDirectDrawSurface2_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) +#define IDirectDrawSurface2_GetFlipStatus(p,a) (p)->lpVtbl->GetFlipStatus(p,a) +#define IDirectDrawSurface2_GetOverlayPosition(p,a,b) (p)->lpVtbl->GetOverlayPosition(p,a,b) +#define IDirectDrawSurface2_GetPalette(p,a) (p)->lpVtbl->GetPalette(p,a) +#define IDirectDrawSurface2_GetPixelFormat(p,a) (p)->lpVtbl->GetPixelFormat(p,a) +#define IDirectDrawSurface2_GetSurfaceDesc(p,a) (p)->lpVtbl->GetSurfaceDesc(p,a) +#define IDirectDrawSurface2_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectDrawSurface2_IsLost(p) (p)->lpVtbl->IsLost(p) +#define IDirectDrawSurface2_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) +#define IDirectDrawSurface2_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) +#define IDirectDrawSurface2_Restore(p) (p)->lpVtbl->Restore(p) +#define IDirectDrawSurface2_SetClipper(p,a) (p)->lpVtbl->SetClipper(p,a) +#define IDirectDrawSurface2_SetColorKey(p,a,b) (p)->lpVtbl->SetColorKey(p,a,b) +#define IDirectDrawSurface2_SetOverlayPosition(p,a,b) (p)->lpVtbl->SetOverlayPosition(p,a,b) +#define IDirectDrawSurface2_SetPalette(p,a) (p)->lpVtbl->SetPalette(p,a) +#define IDirectDrawSurface2_Unlock(p,b) (p)->lpVtbl->Unlock(p,b) +#define IDirectDrawSurface2_UpdateOverlay(p,a,b,c,d,e) (p)->lpVtbl->UpdateOverlay(p,a,b,c,d,e) +#define IDirectDrawSurface2_UpdateOverlayDisplay(p,a) (p)->lpVtbl->UpdateOverlayDisplay(p,a) +#define IDirectDrawSurface2_UpdateOverlayZOrder(p,a,b) (p)->lpVtbl->UpdateOverlayZOrder(p,a,b) +#define IDirectDrawSurface2_GetDDInterface(p,a) (p)->lpVtbl->GetDDInterface(p,a) +#define IDirectDrawSurface2_PageLock(p,a) (p)->lpVtbl->PageLock(p,a) +#define IDirectDrawSurface2_PageUnlock(p,a) (p)->lpVtbl->PageUnlock(p,a) +#else +#define IDirectDrawSurface2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectDrawSurface2_AddRef(p) (p)->AddRef() +#define IDirectDrawSurface2_Release(p) (p)->Release() +#define IDirectDrawSurface2_AddAttachedSurface(p,a) (p)->AddAttachedSurface(a) +#define IDirectDrawSurface2_AddOverlayDirtyRect(p,a) (p)->AddOverlayDirtyRect(a) +#define IDirectDrawSurface2_Blt(p,a,b,c,d,e) (p)->Blt(a,b,c,d,e) +#define IDirectDrawSurface2_BltBatch(p,a,b,c) (p)->BltBatch(a,b,c) +#define IDirectDrawSurface2_BltFast(p,a,b,c,d,e) (p)->BltFast(a,b,c,d,e) +#define IDirectDrawSurface2_DeleteAttachedSurface(p,a,b) (p)->DeleteAttachedSurface(a,b) +#define IDirectDrawSurface2_EnumAttachedSurfaces(p,a,b) (p)->EnumAttachedSurfaces(a,b) +#define IDirectDrawSurface2_EnumOverlayZOrders(p,a,b,c) (p)->EnumOverlayZOrders(a,b,c) +#define IDirectDrawSurface2_Flip(p,a,b) (p)->Flip(a,b) +#define IDirectDrawSurface2_GetAttachedSurface(p,a,b) (p)->GetAttachedSurface(a,b) +#define IDirectDrawSurface2_GetBltStatus(p,a) (p)->GetBltStatus(a) +#define IDirectDrawSurface2_GetCaps(p,b) (p)->GetCaps(b) +#define IDirectDrawSurface2_GetClipper(p,a) (p)->GetClipper(a) +#define IDirectDrawSurface2_GetColorKey(p,a,b) (p)->GetColorKey(a,b) +#define IDirectDrawSurface2_GetDC(p,a) (p)->GetDC(a) +#define IDirectDrawSurface2_GetFlipStatus(p,a) (p)->GetFlipStatus(a) +#define IDirectDrawSurface2_GetOverlayPosition(p,a,b) (p)->GetOverlayPosition(a,b) +#define IDirectDrawSurface2_GetPalette(p,a) (p)->GetPalette(a) +#define IDirectDrawSurface2_GetPixelFormat(p,a) (p)->GetPixelFormat(a) +#define IDirectDrawSurface2_GetSurfaceDesc(p,a) (p)->GetSurfaceDesc(a) +#define IDirectDrawSurface2_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectDrawSurface2_IsLost(p) (p)->IsLost() +#define IDirectDrawSurface2_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) +#define IDirectDrawSurface2_ReleaseDC(p,a) (p)->ReleaseDC(a) +#define IDirectDrawSurface2_Restore(p) (p)->Restore() +#define IDirectDrawSurface2_SetClipper(p,a) (p)->SetClipper(a) +#define IDirectDrawSurface2_SetColorKey(p,a,b) (p)->SetColorKey(a,b) +#define IDirectDrawSurface2_SetOverlayPosition(p,a,b) (p)->SetOverlayPosition(a,b) +#define IDirectDrawSurface2_SetPalette(p,a) (p)->SetPalette(a) +#define IDirectDrawSurface2_Unlock(p,b) (p)->Unlock(b) +#define IDirectDrawSurface2_UpdateOverlay(p,a,b,c,d,e) (p)->UpdateOverlay(a,b,c,d,e) +#define IDirectDrawSurface2_UpdateOverlayDisplay(p,a) (p)->UpdateOverlayDisplay(a) +#define IDirectDrawSurface2_UpdateOverlayZOrder(p,a,b) (p)->UpdateOverlayZOrder(a,b) +#define IDirectDrawSurface2_GetDDInterface(p,a) (p)->GetDDInterface(a) +#define IDirectDrawSurface2_PageLock(p,a) (p)->PageLock(a) +#define IDirectDrawSurface2_PageUnlock(p,a) (p)->PageUnlock(a) +#endif + +/* + * IDirectDrawSurface3 and related interfaces + */ +#undef INTERFACE +#define INTERFACE IDirectDrawSurface3 +DECLARE_INTERFACE_( IDirectDrawSurface3, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDrawSurface methods ***/ + STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE3) PURE; + STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; + STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE3, LPRECT,DWORD, LPDDBLTFX) PURE; + STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; + STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE3, LPRECT,DWORD) PURE; + STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE3) PURE; + STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK) PURE; + STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK) PURE; + STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE3, DWORD) PURE; + STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE3 FAR *) PURE; + STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; + STDMETHOD(GetCaps)(THIS_ LPDDSCAPS) PURE; + STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; + STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; + STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; + STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; + STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; + STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; + STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; + STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC) PURE; + STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC) PURE; + STDMETHOD(IsLost)(THIS) PURE; + STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC,DWORD,HANDLE) PURE; + STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; + STDMETHOD(Restore)(THIS) PURE; + STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; + STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; + STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; + STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; + STDMETHOD(Unlock)(THIS_ LPVOID) PURE; + STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE3,LPRECT,DWORD, LPDDOVERLAYFX) PURE; + STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; + STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE3) PURE; + /*** Added in the v2 interface ***/ + STDMETHOD(GetDDInterface)(THIS_ LPVOID FAR *) PURE; + STDMETHOD(PageLock)(THIS_ DWORD) PURE; + STDMETHOD(PageUnlock)(THIS_ DWORD) PURE; + /*** Added in the V3 interface ***/ + STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC, DWORD) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDrawSurface3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectDrawSurface3_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDrawSurface3_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDrawSurface3_AddAttachedSurface(p,a) (p)->lpVtbl->AddAttachedSurface(p,a) +#define IDirectDrawSurface3_AddOverlayDirtyRect(p,a) (p)->lpVtbl->AddOverlayDirtyRect(p,a) +#define IDirectDrawSurface3_Blt(p,a,b,c,d,e) (p)->lpVtbl->Blt(p,a,b,c,d,e) +#define IDirectDrawSurface3_BltBatch(p,a,b,c) (p)->lpVtbl->BltBatch(p,a,b,c) +#define IDirectDrawSurface3_BltFast(p,a,b,c,d,e) (p)->lpVtbl->BltFast(p,a,b,c,d,e) +#define IDirectDrawSurface3_DeleteAttachedSurface(p,a,b) (p)->lpVtbl->DeleteAttachedSurface(p,a,b) +#define IDirectDrawSurface3_EnumAttachedSurfaces(p,a,b) (p)->lpVtbl->EnumAttachedSurfaces(p,a,b) +#define IDirectDrawSurface3_EnumOverlayZOrders(p,a,b,c) (p)->lpVtbl->EnumOverlayZOrders(p,a,b,c) +#define IDirectDrawSurface3_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) +#define IDirectDrawSurface3_GetAttachedSurface(p,a,b) (p)->lpVtbl->GetAttachedSurface(p,a,b) +#define IDirectDrawSurface3_GetBltStatus(p,a) (p)->lpVtbl->GetBltStatus(p,a) +#define IDirectDrawSurface3_GetCaps(p,b) (p)->lpVtbl->GetCaps(p,b) +#define IDirectDrawSurface3_GetClipper(p,a) (p)->lpVtbl->GetClipper(p,a) +#define IDirectDrawSurface3_GetColorKey(p,a,b) (p)->lpVtbl->GetColorKey(p,a,b) +#define IDirectDrawSurface3_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) +#define IDirectDrawSurface3_GetFlipStatus(p,a) (p)->lpVtbl->GetFlipStatus(p,a) +#define IDirectDrawSurface3_GetOverlayPosition(p,a,b) (p)->lpVtbl->GetOverlayPosition(p,a,b) +#define IDirectDrawSurface3_GetPalette(p,a) (p)->lpVtbl->GetPalette(p,a) +#define IDirectDrawSurface3_GetPixelFormat(p,a) (p)->lpVtbl->GetPixelFormat(p,a) +#define IDirectDrawSurface3_GetSurfaceDesc(p,a) (p)->lpVtbl->GetSurfaceDesc(p,a) +#define IDirectDrawSurface3_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectDrawSurface3_IsLost(p) (p)->lpVtbl->IsLost(p) +#define IDirectDrawSurface3_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) +#define IDirectDrawSurface3_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) +#define IDirectDrawSurface3_Restore(p) (p)->lpVtbl->Restore(p) +#define IDirectDrawSurface3_SetClipper(p,a) (p)->lpVtbl->SetClipper(p,a) +#define IDirectDrawSurface3_SetColorKey(p,a,b) (p)->lpVtbl->SetColorKey(p,a,b) +#define IDirectDrawSurface3_SetOverlayPosition(p,a,b) (p)->lpVtbl->SetOverlayPosition(p,a,b) +#define IDirectDrawSurface3_SetPalette(p,a) (p)->lpVtbl->SetPalette(p,a) +#define IDirectDrawSurface3_Unlock(p,b) (p)->lpVtbl->Unlock(p,b) +#define IDirectDrawSurface3_UpdateOverlay(p,a,b,c,d,e) (p)->lpVtbl->UpdateOverlay(p,a,b,c,d,e) +#define IDirectDrawSurface3_UpdateOverlayDisplay(p,a) (p)->lpVtbl->UpdateOverlayDisplay(p,a) +#define IDirectDrawSurface3_UpdateOverlayZOrder(p,a,b) (p)->lpVtbl->UpdateOverlayZOrder(p,a,b) +#define IDirectDrawSurface3_GetDDInterface(p,a) (p)->lpVtbl->GetDDInterface(p,a) +#define IDirectDrawSurface3_PageLock(p,a) (p)->lpVtbl->PageLock(p,a) +#define IDirectDrawSurface3_PageUnlock(p,a) (p)->lpVtbl->PageUnlock(p,a) +#define IDirectDrawSurface3_SetSurfaceDesc(p,a,b) (p)->lpVtbl->SetSurfaceDesc(p,a,b) +#else +#define IDirectDrawSurface3_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectDrawSurface3_AddRef(p) (p)->AddRef() +#define IDirectDrawSurface3_Release(p) (p)->Release() +#define IDirectDrawSurface3_AddAttachedSurface(p,a) (p)->AddAttachedSurface(a) +#define IDirectDrawSurface3_AddOverlayDirtyRect(p,a) (p)->AddOverlayDirtyRect(a) +#define IDirectDrawSurface3_Blt(p,a,b,c,d,e) (p)->Blt(a,b,c,d,e) +#define IDirectDrawSurface3_BltBatch(p,a,b,c) (p)->BltBatch(a,b,c) +#define IDirectDrawSurface3_BltFast(p,a,b,c,d,e) (p)->BltFast(a,b,c,d,e) +#define IDirectDrawSurface3_DeleteAttachedSurface(p,a,b) (p)->DeleteAttachedSurface(a,b) +#define IDirectDrawSurface3_EnumAttachedSurfaces(p,a,b) (p)->EnumAttachedSurfaces(a,b) +#define IDirectDrawSurface3_EnumOverlayZOrders(p,a,b,c) (p)->EnumOverlayZOrders(a,b,c) +#define IDirectDrawSurface3_Flip(p,a,b) (p)->Flip(a,b) +#define IDirectDrawSurface3_GetAttachedSurface(p,a,b) (p)->GetAttachedSurface(a,b) +#define IDirectDrawSurface3_GetBltStatus(p,a) (p)->GetBltStatus(a) +#define IDirectDrawSurface3_GetCaps(p,b) (p)->GetCaps(b) +#define IDirectDrawSurface3_GetClipper(p,a) (p)->GetClipper(a) +#define IDirectDrawSurface3_GetColorKey(p,a,b) (p)->GetColorKey(a,b) +#define IDirectDrawSurface3_GetDC(p,a) (p)->GetDC(a) +#define IDirectDrawSurface3_GetFlipStatus(p,a) (p)->GetFlipStatus(a) +#define IDirectDrawSurface3_GetOverlayPosition(p,a,b) (p)->GetOverlayPosition(a,b) +#define IDirectDrawSurface3_GetPalette(p,a) (p)->GetPalette(a) +#define IDirectDrawSurface3_GetPixelFormat(p,a) (p)->GetPixelFormat(a) +#define IDirectDrawSurface3_GetSurfaceDesc(p,a) (p)->GetSurfaceDesc(a) +#define IDirectDrawSurface3_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectDrawSurface3_IsLost(p) (p)->IsLost() +#define IDirectDrawSurface3_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) +#define IDirectDrawSurface3_ReleaseDC(p,a) (p)->ReleaseDC(a) +#define IDirectDrawSurface3_Restore(p) (p)->Restore() +#define IDirectDrawSurface3_SetClipper(p,a) (p)->SetClipper(a) +#define IDirectDrawSurface3_SetColorKey(p,a,b) (p)->SetColorKey(a,b) +#define IDirectDrawSurface3_SetOverlayPosition(p,a,b) (p)->SetOverlayPosition(a,b) +#define IDirectDrawSurface3_SetPalette(p,a) (p)->SetPalette(a) +#define IDirectDrawSurface3_Unlock(p,b) (p)->Unlock(b) +#define IDirectDrawSurface3_UpdateOverlay(p,a,b,c,d,e) (p)->UpdateOverlay(a,b,c,d,e) +#define IDirectDrawSurface3_UpdateOverlayDisplay(p,a) (p)->UpdateOverlayDisplay(a) +#define IDirectDrawSurface3_UpdateOverlayZOrder(p,a,b) (p)->UpdateOverlayZOrder(a,b) +#define IDirectDrawSurface3_GetDDInterface(p,a) (p)->GetDDInterface(a) +#define IDirectDrawSurface3_PageLock(p,a) (p)->PageLock(a) +#define IDirectDrawSurface3_PageUnlock(p,a) (p)->PageUnlock(a) +#define IDirectDrawSurface3_SetSurfaceDesc(p,a,b) (p)->SetSurfaceDesc(a,b) +#endif + +/* + * IDirectDrawSurface4 and related interfaces + */ +#undef INTERFACE +#define INTERFACE IDirectDrawSurface4 +DECLARE_INTERFACE_( IDirectDrawSurface4, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDrawSurface methods ***/ + STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE4) PURE; + STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; + STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE4, LPRECT,DWORD, LPDDBLTFX) PURE; + STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; + STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE4, LPRECT,DWORD) PURE; + STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE4) PURE; + STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK2) PURE; + STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK2) PURE; + STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE4, DWORD) PURE; + STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS2, LPDIRECTDRAWSURFACE4 FAR *) PURE; + STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; + STDMETHOD(GetCaps)(THIS_ LPDDSCAPS2) PURE; + STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; + STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; + STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; + STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; + STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; + STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; + STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; + STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC2) PURE; + STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC2) PURE; + STDMETHOD(IsLost)(THIS) PURE; + STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC2,DWORD,HANDLE) PURE; + STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; + STDMETHOD(Restore)(THIS) PURE; + STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; + STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; + STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; + STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; + STDMETHOD(Unlock)(THIS_ LPRECT) PURE; + STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE4,LPRECT,DWORD, LPDDOVERLAYFX) PURE; + STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; + STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE4) PURE; + /*** Added in the v2 interface ***/ + STDMETHOD(GetDDInterface)(THIS_ LPVOID FAR *) PURE; + STDMETHOD(PageLock)(THIS_ DWORD) PURE; + STDMETHOD(PageUnlock)(THIS_ DWORD) PURE; + /*** Added in the v3 interface ***/ + STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC2, DWORD) PURE; + /*** Added in the v4 interface ***/ + STDMETHOD(SetPrivateData)(THIS_ REFGUID, LPVOID, DWORD, DWORD) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID, LPVOID, LPDWORD) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID) PURE; + STDMETHOD(GetUniquenessValue)(THIS_ LPDWORD) PURE; + STDMETHOD(ChangeUniquenessValue)(THIS) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDrawSurface4_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectDrawSurface4_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDrawSurface4_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDrawSurface4_AddAttachedSurface(p,a) (p)->lpVtbl->AddAttachedSurface(p,a) +#define IDirectDrawSurface4_AddOverlayDirtyRect(p,a) (p)->lpVtbl->AddOverlayDirtyRect(p,a) +#define IDirectDrawSurface4_Blt(p,a,b,c,d,e) (p)->lpVtbl->Blt(p,a,b,c,d,e) +#define IDirectDrawSurface4_BltBatch(p,a,b,c) (p)->lpVtbl->BltBatch(p,a,b,c) +#define IDirectDrawSurface4_BltFast(p,a,b,c,d,e) (p)->lpVtbl->BltFast(p,a,b,c,d,e) +#define IDirectDrawSurface4_DeleteAttachedSurface(p,a,b) (p)->lpVtbl->DeleteAttachedSurface(p,a,b) +#define IDirectDrawSurface4_EnumAttachedSurfaces(p,a,b) (p)->lpVtbl->EnumAttachedSurfaces(p,a,b) +#define IDirectDrawSurface4_EnumOverlayZOrders(p,a,b,c) (p)->lpVtbl->EnumOverlayZOrders(p,a,b,c) +#define IDirectDrawSurface4_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) +#define IDirectDrawSurface4_GetAttachedSurface(p,a,b) (p)->lpVtbl->GetAttachedSurface(p,a,b) +#define IDirectDrawSurface4_GetBltStatus(p,a) (p)->lpVtbl->GetBltStatus(p,a) +#define IDirectDrawSurface4_GetCaps(p,b) (p)->lpVtbl->GetCaps(p,b) +#define IDirectDrawSurface4_GetClipper(p,a) (p)->lpVtbl->GetClipper(p,a) +#define IDirectDrawSurface4_GetColorKey(p,a,b) (p)->lpVtbl->GetColorKey(p,a,b) +#define IDirectDrawSurface4_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) +#define IDirectDrawSurface4_GetFlipStatus(p,a) (p)->lpVtbl->GetFlipStatus(p,a) +#define IDirectDrawSurface4_GetOverlayPosition(p,a,b) (p)->lpVtbl->GetOverlayPosition(p,a,b) +#define IDirectDrawSurface4_GetPalette(p,a) (p)->lpVtbl->GetPalette(p,a) +#define IDirectDrawSurface4_GetPixelFormat(p,a) (p)->lpVtbl->GetPixelFormat(p,a) +#define IDirectDrawSurface4_GetSurfaceDesc(p,a) (p)->lpVtbl->GetSurfaceDesc(p,a) +#define IDirectDrawSurface4_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectDrawSurface4_IsLost(p) (p)->lpVtbl->IsLost(p) +#define IDirectDrawSurface4_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) +#define IDirectDrawSurface4_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) +#define IDirectDrawSurface4_Restore(p) (p)->lpVtbl->Restore(p) +#define IDirectDrawSurface4_SetClipper(p,a) (p)->lpVtbl->SetClipper(p,a) +#define IDirectDrawSurface4_SetColorKey(p,a,b) (p)->lpVtbl->SetColorKey(p,a,b) +#define IDirectDrawSurface4_SetOverlayPosition(p,a,b) (p)->lpVtbl->SetOverlayPosition(p,a,b) +#define IDirectDrawSurface4_SetPalette(p,a) (p)->lpVtbl->SetPalette(p,a) +#define IDirectDrawSurface4_Unlock(p,b) (p)->lpVtbl->Unlock(p,b) +#define IDirectDrawSurface4_UpdateOverlay(p,a,b,c,d,e) (p)->lpVtbl->UpdateOverlay(p,a,b,c,d,e) +#define IDirectDrawSurface4_UpdateOverlayDisplay(p,a) (p)->lpVtbl->UpdateOverlayDisplay(p,a) +#define IDirectDrawSurface4_UpdateOverlayZOrder(p,a,b) (p)->lpVtbl->UpdateOverlayZOrder(p,a,b) +#define IDirectDrawSurface4_GetDDInterface(p,a) (p)->lpVtbl->GetDDInterface(p,a) +#define IDirectDrawSurface4_PageLock(p,a) (p)->lpVtbl->PageLock(p,a) +#define IDirectDrawSurface4_PageUnlock(p,a) (p)->lpVtbl->PageUnlock(p,a) +#define IDirectDrawSurface4_SetSurfaceDesc(p,a,b) (p)->lpVtbl->SetSurfaceDesc(p,a,b) +#define IDirectDrawSurface4_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirectDrawSurface4_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirectDrawSurface4_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirectDrawSurface4_GetUniquenessValue(p, a) (p)->lpVtbl->GetUniquenessValue(p, a) +#define IDirectDrawSurface4_ChangeUniquenessValue(p) (p)->lpVtbl->ChangeUniquenessValue(p) +#else +#define IDirectDrawSurface4_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectDrawSurface4_AddRef(p) (p)->AddRef() +#define IDirectDrawSurface4_Release(p) (p)->Release() +#define IDirectDrawSurface4_AddAttachedSurface(p,a) (p)->AddAttachedSurface(a) +#define IDirectDrawSurface4_AddOverlayDirtyRect(p,a) (p)->AddOverlayDirtyRect(a) +#define IDirectDrawSurface4_Blt(p,a,b,c,d,e) (p)->Blt(a,b,c,d,e) +#define IDirectDrawSurface4_BltBatch(p,a,b,c) (p)->BltBatch(a,b,c) +#define IDirectDrawSurface4_BltFast(p,a,b,c,d,e) (p)->BltFast(a,b,c,d,e) +#define IDirectDrawSurface4_DeleteAttachedSurface(p,a,b) (p)->DeleteAttachedSurface(a,b) +#define IDirectDrawSurface4_EnumAttachedSurfaces(p,a,b) (p)->EnumAttachedSurfaces(a,b) +#define IDirectDrawSurface4_EnumOverlayZOrders(p,a,b,c) (p)->EnumOverlayZOrders(a,b,c) +#define IDirectDrawSurface4_Flip(p,a,b) (p)->Flip(a,b) +#define IDirectDrawSurface4_GetAttachedSurface(p,a,b) (p)->GetAttachedSurface(a,b) +#define IDirectDrawSurface4_GetBltStatus(p,a) (p)->GetBltStatus(a) +#define IDirectDrawSurface4_GetCaps(p,b) (p)->GetCaps(b) +#define IDirectDrawSurface4_GetClipper(p,a) (p)->GetClipper(a) +#define IDirectDrawSurface4_GetColorKey(p,a,b) (p)->GetColorKey(a,b) +#define IDirectDrawSurface4_GetDC(p,a) (p)->GetDC(a) +#define IDirectDrawSurface4_GetFlipStatus(p,a) (p)->GetFlipStatus(a) +#define IDirectDrawSurface4_GetOverlayPosition(p,a,b) (p)->GetOverlayPosition(a,b) +#define IDirectDrawSurface4_GetPalette(p,a) (p)->GetPalette(a) +#define IDirectDrawSurface4_GetPixelFormat(p,a) (p)->GetPixelFormat(a) +#define IDirectDrawSurface4_GetSurfaceDesc(p,a) (p)->GetSurfaceDesc(a) +#define IDirectDrawSurface4_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectDrawSurface4_IsLost(p) (p)->IsLost() +#define IDirectDrawSurface4_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) +#define IDirectDrawSurface4_ReleaseDC(p,a) (p)->ReleaseDC(a) +#define IDirectDrawSurface4_Restore(p) (p)->Restore() +#define IDirectDrawSurface4_SetClipper(p,a) (p)->SetClipper(a) +#define IDirectDrawSurface4_SetColorKey(p,a,b) (p)->SetColorKey(a,b) +#define IDirectDrawSurface4_SetOverlayPosition(p,a,b) (p)->SetOverlayPosition(a,b) +#define IDirectDrawSurface4_SetPalette(p,a) (p)->SetPalette(a) +#define IDirectDrawSurface4_Unlock(p,b) (p)->Unlock(b) +#define IDirectDrawSurface4_UpdateOverlay(p,a,b,c,d,e) (p)->UpdateOverlay(a,b,c,d,e) +#define IDirectDrawSurface4_UpdateOverlayDisplay(p,a) (p)->UpdateOverlayDisplay(a) +#define IDirectDrawSurface4_UpdateOverlayZOrder(p,a,b) (p)->UpdateOverlayZOrder(a,b) +#define IDirectDrawSurface4_GetDDInterface(p,a) (p)->GetDDInterface(a) +#define IDirectDrawSurface4_PageLock(p,a) (p)->PageLock(a) +#define IDirectDrawSurface4_PageUnlock(p,a) (p)->PageUnlock(a) +#define IDirectDrawSurface4_SetSurfaceDesc(p,a,b) (p)->SetSurfaceDesc(a,b) +#define IDirectDrawSurface4_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirectDrawSurface4_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirectDrawSurface4_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirectDrawSurface4_GetUniquenessValue(p, a) (p)->GetUniquenessValue(a) +#define IDirectDrawSurface4_ChangeUniquenessValue(p) (p)->ChangeUniquenessValue() +#endif + +/* + * IDirectDrawSurface7 and related interfaces + */ +#undef INTERFACE +#define INTERFACE IDirectDrawSurface7 +DECLARE_INTERFACE_( IDirectDrawSurface7, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDrawSurface methods ***/ + STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE7) PURE; + STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT) PURE; + STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE7, LPRECT,DWORD, LPDDBLTFX) PURE; + STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE; + STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE7, LPRECT,DWORD) PURE; + STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE7) PURE; + STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK7) PURE; + STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK7) PURE; + STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE7, DWORD) PURE; + STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS2, LPDIRECTDRAWSURFACE7 FAR *) PURE; + STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE; + STDMETHOD(GetCaps)(THIS_ LPDDSCAPS2) PURE; + STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE; + STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; + STDMETHOD(GetDC)(THIS_ HDC FAR *) PURE; + STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE; + STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE; + STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE; + STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE; + STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC2) PURE; + STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC2) PURE; + STDMETHOD(IsLost)(THIS) PURE; + STDMETHOD(Lock)(THIS_ LPRECT,LPDDSURFACEDESC2,DWORD,HANDLE) PURE; + STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; + STDMETHOD(Restore)(THIS) PURE; + STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE; + STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE; + STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE; + STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE; + STDMETHOD(Unlock)(THIS_ LPRECT) PURE; + STDMETHOD(UpdateOverlay)(THIS_ LPRECT, LPDIRECTDRAWSURFACE7,LPRECT,DWORD, LPDDOVERLAYFX) PURE; + STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE; + STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE7) PURE; + /*** Added in the v2 interface ***/ + STDMETHOD(GetDDInterface)(THIS_ LPVOID FAR *) PURE; + STDMETHOD(PageLock)(THIS_ DWORD) PURE; + STDMETHOD(PageUnlock)(THIS_ DWORD) PURE; + /*** Added in the v3 interface ***/ + STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC2, DWORD) PURE; + /*** Added in the v4 interface ***/ + STDMETHOD(SetPrivateData)(THIS_ REFGUID, LPVOID, DWORD, DWORD) PURE; + STDMETHOD(GetPrivateData)(THIS_ REFGUID, LPVOID, LPDWORD) PURE; + STDMETHOD(FreePrivateData)(THIS_ REFGUID) PURE; + STDMETHOD(GetUniquenessValue)(THIS_ LPDWORD) PURE; + STDMETHOD(ChangeUniquenessValue)(THIS) PURE; + /*** Moved Texture7 methods here ***/ + STDMETHOD(SetPriority)(THIS_ DWORD) PURE; + STDMETHOD(GetPriority)(THIS_ LPDWORD) PURE; + STDMETHOD(SetLOD)(THIS_ DWORD) PURE; + STDMETHOD(GetLOD)(THIS_ LPDWORD) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDrawSurface7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectDrawSurface7_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDrawSurface7_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDrawSurface7_AddAttachedSurface(p,a) (p)->lpVtbl->AddAttachedSurface(p,a) +#define IDirectDrawSurface7_AddOverlayDirtyRect(p,a) (p)->lpVtbl->AddOverlayDirtyRect(p,a) +#define IDirectDrawSurface7_Blt(p,a,b,c,d,e) (p)->lpVtbl->Blt(p,a,b,c,d,e) +#define IDirectDrawSurface7_BltBatch(p,a,b,c) (p)->lpVtbl->BltBatch(p,a,b,c) +#define IDirectDrawSurface7_BltFast(p,a,b,c,d,e) (p)->lpVtbl->BltFast(p,a,b,c,d,e) +#define IDirectDrawSurface7_DeleteAttachedSurface(p,a,b) (p)->lpVtbl->DeleteAttachedSurface(p,a,b) +#define IDirectDrawSurface7_EnumAttachedSurfaces(p,a,b) (p)->lpVtbl->EnumAttachedSurfaces(p,a,b) +#define IDirectDrawSurface7_EnumOverlayZOrders(p,a,b,c) (p)->lpVtbl->EnumOverlayZOrders(p,a,b,c) +#define IDirectDrawSurface7_Flip(p,a,b) (p)->lpVtbl->Flip(p,a,b) +#define IDirectDrawSurface7_GetAttachedSurface(p,a,b) (p)->lpVtbl->GetAttachedSurface(p,a,b) +#define IDirectDrawSurface7_GetBltStatus(p,a) (p)->lpVtbl->GetBltStatus(p,a) +#define IDirectDrawSurface7_GetCaps(p,b) (p)->lpVtbl->GetCaps(p,b) +#define IDirectDrawSurface7_GetClipper(p,a) (p)->lpVtbl->GetClipper(p,a) +#define IDirectDrawSurface7_GetColorKey(p,a,b) (p)->lpVtbl->GetColorKey(p,a,b) +#define IDirectDrawSurface7_GetDC(p,a) (p)->lpVtbl->GetDC(p,a) +#define IDirectDrawSurface7_GetFlipStatus(p,a) (p)->lpVtbl->GetFlipStatus(p,a) +#define IDirectDrawSurface7_GetOverlayPosition(p,a,b) (p)->lpVtbl->GetOverlayPosition(p,a,b) +#define IDirectDrawSurface7_GetPalette(p,a) (p)->lpVtbl->GetPalette(p,a) +#define IDirectDrawSurface7_GetPixelFormat(p,a) (p)->lpVtbl->GetPixelFormat(p,a) +#define IDirectDrawSurface7_GetSurfaceDesc(p,a) (p)->lpVtbl->GetSurfaceDesc(p,a) +#define IDirectDrawSurface7_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectDrawSurface7_IsLost(p) (p)->lpVtbl->IsLost(p) +#define IDirectDrawSurface7_Lock(p,a,b,c,d) (p)->lpVtbl->Lock(p,a,b,c,d) +#define IDirectDrawSurface7_ReleaseDC(p,a) (p)->lpVtbl->ReleaseDC(p,a) +#define IDirectDrawSurface7_Restore(p) (p)->lpVtbl->Restore(p) +#define IDirectDrawSurface7_SetClipper(p,a) (p)->lpVtbl->SetClipper(p,a) +#define IDirectDrawSurface7_SetColorKey(p,a,b) (p)->lpVtbl->SetColorKey(p,a,b) +#define IDirectDrawSurface7_SetOverlayPosition(p,a,b) (p)->lpVtbl->SetOverlayPosition(p,a,b) +#define IDirectDrawSurface7_SetPalette(p,a) (p)->lpVtbl->SetPalette(p,a) +#define IDirectDrawSurface7_Unlock(p,b) (p)->lpVtbl->Unlock(p,b) +#define IDirectDrawSurface7_UpdateOverlay(p,a,b,c,d,e) (p)->lpVtbl->UpdateOverlay(p,a,b,c,d,e) +#define IDirectDrawSurface7_UpdateOverlayDisplay(p,a) (p)->lpVtbl->UpdateOverlayDisplay(p,a) +#define IDirectDrawSurface7_UpdateOverlayZOrder(p,a,b) (p)->lpVtbl->UpdateOverlayZOrder(p,a,b) +#define IDirectDrawSurface7_GetDDInterface(p,a) (p)->lpVtbl->GetDDInterface(p,a) +#define IDirectDrawSurface7_PageLock(p,a) (p)->lpVtbl->PageLock(p,a) +#define IDirectDrawSurface7_PageUnlock(p,a) (p)->lpVtbl->PageUnlock(p,a) +#define IDirectDrawSurface7_SetSurfaceDesc(p,a,b) (p)->lpVtbl->SetSurfaceDesc(p,a,b) +#define IDirectDrawSurface7_SetPrivateData(p,a,b,c,d) (p)->lpVtbl->SetPrivateData(p,a,b,c,d) +#define IDirectDrawSurface7_GetPrivateData(p,a,b,c) (p)->lpVtbl->GetPrivateData(p,a,b,c) +#define IDirectDrawSurface7_FreePrivateData(p,a) (p)->lpVtbl->FreePrivateData(p,a) +#define IDirectDrawSurface7_GetUniquenessValue(p, a) (p)->lpVtbl->GetUniquenessValue(p, a) +#define IDirectDrawSurface7_ChangeUniquenessValue(p) (p)->lpVtbl->ChangeUniquenessValue(p) +#define IDirectDrawSurface7_SetPriority(p,a) (p)->lpVtbl->SetPriority(p,a) +#define IDirectDrawSurface7_GetPriority(p,a) (p)->lpVtbl->GetPriority(p,a) +#define IDirectDrawSurface7_SetLOD(p,a) (p)->lpVtbl->SetLOD(p,a) +#define IDirectDrawSurface7_GetLOD(p,a) (p)->lpVtbl->GetLOD(p,a) +#else +#define IDirectDrawSurface7_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectDrawSurface7_AddRef(p) (p)->AddRef() +#define IDirectDrawSurface7_Release(p) (p)->Release() +#define IDirectDrawSurface7_AddAttachedSurface(p,a) (p)->AddAttachedSurface(a) +#define IDirectDrawSurface7_AddOverlayDirtyRect(p,a) (p)->AddOverlayDirtyRect(a) +#define IDirectDrawSurface7_Blt(p,a,b,c,d,e) (p)->Blt(a,b,c,d,e) +#define IDirectDrawSurface7_BltBatch(p,a,b,c) (p)->BltBatch(a,b,c) +#define IDirectDrawSurface7_BltFast(p,a,b,c,d,e) (p)->BltFast(a,b,c,d,e) +#define IDirectDrawSurface7_DeleteAttachedSurface(p,a,b) (p)->DeleteAttachedSurface(a,b) +#define IDirectDrawSurface7_EnumAttachedSurfaces(p,a,b) (p)->EnumAttachedSurfaces(a,b) +#define IDirectDrawSurface7_EnumOverlayZOrders(p,a,b,c) (p)->EnumOverlayZOrders(a,b,c) +#define IDirectDrawSurface7_Flip(p,a,b) (p)->Flip(a,b) +#define IDirectDrawSurface7_GetAttachedSurface(p,a,b) (p)->GetAttachedSurface(a,b) +#define IDirectDrawSurface7_GetBltStatus(p,a) (p)->GetBltStatus(a) +#define IDirectDrawSurface7_GetCaps(p,b) (p)->GetCaps(b) +#define IDirectDrawSurface7_GetClipper(p,a) (p)->GetClipper(a) +#define IDirectDrawSurface7_GetColorKey(p,a,b) (p)->GetColorKey(a,b) +#define IDirectDrawSurface7_GetDC(p,a) (p)->GetDC(a) +#define IDirectDrawSurface7_GetFlipStatus(p,a) (p)->GetFlipStatus(a) +#define IDirectDrawSurface7_GetOverlayPosition(p,a,b) (p)->GetOverlayPosition(a,b) +#define IDirectDrawSurface7_GetPalette(p,a) (p)->GetPalette(a) +#define IDirectDrawSurface7_GetPixelFormat(p,a) (p)->GetPixelFormat(a) +#define IDirectDrawSurface7_GetSurfaceDesc(p,a) (p)->GetSurfaceDesc(a) +#define IDirectDrawSurface7_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectDrawSurface7_IsLost(p) (p)->IsLost() +#define IDirectDrawSurface7_Lock(p,a,b,c,d) (p)->Lock(a,b,c,d) +#define IDirectDrawSurface7_ReleaseDC(p,a) (p)->ReleaseDC(a) +#define IDirectDrawSurface7_Restore(p) (p)->Restore() +#define IDirectDrawSurface7_SetClipper(p,a) (p)->SetClipper(a) +#define IDirectDrawSurface7_SetColorKey(p,a,b) (p)->SetColorKey(a,b) +#define IDirectDrawSurface7_SetOverlayPosition(p,a,b) (p)->SetOverlayPosition(a,b) +#define IDirectDrawSurface7_SetPalette(p,a) (p)->SetPalette(a) +#define IDirectDrawSurface7_Unlock(p,b) (p)->Unlock(b) +#define IDirectDrawSurface7_UpdateOverlay(p,a,b,c,d,e) (p)->UpdateOverlay(a,b,c,d,e) +#define IDirectDrawSurface7_UpdateOverlayDisplay(p,a) (p)->UpdateOverlayDisplay(a) +#define IDirectDrawSurface7_UpdateOverlayZOrder(p,a,b) (p)->UpdateOverlayZOrder(a,b) +#define IDirectDrawSurface7_GetDDInterface(p,a) (p)->GetDDInterface(a) +#define IDirectDrawSurface7_PageLock(p,a) (p)->PageLock(a) +#define IDirectDrawSurface7_PageUnlock(p,a) (p)->PageUnlock(a) +#define IDirectDrawSurface7_SetSurfaceDesc(p,a,b) (p)->SetSurfaceDesc(a,b) +#define IDirectDrawSurface7_SetPrivateData(p,a,b,c,d) (p)->SetPrivateData(a,b,c,d) +#define IDirectDrawSurface7_GetPrivateData(p,a,b,c) (p)->GetPrivateData(a,b,c) +#define IDirectDrawSurface7_FreePrivateData(p,a) (p)->FreePrivateData(a) +#define IDirectDrawSurface7_GetUniquenessValue(p, a) (p)->GetUniquenessValue(a) +#define IDirectDrawSurface7_ChangeUniquenessValue(p) (p)->ChangeUniquenessValue() +#define IDirectDrawSurface7_SetPriority(p,a) (p)->SetPriority(a) +#define IDirectDrawSurface7_GetPriority(p,a) (p)->GetPriority(a) +#define IDirectDrawSurface7_SetLOD(p,a) (p)->SetLOD(a) +#define IDirectDrawSurface7_GetLOD(p,a) (p)->GetLOD(a) +#endif + + +/* + * IDirectDrawColorControl + */ +#if defined( _WIN32 ) && !defined( _NO_COM ) +#undef INTERFACE +#define INTERFACE IDirectDrawColorControl +DECLARE_INTERFACE_( IDirectDrawColorControl, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDrawColorControl methods ***/ + STDMETHOD(GetColorControls)(THIS_ LPDDCOLORCONTROL) PURE; + STDMETHOD(SetColorControls)(THIS_ LPDDCOLORCONTROL) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDrawColorControl_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) +#define IDirectDrawColorControl_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDrawColorControl_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDrawColorControl_GetColorControls(p, a) (p)->lpVtbl->GetColorControls(p, a) +#define IDirectDrawColorControl_SetColorControls(p, a) (p)->lpVtbl->SetColorControls(p, a) +#else +#define IDirectDrawColorControl_QueryInterface(p, a, b) (p)->QueryInterface(a, b) +#define IDirectDrawColorControl_AddRef(p) (p)->AddRef() +#define IDirectDrawColorControl_Release(p) (p)->Release() +#define IDirectDrawColorControl_GetColorControls(p, a) (p)->GetColorControls(a) +#define IDirectDrawColorControl_SetColorControls(p, a) (p)->SetColorControls(a) +#endif + +#endif + + +/* + * IDirectDrawGammaControl + */ +#if defined( _WIN32 ) && !defined( _NO_COM ) +#undef INTERFACE +#define INTERFACE IDirectDrawGammaControl +DECLARE_INTERFACE_( IDirectDrawGammaControl, IUnknown ) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IDirectDrawGammaControl methods ***/ + STDMETHOD(GetGammaRamp)(THIS_ DWORD, LPDDGAMMARAMP) PURE; + STDMETHOD(SetGammaRamp)(THIS_ DWORD, LPDDGAMMARAMP) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectDrawGammaControl_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) +#define IDirectDrawGammaControl_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectDrawGammaControl_Release(p) (p)->lpVtbl->Release(p) +#define IDirectDrawGammaControl_GetGammaRamp(p, a, b) (p)->lpVtbl->GetGammaRamp(p, a, b) +#define IDirectDrawGammaControl_SetGammaRamp(p, a, b) (p)->lpVtbl->SetGammaRamp(p, a, b) +#else +#define IDirectDrawGammaControl_QueryInterface(p, a, b) (p)->QueryInterface(a, b) +#define IDirectDrawGammaControl_AddRef(p) (p)->AddRef() +#define IDirectDrawGammaControl_Release(p) (p)->Release() +#define IDirectDrawGammaControl_GetGammaRamp(p, a, b) (p)->GetGammaRamp(a, b) +#define IDirectDrawGammaControl_SetGammaRamp(p, a, b) (p)->SetGammaRamp(a, b) +#endif + +#endif + + + +#endif + + +/* + * DDSURFACEDESC + */ +typedef struct _DDSURFACEDESC +{ + DWORD dwSize; // size of the DDSURFACEDESC structure + DWORD dwFlags; // determines what fields are valid + DWORD dwHeight; // height of surface to be created + DWORD dwWidth; // width of input surface + union + { + LONG lPitch; // distance to start of next line (return value only) + DWORD dwLinearSize; // Formless late-allocated optimized surface size + } DUMMYUNIONNAMEN(1); + DWORD dwBackBufferCount; // number of back buffers requested + union + { + DWORD dwMipMapCount; // number of mip-map levels requested + DWORD dwZBufferBitDepth; // depth of Z buffer requested + DWORD dwRefreshRate; // refresh rate (used when display mode is described) + } DUMMYUNIONNAMEN(2); + DWORD dwAlphaBitDepth; // depth of alpha buffer requested + DWORD dwReserved; // reserved + LPVOID lpSurface; // pointer to the associated surface memory + DDCOLORKEY ddckCKDestOverlay; // color key for destination overlay use + DDCOLORKEY ddckCKDestBlt; // color key for destination blt use + DDCOLORKEY ddckCKSrcOverlay; // color key for source overlay use + DDCOLORKEY ddckCKSrcBlt; // color key for source blt use + DDPIXELFORMAT ddpfPixelFormat; // pixel format description of the surface + DDSCAPS ddsCaps; // direct draw surface capabilities +} DDSURFACEDESC; + +/* + * DDSURFACEDESC2 + */ +typedef struct _DDSURFACEDESC2 +{ + DWORD dwSize; // size of the DDSURFACEDESC structure + DWORD dwFlags; // determines what fields are valid + DWORD dwHeight; // height of surface to be created + DWORD dwWidth; // width of input surface + union + { + LONG lPitch; // distance to start of next line (return value only) + DWORD dwLinearSize; // Formless late-allocated optimized surface size + } DUMMYUNIONNAMEN(1); + union + { + DWORD dwBackBufferCount; // number of back buffers requested + DWORD dwDepth; // the depth if this is a volume texture + } DUMMYUNIONNAMEN(5); + union + { + DWORD dwMipMapCount; // number of mip-map levels requestde + // dwZBufferBitDepth removed, use ddpfPixelFormat one instead + DWORD dwRefreshRate; // refresh rate (used when display mode is described) + DWORD dwSrcVBHandle; // The source used in VB::Optimize + } DUMMYUNIONNAMEN(2); + DWORD dwAlphaBitDepth; // depth of alpha buffer requested + DWORD dwReserved; // reserved + LPVOID lpSurface; // pointer to the associated surface memory + union + { + DDCOLORKEY ddckCKDestOverlay; // color key for destination overlay use + DWORD dwEmptyFaceColor; // Physical color for empty cubemap faces + } DUMMYUNIONNAMEN(3); + DDCOLORKEY ddckCKDestBlt; // color key for destination blt use + DDCOLORKEY ddckCKSrcOverlay; // color key for source overlay use + DDCOLORKEY ddckCKSrcBlt; // color key for source blt use + union + { + DDPIXELFORMAT ddpfPixelFormat; // pixel format description of the surface + DWORD dwFVF; // vertex format description of vertex buffers + } DUMMYUNIONNAMEN(4); + DDSCAPS2 ddsCaps; // direct draw surface capabilities + DWORD dwTextureStage; // stage in multitexture cascade +} DDSURFACEDESC2; + +/* + * ddsCaps field is valid. + */ +#define DDSD_CAPS 0x00000001l // default + +/* + * dwHeight field is valid. + */ +#define DDSD_HEIGHT 0x00000002l + +/* + * dwWidth field is valid. + */ +#define DDSD_WIDTH 0x00000004l + +/* + * lPitch is valid. + */ +#define DDSD_PITCH 0x00000008l + +/* + * dwBackBufferCount is valid. + */ +#define DDSD_BACKBUFFERCOUNT 0x00000020l + +/* + * dwZBufferBitDepth is valid. (shouldnt be used in DDSURFACEDESC2) + */ +#define DDSD_ZBUFFERBITDEPTH 0x00000040l + +/* + * dwAlphaBitDepth is valid. + */ +#define DDSD_ALPHABITDEPTH 0x00000080l + + +/* + * lpSurface is valid. + */ +#define DDSD_LPSURFACE 0x00000800l + +/* + * ddpfPixelFormat is valid. + */ +#define DDSD_PIXELFORMAT 0x00001000l + +/* + * ddckCKDestOverlay is valid. + */ +#define DDSD_CKDESTOVERLAY 0x00002000l + +/* + * ddckCKDestBlt is valid. + */ +#define DDSD_CKDESTBLT 0x00004000l + +/* + * ddckCKSrcOverlay is valid. + */ +#define DDSD_CKSRCOVERLAY 0x00008000l + +/* + * ddckCKSrcBlt is valid. + */ +#define DDSD_CKSRCBLT 0x00010000l + +/* + * dwMipMapCount is valid. + */ +#define DDSD_MIPMAPCOUNT 0x00020000l + + /* + * dwRefreshRate is valid + */ +#define DDSD_REFRESHRATE 0x00040000l + +/* + * dwLinearSize is valid + */ +#define DDSD_LINEARSIZE 0x00080000l + +/* + * dwTextureStage is valid + */ +#define DDSD_TEXTURESTAGE 0x00100000l +/* + * dwFVF is valid + */ +#define DDSD_FVF 0x00200000l +/* + * dwSrcVBHandle is valid + */ +#define DDSD_SRCVBHANDLE 0x00400000l + +/* + * dwDepth is valid + */ +#define DDSD_DEPTH 0x00800000l + +/* + * All input fields are valid. + */ +#define DDSD_ALL 0x00fff9eel + +/* + * DDOPTSURFACEDESC + */ +typedef struct _DDOPTSURFACEDESC +{ + DWORD dwSize; // size of the DDOPTSURFACEDESC structure + DWORD dwFlags; // determines what fields are valid + DDSCAPS2 ddSCaps; // Common caps like: Memory type + DDOSCAPS ddOSCaps; // Common caps like: Memory type + GUID guid; // Compression technique GUID + DWORD dwCompressionRatio; // Compression ratio +} DDOPTSURFACEDESC; + +/* + * guid field is valid. + */ +#define DDOSD_GUID 0x00000001l + +/* + * dwCompressionRatio field is valid. + */ +#define DDOSD_COMPRESSION_RATIO 0x00000002l + +/* + * ddSCaps field is valid. + */ +#define DDOSD_SCAPS 0x00000004l + +/* + * ddOSCaps field is valid. + */ +#define DDOSD_OSCAPS 0x00000008l + +/* + * All input fields are valid. + */ +#define DDOSD_ALL 0x0000000fl + +/* + * The surface's optimized pixelformat is compressed + */ +#define DDOSDCAPS_OPTCOMPRESSED 0x00000001l + +/* + * The surface's optimized pixelformat is reordered + */ +#define DDOSDCAPS_OPTREORDERED 0x00000002l + +/* + * The opt surface is a monolithic mipmap + */ +#define DDOSDCAPS_MONOLITHICMIPMAP 0x00000004l + +/* + * The valid Surf caps: + * #define DDSCAPS_SYSTEMMEMORY 0x00000800l + * #define DDSCAPS_VIDEOMEMORY 0x00004000l + * #define DDSCAPS_LOCALVIDMEM 0x10000000l + * #define DDSCAPS_NONLOCALVIDMEM 0x20000000l + */ +#define DDOSDCAPS_VALIDSCAPS 0x30004800l + +/* + * The valid OptSurf caps + */ +#define DDOSDCAPS_VALIDOSCAPS 0x00000007l + + +/* + * DDCOLORCONTROL + */ +typedef struct _DDCOLORCONTROL +{ + DWORD dwSize; + DWORD dwFlags; + LONG lBrightness; + LONG lContrast; + LONG lHue; + LONG lSaturation; + LONG lSharpness; + LONG lGamma; + LONG lColorEnable; + DWORD dwReserved1; +} DDCOLORCONTROL; + + +/* + * lBrightness field is valid. + */ +#define DDCOLOR_BRIGHTNESS 0x00000001l + +/* + * lContrast field is valid. + */ +#define DDCOLOR_CONTRAST 0x00000002l + +/* + * lHue field is valid. + */ +#define DDCOLOR_HUE 0x00000004l + +/* + * lSaturation field is valid. + */ +#define DDCOLOR_SATURATION 0x00000008l + +/* + * lSharpness field is valid. + */ +#define DDCOLOR_SHARPNESS 0x00000010l + +/* + * lGamma field is valid. + */ +#define DDCOLOR_GAMMA 0x00000020l + +/* + * lColorEnable field is valid. + */ +#define DDCOLOR_COLORENABLE 0x00000040l + + + +/*============================================================================ + * + * Direct Draw Capability Flags + * + * These flags are used to describe the capabilities of a given Surface. + * All flags are bit flags. + * + *==========================================================================*/ + +/**************************************************************************** + * + * DIRECTDRAWSURFACE CAPABILITY FLAGS + * + ****************************************************************************/ + +/* + * This bit is reserved. It should not be specified. + */ +#define DDSCAPS_RESERVED1 0x00000001l + +/* + * Indicates that this surface contains alpha-only information. + * (To determine if a surface is RGBA/YUVA, the pixel format must be + * interrogated.) + */ +#define DDSCAPS_ALPHA 0x00000002l + +/* + * Indicates that this surface is a backbuffer. It is generally + * set by CreateSurface when the DDSCAPS_FLIP capability bit is set. + * It indicates that this surface is THE back buffer of a surface + * flipping structure. DirectDraw supports N surfaces in a + * surface flipping structure. Only the surface that immediately + * precedeces the DDSCAPS_FRONTBUFFER has this capability bit set. + * The other surfaces are identified as back buffers by the presence + * of the DDSCAPS_FLIP capability, their attachment order, and the + * absence of the DDSCAPS_FRONTBUFFER and DDSCAPS_BACKBUFFER + * capabilities. The bit is sent to CreateSurface when a standalone + * back buffer is being created. This surface could be attached to + * a front buffer and/or back buffers to form a flipping surface + * structure after the CreateSurface call. See AddAttachments for + * a detailed description of the behaviors in this case. + */ +#define DDSCAPS_BACKBUFFER 0x00000004l + +/* + * Indicates a complex surface structure is being described. A + * complex surface structure results in the creation of more than + * one surface. The additional surfaces are attached to the root + * surface. The complex structure can only be destroyed by + * destroying the root. + */ +#define DDSCAPS_COMPLEX 0x00000008l + +/* + * Indicates that this surface is a part of a surface flipping structure. + * When it is passed to CreateSurface the DDSCAPS_FRONTBUFFER and + * DDSCAP_BACKBUFFER bits are not set. They are set by CreateSurface + * on the resulting creations. The dwBackBufferCount field in the + * DDSURFACEDESC structure must be set to at least 1 in order for + * the CreateSurface call to succeed. The DDSCAPS_COMPLEX capability + * must always be set with creating multiple surfaces through CreateSurface. + */ +#define DDSCAPS_FLIP 0x00000010l + +/* + * Indicates that this surface is THE front buffer of a surface flipping + * structure. It is generally set by CreateSurface when the DDSCAPS_FLIP + * capability bit is set. + * If this capability is sent to CreateSurface then a standalonw front buffer + * is created. This surface will not have the DDSCAPS_FLIP capability. + * It can be attached to other back buffers to form a flipping structure. + * See AddAttachments for a detailed description of the behaviors in this + * case. + */ +#define DDSCAPS_FRONTBUFFER 0x00000020l + +/* + * Indicates that this surface is any offscreen surface that is not an overlay, + * texture, zbuffer, front buffer, back buffer, or alpha surface. It is used + * to identify plain vanilla surfaces. + */ +#define DDSCAPS_OFFSCREENPLAIN 0x00000040l + +/* + * Indicates that this surface is an overlay. It may or may not be directly visible + * depending on whether or not it is currently being overlayed onto the primary + * surface. DDSCAPS_VISIBLE can be used to determine whether or not it is being + * overlayed at the moment. + */ +#define DDSCAPS_OVERLAY 0x00000080l + +/* + * Indicates that unique DirectDrawPalette objects can be created and + * attached to this surface. + */ +#define DDSCAPS_PALETTE 0x00000100l + +/* + * Indicates that this surface is the primary surface. The primary + * surface represents what the user is seeing at the moment. + */ +#define DDSCAPS_PRIMARYSURFACE 0x00000200l + + +/* + * This flag used to be DDSCAPS_PRIMARYSURFACELEFT, which is now + * obsolete. + */ +#define DDSCAPS_RESERVED3 0x00000400l +#define DDSCAPS_PRIMARYSURFACELEFT 0x00000000l + +/* + * Indicates that this surface memory was allocated in system memory + */ +#define DDSCAPS_SYSTEMMEMORY 0x00000800l + +/* + * Indicates that this surface can be used as a 3D texture. It does not + * indicate whether or not the surface is being used for that purpose. + */ +#define DDSCAPS_TEXTURE 0x00001000l + +/* + * Indicates that a surface may be a destination for 3D rendering. This + * bit must be set in order to query for a Direct3D Device Interface + * from this surface. + */ +#define DDSCAPS_3DDEVICE 0x00002000l + +/* + * Indicates that this surface exists in video memory. + */ +#define DDSCAPS_VIDEOMEMORY 0x00004000l + +/* + * Indicates that changes made to this surface are immediately visible. + * It is always set for the primary surface and is set for overlays while + * they are being overlayed and texture maps while they are being textured. + */ +#define DDSCAPS_VISIBLE 0x00008000l + +/* + * Indicates that only writes are permitted to the surface. Read accesses + * from the surface may or may not generate a protection fault, but the + * results of a read from this surface will not be meaningful. READ ONLY. + */ +#define DDSCAPS_WRITEONLY 0x00010000l + +/* + * Indicates that this surface is a z buffer. A z buffer does not contain + * displayable information. Instead it contains bit depth information that is + * used to determine which pixels are visible and which are obscured. + */ +#define DDSCAPS_ZBUFFER 0x00020000l + +/* + * Indicates surface will have a DC associated long term + */ +#define DDSCAPS_OWNDC 0x00040000l + +/* + * Indicates surface should be able to receive live video + */ +#define DDSCAPS_LIVEVIDEO 0x00080000l + +/* + * Indicates surface should be able to have a stream decompressed + * to it by the hardware. + */ +#define DDSCAPS_HWCODEC 0x00100000l + +/* + * Surface is a ModeX surface. + * + */ +#define DDSCAPS_MODEX 0x00200000l + +/* + * Indicates surface is one level of a mip-map. This surface will + * be attached to other DDSCAPS_MIPMAP surfaces to form the mip-map. + * This can be done explicitly, by creating a number of surfaces and + * attaching them with AddAttachedSurface or by implicitly by CreateSurface. + * If this bit is set then DDSCAPS_TEXTURE must also be set. + */ +#define DDSCAPS_MIPMAP 0x00400000l + +/* + * This bit is reserved. It should not be specified. + */ +#define DDSCAPS_RESERVED2 0x00800000l + + +/* + * Indicates that memory for the surface is not allocated until the surface + * is loaded (via the Direct3D texture Load() function). + */ +#define DDSCAPS_ALLOCONLOAD 0x04000000l + +/* + * Indicates that the surface will recieve data from a video port. + */ +#define DDSCAPS_VIDEOPORT 0x08000000l + +/* + * Indicates that a video memory surface is resident in true, local video + * memory rather than non-local video memory. If this flag is specified then + * so must DDSCAPS_VIDEOMEMORY. This flag is mutually exclusive with + * DDSCAPS_NONLOCALVIDMEM. + */ +#define DDSCAPS_LOCALVIDMEM 0x10000000l + +/* + * Indicates that a video memory surface is resident in non-local video + * memory rather than true, local video memory. If this flag is specified + * then so must DDSCAPS_VIDEOMEMORY. This flag is mutually exclusive with + * DDSCAPS_LOCALVIDMEM. + */ +#define DDSCAPS_NONLOCALVIDMEM 0x20000000l + +/* + * Indicates that this surface is a standard VGA mode surface, and not a + * ModeX surface. (This flag will never be set in combination with the + * DDSCAPS_MODEX flag). + */ +#define DDSCAPS_STANDARDVGAMODE 0x40000000l + +/* + * Indicates that this surface will be an optimized surface. This flag is + * currently only valid in conjunction with the DDSCAPS_TEXTURE flag. The surface + * will be created without any underlying video memory until loaded. + */ +#define DDSCAPS_OPTIMIZED 0x80000000l + + + +/* + * This bit is reserved + */ +#define DDSCAPS2_RESERVED4 0x00000002L +#define DDSCAPS2_HARDWAREDEINTERLACE 0x00000000L + +/* + * Indicates to the driver that this surface will be locked very frequently + * (for procedural textures, dynamic lightmaps, etc). Surfaces with this cap + * set must also have DDSCAPS_TEXTURE. This cap cannot be used with + * DDSCAPS2_HINTSTATIC and DDSCAPS2_OPAQUE. + */ +#define DDSCAPS2_HINTDYNAMIC 0x00000004L + +/* + * Indicates to the driver that this surface can be re-ordered/retiled on + * load. This operation will not change the size of the texture. It is + * relatively fast and symmetrical, since the application may lock these + * bits (although it will take a performance hit when doing so). Surfaces + * with this cap set must also have DDSCAPS_TEXTURE. This cap cannot be + * used with DDSCAPS2_HINTDYNAMIC and DDSCAPS2_OPAQUE. + */ +#define DDSCAPS2_HINTSTATIC 0x00000008L + +/* + * Indicates that the client would like this texture surface to be managed by the + * DirectDraw/Direct3D runtime. Surfaces with this cap set must also have + * DDSCAPS_TEXTURE set. + */ +#define DDSCAPS2_TEXTUREMANAGE 0x00000010L + +/* + * These bits are reserved for internal use */ +#define DDSCAPS2_RESERVED1 0x00000020L +#define DDSCAPS2_RESERVED2 0x00000040L + +/* + * Indicates to the driver that this surface will never be locked again. + * The driver is free to optimize this surface via retiling and actual compression. + * All calls to Lock() or Blts from this surface will fail. Surfaces with this + * cap set must also have DDSCAPS_TEXTURE. This cap cannot be used with + * DDSCAPS2_HINTDYNAMIC and DDSCAPS2_HINTSTATIC. + */ +#define DDSCAPS2_OPAQUE 0x00000080L + +/* + * Applications should set this bit at CreateSurface time to indicate that they + * intend to use antialiasing. Only valid if DDSCAPS_3DDEVICE is also set. + */ +#define DDSCAPS2_HINTANTIALIASING 0x00000100L + + +/* + * This flag is used at CreateSurface time to indicate that this set of + * surfaces is a cubic environment map + */ +#define DDSCAPS2_CUBEMAP 0x00000200L + +/* + * These flags preform two functions: + * - At CreateSurface time, they define which of the six cube faces are + * required by the application. + * - After creation, each face in the cubemap will have exactly one of these + * bits set. + */ +#define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400L +#define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800L +#define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000L +#define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000L +#define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000L +#define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000L + +/* + * This macro may be used to specify all faces of a cube map at CreateSurface time + */ +#define DDSCAPS2_CUBEMAP_ALLFACES ( DDSCAPS2_CUBEMAP_POSITIVEX |\ + DDSCAPS2_CUBEMAP_NEGATIVEX |\ + DDSCAPS2_CUBEMAP_POSITIVEY |\ + DDSCAPS2_CUBEMAP_NEGATIVEY |\ + DDSCAPS2_CUBEMAP_POSITIVEZ |\ + DDSCAPS2_CUBEMAP_NEGATIVEZ ) + + +/* + * This flag is an additional flag which is present on mipmap sublevels from DX7 onwards + * It enables easier use of GetAttachedSurface rather than EnumAttachedSurfaces for surface + * constructs such as Cube Maps, wherein there are more than one mipmap surface attached + * to the root surface. + * This caps bit is ignored by CreateSurface + */ +#define DDSCAPS2_MIPMAPSUBLEVEL 0x00010000L + +/* This flag indicates that the texture should be managed by D3D only */ +#define DDSCAPS2_D3DTEXTUREMANAGE 0x00020000L + +/* This flag indicates that the managed surface can be safely lost */ +#define DDSCAPS2_DONOTPERSIST 0x00040000L + +/* indicates that this surface is part of a stereo flipping chain */ +#define DDSCAPS2_STEREOSURFACELEFT 0x00080000L + + +/* + * Indicates that the surface is a volume. + * Can be combined with DDSCAPS_MIPMAP to indicate a multi-level volume + */ +#define DDSCAPS2_VOLUME 0x00200000L + +/* + * Indicates that the surface may be locked multiple times by the application. + * This cap cannot be used with DDSCAPS2_OPAQUE. + */ +#define DDSCAPS2_NOTUSERLOCKABLE 0x00400000L + +/* + * Indicates that the vertex buffer data can be used to render points and + * point sprites. + */ +#define DDSCAPS2_POINTS 0x00800000L + +/* + * Indicates that the vertex buffer data can be used to render rt pactches. + */ +#define DDSCAPS2_RTPATCHES 0x01000000L + +/* + * Indicates that the vertex buffer data can be used to render n patches. + */ +#define DDSCAPS2_NPATCHES 0x02000000L + +/* + * This bit is reserved for internal use + */ +#define DDSCAPS2_RESERVED3 0x04000000L + + +/* + * Indicates that the contents of the backbuffer do not have to be preserved + * the contents of the backbuffer after they are presented. + */ +#define DDSCAPS2_DISCARDBACKBUFFER 0x10000000L + +/* + * Indicates that all surfaces in this creation chain should be given an alpha channel. + * This flag will be set on primary surface chains that may have no explicit pixel format + * (and thus take on the format of the current display mode). + * The driver should infer that all these surfaces have a format having an alpha channel. + * (e.g. assume D3DFMT_A8R8G8B8 if the display mode is x888.) + */ +#define DDSCAPS2_ENABLEALPHACHANNEL 0x20000000L + +/* + * Indicates that all surfaces in this creation chain is extended primary surface format. + * This flag will be set on extended primary surface chains that always have explicit pixel + * format and the pixel format is typically GDI (Graphics Device Interface) couldn't handle, + * thus only used with fullscreen application. (e.g. D3DFMT_A2R10G10B10 format) + */ +#define DDSCAPS2_EXTENDEDFORMATPRIMARY 0x40000000L + +/* + * Indicates that all surfaces in this creation chain is additional primary surface. + * This flag will be set on primary surface chains which must present on the adapter + * id provided on dwCaps4. Typically this will be used to create secondary primary surface + * on DualView display adapter. + */ +#define DDSCAPS2_ADDITIONALPRIMARY 0x80000000L + +/* + * This is a mask that indicates the set of bits that may be set + * at createsurface time to indicate number of samples per pixel + * when multisampling + */ +#define DDSCAPS3_MULTISAMPLE_MASK 0x0000001FL + +/* + * This is a mask that indicates the set of bits that may be set + * at createsurface time to indicate the quality level of rendering + * for the current number of samples per pixel + */ +#define DDSCAPS3_MULTISAMPLE_QUALITY_MASK 0x000000E0L +#define DDSCAPS3_MULTISAMPLE_QUALITY_SHIFT 5 + +/* + * This bit is reserved for internal use + */ +#define DDSCAPS3_RESERVED1 0x00000100L + +/* + * This bit is reserved for internal use + */ +#define DDSCAPS3_RESERVED2 0x00000200L + +/* + * This indicates whether this surface has light-weight miplevels + */ +#define DDSCAPS3_LIGHTWEIGHTMIPMAP 0x00000400L + +/* + * This indicates that the mipsublevels for this surface are auto-generated + */ +#define DDSCAPS3_AUTOGENMIPMAP 0x00000800L + +/* + * This indicates that the mipsublevels for this surface are auto-generated + */ +#define DDSCAPS3_DMAP 0x00001000L + + + /**************************************************************************** + * + * DIRECTDRAW DRIVER CAPABILITY FLAGS + * + ****************************************************************************/ + +/* + * Display hardware has 3D acceleration. + */ +#define DDCAPS_3D 0x00000001l + +/* + * Indicates that DirectDraw will support only dest rectangles that are aligned + * on DIRECTDRAWCAPS.dwAlignBoundaryDest boundaries of the surface, respectively. + * READ ONLY. + */ +#define DDCAPS_ALIGNBOUNDARYDEST 0x00000002l + +/* + * Indicates that DirectDraw will support only source rectangles whose sizes in + * BYTEs are DIRECTDRAWCAPS.dwAlignSizeDest multiples, respectively. READ ONLY. + */ +#define DDCAPS_ALIGNSIZEDEST 0x00000004l +/* + * Indicates that DirectDraw will support only source rectangles that are aligned + * on DIRECTDRAWCAPS.dwAlignBoundarySrc boundaries of the surface, respectively. + * READ ONLY. + */ +#define DDCAPS_ALIGNBOUNDARYSRC 0x00000008l + +/* + * Indicates that DirectDraw will support only source rectangles whose sizes in + * BYTEs are DIRECTDRAWCAPS.dwAlignSizeSrc multiples, respectively. READ ONLY. + */ +#define DDCAPS_ALIGNSIZESRC 0x00000010l + +/* + * Indicates that DirectDraw will create video memory surfaces that have a stride + * alignment equal to DIRECTDRAWCAPS.dwAlignStride. READ ONLY. + */ +#define DDCAPS_ALIGNSTRIDE 0x00000020l + +/* + * Display hardware is capable of blt operations. + */ +#define DDCAPS_BLT 0x00000040l + +/* + * Display hardware is capable of asynchronous blt operations. + */ +#define DDCAPS_BLTQUEUE 0x00000080l + +/* + * Display hardware is capable of color space conversions during the blt operation. + */ +#define DDCAPS_BLTFOURCC 0x00000100l + +/* + * Display hardware is capable of stretching during blt operations. + */ +#define DDCAPS_BLTSTRETCH 0x00000200l + +/* + * Display hardware is shared with GDI. + */ +#define DDCAPS_GDI 0x00000400l + +/* + * Display hardware can overlay. + */ +#define DDCAPS_OVERLAY 0x00000800l + +/* + * Set if display hardware supports overlays but can not clip them. + */ +#define DDCAPS_OVERLAYCANTCLIP 0x00001000l + +/* + * Indicates that overlay hardware is capable of color space conversions during + * the overlay operation. + */ +#define DDCAPS_OVERLAYFOURCC 0x00002000l + +/* + * Indicates that stretching can be done by the overlay hardware. + */ +#define DDCAPS_OVERLAYSTRETCH 0x00004000l + +/* + * Indicates that unique DirectDrawPalettes can be created for DirectDrawSurfaces + * other than the primary surface. + */ +#define DDCAPS_PALETTE 0x00008000l + +/* + * Indicates that palette changes can be syncd with the veritcal refresh. + */ +#define DDCAPS_PALETTEVSYNC 0x00010000l + +/* + * Display hardware can return the current scan line. + */ +#define DDCAPS_READSCANLINE 0x00020000l + + +/* + * This flag used to bo DDCAPS_STEREOVIEW, which is now obsolete + */ +#define DDCAPS_RESERVED1 0x00040000l + +/* + * Display hardware is capable of generating a vertical blank interrupt. + */ +#define DDCAPS_VBI 0x00080000l + +/* + * Supports the use of z buffers with blt operations. + */ +#define DDCAPS_ZBLTS 0x00100000l + +/* + * Supports Z Ordering of overlays. + */ +#define DDCAPS_ZOVERLAYS 0x00200000l + +/* + * Supports color key + */ +#define DDCAPS_COLORKEY 0x00400000l + +/* + * Supports alpha surfaces + */ +#define DDCAPS_ALPHA 0x00800000l + +/* + * colorkey is hardware assisted(DDCAPS_COLORKEY will also be set) + */ +#define DDCAPS_COLORKEYHWASSIST 0x01000000l + +/* + * no hardware support at all + */ +#define DDCAPS_NOHARDWARE 0x02000000l + +/* + * Display hardware is capable of color fill with bltter + */ +#define DDCAPS_BLTCOLORFILL 0x04000000l + +/* + * Display hardware is bank switched, and potentially very slow at + * random access to VRAM. + */ +#define DDCAPS_BANKSWITCHED 0x08000000l + +/* + * Display hardware is capable of depth filling Z-buffers with bltter + */ +#define DDCAPS_BLTDEPTHFILL 0x10000000l + +/* + * Display hardware is capable of clipping while bltting. + */ +#define DDCAPS_CANCLIP 0x20000000l + +/* + * Display hardware is capable of clipping while stretch bltting. + */ +#define DDCAPS_CANCLIPSTRETCHED 0x40000000l + +/* + * Display hardware is capable of bltting to or from system memory + */ +#define DDCAPS_CANBLTSYSMEM 0x80000000l + + + /**************************************************************************** + * + * MORE DIRECTDRAW DRIVER CAPABILITY FLAGS (dwCaps2) + * + ****************************************************************************/ + +/* + * Display hardware is certified + */ +#define DDCAPS2_CERTIFIED 0x00000001l + +/* + * Driver cannot interleave 2D operations (lock and blt) to surfaces with + * Direct3D rendering operations between calls to BeginScene() and EndScene() + */ +#define DDCAPS2_NO2DDURING3DSCENE 0x00000002l + +/* + * Display hardware contains a video port + */ +#define DDCAPS2_VIDEOPORT 0x00000004l + +/* + * The overlay can be automatically flipped according to the video port + * VSYNCs, providing automatic doubled buffered display of video port + * data using an overlay + */ +#define DDCAPS2_AUTOFLIPOVERLAY 0x00000008l + +/* + * Overlay can display each field of interlaced data individually while + * it is interleaved in memory without causing jittery artifacts. + */ +#define DDCAPS2_CANBOBINTERLEAVED 0x00000010l + +/* + * Overlay can display each field of interlaced data individually while + * it is not interleaved in memory without causing jittery artifacts. + */ +#define DDCAPS2_CANBOBNONINTERLEAVED 0x00000020l + +/* + * The overlay surface contains color controls (brightness, sharpness, etc.) + */ +#define DDCAPS2_COLORCONTROLOVERLAY 0x00000040l + +/* + * The primary surface contains color controls (gamma, etc.) + */ +#define DDCAPS2_COLORCONTROLPRIMARY 0x00000080l + +/* + * RGBZ -> RGB supported for 16:16 RGB:Z + */ +#define DDCAPS2_CANDROPZ16BIT 0x00000100l + +/* + * Driver supports non-local video memory. + */ +#define DDCAPS2_NONLOCALVIDMEM 0x00000200l + +/* + * Dirver supports non-local video memory but has different capabilities for + * non-local video memory surfaces. If this bit is set then so must + * DDCAPS2_NONLOCALVIDMEM. + */ +#define DDCAPS2_NONLOCALVIDMEMCAPS 0x00000400l + +/* + * Driver neither requires nor prefers surfaces to be pagelocked when performing + * blts involving system memory surfaces + */ +#define DDCAPS2_NOPAGELOCKREQUIRED 0x00000800l + +/* + * Driver can create surfaces which are wider than the primary surface + */ +#define DDCAPS2_WIDESURFACES 0x00001000l + +/* + * Driver supports bob without using a video port by handling the + * DDFLIP_ODD and DDFLIP_EVEN flags specified in Flip. + */ +#define DDCAPS2_CANFLIPODDEVEN 0x00002000l + +/* + * Driver supports bob using hardware + */ +#define DDCAPS2_CANBOBHARDWARE 0x00004000l + +/* + * Driver supports bltting any FOURCC surface to another surface of the same FOURCC + */ +#define DDCAPS2_COPYFOURCC 0x00008000l + + +/* + * Driver supports loadable gamma ramps for the primary surface + */ +#define DDCAPS2_PRIMARYGAMMA 0x00020000l + +/* + * Driver can render in windowed mode. + */ +#define DDCAPS2_CANRENDERWINDOWED 0x00080000l + +/* + * A calibrator is available to adjust the gamma ramp according to the + * physical display properties so that the result will be identical on + * all calibrated systems. + */ +#define DDCAPS2_CANCALIBRATEGAMMA 0x00100000l + +/* + * Indicates that the driver will respond to DDFLIP_INTERVALn flags + */ +#define DDCAPS2_FLIPINTERVAL 0x00200000l + +/* + * Indicates that the driver will respond to DDFLIP_NOVSYNC + */ +#define DDCAPS2_FLIPNOVSYNC 0x00400000l + +/* + * Driver supports management of video memory, if this flag is ON, + * driver manages the texture if requested with DDSCAPS2_TEXTUREMANAGE on + * DirectX manages the texture if this flag is OFF and surface has DDSCAPS2_TEXTUREMANAGE on + */ +#define DDCAPS2_CANMANAGETEXTURE 0x00800000l + +/* + * The Direct3D texture manager uses this cap to decide whether to put managed + * surfaces in non-local video memory. If the cap is set, the texture manager will + * put managed surfaces in non-local vidmem. Drivers that cannot texture from + * local vidmem SHOULD NOT set this cap. + */ +#define DDCAPS2_TEXMANINNONLOCALVIDMEM 0x01000000l + +/* + * Indicates that the driver supports DX7 type of stereo in at least one mode (which may + * not necessarily be the current mode). Applications should use IDirectDraw7 (or higher) + * ::EnumDisplayModes and check the DDSURFACEDESC.ddsCaps.dwCaps2 field for the presence of + * DDSCAPS2_STEREOSURFACELEFT to check if a particular mode supports stereo. The application + * can also use IDirectDraw7(or higher)::GetDisplayMode to check the current mode. + */ +#define DDCAPS2_STEREO 0x02000000L + +/* + * This caps bit is intended for internal DirectDraw use. + * -It is only valid if DDCAPS2_NONLOCALVIDMEMCAPS is set. + * -If this bit is set, then DDCAPS_CANBLTSYSMEM MUST be set by the driver (and + * all the assoicated system memory blt caps must be correct). + * -It implies that the system->video blt caps in DDCAPS also apply to system to + * nonlocal blts. I.e. the dwSVBCaps, dwSVBCKeyCaps, dwSVBFXCaps and dwSVBRops + * members of DDCAPS (DDCORECAPS) are filled in correctly. + * -Any blt from system to nonlocal memory that matches these caps bits will + * be passed to the driver. + * + * NOTE: This is intended to enable the driver itself to do efficient reordering + * of textures. This is NOT meant to imply that hardware can write into AGP memory. + * This operation is not currently supported. + */ +#define DDCAPS2_SYSTONONLOCAL_AS_SYSTOLOCAL 0x04000000L + +/* + * was DDCAPS2_PUREHAL + */ +#define DDCAPS2_RESERVED1 0x08000000L + +/* + * Driver supports management of video memory, if this flag is ON, + * driver manages the resource if requested with DDSCAPS2_TEXTUREMANAGE on + * DirectX manages the resource if this flag is OFF and surface has DDSCAPS2_TEXTUREMANAGE on + */ +#define DDCAPS2_CANMANAGERESOURCE 0x10000000L + +/* + * Driver supports dynamic textures. This will allow the application to set + * D3DUSAGE_DYNAMIC (DDSCAPS2_HINTDYNAMIC for drivers) at texture create time. + * Video memory dynamic textures WILL be lockable by applications. It is + * expected that these locks will be very efficient (which implies that the + * driver should always maintain a linear copy, a pointer to which can be + * quickly handed out to the application). + */ +#define DDCAPS2_DYNAMICTEXTURES 0x20000000L + +/* + * Driver supports auto-generation of mipmaps. + */ +#define DDCAPS2_CANAUTOGENMIPMAP 0x40000000L + + +/**************************************************************************** + * + * DIRECTDRAW FX ALPHA CAPABILITY FLAGS + * + ****************************************************************************/ + +/* + * Supports alpha blending around the edge of a source color keyed surface. + * For Blt. + */ +#define DDFXALPHACAPS_BLTALPHAEDGEBLEND 0x00000001l + +/* + * Supports alpha information in the pixel format. The bit depth of alpha + * information in the pixel format can be 1,2,4, or 8. The alpha value becomes + * more opaque as the alpha value increases. (0 is transparent.) + * For Blt. + */ +#define DDFXALPHACAPS_BLTALPHAPIXELS 0x00000002l + +/* + * Supports alpha information in the pixel format. The bit depth of alpha + * information in the pixel format can be 1,2,4, or 8. The alpha value + * becomes more transparent as the alpha value increases. (0 is opaque.) + * This flag can only be set if DDCAPS_ALPHA is set. + * For Blt. + */ +#define DDFXALPHACAPS_BLTALPHAPIXELSNEG 0x00000004l + +/* + * Supports alpha only surfaces. The bit depth of an alpha only surface can be + * 1,2,4, or 8. The alpha value becomes more opaque as the alpha value increases. + * (0 is transparent.) + * For Blt. + */ +#define DDFXALPHACAPS_BLTALPHASURFACES 0x00000008l + +/* + * The depth of the alpha channel data can range can be 1,2,4, or 8. + * The NEG suffix indicates that this alpha channel becomes more transparent + * as the alpha value increases. (0 is opaque.) This flag can only be set if + * DDCAPS_ALPHA is set. + * For Blt. + */ +#define DDFXALPHACAPS_BLTALPHASURFACESNEG 0x00000010l + +/* + * Supports alpha blending around the edge of a source color keyed surface. + * For Overlays. + */ +#define DDFXALPHACAPS_OVERLAYALPHAEDGEBLEND 0x00000020l + +/* + * Supports alpha information in the pixel format. The bit depth of alpha + * information in the pixel format can be 1,2,4, or 8. The alpha value becomes + * more opaque as the alpha value increases. (0 is transparent.) + * For Overlays. + */ +#define DDFXALPHACAPS_OVERLAYALPHAPIXELS 0x00000040l + +/* + * Supports alpha information in the pixel format. The bit depth of alpha + * information in the pixel format can be 1,2,4, or 8. The alpha value + * becomes more transparent as the alpha value increases. (0 is opaque.) + * This flag can only be set if DDCAPS_ALPHA is set. + * For Overlays. + */ +#define DDFXALPHACAPS_OVERLAYALPHAPIXELSNEG 0x00000080l + +/* + * Supports alpha only surfaces. The bit depth of an alpha only surface can be + * 1,2,4, or 8. The alpha value becomes more opaque as the alpha value increases. + * (0 is transparent.) + * For Overlays. + */ +#define DDFXALPHACAPS_OVERLAYALPHASURFACES 0x00000100l + +/* + * The depth of the alpha channel data can range can be 1,2,4, or 8. + * The NEG suffix indicates that this alpha channel becomes more transparent + * as the alpha value increases. (0 is opaque.) This flag can only be set if + * DDCAPS_ALPHA is set. + * For Overlays. + */ +#define DDFXALPHACAPS_OVERLAYALPHASURFACESNEG 0x00000200l + +#if DIRECTDRAW_VERSION < 0x0600 +#endif //DIRECTDRAW_VERSION + + +/**************************************************************************** + * + * DIRECTDRAW FX CAPABILITY FLAGS + * + ****************************************************************************/ + +/* + * Uses arithmetic operations to stretch and shrink surfaces during blt + * rather than pixel doubling techniques. Along the Y axis. + */ +#define DDFXCAPS_BLTARITHSTRETCHY 0x00000020l + +/* + * Uses arithmetic operations to stretch during blt + * rather than pixel doubling techniques. Along the Y axis. Only + * works for x1, x2, etc. + */ +#define DDFXCAPS_BLTARITHSTRETCHYN 0x00000010l + +/* + * Supports mirroring left to right in blt. + */ +#define DDFXCAPS_BLTMIRRORLEFTRIGHT 0x00000040l + +/* + * Supports mirroring top to bottom in blt. + */ +#define DDFXCAPS_BLTMIRRORUPDOWN 0x00000080l + +/* + * Supports arbitrary rotation for blts. + */ +#define DDFXCAPS_BLTROTATION 0x00000100l + +/* + * Supports 90 degree rotations for blts. + */ +#define DDFXCAPS_BLTROTATION90 0x00000200l + +/* + * DirectDraw supports arbitrary shrinking of a surface along the + * x axis (horizontal direction) for blts. + */ +#define DDFXCAPS_BLTSHRINKX 0x00000400l + +/* + * DirectDraw supports integer shrinking (1x,2x,) of a surface + * along the x axis (horizontal direction) for blts. + */ +#define DDFXCAPS_BLTSHRINKXN 0x00000800l + +/* + * DirectDraw supports arbitrary shrinking of a surface along the + * y axis (horizontal direction) for blts. + */ +#define DDFXCAPS_BLTSHRINKY 0x00001000l + +/* + * DirectDraw supports integer shrinking (1x,2x,) of a surface + * along the y axis (vertical direction) for blts. + */ +#define DDFXCAPS_BLTSHRINKYN 0x00002000l + +/* + * DirectDraw supports arbitrary stretching of a surface along the + * x axis (horizontal direction) for blts. + */ +#define DDFXCAPS_BLTSTRETCHX 0x00004000l + +/* + * DirectDraw supports integer stretching (1x,2x,) of a surface + * along the x axis (horizontal direction) for blts. + */ +#define DDFXCAPS_BLTSTRETCHXN 0x00008000l + +/* + * DirectDraw supports arbitrary stretching of a surface along the + * y axis (horizontal direction) for blts. + */ +#define DDFXCAPS_BLTSTRETCHY 0x00010000l + +/* + * DirectDraw supports integer stretching (1x,2x,) of a surface + * along the y axis (vertical direction) for blts. + */ +#define DDFXCAPS_BLTSTRETCHYN 0x00020000l + +/* + * Uses arithmetic operations to stretch and shrink surfaces during + * overlay rather than pixel doubling techniques. Along the Y axis + * for overlays. + */ +#define DDFXCAPS_OVERLAYARITHSTRETCHY 0x00040000l + +/* + * Uses arithmetic operations to stretch surfaces during + * overlay rather than pixel doubling techniques. Along the Y axis + * for overlays. Only works for x1, x2, etc. + */ +#define DDFXCAPS_OVERLAYARITHSTRETCHYN 0x00000008l + +/* + * DirectDraw supports arbitrary shrinking of a surface along the + * x axis (horizontal direction) for overlays. + */ +#define DDFXCAPS_OVERLAYSHRINKX 0x00080000l + +/* + * DirectDraw supports integer shrinking (1x,2x,) of a surface + * along the x axis (horizontal direction) for overlays. + */ +#define DDFXCAPS_OVERLAYSHRINKXN 0x00100000l + +/* + * DirectDraw supports arbitrary shrinking of a surface along the + * y axis (horizontal direction) for overlays. + */ +#define DDFXCAPS_OVERLAYSHRINKY 0x00200000l + +/* + * DirectDraw supports integer shrinking (1x,2x,) of a surface + * along the y axis (vertical direction) for overlays. + */ +#define DDFXCAPS_OVERLAYSHRINKYN 0x00400000l + +/* + * DirectDraw supports arbitrary stretching of a surface along the + * x axis (horizontal direction) for overlays. + */ +#define DDFXCAPS_OVERLAYSTRETCHX 0x00800000l + +/* + * DirectDraw supports integer stretching (1x,2x,) of a surface + * along the x axis (horizontal direction) for overlays. + */ +#define DDFXCAPS_OVERLAYSTRETCHXN 0x01000000l + +/* + * DirectDraw supports arbitrary stretching of a surface along the + * y axis (horizontal direction) for overlays. + */ +#define DDFXCAPS_OVERLAYSTRETCHY 0x02000000l + +/* + * DirectDraw supports integer stretching (1x,2x,) of a surface + * along the y axis (vertical direction) for overlays. + */ +#define DDFXCAPS_OVERLAYSTRETCHYN 0x04000000l + +/* + * DirectDraw supports mirroring of overlays across the vertical axis + */ +#define DDFXCAPS_OVERLAYMIRRORLEFTRIGHT 0x08000000l + +/* + * DirectDraw supports mirroring of overlays across the horizontal axis + */ +#define DDFXCAPS_OVERLAYMIRRORUPDOWN 0x10000000l + +/* + * DirectDraw supports deinterlacing of overlay surfaces + */ +#define DDFXCAPS_OVERLAYDEINTERLACE 0x20000000l + +/* + * Driver can do alpha blending for blits. + */ +#define DDFXCAPS_BLTALPHA 0x00000001l + + +/* + * Driver can do surface-reconstruction filtering for warped blits. + */ +#define DDFXCAPS_BLTFILTER DDFXCAPS_BLTARITHSTRETCHY + +/* + * Driver can do alpha blending for overlays. + */ +#define DDFXCAPS_OVERLAYALPHA 0x00000004l + + +/* + * Driver can do surface-reconstruction filtering for warped overlays. + */ +#define DDFXCAPS_OVERLAYFILTER DDFXCAPS_OVERLAYARITHSTRETCHY + +/**************************************************************************** + * + * DIRECTDRAW STEREO VIEW CAPABILITIES + * + ****************************************************************************/ + +/* + * This flag used to be DDSVCAPS_ENIGMA, which is now obsolete + */ + +#define DDSVCAPS_RESERVED1 0x00000001l + +/* + * This flag used to be DDSVCAPS_FLICKER, which is now obsolete + */ +#define DDSVCAPS_RESERVED2 0x00000002l + +/* + * This flag used to be DDSVCAPS_REDBLUE, which is now obsolete + */ +#define DDSVCAPS_RESERVED3 0x00000004l + +/* + * This flag used to be DDSVCAPS_SPLIT, which is now obsolete + */ +#define DDSVCAPS_RESERVED4 0x00000008l + +/* + * The stereo view is accomplished with switching technology + */ + +#define DDSVCAPS_STEREOSEQUENTIAL 0x00000010L + + + +/**************************************************************************** + * + * DIRECTDRAWPALETTE CAPABILITIES + * + ****************************************************************************/ + +/* + * Index is 4 bits. There are sixteen color entries in the palette table. + */ +#define DDPCAPS_4BIT 0x00000001l + +/* + * Index is onto a 8 bit color index. This field is only valid with the + * DDPCAPS_1BIT, DDPCAPS_2BIT or DDPCAPS_4BIT capability and the target + * surface is in 8bpp. Each color entry is one byte long and is an index + * into destination surface's 8bpp palette. + */ +#define DDPCAPS_8BITENTRIES 0x00000002l + +/* + * Index is 8 bits. There are 256 color entries in the palette table. + */ +#define DDPCAPS_8BIT 0x00000004l + +/* + * Indicates that this DIRECTDRAWPALETTE should use the palette color array + * passed into the lpDDColorArray parameter to initialize the DIRECTDRAWPALETTE + * object. + * This flag is obsolete. DirectDraw always initializes the color array from + * the lpDDColorArray parameter. The definition remains for source-level + * compatibility. + */ +#define DDPCAPS_INITIALIZE 0x00000000l + +/* + * This palette is the one attached to the primary surface. Changing this + * table has immediate effect on the display unless DDPSETPAL_VSYNC is specified + * and supported. + */ +#define DDPCAPS_PRIMARYSURFACE 0x00000010l + +/* + * This palette is the one attached to the primary surface left. Changing + * this table has immediate effect on the display for the left eye unless + * DDPSETPAL_VSYNC is specified and supported. + */ +#define DDPCAPS_PRIMARYSURFACELEFT 0x00000020l + +/* + * This palette can have all 256 entries defined + */ +#define DDPCAPS_ALLOW256 0x00000040l + +/* + * This palette can have modifications to it synced with the monitors + * refresh rate. + */ +#define DDPCAPS_VSYNC 0x00000080l + +/* + * Index is 1 bit. There are two color entries in the palette table. + */ +#define DDPCAPS_1BIT 0x00000100l + +/* + * Index is 2 bit. There are four color entries in the palette table. + */ +#define DDPCAPS_2BIT 0x00000200l + +/* + * The peFlags member of PALETTEENTRY denotes an 8 bit alpha value + */ +#define DDPCAPS_ALPHA 0x00000400l + + +/**************************************************************************** + * + * DIRECTDRAWPALETTE SETENTRY CONSTANTS + * + ****************************************************************************/ + + +/**************************************************************************** + * + * DIRECTDRAWPALETTE GETENTRY CONSTANTS + * + ****************************************************************************/ + +/* 0 is the only legal value */ + +/**************************************************************************** + * + * DIRECTDRAWSURFACE SETPRIVATEDATA CONSTANTS + * + ****************************************************************************/ + +/* + * The passed pointer is an IUnknown ptr. The cbData argument to SetPrivateData + * must be set to sizeof(IUnknown*). DirectDraw will call AddRef through this + * pointer and Release when the private data is destroyed. This includes when + * the surface or palette is destroyed before such priovate data is destroyed. + */ +#define DDSPD_IUNKNOWNPOINTER 0x00000001L + +/* + * Private data is only valid for the current state of the object, + * as determined by the uniqueness value. + */ +#define DDSPD_VOLATILE 0x00000002L + + +/**************************************************************************** + * + * DIRECTDRAWSURFACE SETPALETTE CONSTANTS + * + ****************************************************************************/ + + +/**************************************************************************** + * + * DIRECTDRAW BITDEPTH CONSTANTS + * + * NOTE: These are only used to indicate supported bit depths. These + * are flags only, they are not to be used as an actual bit depth. The + * absolute numbers 1, 2, 4, 8, 16, 24 and 32 are used to indicate actual + * bit depths in a surface or for changing the display mode. + * + ****************************************************************************/ + +/* + * 1 bit per pixel. + */ +#define DDBD_1 0x00004000l + +/* + * 2 bits per pixel. + */ +#define DDBD_2 0x00002000l + +/* + * 4 bits per pixel. + */ +#define DDBD_4 0x00001000l + +/* + * 8 bits per pixel. + */ +#define DDBD_8 0x00000800l + +/* + * 16 bits per pixel. + */ +#define DDBD_16 0x00000400l + +/* + * 24 bits per pixel. + */ +#define DDBD_24 0X00000200l + +/* + * 32 bits per pixel. + */ +#define DDBD_32 0x00000100l + +/**************************************************************************** + * + * DIRECTDRAWSURFACE SET/GET COLOR KEY FLAGS + * + ****************************************************************************/ + +/* + * Set if the structure contains a color space. Not set if the structure + * contains a single color key. + */ +#define DDCKEY_COLORSPACE 0x00000001l + +/* + * Set if the structure specifies a color key or color space which is to be + * used as a destination color key for blt operations. + */ +#define DDCKEY_DESTBLT 0x00000002l + +/* + * Set if the structure specifies a color key or color space which is to be + * used as a destination color key for overlay operations. + */ +#define DDCKEY_DESTOVERLAY 0x00000004l + +/* + * Set if the structure specifies a color key or color space which is to be + * used as a source color key for blt operations. + */ +#define DDCKEY_SRCBLT 0x00000008l + +/* + * Set if the structure specifies a color key or color space which is to be + * used as a source color key for overlay operations. + */ +#define DDCKEY_SRCOVERLAY 0x00000010l + + +/**************************************************************************** + * + * DIRECTDRAW COLOR KEY CAPABILITY FLAGS + * + ****************************************************************************/ + +/* + * Supports transparent blting using a color key to identify the replaceable + * bits of the destination surface for RGB colors. + */ +#define DDCKEYCAPS_DESTBLT 0x00000001l + +/* + * Supports transparent blting using a color space to identify the replaceable + * bits of the destination surface for RGB colors. + */ +#define DDCKEYCAPS_DESTBLTCLRSPACE 0x00000002l + +/* + * Supports transparent blting using a color space to identify the replaceable + * bits of the destination surface for YUV colors. + */ +#define DDCKEYCAPS_DESTBLTCLRSPACEYUV 0x00000004l + +/* + * Supports transparent blting using a color key to identify the replaceable + * bits of the destination surface for YUV colors. + */ +#define DDCKEYCAPS_DESTBLTYUV 0x00000008l + +/* + * Supports overlaying using colorkeying of the replaceable bits of the surface + * being overlayed for RGB colors. + */ +#define DDCKEYCAPS_DESTOVERLAY 0x00000010l + +/* + * Supports a color space as the color key for the destination for RGB colors. + */ +#define DDCKEYCAPS_DESTOVERLAYCLRSPACE 0x00000020l + +/* + * Supports a color space as the color key for the destination for YUV colors. + */ +#define DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV 0x00000040l + +/* + * Supports only one active destination color key value for visible overlay + * surfaces. + */ +#define DDCKEYCAPS_DESTOVERLAYONEACTIVE 0x00000080l + +/* + * Supports overlaying using colorkeying of the replaceable bits of the + * surface being overlayed for YUV colors. + */ +#define DDCKEYCAPS_DESTOVERLAYYUV 0x00000100l + +/* + * Supports transparent blting using the color key for the source with + * this surface for RGB colors. + */ +#define DDCKEYCAPS_SRCBLT 0x00000200l + +/* + * Supports transparent blting using a color space for the source with + * this surface for RGB colors. + */ +#define DDCKEYCAPS_SRCBLTCLRSPACE 0x00000400l + +/* + * Supports transparent blting using a color space for the source with + * this surface for YUV colors. + */ +#define DDCKEYCAPS_SRCBLTCLRSPACEYUV 0x00000800l + +/* + * Supports transparent blting using the color key for the source with + * this surface for YUV colors. + */ +#define DDCKEYCAPS_SRCBLTYUV 0x00001000l + +/* + * Supports overlays using the color key for the source with this + * overlay surface for RGB colors. + */ +#define DDCKEYCAPS_SRCOVERLAY 0x00002000l + +/* + * Supports overlays using a color space as the source color key for + * the overlay surface for RGB colors. + */ +#define DDCKEYCAPS_SRCOVERLAYCLRSPACE 0x00004000l + +/* + * Supports overlays using a color space as the source color key for + * the overlay surface for YUV colors. + */ +#define DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV 0x00008000l + +/* + * Supports only one active source color key value for visible + * overlay surfaces. + */ +#define DDCKEYCAPS_SRCOVERLAYONEACTIVE 0x00010000l + +/* + * Supports overlays using the color key for the source with this + * overlay surface for YUV colors. + */ +#define DDCKEYCAPS_SRCOVERLAYYUV 0x00020000l + +/* + * there are no bandwidth trade-offs for using colorkey with an overlay + */ +#define DDCKEYCAPS_NOCOSTOVERLAY 0x00040000l + + +/**************************************************************************** + * + * DIRECTDRAW PIXELFORMAT FLAGS + * + ****************************************************************************/ + +/* + * The surface has alpha channel information in the pixel format. + */ +#define DDPF_ALPHAPIXELS 0x00000001l + +/* + * The pixel format contains alpha only information + */ +#define DDPF_ALPHA 0x00000002l + +/* + * The FourCC code is valid. + */ +#define DDPF_FOURCC 0x00000004l + +/* + * The surface is 4-bit color indexed. + */ +#define DDPF_PALETTEINDEXED4 0x00000008l + +/* + * The surface is indexed into a palette which stores indices + * into the destination surface's 8-bit palette. + */ +#define DDPF_PALETTEINDEXEDTO8 0x00000010l + +/* + * The surface is 8-bit color indexed. + */ +#define DDPF_PALETTEINDEXED8 0x00000020l + +/* + * The RGB data in the pixel format structure is valid. + */ +#define DDPF_RGB 0x00000040l + +/* + * The surface will accept pixel data in the format specified + * and compress it during the write. + */ +#define DDPF_COMPRESSED 0x00000080l + +/* + * The surface will accept RGB data and translate it during + * the write to YUV data. The format of the data to be written + * will be contained in the pixel format structure. The DDPF_RGB + * flag will be set. + */ +#define DDPF_RGBTOYUV 0x00000100l + +/* + * pixel format is YUV - YUV data in pixel format struct is valid + */ +#define DDPF_YUV 0x00000200l + +/* + * pixel format is a z buffer only surface + */ +#define DDPF_ZBUFFER 0x00000400l + +/* + * The surface is 1-bit color indexed. + */ +#define DDPF_PALETTEINDEXED1 0x00000800l + +/* + * The surface is 2-bit color indexed. + */ +#define DDPF_PALETTEINDEXED2 0x00001000l + +/* + * The surface contains Z information in the pixels + */ +#define DDPF_ZPIXELS 0x00002000l + +/* + * The surface contains stencil information along with Z + */ +#define DDPF_STENCILBUFFER 0x00004000l + +/* + * Premultiplied alpha format -- the color components have been + * premultiplied by the alpha component. + */ +#define DDPF_ALPHAPREMULT 0x00008000l + + +/* + * Luminance data in the pixel format is valid. + * Use this flag for luminance-only or luminance+alpha surfaces, + * the bit depth is then ddpf.dwLuminanceBitCount. + */ +#define DDPF_LUMINANCE 0x00020000l + +/* + * Luminance data in the pixel format is valid. + * Use this flag when hanging luminance off bumpmap surfaces, + * the bit mask for the luminance portion of the pixel is then + * ddpf.dwBumpLuminanceBitMask + */ +#define DDPF_BUMPLUMINANCE 0x00040000l + +/* + * Bump map dUdV data in the pixel format is valid. + */ +#define DDPF_BUMPDUDV 0x00080000l + + +/*=========================================================================== + * + * + * DIRECTDRAW CALLBACK FLAGS + * + * + *==========================================================================*/ + +/**************************************************************************** + * + * DIRECTDRAW ENUMSURFACES FLAGS + * + ****************************************************************************/ + +/* + * Enumerate all of the surfaces that meet the search criterion. + */ +#define DDENUMSURFACES_ALL 0x00000001l + +/* + * A search hit is a surface that matches the surface description. + */ +#define DDENUMSURFACES_MATCH 0x00000002l + +/* + * A search hit is a surface that does not match the surface description. + */ +#define DDENUMSURFACES_NOMATCH 0x00000004l + +/* + * Enumerate the first surface that can be created which meets the search criterion. + */ +#define DDENUMSURFACES_CANBECREATED 0x00000008l + +/* + * Enumerate the surfaces that already exist that meet the search criterion. + */ +#define DDENUMSURFACES_DOESEXIST 0x00000010l + + +/**************************************************************************** + * + * DIRECTDRAW SETDISPLAYMODE FLAGS + * + ****************************************************************************/ + +/* + * The desired mode is a standard VGA mode + */ +#define DDSDM_STANDARDVGAMODE 0x00000001l + + +/**************************************************************************** + * + * DIRECTDRAW ENUMDISPLAYMODES FLAGS + * + ****************************************************************************/ + +/* + * Enumerate Modes with different refresh rates. EnumDisplayModes guarantees + * that a particular mode will be enumerated only once. This flag specifies whether + * the refresh rate is taken into account when determining if a mode is unique. + */ +#define DDEDM_REFRESHRATES 0x00000001l + +/* + * Enumerate VGA modes. Specify this flag if you wish to enumerate supported VGA + * modes such as mode 0x13 in addition to the usual ModeX modes (which are always + * enumerated if the application has previously called SetCooperativeLevel with the + * DDSCL_ALLOWMODEX flag set). + */ +#define DDEDM_STANDARDVGAMODES 0x00000002L + + +/**************************************************************************** + * + * DIRECTDRAW SETCOOPERATIVELEVEL FLAGS + * + ****************************************************************************/ + +/* + * Exclusive mode owner will be responsible for the entire primary surface. + * GDI can be ignored. used with DD + */ +#define DDSCL_FULLSCREEN 0x00000001l + +/* + * allow CTRL_ALT_DEL to work while in fullscreen exclusive mode + */ +#define DDSCL_ALLOWREBOOT 0x00000002l + +/* + * prevents DDRAW from modifying the application window. + * prevents DDRAW from minimize/restore the application window on activation. + */ +#define DDSCL_NOWINDOWCHANGES 0x00000004l + +/* + * app wants to work as a regular Windows application + */ +#define DDSCL_NORMAL 0x00000008l + +/* + * app wants exclusive access + */ +#define DDSCL_EXCLUSIVE 0x00000010l + + +/* + * app can deal with non-windows display modes + */ +#define DDSCL_ALLOWMODEX 0x00000040l + +/* + * this window will receive the focus messages + */ +#define DDSCL_SETFOCUSWINDOW 0x00000080l + +/* + * this window is associated with the DDRAW object and will + * cover the screen in fullscreen mode + */ +#define DDSCL_SETDEVICEWINDOW 0x00000100l + +/* + * app wants DDRAW to create a window to be associated with the + * DDRAW object + */ +#define DDSCL_CREATEDEVICEWINDOW 0x00000200l + +/* + * App explicitly asks DDRAW/D3D to be multithread safe. This makes D3D + * take the global crtisec more frequently. + */ +#define DDSCL_MULTITHREADED 0x00000400l + +/* + * App specifies that it would like to keep the FPU set up for optimal Direct3D + * performance (single precision and exceptions disabled) so Direct3D + * does not need to explicitly set the FPU each time. This is assumed by + * default in DirectX 7. See also DDSCL_FPUPRESERVE + */ +#define DDSCL_FPUSETUP 0x00000800l + +/* + * App specifies that it needs either double precision FPU or FPU exceptions + * enabled. This makes Direct3D explicitly set the FPU state eah time it is + * called. Setting the flag will reduce Direct3D performance. The flag is + * assumed by default in DirectX 6 and earlier. See also DDSCL_FPUSETUP + */ +#define DDSCL_FPUPRESERVE 0x00001000l + + +/**************************************************************************** + * + * DIRECTDRAW BLT FLAGS + * + ****************************************************************************/ + +/* + * Use the alpha information in the pixel format or the alpha channel surface + * attached to the destination surface as the alpha channel for this blt. + */ +#define DDBLT_ALPHADEST 0x00000001l + +/* + * Use the dwConstAlphaDest field in the DDBLTFX structure as the alpha channel + * for the destination surface for this blt. + */ +#define DDBLT_ALPHADESTCONSTOVERRIDE 0x00000002l + +/* + * The NEG suffix indicates that the destination surface becomes more + * transparent as the alpha value increases. (0 is opaque) + */ +#define DDBLT_ALPHADESTNEG 0x00000004l + +/* + * Use the lpDDSAlphaDest field in the DDBLTFX structure as the alpha + * channel for the destination for this blt. + */ +#define DDBLT_ALPHADESTSURFACEOVERRIDE 0x00000008l + +/* + * Use the dwAlphaEdgeBlend field in the DDBLTFX structure as the alpha channel + * for the edges of the image that border the color key colors. + */ +#define DDBLT_ALPHAEDGEBLEND 0x00000010l + +/* + * Use the alpha information in the pixel format or the alpha channel surface + * attached to the source surface as the alpha channel for this blt. + */ +#define DDBLT_ALPHASRC 0x00000020l + +/* + * Use the dwConstAlphaSrc field in the DDBLTFX structure as the alpha channel + * for the source for this blt. + */ +#define DDBLT_ALPHASRCCONSTOVERRIDE 0x00000040l + +/* + * The NEG suffix indicates that the source surface becomes more transparent + * as the alpha value increases. (0 is opaque) + */ +#define DDBLT_ALPHASRCNEG 0x00000080l + +/* + * Use the lpDDSAlphaSrc field in the DDBLTFX structure as the alpha channel + * for the source for this blt. + */ +#define DDBLT_ALPHASRCSURFACEOVERRIDE 0x00000100l + +/* + * Do this blt asynchronously through the FIFO in the order received. If + * there is no room in the hardware FIFO fail the call. + */ +#define DDBLT_ASYNC 0x00000200l + +/* + * Uses the dwFillColor field in the DDBLTFX structure as the RGB color + * to fill the destination rectangle on the destination surface with. + */ +#define DDBLT_COLORFILL 0x00000400l + +/* + * Uses the dwDDFX field in the DDBLTFX structure to specify the effects + * to use for the blt. + */ +#define DDBLT_DDFX 0x00000800l + +/* + * Uses the dwDDROPS field in the DDBLTFX structure to specify the ROPS + * that are not part of the Win32 API. + */ +#define DDBLT_DDROPS 0x00001000l + +/* + * Use the color key associated with the destination surface. + */ +#define DDBLT_KEYDEST 0x00002000l + +/* + * Use the dckDestColorkey field in the DDBLTFX structure as the color key + * for the destination surface. + */ +#define DDBLT_KEYDESTOVERRIDE 0x00004000l + +/* + * Use the color key associated with the source surface. + */ +#define DDBLT_KEYSRC 0x00008000l + +/* + * Use the dckSrcColorkey field in the DDBLTFX structure as the color key + * for the source surface. + */ +#define DDBLT_KEYSRCOVERRIDE 0x00010000l + +/* + * Use the dwROP field in the DDBLTFX structure for the raster operation + * for this blt. These ROPs are the same as the ones defined in the Win32 API. + */ +#define DDBLT_ROP 0x00020000l + +/* + * Use the dwRotationAngle field in the DDBLTFX structure as the angle + * (specified in 1/100th of a degree) to rotate the surface. + */ +#define DDBLT_ROTATIONANGLE 0x00040000l + +/* + * Z-buffered blt using the z-buffers attached to the source and destination + * surfaces and the dwZBufferOpCode field in the DDBLTFX structure as the + * z-buffer opcode. + */ +#define DDBLT_ZBUFFER 0x00080000l + +/* + * Z-buffered blt using the dwConstDest Zfield and the dwZBufferOpCode field + * in the DDBLTFX structure as the z-buffer and z-buffer opcode respectively + * for the destination. + */ +#define DDBLT_ZBUFFERDESTCONSTOVERRIDE 0x00100000l + +/* + * Z-buffered blt using the lpDDSDestZBuffer field and the dwZBufferOpCode + * field in the DDBLTFX structure as the z-buffer and z-buffer opcode + * respectively for the destination. + */ +#define DDBLT_ZBUFFERDESTOVERRIDE 0x00200000l + +/* + * Z-buffered blt using the dwConstSrcZ field and the dwZBufferOpCode field + * in the DDBLTFX structure as the z-buffer and z-buffer opcode respectively + * for the source. + */ +#define DDBLT_ZBUFFERSRCCONSTOVERRIDE 0x00400000l + +/* + * Z-buffered blt using the lpDDSSrcZBuffer field and the dwZBufferOpCode + * field in the DDBLTFX structure as the z-buffer and z-buffer opcode + * respectively for the source. + */ +#define DDBLT_ZBUFFERSRCOVERRIDE 0x00800000l + +/* + * wait until the device is ready to handle the blt + * this will cause blt to not return DDERR_WASSTILLDRAWING + */ +#define DDBLT_WAIT 0x01000000l + +/* + * Uses the dwFillDepth field in the DDBLTFX structure as the depth value + * to fill the destination rectangle on the destination Z-buffer surface + * with. + */ +#define DDBLT_DEPTHFILL 0x02000000l + + +/* + * Return immediately (with DDERR_WASSTILLDRAWING) if the device is not + * ready to schedule the blt at the time Blt() is called. + */ +#define DDBLT_DONOTWAIT 0x08000000l + +/* + * These flags indicate a presentation blt (i.e. a blt + * that moves surface contents from an offscreen back buffer to the primary + * surface). The driver is not allowed to "queue" more than three such blts. + * The "end" of the presentation blt is indicated, since the + * blt may be clipped, in which case the runtime will call the driver with + * several blts. All blts (even if not clipped) are tagged with DDBLT_PRESENTATION + * and the last (even if not clipped) additionally with DDBLT_LAST_PRESENTATION. + * Thus the true rule is that the driver must not schedule a DDBLT_PRESENTATION + * blt if there are 3 or more DDBLT_PRESENTLAST blts in the hardware pipe. + * If there are such blts in the pipe, the driver should return DDERR_WASSTILLDRAWING + * until the oldest queued DDBLT_LAST_PRESENTATION blts has been retired (i.e. the + * pixels have been actually written to the primary surface). Once the oldest blt + * has been retired, the driver is free to schedule the current blt. + * The goal is to provide a mechanism whereby the device's hardware queue never + * gets more than 3 frames ahead of the frames being generated by the application. + * When excessive queueing occurs, applications become unusable because the application + * visibly lags user input, and such problems make windowed interactive applications impossible. + * Some drivers may not have sufficient knowledge of their hardware's FIFO to know + * when a certain blt has been retired. Such drivers should code cautiously, and + * simply not allow any frames to be queued at all. DDBLT_LAST_PRESENTATION should cause + * such drivers to return DDERR_WASSTILLDRAWING until the accelerator is completely + * finished- exactly as if the application had called Lock on the source surface + * before calling Blt. + * In other words, the driver is allowed and encouraged to + * generate as much latency as it can, but never more than 3 frames worth. + * Implementation detail: Drivers should count blts against the SOURCE surface, not + * against the primary surface. This enables multiple parallel windowed application + * to function more optimally. + * This flag is passed only to DX8 or higher drivers. + * + * APPLICATIONS DO NOT SET THESE FLAGS. THEY ARE SET BY THE DIRECTDRAW RUNTIME. + * + */ +#define DDBLT_PRESENTATION 0x10000000l +#define DDBLT_LAST_PRESENTATION 0x20000000l + +/* + * If DDBLT_EXTENDED_FLAGS is set, then the driver should re-interpret + * other flags according to the definitions that follow. + * For example, bit 0 (0x00000001L) means DDBLT_ALPHADEST, unless + * DDBLT_EXTENDED_FLAGS is also set, in which case bit 0 means + * DDBLT_EXTENDED_LINEAR_CONTENT. + * Only DirectX9 and higher drivers will be given extended blt flags. + * Only flags explicitly mentioned here should be re-interpreted. + * All other flags retain their original meanings. + * + * List of re-interpreted flags: + * + * Bit Hex value New meaning old meaning + * --------------------------------------------------------------- + * 2 0x00000004 DDBLT_EXTENDED_LINEAR_CONTENT DDBLT_ALPHADESTNEG + * 4 0x00000010 DDBLT_EXTENDED_PRESENTATION_STRETCHFACTOR DDBLT_ALPHAEDGEBLEND + * + * + * NOTE: APPLICATIONS SHOULD NOT SET THIS FLAG. THIS FLAG IS INTENDED + * FOR USE BY THE DIRECT3D RUNTIME. + */ +#define DDBLT_EXTENDED_FLAGS 0x40000000l + +/* + * EXTENDED FLAG. SEE DEFINITION OF DDBLT_EXTENDED_FLAGS. + * This flag indidcates that the source surface contains content in a + * linear color space. The driver may perform gamma correction to the + * desktop color space (i.e. sRGB, gamma 2.2) as part of this blt. + * If the device can perform such a conversion as part of the copy, + * the driver should also set D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION + * + * NOTE: APPLICATIONS SHOULD NOT SET THIS FLAG. THIS FLAG IS INTENDED + * FOR USE BY THE DIRECT3D RUNTIME. Use IDirect3DSwapChain9::Present + * and specify D3DPRESENT_LINEAR_CONTENT in order to use this functionality. + */ +#define DDBLT_EXTENDED_LINEAR_CONTENT 0x00000004l + + +/**************************************************************************** + * + * BLTFAST FLAGS + * + ****************************************************************************/ + +#define DDBLTFAST_NOCOLORKEY 0x00000000 +#define DDBLTFAST_SRCCOLORKEY 0x00000001 +#define DDBLTFAST_DESTCOLORKEY 0x00000002 +#define DDBLTFAST_WAIT 0x00000010 +#define DDBLTFAST_DONOTWAIT 0x00000020 + +/**************************************************************************** + * + * FLIP FLAGS + * + ****************************************************************************/ + +#define DDFLIP_WAIT 0x00000001L + +/* + * Indicates that the target surface contains the even field of video data. + * This flag is only valid with an overlay surface. + */ +#define DDFLIP_EVEN 0x00000002L + +/* + * Indicates that the target surface contains the odd field of video data. + * This flag is only valid with an overlay surface. + */ +#define DDFLIP_ODD 0x00000004L + +/* + * Causes DirectDraw to perform the physical flip immediately and return + * to the application. Typically, what was the front buffer but is now the back + * buffer will still be visible (depending on timing) until the next vertical + * retrace. Subsequent operations involving the two flipped surfaces will + * not check to see if the physical flip has finished (i.e. will not return + * DDERR_WASSTILLDRAWING for that reason (but may for other reasons)). + * This allows an application to perform Flips at a higher frequency than the + * monitor refresh rate, but may introduce visible artifacts. + * Only effective if DDCAPS2_FLIPNOVSYNC is set. If that bit is not set, + * DDFLIP_NOVSYNC has no effect. + */ +#define DDFLIP_NOVSYNC 0x00000008L + + +/* + * Flip Interval Flags. These flags indicate how many vertical retraces to wait between + * each flip. The default is one. DirectDraw will return DDERR_WASSTILLDRAWING for each + * surface involved in the flip until the specified number of vertical retraces has + * ocurred. Only effective if DDCAPS2_FLIPINTERVAL is set. If that bit is not set, + * DDFLIP_INTERVALn has no effect. + */ + +/* + * DirectDraw will flip on every other vertical sync + */ +#define DDFLIP_INTERVAL2 0x02000000L + + +/* + * DirectDraw will flip on every third vertical sync + */ +#define DDFLIP_INTERVAL3 0x03000000L + + +/* + * DirectDraw will flip on every fourth vertical sync + */ +#define DDFLIP_INTERVAL4 0x04000000L + +/* + * DirectDraw will flip and display a main stereo surface + */ +#define DDFLIP_STEREO 0x00000010L + +/* + * On IDirectDrawSurface7 and higher interfaces, the default is DDFLIP_WAIT. If you wish + * to override the default and use time when the accelerator is busy (as denoted by + * the DDERR_WASSTILLDRAWING return code) then use DDFLIP_DONOTWAIT. + */ +#define DDFLIP_DONOTWAIT 0x00000020L + + +/**************************************************************************** + * + * DIRECTDRAW SURFACE OVERLAY FLAGS + * + ****************************************************************************/ + +/* + * Use the alpha information in the pixel format or the alpha channel surface + * attached to the destination surface as the alpha channel for the + * destination overlay. + */ +#define DDOVER_ALPHADEST 0x00000001l + +/* + * Use the dwConstAlphaDest field in the DDOVERLAYFX structure as the + * destination alpha channel for this overlay. + */ +#define DDOVER_ALPHADESTCONSTOVERRIDE 0x00000002l + +/* + * The NEG suffix indicates that the destination surface becomes more + * transparent as the alpha value increases. + */ +#define DDOVER_ALPHADESTNEG 0x00000004l + +/* + * Use the lpDDSAlphaDest field in the DDOVERLAYFX structure as the alpha + * channel destination for this overlay. + */ +#define DDOVER_ALPHADESTSURFACEOVERRIDE 0x00000008l + +/* + * Use the dwAlphaEdgeBlend field in the DDOVERLAYFX structure as the alpha + * channel for the edges of the image that border the color key colors. + */ +#define DDOVER_ALPHAEDGEBLEND 0x00000010l + +/* + * Use the alpha information in the pixel format or the alpha channel surface + * attached to the source surface as the source alpha channel for this overlay. + */ +#define DDOVER_ALPHASRC 0x00000020l + +/* + * Use the dwConstAlphaSrc field in the DDOVERLAYFX structure as the source + * alpha channel for this overlay. + */ +#define DDOVER_ALPHASRCCONSTOVERRIDE 0x00000040l + +/* + * The NEG suffix indicates that the source surface becomes more transparent + * as the alpha value increases. + */ +#define DDOVER_ALPHASRCNEG 0x00000080l + +/* + * Use the lpDDSAlphaSrc field in the DDOVERLAYFX structure as the alpha channel + * source for this overlay. + */ +#define DDOVER_ALPHASRCSURFACEOVERRIDE 0x00000100l + +/* + * Turn this overlay off. + */ +#define DDOVER_HIDE 0x00000200l + +/* + * Use the color key associated with the destination surface. + */ +#define DDOVER_KEYDEST 0x00000400l + +/* + * Use the dckDestColorkey field in the DDOVERLAYFX structure as the color key + * for the destination surface + */ +#define DDOVER_KEYDESTOVERRIDE 0x00000800l + +/* + * Use the color key associated with the source surface. + */ +#define DDOVER_KEYSRC 0x00001000l + +/* + * Use the dckSrcColorkey field in the DDOVERLAYFX structure as the color key + * for the source surface. + */ +#define DDOVER_KEYSRCOVERRIDE 0x00002000l + +/* + * Turn this overlay on. + */ +#define DDOVER_SHOW 0x00004000l + +/* + * Add a dirty rect to an emulated overlayed surface. + */ +#define DDOVER_ADDDIRTYRECT 0x00008000l + +/* + * Redraw all dirty rects on an emulated overlayed surface. + */ +#define DDOVER_REFRESHDIRTYRECTS 0x00010000l + +/* + * Redraw the entire surface on an emulated overlayed surface. + */ +#define DDOVER_REFRESHALL 0x00020000l + + +/* + * Use the overlay FX flags to define special overlay FX + */ +#define DDOVER_DDFX 0x00080000l + +/* + * Autoflip the overlay when ever the video port autoflips + */ +#define DDOVER_AUTOFLIP 0x00100000l + +/* + * Display each field of video port data individually without + * causing any jittery artifacts + */ +#define DDOVER_BOB 0x00200000l + +/* + * Indicates that bob/weave decisions should not be overridden by other + * interfaces. + */ +#define DDOVER_OVERRIDEBOBWEAVE 0x00400000l + +/* + * Indicates that the surface memory is composed of interleaved fields. + */ +#define DDOVER_INTERLEAVED 0x00800000l + +/* + * Indicates that bob will be performed using hardware rather than + * software or emulated. + */ +#define DDOVER_BOBHARDWARE 0x01000000l + +/* + * Indicates that overlay FX structure contains valid ARGB scaling factors. + */ +#define DDOVER_ARGBSCALEFACTORS 0x02000000l + +/* + * Indicates that ARGB scaling factors can be degraded to fit driver capabilities. + */ +#define DDOVER_DEGRADEARGBSCALING 0x04000000l + + +/**************************************************************************** + * + * DIRECTDRAWSURFACE LOCK FLAGS + * + ****************************************************************************/ + +/* + * The default. Set to indicate that Lock should return a valid memory pointer + * to the top of the specified rectangle. If no rectangle is specified then a + * pointer to the top of the surface is returned. + */ +#define DDLOCK_SURFACEMEMORYPTR 0x00000000L // default + +/* + * Set to indicate that Lock should wait until it can obtain a valid memory + * pointer before returning. If this bit is set, Lock will never return + * DDERR_WASSTILLDRAWING. + */ +#define DDLOCK_WAIT 0x00000001L + +/* + * Set if an event handle is being passed to Lock. Lock will trigger the event + * when it can return the surface memory pointer requested. + */ +#define DDLOCK_EVENT 0x00000002L + +/* + * Indicates that the surface being locked will only be read from. + */ +#define DDLOCK_READONLY 0x00000010L + +/* + * Indicates that the surface being locked will only be written to + */ +#define DDLOCK_WRITEONLY 0x00000020L + + +/* + * Indicates that a system wide lock should not be taken when this surface + * is locked. This has several advantages (cursor responsiveness, ability + * to call more Windows functions, easier debugging) when locking video + * memory surfaces. However, an application specifying this flag must + * comply with a number of conditions documented in the help file. + * Furthermore, this flag cannot be specified when locking the primary. + */ +#define DDLOCK_NOSYSLOCK 0x00000800L + +/* + * Used only with Direct3D Vertex Buffer Locks. Indicates that no vertices + * that were referred to in Draw*PrimtiveVB calls since the start of the + * frame (or the last lock without this flag) will be modified during the + * lock. This can be useful when one is only appending data to the vertex + * buffer + */ +#define DDLOCK_NOOVERWRITE 0x00001000L + +/* + * Indicates that no assumptions will be made about the contents of the + * surface or vertex buffer during this lock. + * This enables two things: + * - Direct3D or the driver may provide an alternative memory + * area as the vertex buffer. This is useful when one plans to clear the + * contents of the vertex buffer and fill in new data. + * - Drivers sometimes store surface data in a re-ordered format. + * When the application locks the surface, the driver is forced to un-re-order + * the surface data before allowing the application to see the surface contents. + * This flag is a hint to the driver that it can skip the un-re-ordering process + * since the application plans to overwrite every single pixel in the surface + * or locked rectangle (and so erase any un-re-ordered pixels anyway). + * Applications should always set this flag when they intend to overwrite the entire + * surface or locked rectangle. + */ +#define DDLOCK_DISCARDCONTENTS 0x00002000L + /* + * DDLOCK_OKTOSWAP is an older, less informative name for DDLOCK_DISCARDCONTENTS + */ +#define DDLOCK_OKTOSWAP 0x00002000L + +/* + * On IDirectDrawSurface7 and higher interfaces, the default is DDLOCK_WAIT. If you wish + * to override the default and use time when the accelerator is busy (as denoted by + * the DDERR_WASSTILLDRAWING return code) then use DDLOCK_DONOTWAIT. + */ +#define DDLOCK_DONOTWAIT 0x00004000L + +/* + * This indicates volume texture lock with front and back specified. + */ +#define DDLOCK_HASVOLUMETEXTUREBOXRECT 0x00008000L + +/* + * This indicates that the driver should not update dirty rect information for this lock. + */ +#define DDLOCK_NODIRTYUPDATE 0x00010000L + + +/**************************************************************************** + * + * DIRECTDRAWSURFACE PAGELOCK FLAGS + * + ****************************************************************************/ + +/* + * No flags defined at present + */ + + +/**************************************************************************** + * + * DIRECTDRAWSURFACE PAGEUNLOCK FLAGS + * + ****************************************************************************/ + +/* + * No flags defined at present + */ + + +/**************************************************************************** + * + * DIRECTDRAWSURFACE BLT FX FLAGS + * + ****************************************************************************/ + +/* + * If stretching, use arithmetic stretching along the Y axis for this blt. + */ +#define DDBLTFX_ARITHSTRETCHY 0x00000001l + +/* + * Do this blt mirroring the surface left to right. Spin the + * surface around its y-axis. + */ +#define DDBLTFX_MIRRORLEFTRIGHT 0x00000002l + +/* + * Do this blt mirroring the surface up and down. Spin the surface + * around its x-axis. + */ +#define DDBLTFX_MIRRORUPDOWN 0x00000004l + +/* + * Schedule this blt to avoid tearing. + */ +#define DDBLTFX_NOTEARING 0x00000008l + +/* + * Do this blt rotating the surface one hundred and eighty degrees. + */ +#define DDBLTFX_ROTATE180 0x00000010l + +/* + * Do this blt rotating the surface two hundred and seventy degrees. + */ +#define DDBLTFX_ROTATE270 0x00000020l + +/* + * Do this blt rotating the surface ninety degrees. + */ +#define DDBLTFX_ROTATE90 0x00000040l + +/* + * Do this z blt using dwZBufferLow and dwZBufferHigh as range values + * specified to limit the bits copied from the source surface. + */ +#define DDBLTFX_ZBUFFERRANGE 0x00000080l + +/* + * Do this z blt adding the dwZBufferBaseDest to each of the sources z values + * before comparing it with the desting z values. + */ +#define DDBLTFX_ZBUFFERBASEDEST 0x00000100l + +/**************************************************************************** + * + * DIRECTDRAWSURFACE OVERLAY FX FLAGS + * + ****************************************************************************/ + +/* + * If stretching, use arithmetic stretching along the Y axis for this overlay. + */ +#define DDOVERFX_ARITHSTRETCHY 0x00000001l + +/* + * Mirror the overlay across the vertical axis + */ +#define DDOVERFX_MIRRORLEFTRIGHT 0x00000002l + +/* + * Mirror the overlay across the horizontal axis + */ +#define DDOVERFX_MIRRORUPDOWN 0x00000004l + +/* + * Deinterlace the overlay, if possible + */ +#define DDOVERFX_DEINTERLACE 0x00000008l + + +/**************************************************************************** + * + * DIRECTDRAW WAITFORVERTICALBLANK FLAGS + * + ****************************************************************************/ + +/* + * return when the vertical blank interval begins + */ +#define DDWAITVB_BLOCKBEGIN 0x00000001l + +/* + * set up an event to trigger when the vertical blank begins + */ +#define DDWAITVB_BLOCKBEGINEVENT 0x00000002l + +/* + * return when the vertical blank interval ends and display begins + */ +#define DDWAITVB_BLOCKEND 0x00000004l + +/**************************************************************************** + * + * DIRECTDRAW GETFLIPSTATUS FLAGS + * + ****************************************************************************/ + +/* + * is it OK to flip now? + */ +#define DDGFS_CANFLIP 0x00000001l + +/* + * is the last flip finished? + */ +#define DDGFS_ISFLIPDONE 0x00000002l + +/**************************************************************************** + * + * DIRECTDRAW GETBLTSTATUS FLAGS + * + ****************************************************************************/ + +/* + * is it OK to blt now? + */ +#define DDGBS_CANBLT 0x00000001l + +/* + * is the blt to the surface finished? + */ +#define DDGBS_ISBLTDONE 0x00000002l + + +/**************************************************************************** + * + * DIRECTDRAW ENUMOVERLAYZORDER FLAGS + * + ****************************************************************************/ + +/* + * Enumerate overlays back to front. + */ +#define DDENUMOVERLAYZ_BACKTOFRONT 0x00000000l + +/* + * Enumerate overlays front to back + */ +#define DDENUMOVERLAYZ_FRONTTOBACK 0x00000001l + +/**************************************************************************** + * + * DIRECTDRAW UPDATEOVERLAYZORDER FLAGS + * + ****************************************************************************/ + +/* + * Send overlay to front + */ +#define DDOVERZ_SENDTOFRONT 0x00000000l + +/* + * Send overlay to back + */ +#define DDOVERZ_SENDTOBACK 0x00000001l + +/* + * Move Overlay forward + */ +#define DDOVERZ_MOVEFORWARD 0x00000002l + +/* + * Move Overlay backward + */ +#define DDOVERZ_MOVEBACKWARD 0x00000003l + +/* + * Move Overlay in front of relative surface + */ +#define DDOVERZ_INSERTINFRONTOF 0x00000004l + +/* + * Move Overlay in back of relative surface + */ +#define DDOVERZ_INSERTINBACKOF 0x00000005l + + +/**************************************************************************** + * + * DIRECTDRAW SETGAMMARAMP FLAGS + * + ****************************************************************************/ + +/* + * Request calibrator to adjust the gamma ramp according to the physical + * properties of the display so that the result should appear identical + * on all systems. + */ +#define DDSGR_CALIBRATE 0x00000001L + + +/**************************************************************************** + * + * DIRECTDRAW STARTMODETEST FLAGS + * + ****************************************************************************/ + +/* + * Indicates that the mode being tested has passed + */ +#define DDSMT_ISTESTREQUIRED 0x00000001L + + +/**************************************************************************** + * + * DIRECTDRAW EVALUATEMODE FLAGS + * + ****************************************************************************/ + +/* + * Indicates that the mode being tested has passed + */ +#define DDEM_MODEPASSED 0x00000001L + +/* + * Indicates that the mode being tested has failed + */ +#define DDEM_MODEFAILED 0x00000002L + + +/*=========================================================================== + * + * + * DIRECTDRAW RETURN CODES + * + * The return values from DirectDraw Commands and Surface that return an HRESULT + * are codes from DirectDraw concerning the results of the action + * requested by DirectDraw. + * + *==========================================================================*/ + +/* + * Status is OK + * + * Issued by: DirectDraw Commands and all callbacks + */ +#define DD_OK S_OK +#define DD_FALSE S_FALSE + +/**************************************************************************** + * + * DIRECTDRAW ENUMCALLBACK RETURN VALUES + * + * EnumCallback returns are used to control the flow of the DIRECTDRAW and + * DIRECTDRAWSURFACE object enumerations. They can only be returned by + * enumeration callback routines. + * + ****************************************************************************/ + +/* + * stop the enumeration + */ +#define DDENUMRET_CANCEL 0 + +/* + * continue the enumeration + */ +#define DDENUMRET_OK 1 + +/**************************************************************************** + * + * DIRECTDRAW ERRORS + * + * Errors are represented by negative values and cannot be combined. + * + ****************************************************************************/ + +/* + * This object is already initialized + */ +#define DDERR_ALREADYINITIALIZED MAKE_DDHRESULT( 5 ) + +/* + * This surface can not be attached to the requested surface. + */ +#define DDERR_CANNOTATTACHSURFACE MAKE_DDHRESULT( 10 ) + +/* + * This surface can not be detached from the requested surface. + */ +#define DDERR_CANNOTDETACHSURFACE MAKE_DDHRESULT( 20 ) + +/* + * Support is currently not available. + */ +#define DDERR_CURRENTLYNOTAVAIL MAKE_DDHRESULT( 40 ) + +/* + * An exception was encountered while performing the requested operation + */ +#define DDERR_EXCEPTION MAKE_DDHRESULT( 55 ) + +/* + * Generic failure. + */ +#define DDERR_GENERIC E_FAIL + +/* + * Height of rectangle provided is not a multiple of reqd alignment + */ +#define DDERR_HEIGHTALIGN MAKE_DDHRESULT( 90 ) + +/* + * Unable to match primary surface creation request with existing + * primary surface. + */ +#define DDERR_INCOMPATIBLEPRIMARY MAKE_DDHRESULT( 95 ) + +/* + * One or more of the caps bits passed to the callback are incorrect. + */ +#define DDERR_INVALIDCAPS MAKE_DDHRESULT( 100 ) + +/* + * DirectDraw does not support provided Cliplist. + */ +#define DDERR_INVALIDCLIPLIST MAKE_DDHRESULT( 110 ) + +/* + * DirectDraw does not support the requested mode + */ +#define DDERR_INVALIDMODE MAKE_DDHRESULT( 120 ) + +/* + * DirectDraw received a pointer that was an invalid DIRECTDRAW object. + */ +#define DDERR_INVALIDOBJECT MAKE_DDHRESULT( 130 ) + +/* + * One or more of the parameters passed to the callback function are + * incorrect. + */ +#define DDERR_INVALIDPARAMS E_INVALIDARG + +/* + * pixel format was invalid as specified + */ +#define DDERR_INVALIDPIXELFORMAT MAKE_DDHRESULT( 145 ) + +/* + * Rectangle provided was invalid. + */ +#define DDERR_INVALIDRECT MAKE_DDHRESULT( 150 ) + +/* + * Operation could not be carried out because one or more surfaces are locked + */ +#define DDERR_LOCKEDSURFACES MAKE_DDHRESULT( 160 ) + +/* + * There is no 3D present. + */ +#define DDERR_NO3D MAKE_DDHRESULT( 170 ) + +/* + * Operation could not be carried out because there is no alpha accleration + * hardware present or available. + */ +#define DDERR_NOALPHAHW MAKE_DDHRESULT( 180 ) + +/* + * Operation could not be carried out because there is no stereo + * hardware present or available. + */ +#define DDERR_NOSTEREOHARDWARE MAKE_DDHRESULT( 181 ) + +/* + * Operation could not be carried out because there is no hardware + * present which supports stereo surfaces + */ +#define DDERR_NOSURFACELEFT MAKE_DDHRESULT( 182 ) + + + +/* + * no clip list available + */ +#define DDERR_NOCLIPLIST MAKE_DDHRESULT( 205 ) + +/* + * Operation could not be carried out because there is no color conversion + * hardware present or available. + */ +#define DDERR_NOCOLORCONVHW MAKE_DDHRESULT( 210 ) + +/* + * Create function called without DirectDraw object method SetCooperativeLevel + * being called. + */ +#define DDERR_NOCOOPERATIVELEVELSET MAKE_DDHRESULT( 212 ) + +/* + * Surface doesn't currently have a color key + */ +#define DDERR_NOCOLORKEY MAKE_DDHRESULT( 215 ) + +/* + * Operation could not be carried out because there is no hardware support + * of the dest color key. + */ +#define DDERR_NOCOLORKEYHW MAKE_DDHRESULT( 220 ) + +/* + * No DirectDraw support possible with current display driver + */ +#define DDERR_NODIRECTDRAWSUPPORT MAKE_DDHRESULT( 222 ) + +/* + * Operation requires the application to have exclusive mode but the + * application does not have exclusive mode. + */ +#define DDERR_NOEXCLUSIVEMODE MAKE_DDHRESULT( 225 ) + +/* + * Flipping visible surfaces is not supported. + */ +#define DDERR_NOFLIPHW MAKE_DDHRESULT( 230 ) + +/* + * There is no GDI present. + */ +#define DDERR_NOGDI MAKE_DDHRESULT( 240 ) + +/* + * Operation could not be carried out because there is no hardware present + * or available. + */ +#define DDERR_NOMIRRORHW MAKE_DDHRESULT( 250 ) + +/* + * Requested item was not found + */ +#define DDERR_NOTFOUND MAKE_DDHRESULT( 255 ) + +/* + * Operation could not be carried out because there is no overlay hardware + * present or available. + */ +#define DDERR_NOOVERLAYHW MAKE_DDHRESULT( 260 ) + +/* + * Operation could not be carried out because the source and destination + * rectangles are on the same surface and overlap each other. + */ +#define DDERR_OVERLAPPINGRECTS MAKE_DDHRESULT( 270 ) + +/* + * Operation could not be carried out because there is no appropriate raster + * op hardware present or available. + */ +#define DDERR_NORASTEROPHW MAKE_DDHRESULT( 280 ) + +/* + * Operation could not be carried out because there is no rotation hardware + * present or available. + */ +#define DDERR_NOROTATIONHW MAKE_DDHRESULT( 290 ) + +/* + * Operation could not be carried out because there is no hardware support + * for stretching + */ +#define DDERR_NOSTRETCHHW MAKE_DDHRESULT( 310 ) + +/* + * DirectDrawSurface is not in 4 bit color palette and the requested operation + * requires 4 bit color palette. + */ +#define DDERR_NOT4BITCOLOR MAKE_DDHRESULT( 316 ) + +/* + * DirectDrawSurface is not in 4 bit color index palette and the requested + * operation requires 4 bit color index palette. + */ +#define DDERR_NOT4BITCOLORINDEX MAKE_DDHRESULT( 317 ) + +/* + * DirectDraw Surface is not in 8 bit color mode and the requested operation + * requires 8 bit color. + */ +#define DDERR_NOT8BITCOLOR MAKE_DDHRESULT( 320 ) + +/* + * Operation could not be carried out because there is no texture mapping + * hardware present or available. + */ +#define DDERR_NOTEXTUREHW MAKE_DDHRESULT( 330 ) + +/* + * Operation could not be carried out because there is no hardware support + * for vertical blank synchronized operations. + */ +#define DDERR_NOVSYNCHW MAKE_DDHRESULT( 335 ) + +/* + * Operation could not be carried out because there is no hardware support + * for zbuffer blting. + */ +#define DDERR_NOZBUFFERHW MAKE_DDHRESULT( 340 ) + +/* + * Overlay surfaces could not be z layered based on their BltOrder because + * the hardware does not support z layering of overlays. + */ +#define DDERR_NOZOVERLAYHW MAKE_DDHRESULT( 350 ) + +/* + * The hardware needed for the requested operation has already been + * allocated. + */ +#define DDERR_OUTOFCAPS MAKE_DDHRESULT( 360 ) + +/* + * DirectDraw does not have enough memory to perform the operation. + */ +#define DDERR_OUTOFMEMORY E_OUTOFMEMORY + +/* + * DirectDraw does not have enough memory to perform the operation. + */ +#define DDERR_OUTOFVIDEOMEMORY MAKE_DDHRESULT( 380 ) + +/* + * hardware does not support clipped overlays + */ +#define DDERR_OVERLAYCANTCLIP MAKE_DDHRESULT( 382 ) + +/* + * Can only have ony color key active at one time for overlays + */ +#define DDERR_OVERLAYCOLORKEYONLYONEACTIVE MAKE_DDHRESULT( 384 ) + +/* + * Access to this palette is being refused because the palette is already + * locked by another thread. + */ +#define DDERR_PALETTEBUSY MAKE_DDHRESULT( 387 ) + +/* + * No src color key specified for this operation. + */ +#define DDERR_COLORKEYNOTSET MAKE_DDHRESULT( 400 ) + +/* + * This surface is already attached to the surface it is being attached to. + */ +#define DDERR_SURFACEALREADYATTACHED MAKE_DDHRESULT( 410 ) + +/* + * This surface is already a dependency of the surface it is being made a + * dependency of. + */ +#define DDERR_SURFACEALREADYDEPENDENT MAKE_DDHRESULT( 420 ) + +/* + * Access to this surface is being refused because the surface is already + * locked by another thread. + */ +#define DDERR_SURFACEBUSY MAKE_DDHRESULT( 430 ) + +/* + * Access to this surface is being refused because no driver exists + * which can supply a pointer to the surface. + * This is most likely to happen when attempting to lock the primary + * surface when no DCI provider is present. + * Will also happen on attempts to lock an optimized surface. + */ +#define DDERR_CANTLOCKSURFACE MAKE_DDHRESULT( 435 ) + +/* + * Access to Surface refused because Surface is obscured. + */ +#define DDERR_SURFACEISOBSCURED MAKE_DDHRESULT( 440 ) + +/* + * Access to this surface is being refused because the surface is gone. + * The DIRECTDRAWSURFACE object representing this surface should + * have Restore called on it. + */ +#define DDERR_SURFACELOST MAKE_DDHRESULT( 450 ) + +/* + * The requested surface is not attached. + */ +#define DDERR_SURFACENOTATTACHED MAKE_DDHRESULT( 460 ) + +/* + * Height requested by DirectDraw is too large. + */ +#define DDERR_TOOBIGHEIGHT MAKE_DDHRESULT( 470 ) + +/* + * Size requested by DirectDraw is too large -- The individual height and + * width are OK. + */ +#define DDERR_TOOBIGSIZE MAKE_DDHRESULT( 480 ) + +/* + * Width requested by DirectDraw is too large. + */ +#define DDERR_TOOBIGWIDTH MAKE_DDHRESULT( 490 ) + +/* + * Action not supported. + */ +#define DDERR_UNSUPPORTED E_NOTIMPL + +/* + * Pixel format requested is unsupported by DirectDraw + */ +#define DDERR_UNSUPPORTEDFORMAT MAKE_DDHRESULT( 510 ) + +/* + * Bitmask in the pixel format requested is unsupported by DirectDraw + */ +#define DDERR_UNSUPPORTEDMASK MAKE_DDHRESULT( 520 ) + +/* + * The specified stream contains invalid data + */ +#define DDERR_INVALIDSTREAM MAKE_DDHRESULT( 521 ) + +/* + * vertical blank is in progress + */ +#define DDERR_VERTICALBLANKINPROGRESS MAKE_DDHRESULT( 537 ) + +/* + * Informs DirectDraw that the previous Blt which is transfering information + * to or from this Surface is incomplete. + */ +#define DDERR_WASSTILLDRAWING MAKE_DDHRESULT( 540 ) + + +/* + * The specified surface type requires specification of the COMPLEX flag + */ +#define DDERR_DDSCAPSCOMPLEXREQUIRED MAKE_DDHRESULT( 542 ) + + +/* + * Rectangle provided was not horizontally aligned on reqd. boundary + */ +#define DDERR_XALIGN MAKE_DDHRESULT( 560 ) + +/* + * The GUID passed to DirectDrawCreate is not a valid DirectDraw driver + * identifier. + */ +#define DDERR_INVALIDDIRECTDRAWGUID MAKE_DDHRESULT( 561 ) + +/* + * A DirectDraw object representing this driver has already been created + * for this process. + */ +#define DDERR_DIRECTDRAWALREADYCREATED MAKE_DDHRESULT( 562 ) + +/* + * A hardware only DirectDraw object creation was attempted but the driver + * did not support any hardware. + */ +#define DDERR_NODIRECTDRAWHW MAKE_DDHRESULT( 563 ) + +/* + * this process already has created a primary surface + */ +#define DDERR_PRIMARYSURFACEALREADYEXISTS MAKE_DDHRESULT( 564 ) + +/* + * software emulation not available. + */ +#define DDERR_NOEMULATION MAKE_DDHRESULT( 565 ) + +/* + * region passed to Clipper::GetClipList is too small. + */ +#define DDERR_REGIONTOOSMALL MAKE_DDHRESULT( 566 ) + +/* + * an attempt was made to set a clip list for a clipper objec that + * is already monitoring an hwnd. + */ +#define DDERR_CLIPPERISUSINGHWND MAKE_DDHRESULT( 567 ) + +/* + * No clipper object attached to surface object + */ +#define DDERR_NOCLIPPERATTACHED MAKE_DDHRESULT( 568 ) + +/* + * Clipper notification requires an HWND or + * no HWND has previously been set as the CooperativeLevel HWND. + */ +#define DDERR_NOHWND MAKE_DDHRESULT( 569 ) + +/* + * HWND used by DirectDraw CooperativeLevel has been subclassed, + * this prevents DirectDraw from restoring state. + */ +#define DDERR_HWNDSUBCLASSED MAKE_DDHRESULT( 570 ) + +/* + * The CooperativeLevel HWND has already been set. + * It can not be reset while the process has surfaces or palettes created. + */ +#define DDERR_HWNDALREADYSET MAKE_DDHRESULT( 571 ) + +/* + * No palette object attached to this surface. + */ +#define DDERR_NOPALETTEATTACHED MAKE_DDHRESULT( 572 ) + +/* + * No hardware support for 16 or 256 color palettes. + */ +#define DDERR_NOPALETTEHW MAKE_DDHRESULT( 573 ) + +/* + * If a clipper object is attached to the source surface passed into a + * BltFast call. + */ +#define DDERR_BLTFASTCANTCLIP MAKE_DDHRESULT( 574 ) + +/* + * No blter. + */ +#define DDERR_NOBLTHW MAKE_DDHRESULT( 575 ) + +/* + * No DirectDraw ROP hardware. + */ +#define DDERR_NODDROPSHW MAKE_DDHRESULT( 576 ) + +/* + * returned when GetOverlayPosition is called on a hidden overlay + */ +#define DDERR_OVERLAYNOTVISIBLE MAKE_DDHRESULT( 577 ) + +/* + * returned when GetOverlayPosition is called on a overlay that UpdateOverlay + * has never been called on to establish a destionation. + */ +#define DDERR_NOOVERLAYDEST MAKE_DDHRESULT( 578 ) + +/* + * returned when the position of the overlay on the destionation is no longer + * legal for that destionation. + */ +#define DDERR_INVALIDPOSITION MAKE_DDHRESULT( 579 ) + +/* + * returned when an overlay member is called for a non-overlay surface + */ +#define DDERR_NOTAOVERLAYSURFACE MAKE_DDHRESULT( 580 ) + +/* + * An attempt was made to set the cooperative level when it was already + * set to exclusive. + */ +#define DDERR_EXCLUSIVEMODEALREADYSET MAKE_DDHRESULT( 581 ) + +/* + * An attempt has been made to flip a surface that is not flippable. + */ +#define DDERR_NOTFLIPPABLE MAKE_DDHRESULT( 582 ) + +/* + * Can't duplicate primary & 3D surfaces, or surfaces that are implicitly + * created. + */ +#define DDERR_CANTDUPLICATE MAKE_DDHRESULT( 583 ) + +/* + * Surface was not locked. An attempt to unlock a surface that was not + * locked at all, or by this process, has been attempted. + */ +#define DDERR_NOTLOCKED MAKE_DDHRESULT( 584 ) + +/* + * Windows can not create any more DCs, or a DC was requested for a paltte-indexed + * surface when the surface had no palette AND the display mode was not palette-indexed + * (in this case DirectDraw cannot select a proper palette into the DC) + */ +#define DDERR_CANTCREATEDC MAKE_DDHRESULT( 585 ) + +/* + * No DC was ever created for this surface. + */ +#define DDERR_NODC MAKE_DDHRESULT( 586 ) + +/* + * This surface can not be restored because it was created in a different + * mode. + */ +#define DDERR_WRONGMODE MAKE_DDHRESULT( 587 ) + +/* + * This surface can not be restored because it is an implicitly created + * surface. + */ +#define DDERR_IMPLICITLYCREATED MAKE_DDHRESULT( 588 ) + +/* + * The surface being used is not a palette-based surface + */ +#define DDERR_NOTPALETTIZED MAKE_DDHRESULT( 589 ) + + +/* + * The display is currently in an unsupported mode + */ +#define DDERR_UNSUPPORTEDMODE MAKE_DDHRESULT( 590 ) + +/* + * Operation could not be carried out because there is no mip-map + * texture mapping hardware present or available. + */ +#define DDERR_NOMIPMAPHW MAKE_DDHRESULT( 591 ) + +/* + * The requested action could not be performed because the surface was of + * the wrong type. + */ +#define DDERR_INVALIDSURFACETYPE MAKE_DDHRESULT( 592 ) + + +/* + * Device does not support optimized surfaces, therefore no video memory optimized surfaces + */ +#define DDERR_NOOPTIMIZEHW MAKE_DDHRESULT( 600 ) + +/* + * Surface is an optimized surface, but has not yet been allocated any memory + */ +#define DDERR_NOTLOADED MAKE_DDHRESULT( 601 ) + +/* + * Attempt was made to create or set a device window without first setting + * the focus window + */ +#define DDERR_NOFOCUSWINDOW MAKE_DDHRESULT( 602 ) + +/* + * Attempt was made to set a palette on a mipmap sublevel + */ +#define DDERR_NOTONMIPMAPSUBLEVEL MAKE_DDHRESULT( 603 ) + +/* + * A DC has already been returned for this surface. Only one DC can be + * retrieved per surface. + */ +#define DDERR_DCALREADYCREATED MAKE_DDHRESULT( 620 ) + +/* + * An attempt was made to allocate non-local video memory from a device + * that does not support non-local video memory. + */ +#define DDERR_NONONLOCALVIDMEM MAKE_DDHRESULT( 630 ) + +/* + * The attempt to page lock a surface failed. + */ +#define DDERR_CANTPAGELOCK MAKE_DDHRESULT( 640 ) + + +/* + * The attempt to page unlock a surface failed. + */ +#define DDERR_CANTPAGEUNLOCK MAKE_DDHRESULT( 660 ) + +/* + * An attempt was made to page unlock a surface with no outstanding page locks. + */ +#define DDERR_NOTPAGELOCKED MAKE_DDHRESULT( 680 ) + +/* + * There is more data available than the specified buffer size could hold + */ +#define DDERR_MOREDATA MAKE_DDHRESULT( 690 ) + +/* + * The data has expired and is therefore no longer valid. + */ +#define DDERR_EXPIRED MAKE_DDHRESULT( 691 ) + +/* + * The mode test has finished executing. + */ +#define DDERR_TESTFINISHED MAKE_DDHRESULT( 692 ) + +/* + * The mode test has switched to a new mode. + */ +#define DDERR_NEWMODE MAKE_DDHRESULT( 693 ) + +/* + * D3D has not yet been initialized. + */ +#define DDERR_D3DNOTINITIALIZED MAKE_DDHRESULT( 694 ) + +/* + * The video port is not active + */ +#define DDERR_VIDEONOTACTIVE MAKE_DDHRESULT( 695 ) + +/* + * The monitor does not have EDID data. + */ +#define DDERR_NOMONITORINFORMATION MAKE_DDHRESULT( 696 ) + +/* + * The driver does not enumerate display mode refresh rates. + */ +#define DDERR_NODRIVERSUPPORT MAKE_DDHRESULT( 697 ) + +/* + * Surfaces created by one direct draw device cannot be used directly by + * another direct draw device. + */ +#define DDERR_DEVICEDOESNTOWNSURFACE MAKE_DDHRESULT( 699 ) + + + +/* + * An attempt was made to invoke an interface member of a DirectDraw object + * created by CoCreateInstance() before it was initialized. + */ +#define DDERR_NOTINITIALIZED CO_E_NOTINITIALIZED + + +/* Alpha bit depth constants */ + + +#ifdef __cplusplus +}; +#endif + +#ifdef ENABLE_NAMELESS_UNION_PRAGMA +#pragma warning(default:4201) +#endif + +#endif //__DDRAW_INCLUDED__ + + diff --git a/src/drivers/win/dinput.h b/src/drivers/win/dinput.h new file mode 100644 index 00000000..bf74e163 --- /dev/null +++ b/src/drivers/win/dinput.h @@ -0,0 +1,4417 @@ +/**************************************************************************** + * + * Copyright (C) 1996-2000 Microsoft Corporation. All Rights Reserved. + * + * File: dinput.h + * Content: DirectInput include file + * + ****************************************************************************/ + +#ifndef __DINPUT_INCLUDED__ +#define __DINPUT_INCLUDED__ + +#ifndef DIJ_RINGZERO + +#ifdef _WIN32 +#define COM_NO_WINDOWS_H +#include +#endif + +#endif /* DIJ_RINGZERO */ + +#ifdef __cplusplus +extern "C" { +#endif + + + + + +/* + * To build applications for older versions of DirectInput + * + * #define DIRECTINPUT_VERSION [ 0x0300 | 0x0500 | 0x0700 ] + * + * before #include . By default, #include + * will produce a DirectX 8-compatible header file. + * + */ + +#define DIRECTINPUT_HEADER_VERSION 0x0800 +#ifndef DIRECTINPUT_VERSION +#define DIRECTINPUT_VERSION DIRECTINPUT_HEADER_VERSION +#pragma message(__FILE__ ": DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800") +#endif + +#ifndef DIJ_RINGZERO + +/**************************************************************************** + * + * Class IDs + * + ****************************************************************************/ + +DEFINE_GUID(CLSID_DirectInput, 0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(CLSID_DirectInputDevice, 0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +DEFINE_GUID(CLSID_DirectInput8, 0x25E609E4,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(CLSID_DirectInputDevice8,0x25E609E5,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +/**************************************************************************** + * + * Interfaces + * + ****************************************************************************/ + +DEFINE_GUID(IID_IDirectInputA, 0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInputW, 0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInput2A, 0x5944E662,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInput2W, 0x5944E663,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInput7A, 0x9A4CB684,0x236D,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); +DEFINE_GUID(IID_IDirectInput7W, 0x9A4CB685,0x236D,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); +DEFINE_GUID(IID_IDirectInput8A, 0xBF798030,0x483A,0x4DA2,0xAA,0x99,0x5D,0x64,0xED,0x36,0x97,0x00); +DEFINE_GUID(IID_IDirectInput8W, 0xBF798031,0x483A,0x4DA2,0xAA,0x99,0x5D,0x64,0xED,0x36,0x97,0x00); +DEFINE_GUID(IID_IDirectInputDeviceA, 0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInputDeviceW, 0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInputDevice2A,0x5944E682,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInputDevice2W,0x5944E683,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(IID_IDirectInputDevice7A,0x57D7C6BC,0x2356,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); +DEFINE_GUID(IID_IDirectInputDevice7W,0x57D7C6BD,0x2356,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); +DEFINE_GUID(IID_IDirectInputDevice8A,0x54D41080,0xDC15,0x4833,0xA4,0x1B,0x74,0x8F,0x73,0xA3,0x81,0x79); +DEFINE_GUID(IID_IDirectInputDevice8W,0x54D41081,0xDC15,0x4833,0xA4,0x1B,0x74,0x8F,0x73,0xA3,0x81,0x79); +DEFINE_GUID(IID_IDirectInputEffect, 0xE7E1F7C0,0x88D2,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); + +/**************************************************************************** + * + * Predefined object types + * + ****************************************************************************/ + +DEFINE_GUID(GUID_XAxis, 0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_YAxis, 0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_ZAxis, 0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_RxAxis, 0xA36D02F4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_RyAxis, 0xA36D02F5,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_RzAxis, 0xA36D02E3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_Slider, 0xA36D02E4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +DEFINE_GUID(GUID_Button, 0xA36D02F0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_Key, 0x55728220,0xD33C,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +DEFINE_GUID(GUID_POV, 0xA36D02F2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +DEFINE_GUID(GUID_Unknown, 0xA36D02F3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +/**************************************************************************** + * + * Predefined product GUIDs + * + ****************************************************************************/ + +DEFINE_GUID(GUID_SysMouse, 0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_SysKeyboard,0x6F1D2B61,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_Joystick ,0x6F1D2B70,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_SysMouseEm, 0x6F1D2B80,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_SysMouseEm2,0x6F1D2B81,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_SysKeyboardEm, 0x6F1D2B82,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(GUID_SysKeyboardEm2,0x6F1D2B83,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + +/**************************************************************************** + * + * Predefined force feedback effects + * + ****************************************************************************/ + +DEFINE_GUID(GUID_ConstantForce, 0x13541C20,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_RampForce, 0x13541C21,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Square, 0x13541C22,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Sine, 0x13541C23,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Triangle, 0x13541C24,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_SawtoothUp, 0x13541C25,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_SawtoothDown, 0x13541C26,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Spring, 0x13541C27,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Damper, 0x13541C28,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Inertia, 0x13541C29,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_Friction, 0x13541C2A,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); +DEFINE_GUID(GUID_CustomForce, 0x13541C2B,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); + +#endif /* DIJ_RINGZERO */ + +/**************************************************************************** + * + * Interfaces and Structures... + * + ****************************************************************************/ + +#if(DIRECTINPUT_VERSION >= 0x0500) + +/**************************************************************************** + * + * IDirectInputEffect + * + ****************************************************************************/ + +#define DIEFT_ALL 0x00000000 + +#define DIEFT_CONSTANTFORCE 0x00000001 +#define DIEFT_RAMPFORCE 0x00000002 +#define DIEFT_PERIODIC 0x00000003 +#define DIEFT_CONDITION 0x00000004 +#define DIEFT_CUSTOMFORCE 0x00000005 +#define DIEFT_HARDWARE 0x000000FF +#define DIEFT_FFATTACK 0x00000200 +#define DIEFT_FFFADE 0x00000400 +#define DIEFT_SATURATION 0x00000800 +#define DIEFT_POSNEGCOEFFICIENTS 0x00001000 +#define DIEFT_POSNEGSATURATION 0x00002000 +#define DIEFT_DEADBAND 0x00004000 +#define DIEFT_STARTDELAY 0x00008000 +#define DIEFT_GETTYPE(n) LOBYTE(n) + +#define DI_DEGREES 100 +#define DI_FFNOMINALMAX 10000 +#define DI_SECONDS 1000000 + +typedef struct DICONSTANTFORCE { + LONG lMagnitude; +} DICONSTANTFORCE, *LPDICONSTANTFORCE; +typedef const DICONSTANTFORCE *LPCDICONSTANTFORCE; + +typedef struct DIRAMPFORCE { + LONG lStart; + LONG lEnd; +} DIRAMPFORCE, *LPDIRAMPFORCE; +typedef const DIRAMPFORCE *LPCDIRAMPFORCE; + +typedef struct DIPERIODIC { + DWORD dwMagnitude; + LONG lOffset; + DWORD dwPhase; + DWORD dwPeriod; +} DIPERIODIC, *LPDIPERIODIC; +typedef const DIPERIODIC *LPCDIPERIODIC; + +typedef struct DICONDITION { + LONG lOffset; + LONG lPositiveCoefficient; + LONG lNegativeCoefficient; + DWORD dwPositiveSaturation; + DWORD dwNegativeSaturation; + LONG lDeadBand; +} DICONDITION, *LPDICONDITION; +typedef const DICONDITION *LPCDICONDITION; + +typedef struct DICUSTOMFORCE { + DWORD cChannels; + DWORD dwSamplePeriod; + DWORD cSamples; + LPLONG rglForceData; +} DICUSTOMFORCE, *LPDICUSTOMFORCE; +typedef const DICUSTOMFORCE *LPCDICUSTOMFORCE; + + +typedef struct DIENVELOPE { + DWORD dwSize; /* sizeof(DIENVELOPE) */ + DWORD dwAttackLevel; + DWORD dwAttackTime; /* Microseconds */ + DWORD dwFadeLevel; + DWORD dwFadeTime; /* Microseconds */ +} DIENVELOPE, *LPDIENVELOPE; +typedef const DIENVELOPE *LPCDIENVELOPE; + + +/* This structure is defined for DirectX 5.0 compatibility */ +typedef struct DIEFFECT_DX5 { + DWORD dwSize; /* sizeof(DIEFFECT_DX5) */ + DWORD dwFlags; /* DIEFF_* */ + DWORD dwDuration; /* Microseconds */ + DWORD dwSamplePeriod; /* Microseconds */ + DWORD dwGain; + DWORD dwTriggerButton; /* or DIEB_NOTRIGGER */ + DWORD dwTriggerRepeatInterval; /* Microseconds */ + DWORD cAxes; /* Number of axes */ + LPDWORD rgdwAxes; /* Array of axes */ + LPLONG rglDirection; /* Array of directions */ + LPDIENVELOPE lpEnvelope; /* Optional */ + DWORD cbTypeSpecificParams; /* Size of params */ + LPVOID lpvTypeSpecificParams; /* Pointer to params */ +} DIEFFECT_DX5, *LPDIEFFECT_DX5; +typedef const DIEFFECT_DX5 *LPCDIEFFECT_DX5; + +typedef struct DIEFFECT { + DWORD dwSize; /* sizeof(DIEFFECT) */ + DWORD dwFlags; /* DIEFF_* */ + DWORD dwDuration; /* Microseconds */ + DWORD dwSamplePeriod; /* Microseconds */ + DWORD dwGain; + DWORD dwTriggerButton; /* or DIEB_NOTRIGGER */ + DWORD dwTriggerRepeatInterval; /* Microseconds */ + DWORD cAxes; /* Number of axes */ + LPDWORD rgdwAxes; /* Array of axes */ + LPLONG rglDirection; /* Array of directions */ + LPDIENVELOPE lpEnvelope; /* Optional */ + DWORD cbTypeSpecificParams; /* Size of params */ + LPVOID lpvTypeSpecificParams; /* Pointer to params */ +#if(DIRECTINPUT_VERSION >= 0x0600) + DWORD dwStartDelay; /* Microseconds */ +#endif /* DIRECTINPUT_VERSION >= 0x0600 */ +} DIEFFECT, *LPDIEFFECT; +typedef DIEFFECT DIEFFECT_DX6; +typedef LPDIEFFECT LPDIEFFECT_DX6; +typedef const DIEFFECT *LPCDIEFFECT; + + +#if(DIRECTINPUT_VERSION >= 0x0700) +#ifndef DIJ_RINGZERO +typedef struct DIFILEEFFECT{ + DWORD dwSize; + GUID GuidEffect; + LPCDIEFFECT lpDiEffect; + CHAR szFriendlyName[MAX_PATH]; +}DIFILEEFFECT, *LPDIFILEEFFECT; +typedef const DIFILEEFFECT *LPCDIFILEEFFECT; +typedef BOOL (FAR PASCAL * LPDIENUMEFFECTSINFILECALLBACK)(LPCDIFILEEFFECT , LPVOID); +#endif /* DIJ_RINGZERO */ +#endif /* DIRECTINPUT_VERSION >= 0x0700 */ + +#define DIEFF_OBJECTIDS 0x00000001 +#define DIEFF_OBJECTOFFSETS 0x00000002 +#define DIEFF_CARTESIAN 0x00000010 +#define DIEFF_POLAR 0x00000020 +#define DIEFF_SPHERICAL 0x00000040 + +#define DIEP_DURATION 0x00000001 +#define DIEP_SAMPLEPERIOD 0x00000002 +#define DIEP_GAIN 0x00000004 +#define DIEP_TRIGGERBUTTON 0x00000008 +#define DIEP_TRIGGERREPEATINTERVAL 0x00000010 +#define DIEP_AXES 0x00000020 +#define DIEP_DIRECTION 0x00000040 +#define DIEP_ENVELOPE 0x00000080 +#define DIEP_TYPESPECIFICPARAMS 0x00000100 +#if(DIRECTINPUT_VERSION >= 0x0600) +#define DIEP_STARTDELAY 0x00000200 +#define DIEP_ALLPARAMS_DX5 0x000001FF +#define DIEP_ALLPARAMS 0x000003FF +#else /* DIRECTINPUT_VERSION < 0x0600 */ +#define DIEP_ALLPARAMS 0x000001FF +#endif /* DIRECTINPUT_VERSION < 0x0600 */ +#define DIEP_START 0x20000000 +#define DIEP_NORESTART 0x40000000 +#define DIEP_NODOWNLOAD 0x80000000 +#define DIEB_NOTRIGGER 0xFFFFFFFF + +#define DIES_SOLO 0x00000001 +#define DIES_NODOWNLOAD 0x80000000 + +#define DIEGES_PLAYING 0x00000001 +#define DIEGES_EMULATED 0x00000002 + +typedef struct DIEFFESCAPE { + DWORD dwSize; + DWORD dwCommand; + LPVOID lpvInBuffer; + DWORD cbInBuffer; + LPVOID lpvOutBuffer; + DWORD cbOutBuffer; +} DIEFFESCAPE, *LPDIEFFESCAPE; + +#ifndef DIJ_RINGZERO + +#undef INTERFACE +#define INTERFACE IDirectInputEffect + +DECLARE_INTERFACE_(IDirectInputEffect, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputEffect methods ***/ + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE; + STDMETHOD(GetEffectGuid)(THIS_ LPGUID) PURE; + STDMETHOD(GetParameters)(THIS_ LPDIEFFECT,DWORD) PURE; + STDMETHOD(SetParameters)(THIS_ LPCDIEFFECT,DWORD) PURE; + STDMETHOD(Start)(THIS_ DWORD,DWORD) PURE; + STDMETHOD(Stop)(THIS) PURE; + STDMETHOD(GetEffectStatus)(THIS_ LPDWORD) PURE; + STDMETHOD(Download)(THIS) PURE; + STDMETHOD(Unload)(THIS) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE; +}; + +typedef struct IDirectInputEffect *LPDIRECTINPUTEFFECT; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectInputEffect_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputEffect_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputEffect_Release(p) (p)->lpVtbl->Release(p) +#define IDirectInputEffect_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) +#define IDirectInputEffect_GetEffectGuid(p,a) (p)->lpVtbl->GetEffectGuid(p,a) +#define IDirectInputEffect_GetParameters(p,a,b) (p)->lpVtbl->GetParameters(p,a,b) +#define IDirectInputEffect_SetParameters(p,a,b) (p)->lpVtbl->SetParameters(p,a,b) +#define IDirectInputEffect_Start(p,a,b) (p)->lpVtbl->Start(p,a,b) +#define IDirectInputEffect_Stop(p) (p)->lpVtbl->Stop(p) +#define IDirectInputEffect_GetEffectStatus(p,a) (p)->lpVtbl->GetEffectStatus(p,a) +#define IDirectInputEffect_Download(p) (p)->lpVtbl->Download(p) +#define IDirectInputEffect_Unload(p) (p)->lpVtbl->Unload(p) +#define IDirectInputEffect_Escape(p,a) (p)->lpVtbl->Escape(p,a) +#else +#define IDirectInputEffect_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInputEffect_AddRef(p) (p)->AddRef() +#define IDirectInputEffect_Release(p) (p)->Release() +#define IDirectInputEffect_Initialize(p,a,b,c) (p)->Initialize(a,b,c) +#define IDirectInputEffect_GetEffectGuid(p,a) (p)->GetEffectGuid(a) +#define IDirectInputEffect_GetParameters(p,a,b) (p)->GetParameters(a,b) +#define IDirectInputEffect_SetParameters(p,a,b) (p)->SetParameters(a,b) +#define IDirectInputEffect_Start(p,a,b) (p)->Start(a,b) +#define IDirectInputEffect_Stop(p) (p)->Stop() +#define IDirectInputEffect_GetEffectStatus(p,a) (p)->GetEffectStatus(a) +#define IDirectInputEffect_Download(p) (p)->Download() +#define IDirectInputEffect_Unload(p) (p)->Unload() +#define IDirectInputEffect_Escape(p,a) (p)->Escape(a) +#endif + +#endif /* DIJ_RINGZERO */ + +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ + +/**************************************************************************** + * + * IDirectInputDevice + * + ****************************************************************************/ + +#if DIRECTINPUT_VERSION <= 0x700 +#define DIDEVTYPE_DEVICE 1 +#define DIDEVTYPE_MOUSE 2 +#define DIDEVTYPE_KEYBOARD 3 +#define DIDEVTYPE_JOYSTICK 4 + +#else +#define DI8DEVCLASS_ALL 0 +#define DI8DEVCLASS_DEVICE 1 +#define DI8DEVCLASS_POINTER 2 +#define DI8DEVCLASS_KEYBOARD 3 +#define DI8DEVCLASS_GAMECTRL 4 + +#define DI8DEVTYPE_DEVICE 0x11 +#define DI8DEVTYPE_MOUSE 0x12 +#define DI8DEVTYPE_KEYBOARD 0x13 +#define DI8DEVTYPE_JOYSTICK 0x14 +#define DI8DEVTYPE_GAMEPAD 0x15 +#define DI8DEVTYPE_DRIVING 0x16 +#define DI8DEVTYPE_FLIGHT 0x17 +#define DI8DEVTYPE_1STPERSON 0x18 +#define DI8DEVTYPE_DEVICECTRL 0x19 +#define DI8DEVTYPE_SCREENPOINTER 0x1A +#define DI8DEVTYPE_REMOTE 0x1B +#define DI8DEVTYPE_SUPPLEMENTAL 0x1C +#endif /* DIRECTINPUT_VERSION <= 0x700 */ + +#define DIDEVTYPE_HID 0x00010000 + +#if DIRECTINPUT_VERSION <= 0x700 +#define DIDEVTYPEMOUSE_UNKNOWN 1 +#define DIDEVTYPEMOUSE_TRADITIONAL 2 +#define DIDEVTYPEMOUSE_FINGERSTICK 3 +#define DIDEVTYPEMOUSE_TOUCHPAD 4 +#define DIDEVTYPEMOUSE_TRACKBALL 5 + +#define DIDEVTYPEKEYBOARD_UNKNOWN 0 +#define DIDEVTYPEKEYBOARD_PCXT 1 +#define DIDEVTYPEKEYBOARD_OLIVETTI 2 +#define DIDEVTYPEKEYBOARD_PCAT 3 +#define DIDEVTYPEKEYBOARD_PCENH 4 +#define DIDEVTYPEKEYBOARD_NOKIA1050 5 +#define DIDEVTYPEKEYBOARD_NOKIA9140 6 +#define DIDEVTYPEKEYBOARD_NEC98 7 +#define DIDEVTYPEKEYBOARD_NEC98LAPTOP 8 +#define DIDEVTYPEKEYBOARD_NEC98106 9 +#define DIDEVTYPEKEYBOARD_JAPAN106 10 +#define DIDEVTYPEKEYBOARD_JAPANAX 11 +#define DIDEVTYPEKEYBOARD_J3100 12 + +#define DIDEVTYPEJOYSTICK_UNKNOWN 1 +#define DIDEVTYPEJOYSTICK_TRADITIONAL 2 +#define DIDEVTYPEJOYSTICK_FLIGHTSTICK 3 +#define DIDEVTYPEJOYSTICK_GAMEPAD 4 +#define DIDEVTYPEJOYSTICK_RUDDER 5 +#define DIDEVTYPEJOYSTICK_WHEEL 6 +#define DIDEVTYPEJOYSTICK_HEADTRACKER 7 + +#else +#define DI8DEVTYPEMOUSE_UNKNOWN 1 +#define DI8DEVTYPEMOUSE_TRADITIONAL 2 +#define DI8DEVTYPEMOUSE_FINGERSTICK 3 +#define DI8DEVTYPEMOUSE_TOUCHPAD 4 +#define DI8DEVTYPEMOUSE_TRACKBALL 5 +#define DI8DEVTYPEMOUSE_ABSOLUTE 6 + +#define DI8DEVTYPEKEYBOARD_UNKNOWN 0 +#define DI8DEVTYPEKEYBOARD_PCXT 1 +#define DI8DEVTYPEKEYBOARD_OLIVETTI 2 +#define DI8DEVTYPEKEYBOARD_PCAT 3 +#define DI8DEVTYPEKEYBOARD_PCENH 4 +#define DI8DEVTYPEKEYBOARD_NOKIA1050 5 +#define DI8DEVTYPEKEYBOARD_NOKIA9140 6 +#define DI8DEVTYPEKEYBOARD_NEC98 7 +#define DI8DEVTYPEKEYBOARD_NEC98LAPTOP 8 +#define DI8DEVTYPEKEYBOARD_NEC98106 9 +#define DI8DEVTYPEKEYBOARD_JAPAN106 10 +#define DI8DEVTYPEKEYBOARD_JAPANAX 11 +#define DI8DEVTYPEKEYBOARD_J3100 12 + +#define DI8DEVTYPE_LIMITEDGAMESUBTYPE 1 + +#define DI8DEVTYPEJOYSTICK_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEJOYSTICK_STANDARD 2 + +#define DI8DEVTYPEGAMEPAD_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEGAMEPAD_STANDARD 2 +#define DI8DEVTYPEGAMEPAD_TILT 3 + +#define DI8DEVTYPEDRIVING_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEDRIVING_COMBINEDPEDALS 2 +#define DI8DEVTYPEDRIVING_DUALPEDALS 3 +#define DI8DEVTYPEDRIVING_THREEPEDALS 4 +#define DI8DEVTYPEDRIVING_HANDHELD 5 + +#define DI8DEVTYPEFLIGHT_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEFLIGHT_STICK 2 +#define DI8DEVTYPEFLIGHT_YOKE 3 +#define DI8DEVTYPEFLIGHT_RC 4 + +#define DI8DEVTYPE1STPERSON_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPE1STPERSON_UNKNOWN 2 +#define DI8DEVTYPE1STPERSON_SIXDOF 3 +#define DI8DEVTYPE1STPERSON_SHOOTER 4 + +#define DI8DEVTYPESCREENPTR_UNKNOWN 2 +#define DI8DEVTYPESCREENPTR_LIGHTGUN 3 +#define DI8DEVTYPESCREENPTR_LIGHTPEN 4 +#define DI8DEVTYPESCREENPTR_TOUCH 5 + +#define DI8DEVTYPEREMOTE_UNKNOWN 2 + +#define DI8DEVTYPEDEVICECTRL_UNKNOWN 2 +#define DI8DEVTYPEDEVICECTRL_COMMSSELECTION 3 +#define DI8DEVTYPEDEVICECTRL_COMMSSELECTION_HARDWIRED 4 + +#define DI8DEVTYPESUPPLEMENTAL_UNKNOWN 2 +#define DI8DEVTYPESUPPLEMENTAL_2NDHANDCONTROLLER 3 +#define DI8DEVTYPESUPPLEMENTAL_HEADTRACKER 4 +#define DI8DEVTYPESUPPLEMENTAL_HANDTRACKER 5 +#define DI8DEVTYPESUPPLEMENTAL_SHIFTSTICKGATE 6 +#define DI8DEVTYPESUPPLEMENTAL_SHIFTER 7 +#define DI8DEVTYPESUPPLEMENTAL_THROTTLE 8 +#define DI8DEVTYPESUPPLEMENTAL_SPLITTHROTTLE 9 +#define DI8DEVTYPESUPPLEMENTAL_COMBINEDPEDALS 10 +#define DI8DEVTYPESUPPLEMENTAL_DUALPEDALS 11 +#define DI8DEVTYPESUPPLEMENTAL_THREEPEDALS 12 +#define DI8DEVTYPESUPPLEMENTAL_RUDDERPEDALS 13 +#endif /* DIRECTINPUT_VERSION <= 0x700 */ + +#define GET_DIDEVICE_TYPE(dwDevType) LOBYTE(dwDevType) +#define GET_DIDEVICE_SUBTYPE(dwDevType) HIBYTE(dwDevType) + +#if(DIRECTINPUT_VERSION >= 0x0500) +/* This structure is defined for DirectX 3.0 compatibility */ +typedef struct DIDEVCAPS_DX3 { + DWORD dwSize; + DWORD dwFlags; + DWORD dwDevType; + DWORD dwAxes; + DWORD dwButtons; + DWORD dwPOVs; +} DIDEVCAPS_DX3, *LPDIDEVCAPS_DX3; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ + +typedef struct DIDEVCAPS { + DWORD dwSize; + DWORD dwFlags; + DWORD dwDevType; + DWORD dwAxes; + DWORD dwButtons; + DWORD dwPOVs; +#if(DIRECTINPUT_VERSION >= 0x0500) + DWORD dwFFSamplePeriod; + DWORD dwFFMinTimeResolution; + DWORD dwFirmwareRevision; + DWORD dwHardwareRevision; + DWORD dwFFDriverVersion; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +} DIDEVCAPS, *LPDIDEVCAPS; + +#define DIDC_ATTACHED 0x00000001 +#define DIDC_POLLEDDEVICE 0x00000002 +#define DIDC_EMULATED 0x00000004 +#define DIDC_POLLEDDATAFORMAT 0x00000008 +#if(DIRECTINPUT_VERSION >= 0x0500) +#define DIDC_FORCEFEEDBACK 0x00000100 +#define DIDC_FFATTACK 0x00000200 +#define DIDC_FFFADE 0x00000400 +#define DIDC_SATURATION 0x00000800 +#define DIDC_POSNEGCOEFFICIENTS 0x00001000 +#define DIDC_POSNEGSATURATION 0x00002000 +#define DIDC_DEADBAND 0x00004000 +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +#define DIDC_STARTDELAY 0x00008000 +#if(DIRECTINPUT_VERSION >= 0x050a) +#define DIDC_ALIAS 0x00010000 +#define DIDC_PHANTOM 0x00020000 +#endif /* DIRECTINPUT_VERSION >= 0x050a */ +#if(DIRECTINPUT_VERSION >= 0x0800) +#define DIDC_HIDDEN 0x00040000 +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ + +#define DIDFT_ALL 0x00000000 + +#define DIDFT_RELAXIS 0x00000001 +#define DIDFT_ABSAXIS 0x00000002 +#define DIDFT_AXIS 0x00000003 + +#define DIDFT_PSHBUTTON 0x00000004 +#define DIDFT_TGLBUTTON 0x00000008 +#define DIDFT_BUTTON 0x0000000C + +#define DIDFT_POV 0x00000010 +#define DIDFT_COLLECTION 0x00000040 +#define DIDFT_NODATA 0x00000080 + +#define DIDFT_ANYINSTANCE 0x00FFFF00 +#define DIDFT_INSTANCEMASK DIDFT_ANYINSTANCE +#define DIDFT_MAKEINSTANCE(n) ((WORD)(n) << 8) +#define DIDFT_GETTYPE(n) LOBYTE(n) +#define DIDFT_GETINSTANCE(n) LOWORD((n) >> 8) +#define DIDFT_FFACTUATOR 0x01000000 +#define DIDFT_FFEFFECTTRIGGER 0x02000000 +#if(DIRECTINPUT_VERSION >= 0x050a) +#define DIDFT_OUTPUT 0x10000000 +#define DIDFT_VENDORDEFINED 0x04000000 +#define DIDFT_ALIAS 0x08000000 +#endif /* DIRECTINPUT_VERSION >= 0x050a */ +#ifndef DIDFT_OPTIONAL +#define DIDFT_OPTIONAL 0x80000000 +#endif + +#define DIDFT_ENUMCOLLECTION(n) ((WORD)(n) << 8) +#define DIDFT_NOCOLLECTION 0x00FFFF00 + +#ifndef DIJ_RINGZERO + +typedef struct _DIOBJECTDATAFORMAT { + const GUID *pguid; + DWORD dwOfs; + DWORD dwType; + DWORD dwFlags; +} DIOBJECTDATAFORMAT, *LPDIOBJECTDATAFORMAT; +typedef const DIOBJECTDATAFORMAT *LPCDIOBJECTDATAFORMAT; + +typedef struct _DIDATAFORMAT { + DWORD dwSize; + DWORD dwObjSize; + DWORD dwFlags; + DWORD dwDataSize; + DWORD dwNumObjs; + LPDIOBJECTDATAFORMAT rgodf; +} DIDATAFORMAT, *LPDIDATAFORMAT; +typedef const DIDATAFORMAT *LPCDIDATAFORMAT; + +#define DIDF_ABSAXIS 0x00000001 +#define DIDF_RELAXIS 0x00000002 + +#ifdef __cplusplus +extern "C" { +#endif +extern const DIDATAFORMAT c_dfDIMouse; + +#if(DIRECTINPUT_VERSION >= 0x0700) +extern const DIDATAFORMAT c_dfDIMouse2; +#endif /* DIRECTINPUT_VERSION >= 0x0700 */ + +extern const DIDATAFORMAT c_dfDIKeyboard; + +#if(DIRECTINPUT_VERSION >= 0x0500) +extern const DIDATAFORMAT c_dfDIJoystick; +extern const DIDATAFORMAT c_dfDIJoystick2; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ + +#ifdef __cplusplus +}; +#endif + + +#if DIRECTINPUT_VERSION > 0x0700 + +typedef struct _DIACTIONA { + UINT_PTR uAppData; + DWORD dwSemantic; + OPTIONAL DWORD dwFlags; + OPTIONAL union { + LPCSTR lptszActionName; + UINT uResIdString; + }; + OPTIONAL GUID guidInstance; + OPTIONAL DWORD dwObjID; + OPTIONAL DWORD dwHow; +} DIACTIONA, *LPDIACTIONA ; +typedef struct _DIACTIONW { + UINT_PTR uAppData; + DWORD dwSemantic; + OPTIONAL DWORD dwFlags; + OPTIONAL union { + LPCWSTR lptszActionName; + UINT uResIdString; + }; + OPTIONAL GUID guidInstance; + OPTIONAL DWORD dwObjID; + OPTIONAL DWORD dwHow; +} DIACTIONW, *LPDIACTIONW ; +#ifdef UNICODE +typedef DIACTIONW DIACTION; +typedef LPDIACTIONW LPDIACTION; +#else +typedef DIACTIONA DIACTION; +typedef LPDIACTIONA LPDIACTION; +#endif // UNICODE + +typedef const DIACTIONA *LPCDIACTIONA; +typedef const DIACTIONW *LPCDIACTIONW; +#ifdef UNICODE +typedef DIACTIONW DIACTION; +typedef LPCDIACTIONW LPCDIACTION; +#else +typedef DIACTIONA DIACTION; +typedef LPCDIACTIONA LPCDIACTION; +#endif // UNICODE +typedef const DIACTION *LPCDIACTION; + + +#define DIA_FORCEFEEDBACK 0x00000001 +#define DIA_APPMAPPED 0x00000002 +#define DIA_APPNOMAP 0x00000004 +#define DIA_NORANGE 0x00000008 +#define DIA_APPFIXED 0x00000010 + +#define DIAH_UNMAPPED 0x00000000 +#define DIAH_USERCONFIG 0x00000001 +#define DIAH_APPREQUESTED 0x00000002 +#define DIAH_HWAPP 0x00000004 +#define DIAH_HWDEFAULT 0x00000008 +#define DIAH_DEFAULT 0x00000020 +#define DIAH_ERROR 0x80000000 + +typedef struct _DIACTIONFORMATA { + DWORD dwSize; + DWORD dwActionSize; + DWORD dwDataSize; + DWORD dwNumActions; + LPDIACTIONA rgoAction; + GUID guidActionMap; + DWORD dwGenre; + DWORD dwBufferSize; + OPTIONAL LONG lAxisMin; + OPTIONAL LONG lAxisMax; + OPTIONAL HINSTANCE hInstString; + FILETIME ftTimeStamp; + DWORD dwCRC; + CHAR tszActionMap[MAX_PATH]; +} DIACTIONFORMATA, *LPDIACTIONFORMATA; +typedef struct _DIACTIONFORMATW { + DWORD dwSize; + DWORD dwActionSize; + DWORD dwDataSize; + DWORD dwNumActions; + LPDIACTIONW rgoAction; + GUID guidActionMap; + DWORD dwGenre; + DWORD dwBufferSize; + OPTIONAL LONG lAxisMin; + OPTIONAL LONG lAxisMax; + OPTIONAL HINSTANCE hInstString; + FILETIME ftTimeStamp; + DWORD dwCRC; + WCHAR tszActionMap[MAX_PATH]; +} DIACTIONFORMATW, *LPDIACTIONFORMATW; +#ifdef UNICODE +typedef DIACTIONFORMATW DIACTIONFORMAT; +typedef LPDIACTIONFORMATW LPDIACTIONFORMAT; +#else +typedef DIACTIONFORMATA DIACTIONFORMAT; +typedef LPDIACTIONFORMATA LPDIACTIONFORMAT; +#endif // UNICODE +typedef const DIACTIONFORMATA *LPCDIACTIONFORMATA; +typedef const DIACTIONFORMATW *LPCDIACTIONFORMATW; +#ifdef UNICODE +typedef DIACTIONFORMATW DIACTIONFORMAT; +typedef LPCDIACTIONFORMATW LPCDIACTIONFORMAT; +#else +typedef DIACTIONFORMATA DIACTIONFORMAT; +typedef LPCDIACTIONFORMATA LPCDIACTIONFORMAT; +#endif // UNICODE +typedef const DIACTIONFORMAT *LPCDIACTIONFORMAT; + +#define DIAFTS_NEWDEVICELOW 0xFFFFFFFF +#define DIAFTS_NEWDEVICEHIGH 0xFFFFFFFF +#define DIAFTS_UNUSEDDEVICELOW 0x00000000 +#define DIAFTS_UNUSEDDEVICEHIGH 0x00000000 + +#define DIDBAM_DEFAULT 0x00000000 +#define DIDBAM_PRESERVE 0x00000001 +#define DIDBAM_INITIALIZE 0x00000002 +#define DIDBAM_HWDEFAULTS 0x00000004 + +#define DIDSAM_DEFAULT 0x00000000 +#define DIDSAM_NOUSER 0x00000001 +#define DIDSAM_FORCESAVE 0x00000002 + +#define DICD_DEFAULT 0x00000000 +#define DICD_EDIT 0x00000001 + +/* + * The following definition is normally defined in d3dtypes.h + */ +#ifndef D3DCOLOR_DEFINED +typedef DWORD D3DCOLOR; +#define D3DCOLOR_DEFINED +#endif + +typedef struct _DICOLORSET{ + DWORD dwSize; + D3DCOLOR cTextFore; + D3DCOLOR cTextHighlight; + D3DCOLOR cCalloutLine; + D3DCOLOR cCalloutHighlight; + D3DCOLOR cBorder; + D3DCOLOR cControlFill; + D3DCOLOR cHighlightFill; + D3DCOLOR cAreaFill; +} DICOLORSET, *LPDICOLORSET; +typedef const DICOLORSET *LPCDICOLORSET; + + +typedef struct _DICONFIGUREDEVICESPARAMSA{ + DWORD dwSize; + DWORD dwcUsers; + LPSTR lptszUserNames; + DWORD dwcFormats; + LPDIACTIONFORMATA lprgFormats; + HWND hwnd; + DICOLORSET dics; + IUnknown FAR * lpUnkDDSTarget; +} DICONFIGUREDEVICESPARAMSA, *LPDICONFIGUREDEVICESPARAMSA; +typedef struct _DICONFIGUREDEVICESPARAMSW{ + DWORD dwSize; + DWORD dwcUsers; + LPWSTR lptszUserNames; + DWORD dwcFormats; + LPDIACTIONFORMATW lprgFormats; + HWND hwnd; + DICOLORSET dics; + IUnknown FAR * lpUnkDDSTarget; +} DICONFIGUREDEVICESPARAMSW, *LPDICONFIGUREDEVICESPARAMSW; +#ifdef UNICODE +typedef DICONFIGUREDEVICESPARAMSW DICONFIGUREDEVICESPARAMS; +typedef LPDICONFIGUREDEVICESPARAMSW LPDICONFIGUREDEVICESPARAMS; +#else +typedef DICONFIGUREDEVICESPARAMSA DICONFIGUREDEVICESPARAMS; +typedef LPDICONFIGUREDEVICESPARAMSA LPDICONFIGUREDEVICESPARAMS; +#endif // UNICODE +typedef const DICONFIGUREDEVICESPARAMSA *LPCDICONFIGUREDEVICESPARAMSA; +typedef const DICONFIGUREDEVICESPARAMSW *LPCDICONFIGUREDEVICESPARAMSW; +#ifdef UNICODE +typedef DICONFIGUREDEVICESPARAMSW DICONFIGUREDEVICESPARAMS; +typedef LPCDICONFIGUREDEVICESPARAMSW LPCDICONFIGUREDEVICESPARAMS; +#else +typedef DICONFIGUREDEVICESPARAMSA DICONFIGUREDEVICESPARAMS; +typedef LPCDICONFIGUREDEVICESPARAMSA LPCDICONFIGUREDEVICESPARAMS; +#endif // UNICODE +typedef const DICONFIGUREDEVICESPARAMS *LPCDICONFIGUREDEVICESPARAMS; + + +#define DIDIFT_CONFIGURATION 0x00000001 +#define DIDIFT_OVERLAY 0x00000002 + +#define DIDAL_CENTERED 0x00000000 +#define DIDAL_LEFTALIGNED 0x00000001 +#define DIDAL_RIGHTALIGNED 0x00000002 +#define DIDAL_MIDDLE 0x00000000 +#define DIDAL_TOPALIGNED 0x00000004 +#define DIDAL_BOTTOMALIGNED 0x00000008 + +typedef struct _DIDEVICEIMAGEINFOA { + CHAR tszImagePath[MAX_PATH]; + DWORD dwFlags; + // These are valid if DIDIFT_OVERLAY is present in dwFlags. + DWORD dwViewID; + RECT rcOverlay; + DWORD dwObjID; + DWORD dwcValidPts; + POINT rgptCalloutLine[5]; + RECT rcCalloutRect; + DWORD dwTextAlign; +} DIDEVICEIMAGEINFOA, *LPDIDEVICEIMAGEINFOA; +typedef struct _DIDEVICEIMAGEINFOW { + WCHAR tszImagePath[MAX_PATH]; + DWORD dwFlags; + // These are valid if DIDIFT_OVERLAY is present in dwFlags. + DWORD dwViewID; + RECT rcOverlay; + DWORD dwObjID; + DWORD dwcValidPts; + POINT rgptCalloutLine[5]; + RECT rcCalloutRect; + DWORD dwTextAlign; +} DIDEVICEIMAGEINFOW, *LPDIDEVICEIMAGEINFOW; +#ifdef UNICODE +typedef DIDEVICEIMAGEINFOW DIDEVICEIMAGEINFO; +typedef LPDIDEVICEIMAGEINFOW LPDIDEVICEIMAGEINFO; +#else +typedef DIDEVICEIMAGEINFOA DIDEVICEIMAGEINFO; +typedef LPDIDEVICEIMAGEINFOA LPDIDEVICEIMAGEINFO; +#endif // UNICODE +typedef const DIDEVICEIMAGEINFOA *LPCDIDEVICEIMAGEINFOA; +typedef const DIDEVICEIMAGEINFOW *LPCDIDEVICEIMAGEINFOW; +#ifdef UNICODE +typedef DIDEVICEIMAGEINFOW DIDEVICEIMAGEINFO; +typedef LPCDIDEVICEIMAGEINFOW LPCDIDEVICEIMAGEINFO; +#else +typedef DIDEVICEIMAGEINFOA DIDEVICEIMAGEINFO; +typedef LPCDIDEVICEIMAGEINFOA LPCDIDEVICEIMAGEINFO; +#endif // UNICODE +typedef const DIDEVICEIMAGEINFO *LPCDIDEVICEIMAGEINFO; + +typedef struct _DIDEVICEIMAGEINFOHEADERA { + DWORD dwSize; + DWORD dwSizeImageInfo; + DWORD dwcViews; + DWORD dwcButtons; + DWORD dwcAxes; + DWORD dwcPOVs; + DWORD dwBufferSize; + DWORD dwBufferUsed; + LPDIDEVICEIMAGEINFOA lprgImageInfoArray; +} DIDEVICEIMAGEINFOHEADERA, *LPDIDEVICEIMAGEINFOHEADERA; +typedef struct _DIDEVICEIMAGEINFOHEADERW { + DWORD dwSize; + DWORD dwSizeImageInfo; + DWORD dwcViews; + DWORD dwcButtons; + DWORD dwcAxes; + DWORD dwcPOVs; + DWORD dwBufferSize; + DWORD dwBufferUsed; + LPDIDEVICEIMAGEINFOW lprgImageInfoArray; +} DIDEVICEIMAGEINFOHEADERW, *LPDIDEVICEIMAGEINFOHEADERW; +#ifdef UNICODE +typedef DIDEVICEIMAGEINFOHEADERW DIDEVICEIMAGEINFOHEADER; +typedef LPDIDEVICEIMAGEINFOHEADERW LPDIDEVICEIMAGEINFOHEADER; +#else +typedef DIDEVICEIMAGEINFOHEADERA DIDEVICEIMAGEINFOHEADER; +typedef LPDIDEVICEIMAGEINFOHEADERA LPDIDEVICEIMAGEINFOHEADER; +#endif // UNICODE +typedef const DIDEVICEIMAGEINFOHEADERA *LPCDIDEVICEIMAGEINFOHEADERA; +typedef const DIDEVICEIMAGEINFOHEADERW *LPCDIDEVICEIMAGEINFOHEADERW; +#ifdef UNICODE +typedef DIDEVICEIMAGEINFOHEADERW DIDEVICEIMAGEINFOHEADER; +typedef LPCDIDEVICEIMAGEINFOHEADERW LPCDIDEVICEIMAGEINFOHEADER; +#else +typedef DIDEVICEIMAGEINFOHEADERA DIDEVICEIMAGEINFOHEADER; +typedef LPCDIDEVICEIMAGEINFOHEADERA LPCDIDEVICEIMAGEINFOHEADER; +#endif // UNICODE +typedef const DIDEVICEIMAGEINFOHEADER *LPCDIDEVICEIMAGEINFOHEADER; + +#endif /* DIRECTINPUT_VERSION > 0x0700 */ + +#if(DIRECTINPUT_VERSION >= 0x0500) +/* These structures are defined for DirectX 3.0 compatibility */ + +typedef struct DIDEVICEOBJECTINSTANCE_DX3A { + DWORD dwSize; + GUID guidType; + DWORD dwOfs; + DWORD dwType; + DWORD dwFlags; + CHAR tszName[MAX_PATH]; +} DIDEVICEOBJECTINSTANCE_DX3A, *LPDIDEVICEOBJECTINSTANCE_DX3A; +typedef struct DIDEVICEOBJECTINSTANCE_DX3W { + DWORD dwSize; + GUID guidType; + DWORD dwOfs; + DWORD dwType; + DWORD dwFlags; + WCHAR tszName[MAX_PATH]; +} DIDEVICEOBJECTINSTANCE_DX3W, *LPDIDEVICEOBJECTINSTANCE_DX3W; +#ifdef UNICODE +typedef DIDEVICEOBJECTINSTANCE_DX3W DIDEVICEOBJECTINSTANCE_DX3; +typedef LPDIDEVICEOBJECTINSTANCE_DX3W LPDIDEVICEOBJECTINSTANCE_DX3; +#else +typedef DIDEVICEOBJECTINSTANCE_DX3A DIDEVICEOBJECTINSTANCE_DX3; +typedef LPDIDEVICEOBJECTINSTANCE_DX3A LPDIDEVICEOBJECTINSTANCE_DX3; +#endif // UNICODE +typedef const DIDEVICEOBJECTINSTANCE_DX3A *LPCDIDEVICEOBJECTINSTANCE_DX3A; +typedef const DIDEVICEOBJECTINSTANCE_DX3W *LPCDIDEVICEOBJECTINSTANCE_DX3W; +typedef const DIDEVICEOBJECTINSTANCE_DX3 *LPCDIDEVICEOBJECTINSTANCE_DX3; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ + +typedef struct DIDEVICEOBJECTINSTANCEA { + DWORD dwSize; + GUID guidType; + DWORD dwOfs; + DWORD dwType; + DWORD dwFlags; + CHAR tszName[MAX_PATH]; +#if(DIRECTINPUT_VERSION >= 0x0500) + DWORD dwFFMaxForce; + DWORD dwFFForceResolution; + WORD wCollectionNumber; + WORD wDesignatorIndex; + WORD wUsagePage; + WORD wUsage; + DWORD dwDimension; + WORD wExponent; + WORD wReportId; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +} DIDEVICEOBJECTINSTANCEA, *LPDIDEVICEOBJECTINSTANCEA; +typedef struct DIDEVICEOBJECTINSTANCEW { + DWORD dwSize; + GUID guidType; + DWORD dwOfs; + DWORD dwType; + DWORD dwFlags; + WCHAR tszName[MAX_PATH]; +#if(DIRECTINPUT_VERSION >= 0x0500) + DWORD dwFFMaxForce; + DWORD dwFFForceResolution; + WORD wCollectionNumber; + WORD wDesignatorIndex; + WORD wUsagePage; + WORD wUsage; + DWORD dwDimension; + WORD wExponent; + WORD wReportId; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +} DIDEVICEOBJECTINSTANCEW, *LPDIDEVICEOBJECTINSTANCEW; +#ifdef UNICODE +typedef DIDEVICEOBJECTINSTANCEW DIDEVICEOBJECTINSTANCE; +typedef LPDIDEVICEOBJECTINSTANCEW LPDIDEVICEOBJECTINSTANCE; +#else +typedef DIDEVICEOBJECTINSTANCEA DIDEVICEOBJECTINSTANCE; +typedef LPDIDEVICEOBJECTINSTANCEA LPDIDEVICEOBJECTINSTANCE; +#endif // UNICODE +typedef const DIDEVICEOBJECTINSTANCEA *LPCDIDEVICEOBJECTINSTANCEA; +typedef const DIDEVICEOBJECTINSTANCEW *LPCDIDEVICEOBJECTINSTANCEW; +typedef const DIDEVICEOBJECTINSTANCE *LPCDIDEVICEOBJECTINSTANCE; + +typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA, LPVOID); +typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKW)(LPCDIDEVICEOBJECTINSTANCEW, LPVOID); +#ifdef UNICODE +#define LPDIENUMDEVICEOBJECTSCALLBACK LPDIENUMDEVICEOBJECTSCALLBACKW +#else +#define LPDIENUMDEVICEOBJECTSCALLBACK LPDIENUMDEVICEOBJECTSCALLBACKA +#endif // !UNICODE + +#if(DIRECTINPUT_VERSION >= 0x0500) +#define DIDOI_FFACTUATOR 0x00000001 +#define DIDOI_FFEFFECTTRIGGER 0x00000002 +#define DIDOI_POLLED 0x00008000 +#define DIDOI_ASPECTPOSITION 0x00000100 +#define DIDOI_ASPECTVELOCITY 0x00000200 +#define DIDOI_ASPECTACCEL 0x00000300 +#define DIDOI_ASPECTFORCE 0x00000400 +#define DIDOI_ASPECTMASK 0x00000F00 +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +#if(DIRECTINPUT_VERSION >= 0x050a) +#define DIDOI_GUIDISUSAGE 0x00010000 +#endif /* DIRECTINPUT_VERSION >= 0x050a */ + +typedef struct DIPROPHEADER { + DWORD dwSize; + DWORD dwHeaderSize; + DWORD dwObj; + DWORD dwHow; +} DIPROPHEADER, *LPDIPROPHEADER; +typedef const DIPROPHEADER *LPCDIPROPHEADER; + +#define DIPH_DEVICE 0 +#define DIPH_BYOFFSET 1 +#define DIPH_BYID 2 +#if(DIRECTINPUT_VERSION >= 0x050a) +#define DIPH_BYUSAGE 3 +#endif /* DIRECTINPUT_VERSION >= 0x050a */ + +#if(DIRECTINPUT_VERSION >= 0x050a) +#define DIMAKEUSAGEDWORD(UsagePage, Usage) \ + (DWORD)MAKELONG(Usage, UsagePage) +#endif /* DIRECTINPUT_VERSION >= 0x050a */ + +typedef struct DIPROPDWORD { + DIPROPHEADER diph; + DWORD dwData; +} DIPROPDWORD, *LPDIPROPDWORD; +typedef const DIPROPDWORD *LPCDIPROPDWORD; + +#if(DIRECTINPUT_VERSION >= 0x0800) +typedef struct DIPROPPOINTER { + DIPROPHEADER diph; + UINT_PTR uData; +} DIPROPPOINTER, *LPDIPROPPOINTER; +typedef const DIPROPPOINTER *LPCDIPROPPOINTER; +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ + +typedef struct DIPROPRANGE { + DIPROPHEADER diph; + LONG lMin; + LONG lMax; +} DIPROPRANGE, *LPDIPROPRANGE; +typedef const DIPROPRANGE *LPCDIPROPRANGE; + +#define DIPROPRANGE_NOMIN ((LONG)0x80000000) +#define DIPROPRANGE_NOMAX ((LONG)0x7FFFFFFF) + +#if(DIRECTINPUT_VERSION >= 0x050a) +typedef struct DIPROPCAL { + DIPROPHEADER diph; + LONG lMin; + LONG lCenter; + LONG lMax; +} DIPROPCAL, *LPDIPROPCAL; +typedef const DIPROPCAL *LPCDIPROPCAL; + +typedef struct DIPROPCALPOV { + DIPROPHEADER diph; + LONG lMin[5]; + LONG lMax[5]; +} DIPROPCALPOV, *LPDIPROPCALPOV; +typedef const DIPROPCALPOV *LPCDIPROPCALPOV; + +typedef struct DIPROPGUIDANDPATH { + DIPROPHEADER diph; + GUID guidClass; + WCHAR wszPath[MAX_PATH]; +} DIPROPGUIDANDPATH, *LPDIPROPGUIDANDPATH; +typedef const DIPROPGUIDANDPATH *LPCDIPROPGUIDANDPATH; + +typedef struct DIPROPSTRING { + DIPROPHEADER diph; + WCHAR wsz[MAX_PATH]; +} DIPROPSTRING, *LPDIPROPSTRING; +typedef const DIPROPSTRING *LPCDIPROPSTRING; + +#endif /* DIRECTINPUT_VERSION >= 0x050a */ + +#if(DIRECTINPUT_VERSION >= 0x0800) +#define MAXCPOINTSNUM 8 + +typedef struct _CPOINT +{ + LONG lP; // raw value + DWORD dwLog; // logical_value / max_logical_value * 10000 +} CPOINT, *PCPOINT; + +typedef struct DIPROPCPOINTS { + DIPROPHEADER diph; + DWORD dwCPointsNum; + CPOINT cp[MAXCPOINTSNUM]; +} DIPROPCPOINTS, *LPDIPROPCPOINTS; +typedef const DIPROPCPOINTS *LPCDIPROPCPOINTS; +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ + + +#ifdef __cplusplus +#define MAKEDIPROP(prop) (*(const GUID *)(prop)) +#else +#define MAKEDIPROP(prop) ((REFGUID)(prop)) +#endif + +#define DIPROP_BUFFERSIZE MAKEDIPROP(1) + +#define DIPROP_AXISMODE MAKEDIPROP(2) + +#define DIPROPAXISMODE_ABS 0 +#define DIPROPAXISMODE_REL 1 + +#define DIPROP_GRANULARITY MAKEDIPROP(3) + +#define DIPROP_RANGE MAKEDIPROP(4) + +#define DIPROP_DEADZONE MAKEDIPROP(5) + +#define DIPROP_SATURATION MAKEDIPROP(6) + +#define DIPROP_FFGAIN MAKEDIPROP(7) + +#define DIPROP_FFLOAD MAKEDIPROP(8) + +#define DIPROP_AUTOCENTER MAKEDIPROP(9) + +#define DIPROPAUTOCENTER_OFF 0 +#define DIPROPAUTOCENTER_ON 1 + +#define DIPROP_CALIBRATIONMODE MAKEDIPROP(10) + +#define DIPROPCALIBRATIONMODE_COOKED 0 +#define DIPROPCALIBRATIONMODE_RAW 1 + +#if(DIRECTINPUT_VERSION >= 0x050a) +#define DIPROP_CALIBRATION MAKEDIPROP(11) + +#define DIPROP_GUIDANDPATH MAKEDIPROP(12) + +#define DIPROP_INSTANCENAME MAKEDIPROP(13) + +#define DIPROP_PRODUCTNAME MAKEDIPROP(14) +#endif /* DIRECTINPUT_VERSION >= 0x050a */ + +#if(DIRECTINPUT_VERSION >= 0x05b2) +#define DIPROP_JOYSTICKID MAKEDIPROP(15) + +#define DIPROP_GETPORTDISPLAYNAME MAKEDIPROP(16) + +#endif /* DIRECTINPUT_VERSION >= 0x05b2 */ + +#if(DIRECTINPUT_VERSION >= 0x0700) +#define DIPROP_PHYSICALRANGE MAKEDIPROP(18) + +#define DIPROP_LOGICALRANGE MAKEDIPROP(19) +#endif /* DIRECTINPUT_VERSION >= 0x0700 */ + +#if(DIRECTINPUT_VERSION >= 0x0800) +#define DIPROP_KEYNAME MAKEDIPROP(20) + +#define DIPROP_CPOINTS MAKEDIPROP(21) + +#define DIPROP_APPDATA MAKEDIPROP(22) + +#define DIPROP_SCANCODE MAKEDIPROP(23) + +#define DIPROP_VIDPID MAKEDIPROP(24) + +#define DIPROP_USERNAME MAKEDIPROP(25) + +#define DIPROP_TYPENAME MAKEDIPROP(26) +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ + + +typedef struct DIDEVICEOBJECTDATA_DX3 { + DWORD dwOfs; + DWORD dwData; + DWORD dwTimeStamp; + DWORD dwSequence; +} DIDEVICEOBJECTDATA_DX3, *LPDIDEVICEOBJECTDATA_DX3; +typedef const DIDEVICEOBJECTDATA_DX3 *LPCDIDEVICEOBJECTDATA_DX; + +typedef struct DIDEVICEOBJECTDATA { + DWORD dwOfs; + DWORD dwData; + DWORD dwTimeStamp; + DWORD dwSequence; +#if(DIRECTINPUT_VERSION >= 0x0800) + UINT_PTR uAppData; +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ +} DIDEVICEOBJECTDATA, *LPDIDEVICEOBJECTDATA; +typedef const DIDEVICEOBJECTDATA *LPCDIDEVICEOBJECTDATA; + +#define DIGDD_PEEK 0x00000001 + +#define DISEQUENCE_COMPARE(dwSequence1, cmp, dwSequence2) \ + ((int)((dwSequence1) - (dwSequence2)) cmp 0) +#define DISCL_EXCLUSIVE 0x00000001 +#define DISCL_NONEXCLUSIVE 0x00000002 +#define DISCL_FOREGROUND 0x00000004 +#define DISCL_BACKGROUND 0x00000008 +#define DISCL_NOWINKEY 0x00000010 + +#if(DIRECTINPUT_VERSION >= 0x0500) +/* These structures are defined for DirectX 3.0 compatibility */ + +typedef struct DIDEVICEINSTANCE_DX3A { + DWORD dwSize; + GUID guidInstance; + GUID guidProduct; + DWORD dwDevType; + CHAR tszInstanceName[MAX_PATH]; + CHAR tszProductName[MAX_PATH]; +} DIDEVICEINSTANCE_DX3A, *LPDIDEVICEINSTANCE_DX3A; +typedef struct DIDEVICEINSTANCE_DX3W { + DWORD dwSize; + GUID guidInstance; + GUID guidProduct; + DWORD dwDevType; + WCHAR tszInstanceName[MAX_PATH]; + WCHAR tszProductName[MAX_PATH]; +} DIDEVICEINSTANCE_DX3W, *LPDIDEVICEINSTANCE_DX3W; +#ifdef UNICODE +typedef DIDEVICEINSTANCE_DX3W DIDEVICEINSTANCE_DX3; +typedef LPDIDEVICEINSTANCE_DX3W LPDIDEVICEINSTANCE_DX3; +#else +typedef DIDEVICEINSTANCE_DX3A DIDEVICEINSTANCE_DX3; +typedef LPDIDEVICEINSTANCE_DX3A LPDIDEVICEINSTANCE_DX3; +#endif // UNICODE +typedef const DIDEVICEINSTANCE_DX3A *LPCDIDEVICEINSTANCE_DX3A; +typedef const DIDEVICEINSTANCE_DX3W *LPCDIDEVICEINSTANCE_DX3W; +typedef const DIDEVICEINSTANCE_DX3 *LPCDIDEVICEINSTANCE_DX3; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ + +typedef struct DIDEVICEINSTANCEA { + DWORD dwSize; + GUID guidInstance; + GUID guidProduct; + DWORD dwDevType; + CHAR tszInstanceName[MAX_PATH]; + CHAR tszProductName[MAX_PATH]; +#if(DIRECTINPUT_VERSION >= 0x0500) + GUID guidFFDriver; + WORD wUsagePage; + WORD wUsage; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +} DIDEVICEINSTANCEA, *LPDIDEVICEINSTANCEA; +typedef struct DIDEVICEINSTANCEW { + DWORD dwSize; + GUID guidInstance; + GUID guidProduct; + DWORD dwDevType; + WCHAR tszInstanceName[MAX_PATH]; + WCHAR tszProductName[MAX_PATH]; +#if(DIRECTINPUT_VERSION >= 0x0500) + GUID guidFFDriver; + WORD wUsagePage; + WORD wUsage; +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +} DIDEVICEINSTANCEW, *LPDIDEVICEINSTANCEW; +#ifdef UNICODE +typedef DIDEVICEINSTANCEW DIDEVICEINSTANCE; +typedef LPDIDEVICEINSTANCEW LPDIDEVICEINSTANCE; +#else +typedef DIDEVICEINSTANCEA DIDEVICEINSTANCE; +typedef LPDIDEVICEINSTANCEA LPDIDEVICEINSTANCE; +#endif // UNICODE + +typedef const DIDEVICEINSTANCEA *LPCDIDEVICEINSTANCEA; +typedef const DIDEVICEINSTANCEW *LPCDIDEVICEINSTANCEW; +#ifdef UNICODE +typedef DIDEVICEINSTANCEW DIDEVICEINSTANCE; +typedef LPCDIDEVICEINSTANCEW LPCDIDEVICEINSTANCE; +#else +typedef DIDEVICEINSTANCEA DIDEVICEINSTANCE; +typedef LPCDIDEVICEINSTANCEA LPCDIDEVICEINSTANCE; +#endif // UNICODE +typedef const DIDEVICEINSTANCE *LPCDIDEVICEINSTANCE; + +#undef INTERFACE +#define INTERFACE IDirectInputDeviceW + +DECLARE_INTERFACE_(IDirectInputDeviceW, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputDeviceW methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW,DWORD,DWORD) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE; +}; + +typedef struct IDirectInputDeviceW *LPDIRECTINPUTDEVICEW; + +#undef INTERFACE +#define INTERFACE IDirectInputDeviceA + +DECLARE_INTERFACE_(IDirectInputDeviceA, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputDeviceA methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA,DWORD,DWORD) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE; +}; + +typedef struct IDirectInputDeviceA *LPDIRECTINPUTDEVICEA; + +#ifdef UNICODE +#define IID_IDirectInputDevice IID_IDirectInputDeviceW +#define IDirectInputDevice IDirectInputDeviceW +#define IDirectInputDeviceVtbl IDirectInputDeviceWVtbl +#else +#define IID_IDirectInputDevice IID_IDirectInputDeviceA +#define IDirectInputDevice IDirectInputDeviceA +#define IDirectInputDeviceVtbl IDirectInputDeviceAVtbl +#endif +typedef struct IDirectInputDevice *LPDIRECTINPUTDEVICE; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectInputDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputDevice_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputDevice_Release(p) (p)->lpVtbl->Release(p) +#define IDirectInputDevice_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a) +#define IDirectInputDevice_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) +#define IDirectInputDevice_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b) +#define IDirectInputDevice_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b) +#define IDirectInputDevice_Acquire(p) (p)->lpVtbl->Acquire(p) +#define IDirectInputDevice_Unacquire(p) (p)->lpVtbl->Unacquire(p) +#define IDirectInputDevice_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b) +#define IDirectInputDevice_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d) +#define IDirectInputDevice_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a) +#define IDirectInputDevice_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a) +#define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) +#define IDirectInputDevice_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c) +#define IDirectInputDevice_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a) +#define IDirectInputDevice_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInputDevice_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) +#else +#define IDirectInputDevice_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInputDevice_AddRef(p) (p)->AddRef() +#define IDirectInputDevice_Release(p) (p)->Release() +#define IDirectInputDevice_GetCapabilities(p,a) (p)->GetCapabilities(a) +#define IDirectInputDevice_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c) +#define IDirectInputDevice_GetProperty(p,a,b) (p)->GetProperty(a,b) +#define IDirectInputDevice_SetProperty(p,a,b) (p)->SetProperty(a,b) +#define IDirectInputDevice_Acquire(p) (p)->Acquire() +#define IDirectInputDevice_Unacquire(p) (p)->Unacquire() +#define IDirectInputDevice_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b) +#define IDirectInputDevice_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d) +#define IDirectInputDevice_SetDataFormat(p,a) (p)->SetDataFormat(a) +#define IDirectInputDevice_SetEventNotification(p,a) (p)->SetEventNotification(a) +#define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) +#define IDirectInputDevice_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c) +#define IDirectInputDevice_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a) +#define IDirectInputDevice_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInputDevice_Initialize(p,a,b,c) (p)->Initialize(a,b,c) +#endif + +#endif /* DIJ_RINGZERO */ + + +#if(DIRECTINPUT_VERSION >= 0x0500) + +#define DISFFC_RESET 0x00000001 +#define DISFFC_STOPALL 0x00000002 +#define DISFFC_PAUSE 0x00000004 +#define DISFFC_CONTINUE 0x00000008 +#define DISFFC_SETACTUATORSON 0x00000010 +#define DISFFC_SETACTUATORSOFF 0x00000020 + +#define DIGFFS_EMPTY 0x00000001 +#define DIGFFS_STOPPED 0x00000002 +#define DIGFFS_PAUSED 0x00000004 +#define DIGFFS_ACTUATORSON 0x00000010 +#define DIGFFS_ACTUATORSOFF 0x00000020 +#define DIGFFS_POWERON 0x00000040 +#define DIGFFS_POWEROFF 0x00000080 +#define DIGFFS_SAFETYSWITCHON 0x00000100 +#define DIGFFS_SAFETYSWITCHOFF 0x00000200 +#define DIGFFS_USERFFSWITCHON 0x00000400 +#define DIGFFS_USERFFSWITCHOFF 0x00000800 +#define DIGFFS_DEVICELOST 0x80000000 + +#ifndef DIJ_RINGZERO + +typedef struct DIEFFECTINFOA { + DWORD dwSize; + GUID guid; + DWORD dwEffType; + DWORD dwStaticParams; + DWORD dwDynamicParams; + CHAR tszName[MAX_PATH]; +} DIEFFECTINFOA, *LPDIEFFECTINFOA; +typedef struct DIEFFECTINFOW { + DWORD dwSize; + GUID guid; + DWORD dwEffType; + DWORD dwStaticParams; + DWORD dwDynamicParams; + WCHAR tszName[MAX_PATH]; +} DIEFFECTINFOW, *LPDIEFFECTINFOW; +#ifdef UNICODE +typedef DIEFFECTINFOW DIEFFECTINFO; +typedef LPDIEFFECTINFOW LPDIEFFECTINFO; +#else +typedef DIEFFECTINFOA DIEFFECTINFO; +typedef LPDIEFFECTINFOA LPDIEFFECTINFO; +#endif // UNICODE +typedef const DIEFFECTINFOA *LPCDIEFFECTINFOA; +typedef const DIEFFECTINFOW *LPCDIEFFECTINFOW; +typedef const DIEFFECTINFO *LPCDIEFFECTINFO; + +#define DISDD_CONTINUE 0x00000001 + +typedef BOOL (FAR PASCAL * LPDIENUMEFFECTSCALLBACKA)(LPCDIEFFECTINFOA, LPVOID); +typedef BOOL (FAR PASCAL * LPDIENUMEFFECTSCALLBACKW)(LPCDIEFFECTINFOW, LPVOID); +#ifdef UNICODE +#define LPDIENUMEFFECTSCALLBACK LPDIENUMEFFECTSCALLBACKW +#else +#define LPDIENUMEFFECTSCALLBACK LPDIENUMEFFECTSCALLBACKA +#endif // !UNICODE +typedef BOOL (FAR PASCAL * LPDIENUMCREATEDEFFECTOBJECTSCALLBACK)(LPDIRECTINPUTEFFECT, LPVOID); + +#undef INTERFACE +#define INTERFACE IDirectInputDevice2W + +DECLARE_INTERFACE_(IDirectInputDevice2W, IDirectInputDeviceW) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputDeviceW methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW,DWORD,DWORD) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE; + + /*** IDirectInputDevice2W methods ***/ + STDMETHOD(CreateEffect)(THIS_ REFGUID,LPCDIEFFECT,LPDIRECTINPUTEFFECT *,LPUNKNOWN) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW,REFGUID) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK,LPVOID,DWORD) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD,LPCDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; +}; + +typedef struct IDirectInputDevice2W *LPDIRECTINPUTDEVICE2W; + +#undef INTERFACE +#define INTERFACE IDirectInputDevice2A + +DECLARE_INTERFACE_(IDirectInputDevice2A, IDirectInputDeviceA) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputDeviceA methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA,DWORD,DWORD) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE; + + /*** IDirectInputDevice2A methods ***/ + STDMETHOD(CreateEffect)(THIS_ REFGUID,LPCDIEFFECT,LPDIRECTINPUTEFFECT *,LPUNKNOWN) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA,REFGUID) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK,LPVOID,DWORD) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD,LPCDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; +}; + +typedef struct IDirectInputDevice2A *LPDIRECTINPUTDEVICE2A; + +#ifdef UNICODE +#define IID_IDirectInputDevice2 IID_IDirectInputDevice2W +#define IDirectInputDevice2 IDirectInputDevice2W +#define IDirectInputDevice2Vtbl IDirectInputDevice2WVtbl +#else +#define IID_IDirectInputDevice2 IID_IDirectInputDevice2A +#define IDirectInputDevice2 IDirectInputDevice2A +#define IDirectInputDevice2Vtbl IDirectInputDevice2AVtbl +#endif +typedef struct IDirectInputDevice2 *LPDIRECTINPUTDEVICE2; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectInputDevice2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputDevice2_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputDevice2_Release(p) (p)->lpVtbl->Release(p) +#define IDirectInputDevice2_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a) +#define IDirectInputDevice2_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) +#define IDirectInputDevice2_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b) +#define IDirectInputDevice2_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b) +#define IDirectInputDevice2_Acquire(p) (p)->lpVtbl->Acquire(p) +#define IDirectInputDevice2_Unacquire(p) (p)->lpVtbl->Unacquire(p) +#define IDirectInputDevice2_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b) +#define IDirectInputDevice2_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d) +#define IDirectInputDevice2_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a) +#define IDirectInputDevice2_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a) +#define IDirectInputDevice2_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) +#define IDirectInputDevice2_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c) +#define IDirectInputDevice2_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a) +#define IDirectInputDevice2_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInputDevice2_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) +#define IDirectInputDevice2_CreateEffect(p,a,b,c,d) (p)->lpVtbl->CreateEffect(p,a,b,c,d) +#define IDirectInputDevice2_EnumEffects(p,a,b,c) (p)->lpVtbl->EnumEffects(p,a,b,c) +#define IDirectInputDevice2_GetEffectInfo(p,a,b) (p)->lpVtbl->GetEffectInfo(p,a,b) +#define IDirectInputDevice2_GetForceFeedbackState(p,a) (p)->lpVtbl->GetForceFeedbackState(p,a) +#define IDirectInputDevice2_SendForceFeedbackCommand(p,a) (p)->lpVtbl->SendForceFeedbackCommand(p,a) +#define IDirectInputDevice2_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c) +#define IDirectInputDevice2_Escape(p,a) (p)->lpVtbl->Escape(p,a) +#define IDirectInputDevice2_Poll(p) (p)->lpVtbl->Poll(p) +#define IDirectInputDevice2_SendDeviceData(p,a,b,c,d) (p)->lpVtbl->SendDeviceData(p,a,b,c,d) +#else +#define IDirectInputDevice2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInputDevice2_AddRef(p) (p)->AddRef() +#define IDirectInputDevice2_Release(p) (p)->Release() +#define IDirectInputDevice2_GetCapabilities(p,a) (p)->GetCapabilities(a) +#define IDirectInputDevice2_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c) +#define IDirectInputDevice2_GetProperty(p,a,b) (p)->GetProperty(a,b) +#define IDirectInputDevice2_SetProperty(p,a,b) (p)->SetProperty(a,b) +#define IDirectInputDevice2_Acquire(p) (p)->Acquire() +#define IDirectInputDevice2_Unacquire(p) (p)->Unacquire() +#define IDirectInputDevice2_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b) +#define IDirectInputDevice2_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d) +#define IDirectInputDevice2_SetDataFormat(p,a) (p)->SetDataFormat(a) +#define IDirectInputDevice2_SetEventNotification(p,a) (p)->SetEventNotification(a) +#define IDirectInputDevice2_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) +#define IDirectInputDevice2_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c) +#define IDirectInputDevice2_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a) +#define IDirectInputDevice2_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInputDevice2_Initialize(p,a,b,c) (p)->Initialize(a,b,c) +#define IDirectInputDevice2_CreateEffect(p,a,b,c,d) (p)->CreateEffect(a,b,c,d) +#define IDirectInputDevice2_EnumEffects(p,a,b,c) (p)->EnumEffects(a,b,c) +#define IDirectInputDevice2_GetEffectInfo(p,a,b) (p)->GetEffectInfo(a,b) +#define IDirectInputDevice2_GetForceFeedbackState(p,a) (p)->GetForceFeedbackState(a) +#define IDirectInputDevice2_SendForceFeedbackCommand(p,a) (p)->SendForceFeedbackCommand(a) +#define IDirectInputDevice2_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c) +#define IDirectInputDevice2_Escape(p,a) (p)->Escape(a) +#define IDirectInputDevice2_Poll(p) (p)->Poll() +#define IDirectInputDevice2_SendDeviceData(p,a,b,c,d) (p)->SendDeviceData(a,b,c,d) +#endif + +#endif /* DIJ_RINGZERO */ + +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ + +#if(DIRECTINPUT_VERSION >= 0x0700) +#define DIFEF_DEFAULT 0x00000000 +#define DIFEF_INCLUDENONSTANDARD 0x00000001 +#define DIFEF_MODIFYIFNEEDED 0x00000010 + +#ifndef DIJ_RINGZERO + +#undef INTERFACE +#define INTERFACE IDirectInputDevice7W + +DECLARE_INTERFACE_(IDirectInputDevice7W, IDirectInputDevice2W) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputDevice2W methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW,DWORD,DWORD) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE; + STDMETHOD(CreateEffect)(THIS_ REFGUID,LPCDIEFFECT,LPDIRECTINPUTEFFECT *,LPUNKNOWN) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW,REFGUID) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK,LPVOID,DWORD) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD,LPCDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + + /*** IDirectInputDevice7W methods ***/ + STDMETHOD(EnumEffectsInFile)(THIS_ LPCWSTR,LPDIENUMEFFECTSINFILECALLBACK,LPVOID,DWORD) PURE; + STDMETHOD(WriteEffectToFile)(THIS_ LPCWSTR,DWORD,LPDIFILEEFFECT,DWORD) PURE; +}; + +typedef struct IDirectInputDevice7W *LPDIRECTINPUTDEVICE7W; + +#undef INTERFACE +#define INTERFACE IDirectInputDevice7A + +DECLARE_INTERFACE_(IDirectInputDevice7A, IDirectInputDevice2A) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputDevice2A methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA,DWORD,DWORD) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE; + STDMETHOD(CreateEffect)(THIS_ REFGUID,LPCDIEFFECT,LPDIRECTINPUTEFFECT *,LPUNKNOWN) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA,REFGUID) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK,LPVOID,DWORD) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD,LPCDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + + /*** IDirectInputDevice7A methods ***/ + STDMETHOD(EnumEffectsInFile)(THIS_ LPCSTR,LPDIENUMEFFECTSINFILECALLBACK,LPVOID,DWORD) PURE; + STDMETHOD(WriteEffectToFile)(THIS_ LPCSTR,DWORD,LPDIFILEEFFECT,DWORD) PURE; +}; + +typedef struct IDirectInputDevice7A *LPDIRECTINPUTDEVICE7A; + +#ifdef UNICODE +#define IID_IDirectInputDevice7 IID_IDirectInputDevice7W +#define IDirectInputDevice7 IDirectInputDevice7W +#define IDirectInputDevice7Vtbl IDirectInputDevice7WVtbl +#else +#define IID_IDirectInputDevice7 IID_IDirectInputDevice7A +#define IDirectInputDevice7 IDirectInputDevice7A +#define IDirectInputDevice7Vtbl IDirectInputDevice7AVtbl +#endif +typedef struct IDirectInputDevice7 *LPDIRECTINPUTDEVICE7; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectInputDevice7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputDevice7_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputDevice7_Release(p) (p)->lpVtbl->Release(p) +#define IDirectInputDevice7_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a) +#define IDirectInputDevice7_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) +#define IDirectInputDevice7_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b) +#define IDirectInputDevice7_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b) +#define IDirectInputDevice7_Acquire(p) (p)->lpVtbl->Acquire(p) +#define IDirectInputDevice7_Unacquire(p) (p)->lpVtbl->Unacquire(p) +#define IDirectInputDevice7_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b) +#define IDirectInputDevice7_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d) +#define IDirectInputDevice7_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a) +#define IDirectInputDevice7_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a) +#define IDirectInputDevice7_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) +#define IDirectInputDevice7_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c) +#define IDirectInputDevice7_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a) +#define IDirectInputDevice7_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInputDevice7_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) +#define IDirectInputDevice7_CreateEffect(p,a,b,c,d) (p)->lpVtbl->CreateEffect(p,a,b,c,d) +#define IDirectInputDevice7_EnumEffects(p,a,b,c) (p)->lpVtbl->EnumEffects(p,a,b,c) +#define IDirectInputDevice7_GetEffectInfo(p,a,b) (p)->lpVtbl->GetEffectInfo(p,a,b) +#define IDirectInputDevice7_GetForceFeedbackState(p,a) (p)->lpVtbl->GetForceFeedbackState(p,a) +#define IDirectInputDevice7_SendForceFeedbackCommand(p,a) (p)->lpVtbl->SendForceFeedbackCommand(p,a) +#define IDirectInputDevice7_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c) +#define IDirectInputDevice7_Escape(p,a) (p)->lpVtbl->Escape(p,a) +#define IDirectInputDevice7_Poll(p) (p)->lpVtbl->Poll(p) +#define IDirectInputDevice7_SendDeviceData(p,a,b,c,d) (p)->lpVtbl->SendDeviceData(p,a,b,c,d) +#define IDirectInputDevice7_EnumEffectsInFile(p,a,b,c,d) (p)->lpVtbl->EnumEffectsInFile(p,a,b,c,d) +#define IDirectInputDevice7_WriteEffectToFile(p,a,b,c,d) (p)->lpVtbl->WriteEffectToFile(p,a,b,c,d) +#else +#define IDirectInputDevice7_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInputDevice7_AddRef(p) (p)->AddRef() +#define IDirectInputDevice7_Release(p) (p)->Release() +#define IDirectInputDevice7_GetCapabilities(p,a) (p)->GetCapabilities(a) +#define IDirectInputDevice7_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c) +#define IDirectInputDevice7_GetProperty(p,a,b) (p)->GetProperty(a,b) +#define IDirectInputDevice7_SetProperty(p,a,b) (p)->SetProperty(a,b) +#define IDirectInputDevice7_Acquire(p) (p)->Acquire() +#define IDirectInputDevice7_Unacquire(p) (p)->Unacquire() +#define IDirectInputDevice7_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b) +#define IDirectInputDevice7_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d) +#define IDirectInputDevice7_SetDataFormat(p,a) (p)->SetDataFormat(a) +#define IDirectInputDevice7_SetEventNotification(p,a) (p)->SetEventNotification(a) +#define IDirectInputDevice7_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) +#define IDirectInputDevice7_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c) +#define IDirectInputDevice7_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a) +#define IDirectInputDevice7_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInputDevice7_Initialize(p,a,b,c) (p)->Initialize(a,b,c) +#define IDirectInputDevice7_CreateEffect(p,a,b,c,d) (p)->CreateEffect(a,b,c,d) +#define IDirectInputDevice7_EnumEffects(p,a,b,c) (p)->EnumEffects(a,b,c) +#define IDirectInputDevice7_GetEffectInfo(p,a,b) (p)->GetEffectInfo(a,b) +#define IDirectInputDevice7_GetForceFeedbackState(p,a) (p)->GetForceFeedbackState(a) +#define IDirectInputDevice7_SendForceFeedbackCommand(p,a) (p)->SendForceFeedbackCommand(a) +#define IDirectInputDevice7_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c) +#define IDirectInputDevice7_Escape(p,a) (p)->Escape(a) +#define IDirectInputDevice7_Poll(p) (p)->Poll() +#define IDirectInputDevice7_SendDeviceData(p,a,b,c,d) (p)->SendDeviceData(a,b,c,d) +#define IDirectInputDevice7_EnumEffectsInFile(p,a,b,c,d) (p)->EnumEffectsInFile(a,b,c,d) +#define IDirectInputDevice7_WriteEffectToFile(p,a,b,c,d) (p)->WriteEffectToFile(a,b,c,d) +#endif + +#endif /* DIJ_RINGZERO */ + +#endif /* DIRECTINPUT_VERSION >= 0x0700 */ + +#if(DIRECTINPUT_VERSION >= 0x0800) + +#ifndef DIJ_RINGZERO + +#undef INTERFACE +#define INTERFACE IDirectInputDevice8W + +DECLARE_INTERFACE_(IDirectInputDevice8W, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputDevice8W methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW,DWORD,DWORD) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE; + STDMETHOD(CreateEffect)(THIS_ REFGUID,LPCDIEFFECT,LPDIRECTINPUTEFFECT *,LPUNKNOWN) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW,REFGUID) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK,LPVOID,DWORD) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD,LPCDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + STDMETHOD(EnumEffectsInFile)(THIS_ LPCWSTR,LPDIENUMEFFECTSINFILECALLBACK,LPVOID,DWORD) PURE; + STDMETHOD(WriteEffectToFile)(THIS_ LPCWSTR,DWORD,LPDIFILEEFFECT,DWORD) PURE; + STDMETHOD(BuildActionMap)(THIS_ LPDIACTIONFORMATW,LPCWSTR,DWORD) PURE; + STDMETHOD(SetActionMap)(THIS_ LPDIACTIONFORMATW,LPCWSTR,DWORD) PURE; + STDMETHOD(GetImageInfo)(THIS_ LPDIDEVICEIMAGEINFOHEADERW) PURE; +}; + +typedef struct IDirectInputDevice8W *LPDIRECTINPUTDEVICE8W; + +#undef INTERFACE +#define INTERFACE IDirectInputDevice8A + +DECLARE_INTERFACE_(IDirectInputDevice8A, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputDevice8A methods ***/ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE; + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE; + STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE; + STDMETHOD(Acquire)(THIS) PURE; + STDMETHOD(Unacquire)(THIS) PURE; + STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE; + STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE; + STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA,DWORD,DWORD) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE; + STDMETHOD(CreateEffect)(THIS_ REFGUID,LPCDIEFFECT,LPDIRECTINPUTEFFECT *,LPUNKNOWN) PURE; + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA,REFGUID) PURE; + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD) PURE; + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD) PURE; + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK,LPVOID,DWORD) PURE; + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE; + STDMETHOD(Poll)(THIS) PURE; + STDMETHOD(SendDeviceData)(THIS_ DWORD,LPCDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE; + STDMETHOD(EnumEffectsInFile)(THIS_ LPCSTR,LPDIENUMEFFECTSINFILECALLBACK,LPVOID,DWORD) PURE; + STDMETHOD(WriteEffectToFile)(THIS_ LPCSTR,DWORD,LPDIFILEEFFECT,DWORD) PURE; + STDMETHOD(BuildActionMap)(THIS_ LPDIACTIONFORMATA,LPCSTR,DWORD) PURE; + STDMETHOD(SetActionMap)(THIS_ LPDIACTIONFORMATA,LPCSTR,DWORD) PURE; + STDMETHOD(GetImageInfo)(THIS_ LPDIDEVICEIMAGEINFOHEADERA) PURE; +}; + +typedef struct IDirectInputDevice8A *LPDIRECTINPUTDEVICE8A; + +#ifdef UNICODE +#define IID_IDirectInputDevice8 IID_IDirectInputDevice8W +#define IDirectInputDevice8 IDirectInputDevice8W +#define IDirectInputDevice8Vtbl IDirectInputDevice8WVtbl +#else +#define IID_IDirectInputDevice8 IID_IDirectInputDevice8A +#define IDirectInputDevice8 IDirectInputDevice8A +#define IDirectInputDevice8Vtbl IDirectInputDevice8AVtbl +#endif +typedef struct IDirectInputDevice8 *LPDIRECTINPUTDEVICE8; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectInputDevice8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputDevice8_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputDevice8_Release(p) (p)->lpVtbl->Release(p) +#define IDirectInputDevice8_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a) +#define IDirectInputDevice8_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) +#define IDirectInputDevice8_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b) +#define IDirectInputDevice8_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b) +#define IDirectInputDevice8_Acquire(p) (p)->lpVtbl->Acquire(p) +#define IDirectInputDevice8_Unacquire(p) (p)->lpVtbl->Unacquire(p) +#define IDirectInputDevice8_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b) +#define IDirectInputDevice8_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d) +#define IDirectInputDevice8_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a) +#define IDirectInputDevice8_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a) +#define IDirectInputDevice8_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) +#define IDirectInputDevice8_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c) +#define IDirectInputDevice8_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a) +#define IDirectInputDevice8_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInputDevice8_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) +#define IDirectInputDevice8_CreateEffect(p,a,b,c,d) (p)->lpVtbl->CreateEffect(p,a,b,c,d) +#define IDirectInputDevice8_EnumEffects(p,a,b,c) (p)->lpVtbl->EnumEffects(p,a,b,c) +#define IDirectInputDevice8_GetEffectInfo(p,a,b) (p)->lpVtbl->GetEffectInfo(p,a,b) +#define IDirectInputDevice8_GetForceFeedbackState(p,a) (p)->lpVtbl->GetForceFeedbackState(p,a) +#define IDirectInputDevice8_SendForceFeedbackCommand(p,a) (p)->lpVtbl->SendForceFeedbackCommand(p,a) +#define IDirectInputDevice8_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c) +#define IDirectInputDevice8_Escape(p,a) (p)->lpVtbl->Escape(p,a) +#define IDirectInputDevice8_Poll(p) (p)->lpVtbl->Poll(p) +#define IDirectInputDevice8_SendDeviceData(p,a,b,c,d) (p)->lpVtbl->SendDeviceData(p,a,b,c,d) +#define IDirectInputDevice8_EnumEffectsInFile(p,a,b,c,d) (p)->lpVtbl->EnumEffectsInFile(p,a,b,c,d) +#define IDirectInputDevice8_WriteEffectToFile(p,a,b,c,d) (p)->lpVtbl->WriteEffectToFile(p,a,b,c,d) +#define IDirectInputDevice8_BuildActionMap(p,a,b,c) (p)->lpVtbl->BuildActionMap(p,a,b,c) +#define IDirectInputDevice8_SetActionMap(p,a,b,c) (p)->lpVtbl->SetActionMap(p,a,b,c) +#define IDirectInputDevice8_GetImageInfo(p,a) (p)->lpVtbl->GetImageInfo(p,a) +#else +#define IDirectInputDevice8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInputDevice8_AddRef(p) (p)->AddRef() +#define IDirectInputDevice8_Release(p) (p)->Release() +#define IDirectInputDevice8_GetCapabilities(p,a) (p)->GetCapabilities(a) +#define IDirectInputDevice8_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c) +#define IDirectInputDevice8_GetProperty(p,a,b) (p)->GetProperty(a,b) +#define IDirectInputDevice8_SetProperty(p,a,b) (p)->SetProperty(a,b) +#define IDirectInputDevice8_Acquire(p) (p)->Acquire() +#define IDirectInputDevice8_Unacquire(p) (p)->Unacquire() +#define IDirectInputDevice8_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b) +#define IDirectInputDevice8_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d) +#define IDirectInputDevice8_SetDataFormat(p,a) (p)->SetDataFormat(a) +#define IDirectInputDevice8_SetEventNotification(p,a) (p)->SetEventNotification(a) +#define IDirectInputDevice8_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) +#define IDirectInputDevice8_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c) +#define IDirectInputDevice8_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a) +#define IDirectInputDevice8_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInputDevice8_Initialize(p,a,b,c) (p)->Initialize(a,b,c) +#define IDirectInputDevice8_CreateEffect(p,a,b,c,d) (p)->CreateEffect(a,b,c,d) +#define IDirectInputDevice8_EnumEffects(p,a,b,c) (p)->EnumEffects(a,b,c) +#define IDirectInputDevice8_GetEffectInfo(p,a,b) (p)->GetEffectInfo(a,b) +#define IDirectInputDevice8_GetForceFeedbackState(p,a) (p)->GetForceFeedbackState(a) +#define IDirectInputDevice8_SendForceFeedbackCommand(p,a) (p)->SendForceFeedbackCommand(a) +#define IDirectInputDevice8_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c) +#define IDirectInputDevice8_Escape(p,a) (p)->Escape(a) +#define IDirectInputDevice8_Poll(p) (p)->Poll() +#define IDirectInputDevice8_SendDeviceData(p,a,b,c,d) (p)->SendDeviceData(a,b,c,d) +#define IDirectInputDevice8_EnumEffectsInFile(p,a,b,c,d) (p)->EnumEffectsInFile(a,b,c,d) +#define IDirectInputDevice8_WriteEffectToFile(p,a,b,c,d) (p)->WriteEffectToFile(a,b,c,d) +#define IDirectInputDevice8_BuildActionMap(p,a,b,c) (p)->BuildActionMap(a,b,c) +#define IDirectInputDevice8_SetActionMap(p,a,b,c) (p)->SetActionMap(a,b,c) +#define IDirectInputDevice8_GetImageInfo(p,a) (p)->GetImageInfo(a) +#endif + +#endif /* DIJ_RINGZERO */ + +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ + +/**************************************************************************** + * + * Mouse + * + ****************************************************************************/ + +#ifndef DIJ_RINGZERO + +typedef struct _DIMOUSESTATE { + LONG lX; + LONG lY; + LONG lZ; + BYTE rgbButtons[4]; +} DIMOUSESTATE, *LPDIMOUSESTATE; + +#if DIRECTINPUT_VERSION >= 0x0700 +typedef struct _DIMOUSESTATE2 { + LONG lX; + LONG lY; + LONG lZ; + BYTE rgbButtons[8]; +} DIMOUSESTATE2, *LPDIMOUSESTATE2; +#endif + + +#define DIMOFS_X FIELD_OFFSET(DIMOUSESTATE, lX) +#define DIMOFS_Y FIELD_OFFSET(DIMOUSESTATE, lY) +#define DIMOFS_Z FIELD_OFFSET(DIMOUSESTATE, lZ) +#define DIMOFS_BUTTON0 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 0) +#define DIMOFS_BUTTON1 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 1) +#define DIMOFS_BUTTON2 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 2) +#define DIMOFS_BUTTON3 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 3) +#if (DIRECTINPUT_VERSION >= 0x0700) +#define DIMOFS_BUTTON4 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 4) +#define DIMOFS_BUTTON5 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 5) +#define DIMOFS_BUTTON6 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 6) +#define DIMOFS_BUTTON7 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 7) +#endif +#endif /* DIJ_RINGZERO */ + +/**************************************************************************** + * + * Keyboard + * + ****************************************************************************/ + +#ifndef DIJ_RINGZERO + +/**************************************************************************** + * + * DirectInput keyboard scan codes + * + ****************************************************************************/ +#define DIK_ESCAPE 0x01 +#define DIK_1 0x02 +#define DIK_2 0x03 +#define DIK_3 0x04 +#define DIK_4 0x05 +#define DIK_5 0x06 +#define DIK_6 0x07 +#define DIK_7 0x08 +#define DIK_8 0x09 +#define DIK_9 0x0A +#define DIK_0 0x0B +#define DIK_MINUS 0x0C /* - on main keyboard */ +#define DIK_EQUALS 0x0D +#define DIK_BACK 0x0E /* backspace */ +#define DIK_TAB 0x0F +#define DIK_Q 0x10 +#define DIK_W 0x11 +#define DIK_E 0x12 +#define DIK_R 0x13 +#define DIK_T 0x14 +#define DIK_Y 0x15 +#define DIK_U 0x16 +#define DIK_I 0x17 +#define DIK_O 0x18 +#define DIK_P 0x19 +#define DIK_LBRACKET 0x1A +#define DIK_RBRACKET 0x1B +#define DIK_RETURN 0x1C /* Enter on main keyboard */ +#define DIK_LCONTROL 0x1D +#define DIK_A 0x1E +#define DIK_S 0x1F +#define DIK_D 0x20 +#define DIK_F 0x21 +#define DIK_G 0x22 +#define DIK_H 0x23 +#define DIK_J 0x24 +#define DIK_K 0x25 +#define DIK_L 0x26 +#define DIK_SEMICOLON 0x27 +#define DIK_APOSTROPHE 0x28 +#define DIK_GRAVE 0x29 /* accent grave */ +#define DIK_LSHIFT 0x2A +#define DIK_BACKSLASH 0x2B +#define DIK_Z 0x2C +#define DIK_X 0x2D +#define DIK_C 0x2E +#define DIK_V 0x2F +#define DIK_B 0x30 +#define DIK_N 0x31 +#define DIK_M 0x32 +#define DIK_COMMA 0x33 +#define DIK_PERIOD 0x34 /* . on main keyboard */ +#define DIK_SLASH 0x35 /* / on main keyboard */ +#define DIK_RSHIFT 0x36 +#define DIK_MULTIPLY 0x37 /* * on numeric keypad */ +#define DIK_LMENU 0x38 /* left Alt */ +#define DIK_SPACE 0x39 +#define DIK_CAPITAL 0x3A +#define DIK_F1 0x3B +#define DIK_F2 0x3C +#define DIK_F3 0x3D +#define DIK_F4 0x3E +#define DIK_F5 0x3F +#define DIK_F6 0x40 +#define DIK_F7 0x41 +#define DIK_F8 0x42 +#define DIK_F9 0x43 +#define DIK_F10 0x44 +#define DIK_NUMLOCK 0x45 +#define DIK_SCROLL 0x46 /* Scroll Lock */ +#define DIK_NUMPAD7 0x47 +#define DIK_NUMPAD8 0x48 +#define DIK_NUMPAD9 0x49 +#define DIK_SUBTRACT 0x4A /* - on numeric keypad */ +#define DIK_NUMPAD4 0x4B +#define DIK_NUMPAD5 0x4C +#define DIK_NUMPAD6 0x4D +#define DIK_ADD 0x4E /* + on numeric keypad */ +#define DIK_NUMPAD1 0x4F +#define DIK_NUMPAD2 0x50 +#define DIK_NUMPAD3 0x51 +#define DIK_NUMPAD0 0x52 +#define DIK_DECIMAL 0x53 /* . on numeric keypad */ +#define DIK_OEM_102 0x56 /* <> or \| on RT 102-key keyboard (Non-U.S.) */ +#define DIK_F11 0x57 +#define DIK_F12 0x58 +#define DIK_F13 0x64 /* (NEC PC98) */ +#define DIK_F14 0x65 /* (NEC PC98) */ +#define DIK_F15 0x66 /* (NEC PC98) */ +#define DIK_KANA 0x70 /* (Japanese keyboard) */ +#define DIK_ABNT_C1 0x73 /* /? on Brazilian keyboard */ +#define DIK_CONVERT 0x79 /* (Japanese keyboard) */ +#define DIK_NOCONVERT 0x7B /* (Japanese keyboard) */ +#define DIK_YEN 0x7D /* (Japanese keyboard) */ +#define DIK_ABNT_C2 0x7E /* Numpad . on Brazilian keyboard */ +#define DIK_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */ +#define DIK_PREVTRACK 0x90 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */ +#define DIK_AT 0x91 /* (NEC PC98) */ +#define DIK_COLON 0x92 /* (NEC PC98) */ +#define DIK_UNDERLINE 0x93 /* (NEC PC98) */ +#define DIK_KANJI 0x94 /* (Japanese keyboard) */ +#define DIK_STOP 0x95 /* (NEC PC98) */ +#define DIK_AX 0x96 /* (Japan AX) */ +#define DIK_UNLABELED 0x97 /* (J3100) */ +#define DIK_NEXTTRACK 0x99 /* Next Track */ +#define DIK_NUMPADENTER 0x9C /* Enter on numeric keypad */ +#define DIK_RCONTROL 0x9D +#define DIK_MUTE 0xA0 /* Mute */ +#define DIK_CALCULATOR 0xA1 /* Calculator */ +#define DIK_PLAYPAUSE 0xA2 /* Play / Pause */ +#define DIK_MEDIASTOP 0xA4 /* Media Stop */ +#define DIK_VOLUMEDOWN 0xAE /* Volume - */ +#define DIK_VOLUMEUP 0xB0 /* Volume + */ +#define DIK_WEBHOME 0xB2 /* Web home */ +#define DIK_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */ +#define DIK_DIVIDE 0xB5 /* / on numeric keypad */ +#define DIK_SYSRQ 0xB7 +#define DIK_RMENU 0xB8 /* right Alt */ +#define DIK_PAUSE 0xC5 /* Pause */ +#define DIK_HOME 0xC7 /* Home on arrow keypad */ +#define DIK_UP 0xC8 /* UpArrow on arrow keypad */ +#define DIK_PRIOR 0xC9 /* PgUp on arrow keypad */ +#define DIK_LEFT 0xCB /* LeftArrow on arrow keypad */ +#define DIK_RIGHT 0xCD /* RightArrow on arrow keypad */ +#define DIK_END 0xCF /* End on arrow keypad */ +#define DIK_DOWN 0xD0 /* DownArrow on arrow keypad */ +#define DIK_NEXT 0xD1 /* PgDn on arrow keypad */ +#define DIK_INSERT 0xD2 /* Insert on arrow keypad */ +#define DIK_DELETE 0xD3 /* Delete on arrow keypad */ +#define DIK_LWIN 0xDB /* Left Windows key */ +#define DIK_RWIN 0xDC /* Right Windows key */ +#define DIK_APPS 0xDD /* AppMenu key */ +#define DIK_POWER 0xDE /* System Power */ +#define DIK_SLEEP 0xDF /* System Sleep */ +#define DIK_WAKE 0xE3 /* System Wake */ +#define DIK_WEBSEARCH 0xE5 /* Web Search */ +#define DIK_WEBFAVORITES 0xE6 /* Web Favorites */ +#define DIK_WEBREFRESH 0xE7 /* Web Refresh */ +#define DIK_WEBSTOP 0xE8 /* Web Stop */ +#define DIK_WEBFORWARD 0xE9 /* Web Forward */ +#define DIK_WEBBACK 0xEA /* Web Back */ +#define DIK_MYCOMPUTER 0xEB /* My Computer */ +#define DIK_MAIL 0xEC /* Mail */ +#define DIK_MEDIASELECT 0xED /* Media Select */ + +/* + * Alternate names for keys, to facilitate transition from DOS. + */ +#define DIK_BACKSPACE DIK_BACK /* backspace */ +#define DIK_NUMPADSTAR DIK_MULTIPLY /* * on numeric keypad */ +#define DIK_LALT DIK_LMENU /* left Alt */ +#define DIK_CAPSLOCK DIK_CAPITAL /* CapsLock */ +#define DIK_NUMPADMINUS DIK_SUBTRACT /* - on numeric keypad */ +#define DIK_NUMPADPLUS DIK_ADD /* + on numeric keypad */ +#define DIK_NUMPADPERIOD DIK_DECIMAL /* . on numeric keypad */ +#define DIK_NUMPADSLASH DIK_DIVIDE /* / on numeric keypad */ +#define DIK_RALT DIK_RMENU /* right Alt */ +#define DIK_UPARROW DIK_UP /* UpArrow on arrow keypad */ +#define DIK_PGUP DIK_PRIOR /* PgUp on arrow keypad */ +#define DIK_LEFTARROW DIK_LEFT /* LeftArrow on arrow keypad */ +#define DIK_RIGHTARROW DIK_RIGHT /* RightArrow on arrow keypad */ +#define DIK_DOWNARROW DIK_DOWN /* DownArrow on arrow keypad */ +#define DIK_PGDN DIK_NEXT /* PgDn on arrow keypad */ + +/* + * Alternate names for keys originally not used on US keyboards. + */ +#define DIK_CIRCUMFLEX DIK_PREVTRACK /* Japanese keyboard */ + +#endif /* DIJ_RINGZERO */ + +/**************************************************************************** + * + * Joystick + * + ****************************************************************************/ + +#ifndef DIJ_RINGZERO + +typedef struct DIJOYSTATE { + LONG lX; /* x-axis position */ + LONG lY; /* y-axis position */ + LONG lZ; /* z-axis position */ + LONG lRx; /* x-axis rotation */ + LONG lRy; /* y-axis rotation */ + LONG lRz; /* z-axis rotation */ + LONG rglSlider[2]; /* extra axes positions */ + DWORD rgdwPOV[4]; /* POV directions */ + BYTE rgbButtons[32]; /* 32 buttons */ +} DIJOYSTATE, *LPDIJOYSTATE; + +typedef struct DIJOYSTATE2 { + LONG lX; /* x-axis position */ + LONG lY; /* y-axis position */ + LONG lZ; /* z-axis position */ + LONG lRx; /* x-axis rotation */ + LONG lRy; /* y-axis rotation */ + LONG lRz; /* z-axis rotation */ + LONG rglSlider[2]; /* extra axes positions */ + DWORD rgdwPOV[4]; /* POV directions */ + BYTE rgbButtons[128]; /* 128 buttons */ + LONG lVX; /* x-axis velocity */ + LONG lVY; /* y-axis velocity */ + LONG lVZ; /* z-axis velocity */ + LONG lVRx; /* x-axis angular velocity */ + LONG lVRy; /* y-axis angular velocity */ + LONG lVRz; /* z-axis angular velocity */ + LONG rglVSlider[2]; /* extra axes velocities */ + LONG lAX; /* x-axis acceleration */ + LONG lAY; /* y-axis acceleration */ + LONG lAZ; /* z-axis acceleration */ + LONG lARx; /* x-axis angular acceleration */ + LONG lARy; /* y-axis angular acceleration */ + LONG lARz; /* z-axis angular acceleration */ + LONG rglASlider[2]; /* extra axes accelerations */ + LONG lFX; /* x-axis force */ + LONG lFY; /* y-axis force */ + LONG lFZ; /* z-axis force */ + LONG lFRx; /* x-axis torque */ + LONG lFRy; /* y-axis torque */ + LONG lFRz; /* z-axis torque */ + LONG rglFSlider[2]; /* extra axes forces */ +} DIJOYSTATE2, *LPDIJOYSTATE2; + +#define DIJOFS_X FIELD_OFFSET(DIJOYSTATE, lX) +#define DIJOFS_Y FIELD_OFFSET(DIJOYSTATE, lY) +#define DIJOFS_Z FIELD_OFFSET(DIJOYSTATE, lZ) +#define DIJOFS_RX FIELD_OFFSET(DIJOYSTATE, lRx) +#define DIJOFS_RY FIELD_OFFSET(DIJOYSTATE, lRy) +#define DIJOFS_RZ FIELD_OFFSET(DIJOYSTATE, lRz) +#define DIJOFS_SLIDER(n) (FIELD_OFFSET(DIJOYSTATE, rglSlider) + \ + (n) * sizeof(LONG)) +#define DIJOFS_POV(n) (FIELD_OFFSET(DIJOYSTATE, rgdwPOV) + \ + (n) * sizeof(DWORD)) +#define DIJOFS_BUTTON(n) (FIELD_OFFSET(DIJOYSTATE, rgbButtons) + (n)) +#define DIJOFS_BUTTON0 DIJOFS_BUTTON(0) +#define DIJOFS_BUTTON1 DIJOFS_BUTTON(1) +#define DIJOFS_BUTTON2 DIJOFS_BUTTON(2) +#define DIJOFS_BUTTON3 DIJOFS_BUTTON(3) +#define DIJOFS_BUTTON4 DIJOFS_BUTTON(4) +#define DIJOFS_BUTTON5 DIJOFS_BUTTON(5) +#define DIJOFS_BUTTON6 DIJOFS_BUTTON(6) +#define DIJOFS_BUTTON7 DIJOFS_BUTTON(7) +#define DIJOFS_BUTTON8 DIJOFS_BUTTON(8) +#define DIJOFS_BUTTON9 DIJOFS_BUTTON(9) +#define DIJOFS_BUTTON10 DIJOFS_BUTTON(10) +#define DIJOFS_BUTTON11 DIJOFS_BUTTON(11) +#define DIJOFS_BUTTON12 DIJOFS_BUTTON(12) +#define DIJOFS_BUTTON13 DIJOFS_BUTTON(13) +#define DIJOFS_BUTTON14 DIJOFS_BUTTON(14) +#define DIJOFS_BUTTON15 DIJOFS_BUTTON(15) +#define DIJOFS_BUTTON16 DIJOFS_BUTTON(16) +#define DIJOFS_BUTTON17 DIJOFS_BUTTON(17) +#define DIJOFS_BUTTON18 DIJOFS_BUTTON(18) +#define DIJOFS_BUTTON19 DIJOFS_BUTTON(19) +#define DIJOFS_BUTTON20 DIJOFS_BUTTON(20) +#define DIJOFS_BUTTON21 DIJOFS_BUTTON(21) +#define DIJOFS_BUTTON22 DIJOFS_BUTTON(22) +#define DIJOFS_BUTTON23 DIJOFS_BUTTON(23) +#define DIJOFS_BUTTON24 DIJOFS_BUTTON(24) +#define DIJOFS_BUTTON25 DIJOFS_BUTTON(25) +#define DIJOFS_BUTTON26 DIJOFS_BUTTON(26) +#define DIJOFS_BUTTON27 DIJOFS_BUTTON(27) +#define DIJOFS_BUTTON28 DIJOFS_BUTTON(28) +#define DIJOFS_BUTTON29 DIJOFS_BUTTON(29) +#define DIJOFS_BUTTON30 DIJOFS_BUTTON(30) +#define DIJOFS_BUTTON31 DIJOFS_BUTTON(31) + + +#endif /* DIJ_RINGZERO */ + +/**************************************************************************** + * + * IDirectInput + * + ****************************************************************************/ + +#ifndef DIJ_RINGZERO + +#define DIENUM_STOP 0 +#define DIENUM_CONTINUE 1 + +typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKA)(LPCDIDEVICEINSTANCEA, LPVOID); +typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW, LPVOID); +#ifdef UNICODE +#define LPDIENUMDEVICESCALLBACK LPDIENUMDEVICESCALLBACKW +#else +#define LPDIENUMDEVICESCALLBACK LPDIENUMDEVICESCALLBACKA +#endif // !UNICODE +typedef BOOL (FAR PASCAL * LPDICONFIGUREDEVICESCALLBACK)(IUnknown FAR *, LPVOID); + +#define DIEDFL_ALLDEVICES 0x00000000 +#define DIEDFL_ATTACHEDONLY 0x00000001 +#if(DIRECTINPUT_VERSION >= 0x0500) +#define DIEDFL_FORCEFEEDBACK 0x00000100 +#endif /* DIRECTINPUT_VERSION >= 0x0500 */ +#if(DIRECTINPUT_VERSION >= 0x050a) +#define DIEDFL_INCLUDEALIASES 0x00010000 +#define DIEDFL_INCLUDEPHANTOMS 0x00020000 +#endif /* DIRECTINPUT_VERSION >= 0x050a */ +#if(DIRECTINPUT_VERSION >= 0x0800) +#define DIEDFL_INCLUDEHIDDEN 0x00040000 +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ + + +#if(DIRECTINPUT_VERSION >= 0x0800) +typedef BOOL (FAR PASCAL * LPDIENUMDEVICESBYSEMANTICSCBA)(LPCDIDEVICEINSTANCEA, LPDIRECTINPUTDEVICE8A, DWORD, DWORD, LPVOID); +typedef BOOL (FAR PASCAL * LPDIENUMDEVICESBYSEMANTICSCBW)(LPCDIDEVICEINSTANCEW, LPDIRECTINPUTDEVICE8W, DWORD, DWORD, LPVOID); +#ifdef UNICODE +#define LPDIENUMDEVICESBYSEMANTICSCB LPDIENUMDEVICESBYSEMANTICSCBW +#else +#define LPDIENUMDEVICESBYSEMANTICSCB LPDIENUMDEVICESBYSEMANTICSCBA +#endif // !UNICODE +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ + +#if(DIRECTINPUT_VERSION >= 0x0800) +#define DIEDBS_MAPPEDPRI1 0x00000001 +#define DIEDBS_MAPPEDPRI2 0x00000002 +#define DIEDBS_RECENTDEVICE 0x00000010 +#define DIEDBS_NEWDEVICE 0x00000020 +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ + +#if(DIRECTINPUT_VERSION >= 0x0800) +#define DIEDBSFL_ATTACHEDONLY 0x00000000 +#define DIEDBSFL_THISUSER 0x00000010 +#define DIEDBSFL_FORCEFEEDBACK DIEDFL_FORCEFEEDBACK +#define DIEDBSFL_AVAILABLEDEVICES 0x00001000 +#define DIEDBSFL_MULTIMICEKEYBOARDS 0x00002000 +#define DIEDBSFL_NONGAMINGDEVICES 0x00004000 +#define DIEDBSFL_VALID 0x00007110 +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ + +#undef INTERFACE +#define INTERFACE IDirectInputW + +DECLARE_INTERFACE_(IDirectInputW, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputW methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEW *,LPUNKNOWN) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE; +}; + +typedef struct IDirectInputW *LPDIRECTINPUTW; + +#undef INTERFACE +#define INTERFACE IDirectInputA + +DECLARE_INTERFACE_(IDirectInputA, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputA methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEA *,LPUNKNOWN) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE; +}; + +typedef struct IDirectInputA *LPDIRECTINPUTA; + +#ifdef UNICODE +#define IID_IDirectInput IID_IDirectInputW +#define IDirectInput IDirectInputW +#define IDirectInputVtbl IDirectInputWVtbl +#else +#define IID_IDirectInput IID_IDirectInputA +#define IDirectInput IDirectInputA +#define IDirectInputVtbl IDirectInputAVtbl +#endif +typedef struct IDirectInput *LPDIRECTINPUT; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectInput_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput_Release(p) (p)->lpVtbl->Release(p) +#define IDirectInput_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#else +#define IDirectInput_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInput_AddRef(p) (p)->AddRef() +#define IDirectInput_Release(p) (p)->Release() +#define IDirectInput_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) +#define IDirectInput_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d) +#define IDirectInput_GetDeviceStatus(p,a) (p)->GetDeviceStatus(a) +#define IDirectInput_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInput_Initialize(p,a,b) (p)->Initialize(a,b) +#endif + +#undef INTERFACE +#define INTERFACE IDirectInput2W + +DECLARE_INTERFACE_(IDirectInput2W, IDirectInputW) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputW methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEW *,LPUNKNOWN) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE; + + /*** IDirectInput2W methods ***/ + STDMETHOD(FindDevice)(THIS_ REFGUID,LPCWSTR,LPGUID) PURE; +}; + +typedef struct IDirectInput2W *LPDIRECTINPUT2W; + +#undef INTERFACE +#define INTERFACE IDirectInput2A + +DECLARE_INTERFACE_(IDirectInput2A, IDirectInputA) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInputA methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEA *,LPUNKNOWN) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE; + + /*** IDirectInput2A methods ***/ + STDMETHOD(FindDevice)(THIS_ REFGUID,LPCSTR,LPGUID) PURE; +}; + +typedef struct IDirectInput2A *LPDIRECTINPUT2A; + +#ifdef UNICODE +#define IID_IDirectInput2 IID_IDirectInput2W +#define IDirectInput2 IDirectInput2W +#define IDirectInput2Vtbl IDirectInput2WVtbl +#else +#define IID_IDirectInput2 IID_IDirectInput2A +#define IDirectInput2 IDirectInput2A +#define IDirectInput2Vtbl IDirectInput2AVtbl +#endif +typedef struct IDirectInput2 *LPDIRECTINPUT2; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectInput2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput2_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput2_Release(p) (p)->lpVtbl->Release(p) +#define IDirectInput2_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput2_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput2_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput2_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput2_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectInput2_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) +#else +#define IDirectInput2_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInput2_AddRef(p) (p)->AddRef() +#define IDirectInput2_Release(p) (p)->Release() +#define IDirectInput2_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) +#define IDirectInput2_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d) +#define IDirectInput2_GetDeviceStatus(p,a) (p)->GetDeviceStatus(a) +#define IDirectInput2_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInput2_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectInput2_FindDevice(p,a,b,c) (p)->FindDevice(a,b,c) +#endif + + +#undef INTERFACE +#define INTERFACE IDirectInput7W + +DECLARE_INTERFACE_(IDirectInput7W, IDirectInput2W) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInput2W methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEW *,LPUNKNOWN) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE; + STDMETHOD(FindDevice)(THIS_ REFGUID,LPCWSTR,LPGUID) PURE; + + /*** IDirectInput7W methods ***/ + STDMETHOD(CreateDeviceEx)(THIS_ REFGUID,REFIID,LPVOID *,LPUNKNOWN) PURE; +}; + +typedef struct IDirectInput7W *LPDIRECTINPUT7W; + +#undef INTERFACE +#define INTERFACE IDirectInput7A + +DECLARE_INTERFACE_(IDirectInput7A, IDirectInput2A) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInput2A methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEA *,LPUNKNOWN) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE; + STDMETHOD(FindDevice)(THIS_ REFGUID,LPCSTR,LPGUID) PURE; + + /*** IDirectInput7A methods ***/ + STDMETHOD(CreateDeviceEx)(THIS_ REFGUID,REFIID,LPVOID *,LPUNKNOWN) PURE; +}; + +typedef struct IDirectInput7A *LPDIRECTINPUT7A; + +#ifdef UNICODE +#define IID_IDirectInput7 IID_IDirectInput7W +#define IDirectInput7 IDirectInput7W +#define IDirectInput7Vtbl IDirectInput7WVtbl +#else +#define IID_IDirectInput7 IID_IDirectInput7A +#define IDirectInput7 IDirectInput7A +#define IDirectInput7Vtbl IDirectInput7AVtbl +#endif +typedef struct IDirectInput7 *LPDIRECTINPUT7; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectInput7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput7_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput7_Release(p) (p)->lpVtbl->Release(p) +#define IDirectInput7_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput7_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput7_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput7_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput7_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectInput7_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) +#define IDirectInput7_CreateDeviceEx(p,a,b,c,d) (p)->lpVtbl->CreateDeviceEx(p,a,b,c,d) +#else +#define IDirectInput7_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInput7_AddRef(p) (p)->AddRef() +#define IDirectInput7_Release(p) (p)->Release() +#define IDirectInput7_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) +#define IDirectInput7_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d) +#define IDirectInput7_GetDeviceStatus(p,a) (p)->GetDeviceStatus(a) +#define IDirectInput7_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInput7_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectInput7_FindDevice(p,a,b,c) (p)->FindDevice(a,b,c) +#define IDirectInput7_CreateDeviceEx(p,a,b,c,d) (p)->CreateDeviceEx(a,b,c,d) +#endif + +#if(DIRECTINPUT_VERSION >= 0x0800) +#undef INTERFACE +#define INTERFACE IDirectInput8W + +DECLARE_INTERFACE_(IDirectInput8W, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInput8W methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICE8W *,LPUNKNOWN) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKW,LPVOID,DWORD) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE; + STDMETHOD(FindDevice)(THIS_ REFGUID,LPCWSTR,LPGUID) PURE; + STDMETHOD(EnumDevicesBySemantics)(THIS_ LPCWSTR,LPDIACTIONFORMATW,LPDIENUMDEVICESBYSEMANTICSCBW,LPVOID,DWORD) PURE; + STDMETHOD(ConfigureDevices)(THIS_ LPDICONFIGUREDEVICESCALLBACK,LPDICONFIGUREDEVICESPARAMSW,DWORD,LPVOID) PURE; +}; + +typedef struct IDirectInput8W *LPDIRECTINPUT8W; + +#undef INTERFACE +#define INTERFACE IDirectInput8A + +DECLARE_INTERFACE_(IDirectInput8A, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + /*** IDirectInput8A methods ***/ + STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICE8A *,LPUNKNOWN) PURE; + STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKA,LPVOID,DWORD) PURE; + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE; + STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE; + STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE; + STDMETHOD(FindDevice)(THIS_ REFGUID,LPCSTR,LPGUID) PURE; + STDMETHOD(EnumDevicesBySemantics)(THIS_ LPCSTR,LPDIACTIONFORMATA,LPDIENUMDEVICESBYSEMANTICSCBA,LPVOID,DWORD) PURE; + STDMETHOD(ConfigureDevices)(THIS_ LPDICONFIGUREDEVICESCALLBACK,LPDICONFIGUREDEVICESPARAMSA,DWORD,LPVOID) PURE; +}; + +typedef struct IDirectInput8A *LPDIRECTINPUT8A; + +#ifdef UNICODE +#define IID_IDirectInput8 IID_IDirectInput8W +#define IDirectInput8 IDirectInput8W +#define IDirectInput8Vtbl IDirectInput8WVtbl +#else +#define IID_IDirectInput8 IID_IDirectInput8A +#define IDirectInput8 IDirectInput8A +#define IDirectInput8Vtbl IDirectInput8AVtbl +#endif +typedef struct IDirectInput8 *LPDIRECTINPUT8; + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectInput8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput8_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput8_Release(p) (p)->lpVtbl->Release(p) +#define IDirectInput8_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput8_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput8_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput8_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput8_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectInput8_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) +#define IDirectInput8_EnumDevicesBySemantics(p,a,b,c,d,e) (p)->lpVtbl->EnumDevicesBySemantics(p,a,b,c,d,e) +#define IDirectInput8_ConfigureDevices(p,a,b,c,d) (p)->lpVtbl->ConfigureDevices(p,a,b,c,d) +#else +#define IDirectInput8_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDirectInput8_AddRef(p) (p)->AddRef() +#define IDirectInput8_Release(p) (p)->Release() +#define IDirectInput8_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c) +#define IDirectInput8_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d) +#define IDirectInput8_GetDeviceStatus(p,a) (p)->GetDeviceStatus(a) +#define IDirectInput8_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b) +#define IDirectInput8_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectInput8_FindDevice(p,a,b,c) (p)->FindDevice(a,b,c) +#define IDirectInput8_EnumDevicesBySemantics(p,a,b,c,d,e) (p)->EnumDevicesBySemantics(a,b,c,d,e) +#define IDirectInput8_ConfigureDevices(p,a,b,c,d) (p)->ConfigureDevices(a,b,c,d) +#endif +#endif /* DIRECTINPUT_VERSION >= 0x0800 */ + +#if DIRECTINPUT_VERSION > 0x0700 + +extern HRESULT WINAPI DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter); + +#else +extern HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter); +extern HRESULT WINAPI DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTW *ppDI, LPUNKNOWN punkOuter); +#ifdef UNICODE +#define DirectInputCreate DirectInputCreateW +#else +#define DirectInputCreate DirectInputCreateA +#endif // !UNICODE + +extern HRESULT WINAPI DirectInputCreateEx(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter); + +#endif /* DIRECTINPUT_VERSION > 0x700 */ + +#endif /* DIJ_RINGZERO */ + + +/**************************************************************************** + * + * Return Codes + * + ****************************************************************************/ + +/* + * The operation completed successfully. + */ +#define DI_OK S_OK + +/* + * The device exists but is not currently attached. + */ +#define DI_NOTATTACHED S_FALSE + +/* + * The device buffer overflowed. Some input was lost. + */ +#define DI_BUFFEROVERFLOW S_FALSE + +/* + * The change in device properties had no effect. + */ +#define DI_PROPNOEFFECT S_FALSE + +/* + * The operation had no effect. + */ +#define DI_NOEFFECT S_FALSE + +/* + * The device is a polled device. As a result, device buffering + * will not collect any data and event notifications will not be + * signalled until GetDeviceState is called. + */ +#define DI_POLLEDDEVICE ((HRESULT)0x00000002L) + +/* + * The parameters of the effect were successfully updated by + * IDirectInputEffect::SetParameters, but the effect was not + * downloaded because the device is not exclusively acquired + * or because the DIEP_NODOWNLOAD flag was passed. + */ +#define DI_DOWNLOADSKIPPED ((HRESULT)0x00000003L) + +/* + * The parameters of the effect were successfully updated by + * IDirectInputEffect::SetParameters, but in order to change + * the parameters, the effect needed to be restarted. + */ +#define DI_EFFECTRESTARTED ((HRESULT)0x00000004L) + +/* + * The parameters of the effect were successfully updated by + * IDirectInputEffect::SetParameters, but some of them were + * beyond the capabilities of the device and were truncated. + */ +#define DI_TRUNCATED ((HRESULT)0x00000008L) + +/* + * The settings have been successfully applied but could not be + * persisted. + */ +#define DI_SETTINGSNOTSAVED ((HRESULT)0x0000000BL) + +/* + * Equal to DI_EFFECTRESTARTED | DI_TRUNCATED. + */ +#define DI_TRUNCATEDANDRESTARTED ((HRESULT)0x0000000CL) + +/* + * A SUCCESS code indicating that settings cannot be modified. + */ +#define DI_WRITEPROTECT ((HRESULT)0x00000013L) + +/* + * The application requires a newer version of DirectInput. + */ +#define DIERR_OLDDIRECTINPUTVERSION \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION) + +/* + * The application was written for an unsupported prerelease version + * of DirectInput. + */ +#define DIERR_BETADIRECTINPUTVERSION \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP) + +/* + * The object could not be created due to an incompatible driver version + * or mismatched or incomplete driver components. + */ +#define DIERR_BADDRIVERVER \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL) + +/* + * The device or device instance or effect is not registered with DirectInput. + */ +#define DIERR_DEVICENOTREG REGDB_E_CLASSNOTREG + +/* + * The requested object does not exist. + */ +#define DIERR_NOTFOUND \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND) + +/* + * The requested object does not exist. + */ +#define DIERR_OBJECTNOTFOUND \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND) + +/* + * An invalid parameter was passed to the returning function, + * or the object was not in a state that admitted the function + * to be called. + */ +#define DIERR_INVALIDPARAM E_INVALIDARG + +/* + * The specified interface is not supported by the object + */ +#define DIERR_NOINTERFACE E_NOINTERFACE + +/* + * An undetermined error occured inside the DInput subsystem + */ +#define DIERR_GENERIC E_FAIL + +/* + * The DInput subsystem couldn't allocate sufficient memory to complete the + * caller's request. + */ +#define DIERR_OUTOFMEMORY E_OUTOFMEMORY + +/* + * The function called is not supported at this time + */ +#define DIERR_UNSUPPORTED E_NOTIMPL + +/* + * This object has not been initialized + */ +#define DIERR_NOTINITIALIZED \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY) + +/* + * This object is already initialized + */ +#define DIERR_ALREADYINITIALIZED \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED) + +/* + * This object does not support aggregation + */ +#define DIERR_NOAGGREGATION CLASS_E_NOAGGREGATION + +/* + * Another app has a higher priority level, preventing this call from + * succeeding. + */ +#define DIERR_OTHERAPPHASPRIO E_ACCESSDENIED + +/* + * Access to the device has been lost. It must be re-acquired. + */ +#define DIERR_INPUTLOST \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT) + +/* + * The operation cannot be performed while the device is acquired. + */ +#define DIERR_ACQUIRED \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY) + +/* + * The operation cannot be performed unless the device is acquired. + */ +#define DIERR_NOTACQUIRED \ + MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS) + +/* + * The specified property cannot be changed. + */ +#define DIERR_READONLY E_ACCESSDENIED + +/* + * The device already has an event notification associated with it. + */ +#define DIERR_HANDLEEXISTS E_ACCESSDENIED + +/* + * Data is not yet available. + */ +#ifndef E_PENDING +#define E_PENDING 0x8000000AL +#endif + +/* + * Unable to IDirectInputJoyConfig_Acquire because the user + * does not have sufficient privileges to change the joystick + * configuration. + */ +#define DIERR_INSUFFICIENTPRIVS 0x80040200L + +/* + * The device is full. + */ +#define DIERR_DEVICEFULL 0x80040201L + +/* + * Not all the requested information fit into the buffer. + */ +#define DIERR_MOREDATA 0x80040202L + +/* + * The effect is not downloaded. + */ +#define DIERR_NOTDOWNLOADED 0x80040203L + +/* + * The device cannot be reinitialized because there are still effects + * attached to it. + */ +#define DIERR_HASEFFECTS 0x80040204L + +/* + * The operation cannot be performed unless the device is acquired + * in DISCL_EXCLUSIVE mode. + */ +#define DIERR_NOTEXCLUSIVEACQUIRED 0x80040205L + +/* + * The effect could not be downloaded because essential information + * is missing. For example, no axes have been associated with the + * effect, or no type-specific information has been created. + */ +#define DIERR_INCOMPLETEEFFECT 0x80040206L + +/* + * Attempted to read buffered device data from a device that is + * not buffered. + */ +#define DIERR_NOTBUFFERED 0x80040207L + +/* + * An attempt was made to modify parameters of an effect while it is + * playing. Not all hardware devices support altering the parameters + * of an effect while it is playing. + */ +#define DIERR_EFFECTPLAYING 0x80040208L + +/* + * The operation could not be completed because the device is not + * plugged in. + */ +#define DIERR_UNPLUGGED 0x80040209L + +/* + * SendDeviceData failed because more information was requested + * to be sent than can be sent to the device. Some devices have + * restrictions on how much data can be sent to them. (For example, + * there might be a limit on the number of buttons that can be + * pressed at once.) + */ +#define DIERR_REPORTFULL 0x8004020AL + + +/* + * A mapper file function failed because reading or writing the user or IHV + * settings file failed. + */ +#define DIERR_MAPFILEFAIL 0x8004020BL + + +/*--- DINPUT Mapper Definitions: New for Dx8 ---*/ + + +/*--- Keyboard + Physical Keyboard Device ---*/ + +#define DIKEYBOARD_ESCAPE 0x81000401 +#define DIKEYBOARD_1 0x81000402 +#define DIKEYBOARD_2 0x81000403 +#define DIKEYBOARD_3 0x81000404 +#define DIKEYBOARD_4 0x81000405 +#define DIKEYBOARD_5 0x81000406 +#define DIKEYBOARD_6 0x81000407 +#define DIKEYBOARD_7 0x81000408 +#define DIKEYBOARD_8 0x81000409 +#define DIKEYBOARD_9 0x8100040A +#define DIKEYBOARD_0 0x8100040B +#define DIKEYBOARD_MINUS 0x8100040C /* - on main keyboard */ +#define DIKEYBOARD_EQUALS 0x8100040D +#define DIKEYBOARD_BACK 0x8100040E /* backspace */ +#define DIKEYBOARD_TAB 0x8100040F +#define DIKEYBOARD_Q 0x81000410 +#define DIKEYBOARD_W 0x81000411 +#define DIKEYBOARD_E 0x81000412 +#define DIKEYBOARD_R 0x81000413 +#define DIKEYBOARD_T 0x81000414 +#define DIKEYBOARD_Y 0x81000415 +#define DIKEYBOARD_U 0x81000416 +#define DIKEYBOARD_I 0x81000417 +#define DIKEYBOARD_O 0x81000418 +#define DIKEYBOARD_P 0x81000419 +#define DIKEYBOARD_LBRACKET 0x8100041A +#define DIKEYBOARD_RBRACKET 0x8100041B +#define DIKEYBOARD_RETURN 0x8100041C /* Enter on main keyboard */ +#define DIKEYBOARD_LCONTROL 0x8100041D +#define DIKEYBOARD_A 0x8100041E +#define DIKEYBOARD_S 0x8100041F +#define DIKEYBOARD_D 0x81000420 +#define DIKEYBOARD_F 0x81000421 +#define DIKEYBOARD_G 0x81000422 +#define DIKEYBOARD_H 0x81000423 +#define DIKEYBOARD_J 0x81000424 +#define DIKEYBOARD_K 0x81000425 +#define DIKEYBOARD_L 0x81000426 +#define DIKEYBOARD_SEMICOLON 0x81000427 +#define DIKEYBOARD_APOSTROPHE 0x81000428 +#define DIKEYBOARD_GRAVE 0x81000429 /* accent grave */ +#define DIKEYBOARD_LSHIFT 0x8100042A +#define DIKEYBOARD_BACKSLASH 0x8100042B +#define DIKEYBOARD_Z 0x8100042C +#define DIKEYBOARD_X 0x8100042D +#define DIKEYBOARD_C 0x8100042E +#define DIKEYBOARD_V 0x8100042F +#define DIKEYBOARD_B 0x81000430 +#define DIKEYBOARD_N 0x81000431 +#define DIKEYBOARD_M 0x81000432 +#define DIKEYBOARD_COMMA 0x81000433 +#define DIKEYBOARD_PERIOD 0x81000434 /* . on main keyboard */ +#define DIKEYBOARD_SLASH 0x81000435 /* / on main keyboard */ +#define DIKEYBOARD_RSHIFT 0x81000436 +#define DIKEYBOARD_MULTIPLY 0x81000437 /* * on numeric keypad */ +#define DIKEYBOARD_LMENU 0x81000438 /* left Alt */ +#define DIKEYBOARD_SPACE 0x81000439 +#define DIKEYBOARD_CAPITAL 0x8100043A +#define DIKEYBOARD_F1 0x8100043B +#define DIKEYBOARD_F2 0x8100043C +#define DIKEYBOARD_F3 0x8100043D +#define DIKEYBOARD_F4 0x8100043E +#define DIKEYBOARD_F5 0x8100043F +#define DIKEYBOARD_F6 0x81000440 +#define DIKEYBOARD_F7 0x81000441 +#define DIKEYBOARD_F8 0x81000442 +#define DIKEYBOARD_F9 0x81000443 +#define DIKEYBOARD_F10 0x81000444 +#define DIKEYBOARD_NUMLOCK 0x81000445 +#define DIKEYBOARD_SCROLL 0x81000446 /* Scroll Lock */ +#define DIKEYBOARD_NUMPAD7 0x81000447 +#define DIKEYBOARD_NUMPAD8 0x81000448 +#define DIKEYBOARD_NUMPAD9 0x81000449 +#define DIKEYBOARD_SUBTRACT 0x8100044A /* - on numeric keypad */ +#define DIKEYBOARD_NUMPAD4 0x8100044B +#define DIKEYBOARD_NUMPAD5 0x8100044C +#define DIKEYBOARD_NUMPAD6 0x8100044D +#define DIKEYBOARD_ADD 0x8100044E /* + on numeric keypad */ +#define DIKEYBOARD_NUMPAD1 0x8100044F +#define DIKEYBOARD_NUMPAD2 0x81000450 +#define DIKEYBOARD_NUMPAD3 0x81000451 +#define DIKEYBOARD_NUMPAD0 0x81000452 +#define DIKEYBOARD_DECIMAL 0x81000453 /* . on numeric keypad */ +#define DIKEYBOARD_OEM_102 0x81000456 /* <> or \| on RT 102-key keyboard (Non-U.S.) */ +#define DIKEYBOARD_F11 0x81000457 +#define DIKEYBOARD_F12 0x81000458 +#define DIKEYBOARD_F13 0x81000464 /* (NEC PC98) */ +#define DIKEYBOARD_F14 0x81000465 /* (NEC PC98) */ +#define DIKEYBOARD_F15 0x81000466 /* (NEC PC98) */ +#define DIKEYBOARD_KANA 0x81000470 /* (Japanese keyboard) */ +#define DIKEYBOARD_ABNT_C1 0x81000473 /* /? on Brazilian keyboard */ +#define DIKEYBOARD_CONVERT 0x81000479 /* (Japanese keyboard) */ +#define DIKEYBOARD_NOCONVERT 0x8100047B /* (Japanese keyboard) */ +#define DIKEYBOARD_YEN 0x8100047D /* (Japanese keyboard) */ +#define DIKEYBOARD_ABNT_C2 0x8100047E /* Numpad . on Brazilian keyboard */ +#define DIKEYBOARD_NUMPADEQUALS 0x8100048D /* = on numeric keypad (NEC PC98) */ +#define DIKEYBOARD_PREVTRACK 0x81000490 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */ +#define DIKEYBOARD_AT 0x81000491 /* (NEC PC98) */ +#define DIKEYBOARD_COLON 0x81000492 /* (NEC PC98) */ +#define DIKEYBOARD_UNDERLINE 0x81000493 /* (NEC PC98) */ +#define DIKEYBOARD_KANJI 0x81000494 /* (Japanese keyboard) */ +#define DIKEYBOARD_STOP 0x81000495 /* (NEC PC98) */ +#define DIKEYBOARD_AX 0x81000496 /* (Japan AX) */ +#define DIKEYBOARD_UNLABELED 0x81000497 /* (J3100) */ +#define DIKEYBOARD_NEXTTRACK 0x81000499 /* Next Track */ +#define DIKEYBOARD_NUMPADENTER 0x8100049C /* Enter on numeric keypad */ +#define DIKEYBOARD_RCONTROL 0x8100049D +#define DIKEYBOARD_MUTE 0x810004A0 /* Mute */ +#define DIKEYBOARD_CALCULATOR 0x810004A1 /* Calculator */ +#define DIKEYBOARD_PLAYPAUSE 0x810004A2 /* Play / Pause */ +#define DIKEYBOARD_MEDIASTOP 0x810004A4 /* Media Stop */ +#define DIKEYBOARD_VOLUMEDOWN 0x810004AE /* Volume - */ +#define DIKEYBOARD_VOLUMEUP 0x810004B0 /* Volume + */ +#define DIKEYBOARD_WEBHOME 0x810004B2 /* Web home */ +#define DIKEYBOARD_NUMPADCOMMA 0x810004B3 /* , on numeric keypad (NEC PC98) */ +#define DIKEYBOARD_DIVIDE 0x810004B5 /* / on numeric keypad */ +#define DIKEYBOARD_SYSRQ 0x810004B7 +#define DIKEYBOARD_RMENU 0x810004B8 /* right Alt */ +#define DIKEYBOARD_PAUSE 0x810004C5 /* Pause */ +#define DIKEYBOARD_HOME 0x810004C7 /* Home on arrow keypad */ +#define DIKEYBOARD_UP 0x810004C8 /* UpArrow on arrow keypad */ +#define DIKEYBOARD_PRIOR 0x810004C9 /* PgUp on arrow keypad */ +#define DIKEYBOARD_LEFT 0x810004CB /* LeftArrow on arrow keypad */ +#define DIKEYBOARD_RIGHT 0x810004CD /* RightArrow on arrow keypad */ +#define DIKEYBOARD_END 0x810004CF /* End on arrow keypad */ +#define DIKEYBOARD_DOWN 0x810004D0 /* DownArrow on arrow keypad */ +#define DIKEYBOARD_NEXT 0x810004D1 /* PgDn on arrow keypad */ +#define DIKEYBOARD_INSERT 0x810004D2 /* Insert on arrow keypad */ +#define DIKEYBOARD_DELETE 0x810004D3 /* Delete on arrow keypad */ +#define DIKEYBOARD_LWIN 0x810004DB /* Left Windows key */ +#define DIKEYBOARD_RWIN 0x810004DC /* Right Windows key */ +#define DIKEYBOARD_APPS 0x810004DD /* AppMenu key */ +#define DIKEYBOARD_POWER 0x810004DE /* System Power */ +#define DIKEYBOARD_SLEEP 0x810004DF /* System Sleep */ +#define DIKEYBOARD_WAKE 0x810004E3 /* System Wake */ +#define DIKEYBOARD_WEBSEARCH 0x810004E5 /* Web Search */ +#define DIKEYBOARD_WEBFAVORITES 0x810004E6 /* Web Favorites */ +#define DIKEYBOARD_WEBREFRESH 0x810004E7 /* Web Refresh */ +#define DIKEYBOARD_WEBSTOP 0x810004E8 /* Web Stop */ +#define DIKEYBOARD_WEBFORWARD 0x810004E9 /* Web Forward */ +#define DIKEYBOARD_WEBBACK 0x810004EA /* Web Back */ +#define DIKEYBOARD_MYCOMPUTER 0x810004EB /* My Computer */ +#define DIKEYBOARD_MAIL 0x810004EC /* Mail */ +#define DIKEYBOARD_MEDIASELECT 0x810004ED /* Media Select */ + + +/*--- MOUSE + Physical Mouse Device ---*/ + +#define DIMOUSE_XAXISAB (0x82000200 |DIMOFS_X ) /* X Axis-absolute: Some mice natively report absolute coordinates */ +#define DIMOUSE_YAXISAB (0x82000200 |DIMOFS_Y ) /* Y Axis-absolute: Some mice natively report absolute coordinates */ +#define DIMOUSE_XAXIS (0x82000300 |DIMOFS_X ) /* X Axis */ +#define DIMOUSE_YAXIS (0x82000300 |DIMOFS_Y ) /* Y Axis */ +#define DIMOUSE_WHEEL (0x82000300 |DIMOFS_Z ) /* Z Axis */ +#define DIMOUSE_BUTTON0 (0x82000400 |DIMOFS_BUTTON0) /* Button 0 */ +#define DIMOUSE_BUTTON1 (0x82000400 |DIMOFS_BUTTON1) /* Button 1 */ +#define DIMOUSE_BUTTON2 (0x82000400 |DIMOFS_BUTTON2) /* Button 2 */ +#define DIMOUSE_BUTTON3 (0x82000400 |DIMOFS_BUTTON3) /* Button 3 */ +#define DIMOUSE_BUTTON4 (0x82000400 |DIMOFS_BUTTON4) /* Button 4 */ +#define DIMOUSE_BUTTON5 (0x82000400 |DIMOFS_BUTTON5) /* Button 5 */ +#define DIMOUSE_BUTTON6 (0x82000400 |DIMOFS_BUTTON6) /* Button 6 */ +#define DIMOUSE_BUTTON7 (0x82000400 |DIMOFS_BUTTON7) /* Button 7 */ + + +/*--- VOICE + Physical Dplay Voice Device ---*/ + +#define DIVOICE_CHANNEL1 0x83000401 +#define DIVOICE_CHANNEL2 0x83000402 +#define DIVOICE_CHANNEL3 0x83000403 +#define DIVOICE_CHANNEL4 0x83000404 +#define DIVOICE_CHANNEL5 0x83000405 +#define DIVOICE_CHANNEL6 0x83000406 +#define DIVOICE_CHANNEL7 0x83000407 +#define DIVOICE_CHANNEL8 0x83000408 +#define DIVOICE_TEAM 0x83000409 +#define DIVOICE_ALL 0x8300040A +#define DIVOICE_RECORDMUTE 0x8300040B +#define DIVOICE_PLAYBACKMUTE 0x8300040C +#define DIVOICE_TRANSMIT 0x8300040D + +#define DIVOICE_VOICECOMMAND 0x83000410 + + +/*--- Driving Simulator - Racing + Vehicle control is primary objective ---*/ +#define DIVIRTUAL_DRIVING_RACE 0x01000000 +#define DIAXIS_DRIVINGR_STEER 0x01008A01 /* Steering */ +#define DIAXIS_DRIVINGR_ACCELERATE 0x01039202 /* Accelerate */ +#define DIAXIS_DRIVINGR_BRAKE 0x01041203 /* Brake-Axis */ +#define DIBUTTON_DRIVINGR_SHIFTUP 0x01000C01 /* Shift to next higher gear */ +#define DIBUTTON_DRIVINGR_SHIFTDOWN 0x01000C02 /* Shift to next lower gear */ +#define DIBUTTON_DRIVINGR_VIEW 0x01001C03 /* Cycle through view options */ +#define DIBUTTON_DRIVINGR_MENU 0x010004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIAXIS_DRIVINGR_ACCEL_AND_BRAKE 0x01014A04 /* Some devices combine accelerate and brake in a single axis */ +#define DIHATSWITCH_DRIVINGR_GLANCE 0x01004601 /* Look around */ +#define DIBUTTON_DRIVINGR_BRAKE 0x01004C04 /* Brake-button */ +#define DIBUTTON_DRIVINGR_DASHBOARD 0x01004405 /* Select next dashboard option */ +#define DIBUTTON_DRIVINGR_AIDS 0x01004406 /* Driver correction aids */ +#define DIBUTTON_DRIVINGR_MAP 0x01004407 /* Display Driving Map */ +#define DIBUTTON_DRIVINGR_BOOST 0x01004408 /* Turbo Boost */ +#define DIBUTTON_DRIVINGR_PIT 0x01004409 /* Pit stop notification */ +#define DIBUTTON_DRIVINGR_ACCELERATE_LINK 0x0103D4E0 /* Fallback Accelerate button */ +#define DIBUTTON_DRIVINGR_STEER_LEFT_LINK 0x0100CCE4 /* Fallback Steer Left button */ +#define DIBUTTON_DRIVINGR_STEER_RIGHT_LINK 0x0100CCEC /* Fallback Steer Right button */ +#define DIBUTTON_DRIVINGR_GLANCE_LEFT_LINK 0x0107C4E4 /* Fallback Glance Left button */ +#define DIBUTTON_DRIVINGR_GLANCE_RIGHT_LINK 0x0107C4EC /* Fallback Glance Right button */ +#define DIBUTTON_DRIVINGR_DEVICE 0x010044FE /* Show input device and controls */ +#define DIBUTTON_DRIVINGR_PAUSE 0x010044FC /* Start / Pause / Restart game */ + +/*--- Driving Simulator - Combat + Combat from within a vehicle is primary objective ---*/ +#define DIVIRTUAL_DRIVING_COMBAT 0x02000000 +#define DIAXIS_DRIVINGC_STEER 0x02008A01 /* Steering */ +#define DIAXIS_DRIVINGC_ACCELERATE 0x02039202 /* Accelerate */ +#define DIAXIS_DRIVINGC_BRAKE 0x02041203 /* Brake-axis */ +#define DIBUTTON_DRIVINGC_FIRE 0x02000C01 /* Fire */ +#define DIBUTTON_DRIVINGC_WEAPONS 0x02000C02 /* Select next weapon */ +#define DIBUTTON_DRIVINGC_TARGET 0x02000C03 /* Select next available target */ +#define DIBUTTON_DRIVINGC_MENU 0x020004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIAXIS_DRIVINGC_ACCEL_AND_BRAKE 0x02014A04 /* Some devices combine accelerate and brake in a single axis */ +#define DIHATSWITCH_DRIVINGC_GLANCE 0x02004601 /* Look around */ +#define DIBUTTON_DRIVINGC_SHIFTUP 0x02004C04 /* Shift to next higher gear */ +#define DIBUTTON_DRIVINGC_SHIFTDOWN 0x02004C05 /* Shift to next lower gear */ +#define DIBUTTON_DRIVINGC_DASHBOARD 0x02004406 /* Select next dashboard option */ +#define DIBUTTON_DRIVINGC_AIDS 0x02004407 /* Driver correction aids */ +#define DIBUTTON_DRIVINGC_BRAKE 0x02004C08 /* Brake-button */ +#define DIBUTTON_DRIVINGC_FIRESECONDARY 0x02004C09 /* Alternative fire button */ +#define DIBUTTON_DRIVINGC_ACCELERATE_LINK 0x0203D4E0 /* Fallback Accelerate button */ +#define DIBUTTON_DRIVINGC_STEER_LEFT_LINK 0x0200CCE4 /* Fallback Steer Left button */ +#define DIBUTTON_DRIVINGC_STEER_RIGHT_LINK 0x0200CCEC /* Fallback Steer Right button */ +#define DIBUTTON_DRIVINGC_GLANCE_LEFT_LINK 0x0207C4E4 /* Fallback Glance Left button */ +#define DIBUTTON_DRIVINGC_GLANCE_RIGHT_LINK 0x0207C4EC /* Fallback Glance Right button */ +#define DIBUTTON_DRIVINGC_DEVICE 0x020044FE /* Show input device and controls */ +#define DIBUTTON_DRIVINGC_PAUSE 0x020044FC /* Start / Pause / Restart game */ + +/*--- Driving Simulator - Tank + Combat from withing a tank is primary objective ---*/ +#define DIVIRTUAL_DRIVING_TANK 0x03000000 +#define DIAXIS_DRIVINGT_STEER 0x03008A01 /* Turn tank left / right */ +#define DIAXIS_DRIVINGT_BARREL 0x03010202 /* Raise / lower barrel */ +#define DIAXIS_DRIVINGT_ACCELERATE 0x03039203 /* Accelerate */ +#define DIAXIS_DRIVINGT_ROTATE 0x03020204 /* Turn barrel left / right */ +#define DIBUTTON_DRIVINGT_FIRE 0x03000C01 /* Fire */ +#define DIBUTTON_DRIVINGT_WEAPONS 0x03000C02 /* Select next weapon */ +#define DIBUTTON_DRIVINGT_TARGET 0x03000C03 /* Selects next available target */ +#define DIBUTTON_DRIVINGT_MENU 0x030004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_DRIVINGT_GLANCE 0x03004601 /* Look around */ +#define DIAXIS_DRIVINGT_BRAKE 0x03045205 /* Brake-axis */ +#define DIAXIS_DRIVINGT_ACCEL_AND_BRAKE 0x03014A06 /* Some devices combine accelerate and brake in a single axis */ +#define DIBUTTON_DRIVINGT_VIEW 0x03005C04 /* Cycle through view options */ +#define DIBUTTON_DRIVINGT_DASHBOARD 0x03005C05 /* Select next dashboard option */ +#define DIBUTTON_DRIVINGT_BRAKE 0x03004C06 /* Brake-button */ +#define DIBUTTON_DRIVINGT_FIRESECONDARY 0x03004C07 /* Alternative fire button */ +#define DIBUTTON_DRIVINGT_ACCELERATE_LINK 0x0303D4E0 /* Fallback Accelerate button */ +#define DIBUTTON_DRIVINGT_STEER_LEFT_LINK 0x0300CCE4 /* Fallback Steer Left button */ +#define DIBUTTON_DRIVINGT_STEER_RIGHT_LINK 0x0300CCEC /* Fallback Steer Right button */ +#define DIBUTTON_DRIVINGT_BARREL_UP_LINK 0x030144E0 /* Fallback Barrel up button */ +#define DIBUTTON_DRIVINGT_BARREL_DOWN_LINK 0x030144E8 /* Fallback Barrel down button */ +#define DIBUTTON_DRIVINGT_ROTATE_LEFT_LINK 0x030244E4 /* Fallback Rotate left button */ +#define DIBUTTON_DRIVINGT_ROTATE_RIGHT_LINK 0x030244EC /* Fallback Rotate right button */ +#define DIBUTTON_DRIVINGT_GLANCE_LEFT_LINK 0x0307C4E4 /* Fallback Glance Left button */ +#define DIBUTTON_DRIVINGT_GLANCE_RIGHT_LINK 0x0307C4EC /* Fallback Glance Right button */ +#define DIBUTTON_DRIVINGT_DEVICE 0x030044FE /* Show input device and controls */ +#define DIBUTTON_DRIVINGT_PAUSE 0x030044FC /* Start / Pause / Restart game */ + +/*--- Flight Simulator - Civilian + Plane control is the primary objective ---*/ +#define DIVIRTUAL_FLYING_CIVILIAN 0x04000000 +#define DIAXIS_FLYINGC_BANK 0x04008A01 /* Roll ship left / right */ +#define DIAXIS_FLYINGC_PITCH 0x04010A02 /* Nose up / down */ +#define DIAXIS_FLYINGC_THROTTLE 0x04039203 /* Throttle */ +#define DIBUTTON_FLYINGC_VIEW 0x04002401 /* Cycle through view options */ +#define DIBUTTON_FLYINGC_DISPLAY 0x04002402 /* Select next dashboard / heads up display option */ +#define DIBUTTON_FLYINGC_GEAR 0x04002C03 /* Gear up / down */ +#define DIBUTTON_FLYINGC_MENU 0x040004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_FLYINGC_GLANCE 0x04004601 /* Look around */ +#define DIAXIS_FLYINGC_BRAKE 0x04046A04 /* Apply Brake */ +#define DIAXIS_FLYINGC_RUDDER 0x04025205 /* Yaw ship left/right */ +#define DIAXIS_FLYINGC_FLAPS 0x04055A06 /* Flaps */ +#define DIBUTTON_FLYINGC_FLAPSUP 0x04006404 /* Increment stepping up until fully retracted */ +#define DIBUTTON_FLYINGC_FLAPSDOWN 0x04006405 /* Decrement stepping down until fully extended */ +#define DIBUTTON_FLYINGC_BRAKE_LINK 0x04046CE0 /* Fallback brake button */ +#define DIBUTTON_FLYINGC_FASTER_LINK 0x0403D4E0 /* Fallback throttle up button */ +#define DIBUTTON_FLYINGC_SLOWER_LINK 0x0403D4E8 /* Fallback throttle down button */ +#define DIBUTTON_FLYINGC_GLANCE_LEFT_LINK 0x0407C4E4 /* Fallback Glance Left button */ +#define DIBUTTON_FLYINGC_GLANCE_RIGHT_LINK 0x0407C4EC /* Fallback Glance Right button */ +#define DIBUTTON_FLYINGC_GLANCE_UP_LINK 0x0407C4E0 /* Fallback Glance Up button */ +#define DIBUTTON_FLYINGC_GLANCE_DOWN_LINK 0x0407C4E8 /* Fallback Glance Down button */ +#define DIBUTTON_FLYINGC_DEVICE 0x040044FE /* Show input device and controls */ +#define DIBUTTON_FLYINGC_PAUSE 0x040044FC /* Start / Pause / Restart game */ + +/*--- Flight Simulator - Military + Aerial combat is the primary objective ---*/ +#define DIVIRTUAL_FLYING_MILITARY 0x05000000 +#define DIAXIS_FLYINGM_BANK 0x05008A01 /* Bank - Roll ship left / right */ +#define DIAXIS_FLYINGM_PITCH 0x05010A02 /* Pitch - Nose up / down */ +#define DIAXIS_FLYINGM_THROTTLE 0x05039203 /* Throttle - faster / slower */ +#define DIBUTTON_FLYINGM_FIRE 0x05000C01 /* Fire */ +#define DIBUTTON_FLYINGM_WEAPONS 0x05000C02 /* Select next weapon */ +#define DIBUTTON_FLYINGM_TARGET 0x05000C03 /* Selects next available target */ +#define DIBUTTON_FLYINGM_MENU 0x050004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_FLYINGM_GLANCE 0x05004601 /* Look around */ +#define DIBUTTON_FLYINGM_COUNTER 0x05005C04 /* Activate counter measures */ +#define DIAXIS_FLYINGM_RUDDER 0x05024A04 /* Rudder - Yaw ship left/right */ +#define DIAXIS_FLYINGM_BRAKE 0x05046205 /* Brake-axis */ +#define DIBUTTON_FLYINGM_VIEW 0x05006405 /* Cycle through view options */ +#define DIBUTTON_FLYINGM_DISPLAY 0x05006406 /* Select next dashboard option */ +#define DIAXIS_FLYINGM_FLAPS 0x05055206 /* Flaps */ +#define DIBUTTON_FLYINGM_FLAPSUP 0x05005407 /* Increment stepping up until fully retracted */ +#define DIBUTTON_FLYINGM_FLAPSDOWN 0x05005408 /* Decrement stepping down until fully extended */ +#define DIBUTTON_FLYINGM_FIRESECONDARY 0x05004C09 /* Alternative fire button */ +#define DIBUTTON_FLYINGM_GEAR 0x0500640A /* Gear up / down */ +#define DIBUTTON_FLYINGM_BRAKE_LINK 0x050464E0 /* Fallback brake button */ +#define DIBUTTON_FLYINGM_FASTER_LINK 0x0503D4E0 /* Fallback throttle up button */ +#define DIBUTTON_FLYINGM_SLOWER_LINK 0x0503D4E8 /* Fallback throttle down button */ +#define DIBUTTON_FLYINGM_GLANCE_LEFT_LINK 0x0507C4E4 /* Fallback Glance Left button */ +#define DIBUTTON_FLYINGM_GLANCE_RIGHT_LINK 0x0507C4EC /* Fallback Glance Right button */ +#define DIBUTTON_FLYINGM_GLANCE_UP_LINK 0x0507C4E0 /* Fallback Glance Up button */ +#define DIBUTTON_FLYINGM_GLANCE_DOWN_LINK 0x0507C4E8 /* Fallback Glance Down button */ +#define DIBUTTON_FLYINGM_DEVICE 0x050044FE /* Show input device and controls */ +#define DIBUTTON_FLYINGM_PAUSE 0x050044FC /* Start / Pause / Restart game */ + +/*--- Flight Simulator - Combat Helicopter + Combat from helicopter is primary objective ---*/ +#define DIVIRTUAL_FLYING_HELICOPTER 0x06000000 +#define DIAXIS_FLYINGH_BANK 0x06008A01 /* Bank - Roll ship left / right */ +#define DIAXIS_FLYINGH_PITCH 0x06010A02 /* Pitch - Nose up / down */ +#define DIAXIS_FLYINGH_COLLECTIVE 0x06018A03 /* Collective - Blade pitch/power */ +#define DIBUTTON_FLYINGH_FIRE 0x06001401 /* Fire */ +#define DIBUTTON_FLYINGH_WEAPONS 0x06001402 /* Select next weapon */ +#define DIBUTTON_FLYINGH_TARGET 0x06001403 /* Selects next available target */ +#define DIBUTTON_FLYINGH_MENU 0x060004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_FLYINGH_GLANCE 0x06004601 /* Look around */ +#define DIAXIS_FLYINGH_TORQUE 0x06025A04 /* Torque - Rotate ship around left / right axis */ +#define DIAXIS_FLYINGH_THROTTLE 0x0603DA05 /* Throttle */ +#define DIBUTTON_FLYINGH_COUNTER 0x06005404 /* Activate counter measures */ +#define DIBUTTON_FLYINGH_VIEW 0x06006405 /* Cycle through view options */ +#define DIBUTTON_FLYINGH_GEAR 0x06006406 /* Gear up / down */ +#define DIBUTTON_FLYINGH_FIRESECONDARY 0x06004C07 /* Alternative fire button */ +#define DIBUTTON_FLYINGH_FASTER_LINK 0x0603DCE0 /* Fallback throttle up button */ +#define DIBUTTON_FLYINGH_SLOWER_LINK 0x0603DCE8 /* Fallback throttle down button */ +#define DIBUTTON_FLYINGH_GLANCE_LEFT_LINK 0x0607C4E4 /* Fallback Glance Left button */ +#define DIBUTTON_FLYINGH_GLANCE_RIGHT_LINK 0x0607C4EC /* Fallback Glance Right button */ +#define DIBUTTON_FLYINGH_GLANCE_UP_LINK 0x0607C4E0 /* Fallback Glance Up button */ +#define DIBUTTON_FLYINGH_GLANCE_DOWN_LINK 0x0607C4E8 /* Fallback Glance Down button */ +#define DIBUTTON_FLYINGH_DEVICE 0x060044FE /* Show input device and controls */ +#define DIBUTTON_FLYINGH_PAUSE 0x060044FC /* Start / Pause / Restart game */ + +/*--- Space Simulator - Combat + Space Simulator with weapons ---*/ +#define DIVIRTUAL_SPACESIM 0x07000000 +#define DIAXIS_SPACESIM_LATERAL 0x07008201 /* Move ship left / right */ +#define DIAXIS_SPACESIM_MOVE 0x07010202 /* Move ship forward/backward */ +#define DIAXIS_SPACESIM_THROTTLE 0x07038203 /* Throttle - Engine speed */ +#define DIBUTTON_SPACESIM_FIRE 0x07000401 /* Fire */ +#define DIBUTTON_SPACESIM_WEAPONS 0x07000402 /* Select next weapon */ +#define DIBUTTON_SPACESIM_TARGET 0x07000403 /* Selects next available target */ +#define DIBUTTON_SPACESIM_MENU 0x070004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_SPACESIM_GLANCE 0x07004601 /* Look around */ +#define DIAXIS_SPACESIM_CLIMB 0x0701C204 /* Climb - Pitch ship up/down */ +#define DIAXIS_SPACESIM_ROTATE 0x07024205 /* Rotate - Turn ship left/right */ +#define DIBUTTON_SPACESIM_VIEW 0x07004404 /* Cycle through view options */ +#define DIBUTTON_SPACESIM_DISPLAY 0x07004405 /* Select next dashboard / heads up display option */ +#define DIBUTTON_SPACESIM_RAISE 0x07004406 /* Raise ship while maintaining current pitch */ +#define DIBUTTON_SPACESIM_LOWER 0x07004407 /* Lower ship while maintaining current pitch */ +#define DIBUTTON_SPACESIM_GEAR 0x07004408 /* Gear up / down */ +#define DIBUTTON_SPACESIM_FIRESECONDARY 0x07004409 /* Alternative fire button */ +#define DIBUTTON_SPACESIM_LEFT_LINK 0x0700C4E4 /* Fallback move left button */ +#define DIBUTTON_SPACESIM_RIGHT_LINK 0x0700C4EC /* Fallback move right button */ +#define DIBUTTON_SPACESIM_FORWARD_LINK 0x070144E0 /* Fallback move forward button */ +#define DIBUTTON_SPACESIM_BACKWARD_LINK 0x070144E8 /* Fallback move backwards button */ +#define DIBUTTON_SPACESIM_FASTER_LINK 0x0703C4E0 /* Fallback throttle up button */ +#define DIBUTTON_SPACESIM_SLOWER_LINK 0x0703C4E8 /* Fallback throttle down button */ +#define DIBUTTON_SPACESIM_TURN_LEFT_LINK 0x070244E4 /* Fallback turn left button */ +#define DIBUTTON_SPACESIM_TURN_RIGHT_LINK 0x070244EC /* Fallback turn right button */ +#define DIBUTTON_SPACESIM_GLANCE_LEFT_LINK 0x0707C4E4 /* Fallback Glance Left button */ +#define DIBUTTON_SPACESIM_GLANCE_RIGHT_LINK 0x0707C4EC /* Fallback Glance Right button */ +#define DIBUTTON_SPACESIM_GLANCE_UP_LINK 0x0707C4E0 /* Fallback Glance Up button */ +#define DIBUTTON_SPACESIM_GLANCE_DOWN_LINK 0x0707C4E8 /* Fallback Glance Down button */ +#define DIBUTTON_SPACESIM_DEVICE 0x070044FE /* Show input device and controls */ +#define DIBUTTON_SPACESIM_PAUSE 0x070044FC /* Start / Pause / Restart game */ + +/*--- Fighting - First Person + Hand to Hand combat is primary objective ---*/ +#define DIVIRTUAL_FIGHTING_HAND2HAND 0x08000000 +#define DIAXIS_FIGHTINGH_LATERAL 0x08008201 /* Sidestep left/right */ +#define DIAXIS_FIGHTINGH_MOVE 0x08010202 /* Move forward/backward */ +#define DIBUTTON_FIGHTINGH_PUNCH 0x08000401 /* Punch */ +#define DIBUTTON_FIGHTINGH_KICK 0x08000402 /* Kick */ +#define DIBUTTON_FIGHTINGH_BLOCK 0x08000403 /* Block */ +#define DIBUTTON_FIGHTINGH_CROUCH 0x08000404 /* Crouch */ +#define DIBUTTON_FIGHTINGH_JUMP 0x08000405 /* Jump */ +#define DIBUTTON_FIGHTINGH_SPECIAL1 0x08000406 /* Apply first special move */ +#define DIBUTTON_FIGHTINGH_SPECIAL2 0x08000407 /* Apply second special move */ +#define DIBUTTON_FIGHTINGH_MENU 0x080004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_FIGHTINGH_SELECT 0x08004408 /* Select special move */ +#define DIHATSWITCH_FIGHTINGH_SLIDE 0x08004601 /* Look around */ +#define DIBUTTON_FIGHTINGH_DISPLAY 0x08004409 /* Shows next on-screen display option */ +#define DIAXIS_FIGHTINGH_ROTATE 0x08024203 /* Rotate - Turn body left/right */ +#define DIBUTTON_FIGHTINGH_DODGE 0x0800440A /* Dodge */ +#define DIBUTTON_FIGHTINGH_LEFT_LINK 0x0800C4E4 /* Fallback left sidestep button */ +#define DIBUTTON_FIGHTINGH_RIGHT_LINK 0x0800C4EC /* Fallback right sidestep button */ +#define DIBUTTON_FIGHTINGH_FORWARD_LINK 0x080144E0 /* Fallback forward button */ +#define DIBUTTON_FIGHTINGH_BACKWARD_LINK 0x080144E8 /* Fallback backward button */ +#define DIBUTTON_FIGHTINGH_DEVICE 0x080044FE /* Show input device and controls */ +#define DIBUTTON_FIGHTINGH_PAUSE 0x080044FC /* Start / Pause / Restart game */ + +/*--- Fighting - First Person Shooting + Navigation and combat are primary objectives ---*/ +#define DIVIRTUAL_FIGHTING_FPS 0x09000000 +#define DIAXIS_FPS_ROTATE 0x09008201 /* Rotate character left/right */ +#define DIAXIS_FPS_MOVE 0x09010202 /* Move forward/backward */ +#define DIBUTTON_FPS_FIRE 0x09000401 /* Fire */ +#define DIBUTTON_FPS_WEAPONS 0x09000402 /* Select next weapon */ +#define DIBUTTON_FPS_APPLY 0x09000403 /* Use item */ +#define DIBUTTON_FPS_SELECT 0x09000404 /* Select next inventory item */ +#define DIBUTTON_FPS_CROUCH 0x09000405 /* Crouch/ climb down/ swim down */ +#define DIBUTTON_FPS_JUMP 0x09000406 /* Jump/ climb up/ swim up */ +#define DIAXIS_FPS_LOOKUPDOWN 0x09018203 /* Look up / down */ +#define DIBUTTON_FPS_STRAFE 0x09000407 /* Enable strafing while active */ +#define DIBUTTON_FPS_MENU 0x090004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_FPS_GLANCE 0x09004601 /* Look around */ +#define DIBUTTON_FPS_DISPLAY 0x09004408 /* Shows next on-screen display option/ map */ +#define DIAXIS_FPS_SIDESTEP 0x09024204 /* Sidestep */ +#define DIBUTTON_FPS_DODGE 0x09004409 /* Dodge */ +#define DIBUTTON_FPS_GLANCEL 0x0900440A /* Glance Left */ +#define DIBUTTON_FPS_GLANCER 0x0900440B /* Glance Right */ +#define DIBUTTON_FPS_FIRESECONDARY 0x0900440C /* Alternative fire button */ +#define DIBUTTON_FPS_ROTATE_LEFT_LINK 0x0900C4E4 /* Fallback rotate left button */ +#define DIBUTTON_FPS_ROTATE_RIGHT_LINK 0x0900C4EC /* Fallback rotate right button */ +#define DIBUTTON_FPS_FORWARD_LINK 0x090144E0 /* Fallback forward button */ +#define DIBUTTON_FPS_BACKWARD_LINK 0x090144E8 /* Fallback backward button */ +#define DIBUTTON_FPS_GLANCE_UP_LINK 0x0901C4E0 /* Fallback look up button */ +#define DIBUTTON_FPS_GLANCE_DOWN_LINK 0x0901C4E8 /* Fallback look down button */ +#define DIBUTTON_FPS_STEP_LEFT_LINK 0x090244E4 /* Fallback step left button */ +#define DIBUTTON_FPS_STEP_RIGHT_LINK 0x090244EC /* Fallback step right button */ +#define DIBUTTON_FPS_DEVICE 0x090044FE /* Show input device and controls */ +#define DIBUTTON_FPS_PAUSE 0x090044FC /* Start / Pause / Restart game */ + +/*--- Fighting - Third Person action + Perspective of camera is behind the main character ---*/ +#define DIVIRTUAL_FIGHTING_THIRDPERSON 0x0A000000 +#define DIAXIS_TPS_TURN 0x0A020201 /* Turn left/right */ +#define DIAXIS_TPS_MOVE 0x0A010202 /* Move forward/backward */ +#define DIBUTTON_TPS_RUN 0x0A000401 /* Run or walk toggle switch */ +#define DIBUTTON_TPS_ACTION 0x0A000402 /* Action Button */ +#define DIBUTTON_TPS_SELECT 0x0A000403 /* Select next weapon */ +#define DIBUTTON_TPS_USE 0x0A000404 /* Use inventory item currently selected */ +#define DIBUTTON_TPS_JUMP 0x0A000405 /* Character Jumps */ +#define DIBUTTON_TPS_MENU 0x0A0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_TPS_GLANCE 0x0A004601 /* Look around */ +#define DIBUTTON_TPS_VIEW 0x0A004406 /* Select camera view */ +#define DIBUTTON_TPS_STEPLEFT 0x0A004407 /* Character takes a left step */ +#define DIBUTTON_TPS_STEPRIGHT 0x0A004408 /* Character takes a right step */ +#define DIAXIS_TPS_STEP 0x0A00C203 /* Character steps left/right */ +#define DIBUTTON_TPS_DODGE 0x0A004409 /* Character dodges or ducks */ +#define DIBUTTON_TPS_INVENTORY 0x0A00440A /* Cycle through inventory */ +#define DIBUTTON_TPS_TURN_LEFT_LINK 0x0A0244E4 /* Fallback turn left button */ +#define DIBUTTON_TPS_TURN_RIGHT_LINK 0x0A0244EC /* Fallback turn right button */ +#define DIBUTTON_TPS_FORWARD_LINK 0x0A0144E0 /* Fallback forward button */ +#define DIBUTTON_TPS_BACKWARD_LINK 0x0A0144E8 /* Fallback backward button */ +#define DIBUTTON_TPS_GLANCE_UP_LINK 0x0A07C4E0 /* Fallback look up button */ +#define DIBUTTON_TPS_GLANCE_DOWN_LINK 0x0A07C4E8 /* Fallback look down button */ +#define DIBUTTON_TPS_GLANCE_LEFT_LINK 0x0A07C4E4 /* Fallback glance up button */ +#define DIBUTTON_TPS_GLANCE_RIGHT_LINK 0x0A07C4EC /* Fallback glance right button */ +#define DIBUTTON_TPS_DEVICE 0x0A0044FE /* Show input device and controls */ +#define DIBUTTON_TPS_PAUSE 0x0A0044FC /* Start / Pause / Restart game */ + +/*--- Strategy - Role Playing + Navigation and problem solving are primary actions ---*/ +#define DIVIRTUAL_STRATEGY_ROLEPLAYING 0x0B000000 +#define DIAXIS_STRATEGYR_LATERAL 0x0B008201 /* sidestep - left/right */ +#define DIAXIS_STRATEGYR_MOVE 0x0B010202 /* move forward/backward */ +#define DIBUTTON_STRATEGYR_GET 0x0B000401 /* Acquire item */ +#define DIBUTTON_STRATEGYR_APPLY 0x0B000402 /* Use selected item */ +#define DIBUTTON_STRATEGYR_SELECT 0x0B000403 /* Select nextitem */ +#define DIBUTTON_STRATEGYR_ATTACK 0x0B000404 /* Attack */ +#define DIBUTTON_STRATEGYR_CAST 0x0B000405 /* Cast Spell */ +#define DIBUTTON_STRATEGYR_CROUCH 0x0B000406 /* Crouch */ +#define DIBUTTON_STRATEGYR_JUMP 0x0B000407 /* Jump */ +#define DIBUTTON_STRATEGYR_MENU 0x0B0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_STRATEGYR_GLANCE 0x0B004601 /* Look around */ +#define DIBUTTON_STRATEGYR_MAP 0x0B004408 /* Cycle through map options */ +#define DIBUTTON_STRATEGYR_DISPLAY 0x0B004409 /* Shows next on-screen display option */ +#define DIAXIS_STRATEGYR_ROTATE 0x0B024203 /* Turn body left/right */ +#define DIBUTTON_STRATEGYR_LEFT_LINK 0x0B00C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_STRATEGYR_RIGHT_LINK 0x0B00C4EC /* Fallback sidestep right button */ +#define DIBUTTON_STRATEGYR_FORWARD_LINK 0x0B0144E0 /* Fallback move forward button */ +#define DIBUTTON_STRATEGYR_BACK_LINK 0x0B0144E8 /* Fallback move backward button */ +#define DIBUTTON_STRATEGYR_ROTATE_LEFT_LINK 0x0B0244E4 /* Fallback turn body left button */ +#define DIBUTTON_STRATEGYR_ROTATE_RIGHT_LINK 0x0B0244EC /* Fallback turn body right button */ +#define DIBUTTON_STRATEGYR_DEVICE 0x0B0044FE /* Show input device and controls */ +#define DIBUTTON_STRATEGYR_PAUSE 0x0B0044FC /* Start / Pause / Restart game */ + +/*--- Strategy - Turn based + Navigation and problem solving are primary actions ---*/ +#define DIVIRTUAL_STRATEGY_TURN 0x0C000000 +#define DIAXIS_STRATEGYT_LATERAL 0x0C008201 /* Sidestep left/right */ +#define DIAXIS_STRATEGYT_MOVE 0x0C010202 /* Move forward/backwards */ +#define DIBUTTON_STRATEGYT_SELECT 0x0C000401 /* Select unit or object */ +#define DIBUTTON_STRATEGYT_INSTRUCT 0x0C000402 /* Cycle through instructions */ +#define DIBUTTON_STRATEGYT_APPLY 0x0C000403 /* Apply selected instruction */ +#define DIBUTTON_STRATEGYT_TEAM 0x0C000404 /* Select next team / cycle through all */ +#define DIBUTTON_STRATEGYT_TURN 0x0C000405 /* Indicate turn over */ +#define DIBUTTON_STRATEGYT_MENU 0x0C0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_STRATEGYT_ZOOM 0x0C004406 /* Zoom - in / out */ +#define DIBUTTON_STRATEGYT_MAP 0x0C004407 /* cycle through map options */ +#define DIBUTTON_STRATEGYT_DISPLAY 0x0C004408 /* shows next on-screen display options */ +#define DIBUTTON_STRATEGYT_LEFT_LINK 0x0C00C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_STRATEGYT_RIGHT_LINK 0x0C00C4EC /* Fallback sidestep right button */ +#define DIBUTTON_STRATEGYT_FORWARD_LINK 0x0C0144E0 /* Fallback move forward button */ +#define DIBUTTON_STRATEGYT_BACK_LINK 0x0C0144E8 /* Fallback move back button */ +#define DIBUTTON_STRATEGYT_DEVICE 0x0C0044FE /* Show input device and controls */ +#define DIBUTTON_STRATEGYT_PAUSE 0x0C0044FC /* Start / Pause / Restart game */ + +/*--- Sports - Hunting + Hunting ---*/ +#define DIVIRTUAL_SPORTS_HUNTING 0x0D000000 +#define DIAXIS_HUNTING_LATERAL 0x0D008201 /* sidestep left/right */ +#define DIAXIS_HUNTING_MOVE 0x0D010202 /* move forward/backwards */ +#define DIBUTTON_HUNTING_FIRE 0x0D000401 /* Fire selected weapon */ +#define DIBUTTON_HUNTING_AIM 0x0D000402 /* Select aim/move */ +#define DIBUTTON_HUNTING_WEAPON 0x0D000403 /* Select next weapon */ +#define DIBUTTON_HUNTING_BINOCULAR 0x0D000404 /* Look through Binoculars */ +#define DIBUTTON_HUNTING_CALL 0x0D000405 /* Make animal call */ +#define DIBUTTON_HUNTING_MAP 0x0D000406 /* View Map */ +#define DIBUTTON_HUNTING_SPECIAL 0x0D000407 /* Special game operation */ +#define DIBUTTON_HUNTING_MENU 0x0D0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_HUNTING_GLANCE 0x0D004601 /* Look around */ +#define DIBUTTON_HUNTING_DISPLAY 0x0D004408 /* show next on-screen display option */ +#define DIAXIS_HUNTING_ROTATE 0x0D024203 /* Turn body left/right */ +#define DIBUTTON_HUNTING_CROUCH 0x0D004409 /* Crouch/ Climb / Swim down */ +#define DIBUTTON_HUNTING_JUMP 0x0D00440A /* Jump/ Climb up / Swim up */ +#define DIBUTTON_HUNTING_FIRESECONDARY 0x0D00440B /* Alternative fire button */ +#define DIBUTTON_HUNTING_LEFT_LINK 0x0D00C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_HUNTING_RIGHT_LINK 0x0D00C4EC /* Fallback sidestep right button */ +#define DIBUTTON_HUNTING_FORWARD_LINK 0x0D0144E0 /* Fallback move forward button */ +#define DIBUTTON_HUNTING_BACK_LINK 0x0D0144E8 /* Fallback move back button */ +#define DIBUTTON_HUNTING_ROTATE_LEFT_LINK 0x0D0244E4 /* Fallback turn body left button */ +#define DIBUTTON_HUNTING_ROTATE_RIGHT_LINK 0x0D0244EC /* Fallback turn body right button */ +#define DIBUTTON_HUNTING_DEVICE 0x0D0044FE /* Show input device and controls */ +#define DIBUTTON_HUNTING_PAUSE 0x0D0044FC /* Start / Pause / Restart game */ + +/*--- Sports - Fishing + Catching Fish is primary objective ---*/ +#define DIVIRTUAL_SPORTS_FISHING 0x0E000000 +#define DIAXIS_FISHING_LATERAL 0x0E008201 /* sidestep left/right */ +#define DIAXIS_FISHING_MOVE 0x0E010202 /* move forward/backwards */ +#define DIBUTTON_FISHING_CAST 0x0E000401 /* Cast line */ +#define DIBUTTON_FISHING_TYPE 0x0E000402 /* Select cast type */ +#define DIBUTTON_FISHING_BINOCULAR 0x0E000403 /* Look through Binocular */ +#define DIBUTTON_FISHING_BAIT 0x0E000404 /* Select type of Bait */ +#define DIBUTTON_FISHING_MAP 0x0E000405 /* View Map */ +#define DIBUTTON_FISHING_MENU 0x0E0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_FISHING_GLANCE 0x0E004601 /* Look around */ +#define DIBUTTON_FISHING_DISPLAY 0x0E004406 /* Show next on-screen display option */ +#define DIAXIS_FISHING_ROTATE 0x0E024203 /* Turn character left / right */ +#define DIBUTTON_FISHING_CROUCH 0x0E004407 /* Crouch/ Climb / Swim down */ +#define DIBUTTON_FISHING_JUMP 0x0E004408 /* Jump/ Climb up / Swim up */ +#define DIBUTTON_FISHING_LEFT_LINK 0x0E00C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_FISHING_RIGHT_LINK 0x0E00C4EC /* Fallback sidestep right button */ +#define DIBUTTON_FISHING_FORWARD_LINK 0x0E0144E0 /* Fallback move forward button */ +#define DIBUTTON_FISHING_BACK_LINK 0x0E0144E8 /* Fallback move back button */ +#define DIBUTTON_FISHING_ROTATE_LEFT_LINK 0x0E0244E4 /* Fallback turn body left button */ +#define DIBUTTON_FISHING_ROTATE_RIGHT_LINK 0x0E0244EC /* Fallback turn body right button */ +#define DIBUTTON_FISHING_DEVICE 0x0E0044FE /* Show input device and controls */ +#define DIBUTTON_FISHING_PAUSE 0x0E0044FC /* Start / Pause / Restart game */ + +/*--- Sports - Baseball - Batting + Batter control is primary objective ---*/ +#define DIVIRTUAL_SPORTS_BASEBALL_BAT 0x0F000000 +#define DIAXIS_BASEBALLB_LATERAL 0x0F008201 /* Aim left / right */ +#define DIAXIS_BASEBALLB_MOVE 0x0F010202 /* Aim up / down */ +#define DIBUTTON_BASEBALLB_SELECT 0x0F000401 /* cycle through swing options */ +#define DIBUTTON_BASEBALLB_NORMAL 0x0F000402 /* normal swing */ +#define DIBUTTON_BASEBALLB_POWER 0x0F000403 /* swing for the fence */ +#define DIBUTTON_BASEBALLB_BUNT 0x0F000404 /* bunt */ +#define DIBUTTON_BASEBALLB_STEAL 0x0F000405 /* Base runner attempts to steal a base */ +#define DIBUTTON_BASEBALLB_BURST 0x0F000406 /* Base runner invokes burst of speed */ +#define DIBUTTON_BASEBALLB_SLIDE 0x0F000407 /* Base runner slides into base */ +#define DIBUTTON_BASEBALLB_CONTACT 0x0F000408 /* Contact swing */ +#define DIBUTTON_BASEBALLB_MENU 0x0F0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_BASEBALLB_NOSTEAL 0x0F004409 /* Base runner goes back to a base */ +#define DIBUTTON_BASEBALLB_BOX 0x0F00440A /* Enter or exit batting box */ +#define DIBUTTON_BASEBALLB_LEFT_LINK 0x0F00C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_BASEBALLB_RIGHT_LINK 0x0F00C4EC /* Fallback sidestep right button */ +#define DIBUTTON_BASEBALLB_FORWARD_LINK 0x0F0144E0 /* Fallback move forward button */ +#define DIBUTTON_BASEBALLB_BACK_LINK 0x0F0144E8 /* Fallback move back button */ +#define DIBUTTON_BASEBALLB_DEVICE 0x0F0044FE /* Show input device and controls */ +#define DIBUTTON_BASEBALLB_PAUSE 0x0F0044FC /* Start / Pause / Restart game */ + +/*--- Sports - Baseball - Pitching + Pitcher control is primary objective ---*/ +#define DIVIRTUAL_SPORTS_BASEBALL_PITCH 0x10000000 +#define DIAXIS_BASEBALLP_LATERAL 0x10008201 /* Aim left / right */ +#define DIAXIS_BASEBALLP_MOVE 0x10010202 /* Aim up / down */ +#define DIBUTTON_BASEBALLP_SELECT 0x10000401 /* cycle through pitch selections */ +#define DIBUTTON_BASEBALLP_PITCH 0x10000402 /* throw pitch */ +#define DIBUTTON_BASEBALLP_BASE 0x10000403 /* select base to throw to */ +#define DIBUTTON_BASEBALLP_THROW 0x10000404 /* throw to base */ +#define DIBUTTON_BASEBALLP_FAKE 0x10000405 /* Fake a throw to a base */ +#define DIBUTTON_BASEBALLP_MENU 0x100004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_BASEBALLP_WALK 0x10004406 /* Throw intentional walk / pitch out */ +#define DIBUTTON_BASEBALLP_LOOK 0x10004407 /* Look at runners on bases */ +#define DIBUTTON_BASEBALLP_LEFT_LINK 0x1000C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_BASEBALLP_RIGHT_LINK 0x1000C4EC /* Fallback sidestep right button */ +#define DIBUTTON_BASEBALLP_FORWARD_LINK 0x100144E0 /* Fallback move forward button */ +#define DIBUTTON_BASEBALLP_BACK_LINK 0x100144E8 /* Fallback move back button */ +#define DIBUTTON_BASEBALLP_DEVICE 0x100044FE /* Show input device and controls */ +#define DIBUTTON_BASEBALLP_PAUSE 0x100044FC /* Start / Pause / Restart game */ + +/*--- Sports - Baseball - Fielding + Fielder control is primary objective ---*/ +#define DIVIRTUAL_SPORTS_BASEBALL_FIELD 0x11000000 +#define DIAXIS_BASEBALLF_LATERAL 0x11008201 /* Aim left / right */ +#define DIAXIS_BASEBALLF_MOVE 0x11010202 /* Aim up / down */ +#define DIBUTTON_BASEBALLF_NEAREST 0x11000401 /* Switch to fielder nearest to the ball */ +#define DIBUTTON_BASEBALLF_THROW1 0x11000402 /* Make conservative throw */ +#define DIBUTTON_BASEBALLF_THROW2 0x11000403 /* Make aggressive throw */ +#define DIBUTTON_BASEBALLF_BURST 0x11000404 /* Invoke burst of speed */ +#define DIBUTTON_BASEBALLF_JUMP 0x11000405 /* Jump to catch ball */ +#define DIBUTTON_BASEBALLF_DIVE 0x11000406 /* Dive to catch ball */ +#define DIBUTTON_BASEBALLF_MENU 0x110004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_BASEBALLF_SHIFTIN 0x11004407 /* Shift the infield positioning */ +#define DIBUTTON_BASEBALLF_SHIFTOUT 0x11004408 /* Shift the outfield positioning */ +#define DIBUTTON_BASEBALLF_AIM_LEFT_LINK 0x1100C4E4 /* Fallback aim left button */ +#define DIBUTTON_BASEBALLF_AIM_RIGHT_LINK 0x1100C4EC /* Fallback aim right button */ +#define DIBUTTON_BASEBALLF_FORWARD_LINK 0x110144E0 /* Fallback move forward button */ +#define DIBUTTON_BASEBALLF_BACK_LINK 0x110144E8 /* Fallback move back button */ +#define DIBUTTON_BASEBALLF_DEVICE 0x110044FE /* Show input device and controls */ +#define DIBUTTON_BASEBALLF_PAUSE 0x110044FC /* Start / Pause / Restart game */ + +/*--- Sports - Basketball - Offense + Offense ---*/ +#define DIVIRTUAL_SPORTS_BASKETBALL_OFFENSE 0x12000000 +#define DIAXIS_BBALLO_LATERAL 0x12008201 /* left / right */ +#define DIAXIS_BBALLO_MOVE 0x12010202 /* up / down */ +#define DIBUTTON_BBALLO_SHOOT 0x12000401 /* shoot basket */ +#define DIBUTTON_BBALLO_DUNK 0x12000402 /* dunk basket */ +#define DIBUTTON_BBALLO_PASS 0x12000403 /* throw pass */ +#define DIBUTTON_BBALLO_FAKE 0x12000404 /* fake shot or pass */ +#define DIBUTTON_BBALLO_SPECIAL 0x12000405 /* apply special move */ +#define DIBUTTON_BBALLO_PLAYER 0x12000406 /* select next player */ +#define DIBUTTON_BBALLO_BURST 0x12000407 /* invoke burst */ +#define DIBUTTON_BBALLO_CALL 0x12000408 /* call for ball / pass to me */ +#define DIBUTTON_BBALLO_MENU 0x120004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_BBALLO_GLANCE 0x12004601 /* scroll view */ +#define DIBUTTON_BBALLO_SCREEN 0x12004409 /* Call for screen */ +#define DIBUTTON_BBALLO_PLAY 0x1200440A /* Call for specific offensive play */ +#define DIBUTTON_BBALLO_JAB 0x1200440B /* Initiate fake drive to basket */ +#define DIBUTTON_BBALLO_POST 0x1200440C /* Perform post move */ +#define DIBUTTON_BBALLO_TIMEOUT 0x1200440D /* Time Out */ +#define DIBUTTON_BBALLO_SUBSTITUTE 0x1200440E /* substitute one player for another */ +#define DIBUTTON_BBALLO_LEFT_LINK 0x1200C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_BBALLO_RIGHT_LINK 0x1200C4EC /* Fallback sidestep right button */ +#define DIBUTTON_BBALLO_FORWARD_LINK 0x120144E0 /* Fallback move forward button */ +#define DIBUTTON_BBALLO_BACK_LINK 0x120144E8 /* Fallback move back button */ +#define DIBUTTON_BBALLO_DEVICE 0x120044FE /* Show input device and controls */ +#define DIBUTTON_BBALLO_PAUSE 0x120044FC /* Start / Pause / Restart game */ + +/*--- Sports - Basketball - Defense + Defense ---*/ +#define DIVIRTUAL_SPORTS_BASKETBALL_DEFENSE 0x13000000 +#define DIAXIS_BBALLD_LATERAL 0x13008201 /* left / right */ +#define DIAXIS_BBALLD_MOVE 0x13010202 /* up / down */ +#define DIBUTTON_BBALLD_JUMP 0x13000401 /* jump to block shot */ +#define DIBUTTON_BBALLD_STEAL 0x13000402 /* attempt to steal ball */ +#define DIBUTTON_BBALLD_FAKE 0x13000403 /* fake block or steal */ +#define DIBUTTON_BBALLD_SPECIAL 0x13000404 /* apply special move */ +#define DIBUTTON_BBALLD_PLAYER 0x13000405 /* select next player */ +#define DIBUTTON_BBALLD_BURST 0x13000406 /* invoke burst */ +#define DIBUTTON_BBALLD_PLAY 0x13000407 /* call for specific defensive play */ +#define DIBUTTON_BBALLD_MENU 0x130004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_BBALLD_GLANCE 0x13004601 /* scroll view */ +#define DIBUTTON_BBALLD_TIMEOUT 0x13004408 /* Time Out */ +#define DIBUTTON_BBALLD_SUBSTITUTE 0x13004409 /* substitute one player for another */ +#define DIBUTTON_BBALLD_LEFT_LINK 0x1300C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_BBALLD_RIGHT_LINK 0x1300C4EC /* Fallback sidestep right button */ +#define DIBUTTON_BBALLD_FORWARD_LINK 0x130144E0 /* Fallback move forward button */ +#define DIBUTTON_BBALLD_BACK_LINK 0x130144E8 /* Fallback move back button */ +#define DIBUTTON_BBALLD_DEVICE 0x130044FE /* Show input device and controls */ +#define DIBUTTON_BBALLD_PAUSE 0x130044FC /* Start / Pause / Restart game */ + +/*--- Sports - Football - Play + Play selection ---*/ +#define DIVIRTUAL_SPORTS_FOOTBALL_FIELD 0x14000000 +#define DIBUTTON_FOOTBALLP_PLAY 0x14000401 /* cycle through available plays */ +#define DIBUTTON_FOOTBALLP_SELECT 0x14000402 /* select play */ +#define DIBUTTON_FOOTBALLP_HELP 0x14000403 /* Bring up pop-up help */ +#define DIBUTTON_FOOTBALLP_MENU 0x140004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_FOOTBALLP_DEVICE 0x140044FE /* Show input device and controls */ +#define DIBUTTON_FOOTBALLP_PAUSE 0x140044FC /* Start / Pause / Restart game */ + +/*--- Sports - Football - QB + Offense: Quarterback / Kicker ---*/ +#define DIVIRTUAL_SPORTS_FOOTBALL_QBCK 0x15000000 +#define DIAXIS_FOOTBALLQ_LATERAL 0x15008201 /* Move / Aim: left / right */ +#define DIAXIS_FOOTBALLQ_MOVE 0x15010202 /* Move / Aim: up / down */ +#define DIBUTTON_FOOTBALLQ_SELECT 0x15000401 /* Select */ +#define DIBUTTON_FOOTBALLQ_SNAP 0x15000402 /* snap ball - start play */ +#define DIBUTTON_FOOTBALLQ_JUMP 0x15000403 /* jump over defender */ +#define DIBUTTON_FOOTBALLQ_SLIDE 0x15000404 /* Dive/Slide */ +#define DIBUTTON_FOOTBALLQ_PASS 0x15000405 /* throws pass to receiver */ +#define DIBUTTON_FOOTBALLQ_FAKE 0x15000406 /* pump fake pass or fake kick */ +#define DIBUTTON_FOOTBALLQ_MENU 0x150004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_FOOTBALLQ_FAKESNAP 0x15004407 /* Fake snap */ +#define DIBUTTON_FOOTBALLQ_MOTION 0x15004408 /* Send receivers in motion */ +#define DIBUTTON_FOOTBALLQ_AUDIBLE 0x15004409 /* Change offensive play at line of scrimmage */ +#define DIBUTTON_FOOTBALLQ_LEFT_LINK 0x1500C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_FOOTBALLQ_RIGHT_LINK 0x1500C4EC /* Fallback sidestep right button */ +#define DIBUTTON_FOOTBALLQ_FORWARD_LINK 0x150144E0 /* Fallback move forward button */ +#define DIBUTTON_FOOTBALLQ_BACK_LINK 0x150144E8 /* Fallback move back button */ +#define DIBUTTON_FOOTBALLQ_DEVICE 0x150044FE /* Show input device and controls */ +#define DIBUTTON_FOOTBALLQ_PAUSE 0x150044FC /* Start / Pause / Restart game */ + +/*--- Sports - Football - Offense + Offense - Runner ---*/ +#define DIVIRTUAL_SPORTS_FOOTBALL_OFFENSE 0x16000000 +#define DIAXIS_FOOTBALLO_LATERAL 0x16008201 /* Move / Aim: left / right */ +#define DIAXIS_FOOTBALLO_MOVE 0x16010202 /* Move / Aim: up / down */ +#define DIBUTTON_FOOTBALLO_JUMP 0x16000401 /* jump or hurdle over defender */ +#define DIBUTTON_FOOTBALLO_LEFTARM 0x16000402 /* holds out left arm */ +#define DIBUTTON_FOOTBALLO_RIGHTARM 0x16000403 /* holds out right arm */ +#define DIBUTTON_FOOTBALLO_THROW 0x16000404 /* throw pass or lateral ball to another runner */ +#define DIBUTTON_FOOTBALLO_SPIN 0x16000405 /* Spin to avoid defenders */ +#define DIBUTTON_FOOTBALLO_MENU 0x160004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_FOOTBALLO_JUKE 0x16004406 /* Use special move to avoid defenders */ +#define DIBUTTON_FOOTBALLO_SHOULDER 0x16004407 /* Lower shoulder to run over defenders */ +#define DIBUTTON_FOOTBALLO_TURBO 0x16004408 /* Speed burst past defenders */ +#define DIBUTTON_FOOTBALLO_DIVE 0x16004409 /* Dive over defenders */ +#define DIBUTTON_FOOTBALLO_ZOOM 0x1600440A /* Zoom view in / out */ +#define DIBUTTON_FOOTBALLO_SUBSTITUTE 0x1600440B /* substitute one player for another */ +#define DIBUTTON_FOOTBALLO_LEFT_LINK 0x1600C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_FOOTBALLO_RIGHT_LINK 0x1600C4EC /* Fallback sidestep right button */ +#define DIBUTTON_FOOTBALLO_FORWARD_LINK 0x160144E0 /* Fallback move forward button */ +#define DIBUTTON_FOOTBALLO_BACK_LINK 0x160144E8 /* Fallback move back button */ +#define DIBUTTON_FOOTBALLO_DEVICE 0x160044FE /* Show input device and controls */ +#define DIBUTTON_FOOTBALLO_PAUSE 0x160044FC /* Start / Pause / Restart game */ + +/*--- Sports - Football - Defense + Defense ---*/ +#define DIVIRTUAL_SPORTS_FOOTBALL_DEFENSE 0x17000000 +#define DIAXIS_FOOTBALLD_LATERAL 0x17008201 /* Move / Aim: left / right */ +#define DIAXIS_FOOTBALLD_MOVE 0x17010202 /* Move / Aim: up / down */ +#define DIBUTTON_FOOTBALLD_PLAY 0x17000401 /* cycle through available plays */ +#define DIBUTTON_FOOTBALLD_SELECT 0x17000402 /* select player closest to the ball */ +#define DIBUTTON_FOOTBALLD_JUMP 0x17000403 /* jump to intercept or block */ +#define DIBUTTON_FOOTBALLD_TACKLE 0x17000404 /* tackler runner */ +#define DIBUTTON_FOOTBALLD_FAKE 0x17000405 /* hold down to fake tackle or intercept */ +#define DIBUTTON_FOOTBALLD_SUPERTACKLE 0x17000406 /* Initiate special tackle */ +#define DIBUTTON_FOOTBALLD_MENU 0x170004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_FOOTBALLD_SPIN 0x17004407 /* Spin to beat offensive line */ +#define DIBUTTON_FOOTBALLD_SWIM 0x17004408 /* Swim to beat the offensive line */ +#define DIBUTTON_FOOTBALLD_BULLRUSH 0x17004409 /* Bull rush the offensive line */ +#define DIBUTTON_FOOTBALLD_RIP 0x1700440A /* Rip the offensive line */ +#define DIBUTTON_FOOTBALLD_AUDIBLE 0x1700440B /* Change defensive play at the line of scrimmage */ +#define DIBUTTON_FOOTBALLD_ZOOM 0x1700440C /* Zoom view in / out */ +#define DIBUTTON_FOOTBALLD_SUBSTITUTE 0x1700440D /* substitute one player for another */ +#define DIBUTTON_FOOTBALLD_LEFT_LINK 0x1700C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_FOOTBALLD_RIGHT_LINK 0x1700C4EC /* Fallback sidestep right button */ +#define DIBUTTON_FOOTBALLD_FORWARD_LINK 0x170144E0 /* Fallback move forward button */ +#define DIBUTTON_FOOTBALLD_BACK_LINK 0x170144E8 /* Fallback move back button */ +#define DIBUTTON_FOOTBALLD_DEVICE 0x170044FE /* Show input device and controls */ +#define DIBUTTON_FOOTBALLD_PAUSE 0x170044FC /* Start / Pause / Restart game */ + +/*--- Sports - Golf + ---*/ +#define DIVIRTUAL_SPORTS_GOLF 0x18000000 +#define DIAXIS_GOLF_LATERAL 0x18008201 /* Move / Aim: left / right */ +#define DIAXIS_GOLF_MOVE 0x18010202 /* Move / Aim: up / down */ +#define DIBUTTON_GOLF_SWING 0x18000401 /* swing club */ +#define DIBUTTON_GOLF_SELECT 0x18000402 /* cycle between: club / swing strength / ball arc / ball spin */ +#define DIBUTTON_GOLF_UP 0x18000403 /* increase selection */ +#define DIBUTTON_GOLF_DOWN 0x18000404 /* decrease selection */ +#define DIBUTTON_GOLF_TERRAIN 0x18000405 /* shows terrain detail */ +#define DIBUTTON_GOLF_FLYBY 0x18000406 /* view the hole via a flyby */ +#define DIBUTTON_GOLF_MENU 0x180004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_GOLF_SCROLL 0x18004601 /* scroll view */ +#define DIBUTTON_GOLF_ZOOM 0x18004407 /* Zoom view in / out */ +#define DIBUTTON_GOLF_TIMEOUT 0x18004408 /* Call for time out */ +#define DIBUTTON_GOLF_SUBSTITUTE 0x18004409 /* substitute one player for another */ +#define DIBUTTON_GOLF_LEFT_LINK 0x1800C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_GOLF_RIGHT_LINK 0x1800C4EC /* Fallback sidestep right button */ +#define DIBUTTON_GOLF_FORWARD_LINK 0x180144E0 /* Fallback move forward button */ +#define DIBUTTON_GOLF_BACK_LINK 0x180144E8 /* Fallback move back button */ +#define DIBUTTON_GOLF_DEVICE 0x180044FE /* Show input device and controls */ +#define DIBUTTON_GOLF_PAUSE 0x180044FC /* Start / Pause / Restart game */ + +/*--- Sports - Hockey - Offense + Offense ---*/ +#define DIVIRTUAL_SPORTS_HOCKEY_OFFENSE 0x19000000 +#define DIAXIS_HOCKEYO_LATERAL 0x19008201 /* Move / Aim: left / right */ +#define DIAXIS_HOCKEYO_MOVE 0x19010202 /* Move / Aim: up / down */ +#define DIBUTTON_HOCKEYO_SHOOT 0x19000401 /* Shoot */ +#define DIBUTTON_HOCKEYO_PASS 0x19000402 /* pass the puck */ +#define DIBUTTON_HOCKEYO_BURST 0x19000403 /* invoke speed burst */ +#define DIBUTTON_HOCKEYO_SPECIAL 0x19000404 /* invoke special move */ +#define DIBUTTON_HOCKEYO_FAKE 0x19000405 /* hold down to fake pass or kick */ +#define DIBUTTON_HOCKEYO_MENU 0x190004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_HOCKEYO_SCROLL 0x19004601 /* scroll view */ +#define DIBUTTON_HOCKEYO_ZOOM 0x19004406 /* Zoom view in / out */ +#define DIBUTTON_HOCKEYO_STRATEGY 0x19004407 /* Invoke coaching menu for strategy help */ +#define DIBUTTON_HOCKEYO_TIMEOUT 0x19004408 /* Call for time out */ +#define DIBUTTON_HOCKEYO_SUBSTITUTE 0x19004409 /* substitute one player for another */ +#define DIBUTTON_HOCKEYO_LEFT_LINK 0x1900C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_HOCKEYO_RIGHT_LINK 0x1900C4EC /* Fallback sidestep right button */ +#define DIBUTTON_HOCKEYO_FORWARD_LINK 0x190144E0 /* Fallback move forward button */ +#define DIBUTTON_HOCKEYO_BACK_LINK 0x190144E8 /* Fallback move back button */ +#define DIBUTTON_HOCKEYO_DEVICE 0x190044FE /* Show input device and controls */ +#define DIBUTTON_HOCKEYO_PAUSE 0x190044FC /* Start / Pause / Restart game */ + +/*--- Sports - Hockey - Defense + Defense ---*/ +#define DIVIRTUAL_SPORTS_HOCKEY_DEFENSE 0x1A000000 +#define DIAXIS_HOCKEYD_LATERAL 0x1A008201 /* Move / Aim: left / right */ +#define DIAXIS_HOCKEYD_MOVE 0x1A010202 /* Move / Aim: up / down */ +#define DIBUTTON_HOCKEYD_PLAYER 0x1A000401 /* control player closest to the puck */ +#define DIBUTTON_HOCKEYD_STEAL 0x1A000402 /* attempt steal */ +#define DIBUTTON_HOCKEYD_BURST 0x1A000403 /* speed burst or body check */ +#define DIBUTTON_HOCKEYD_BLOCK 0x1A000404 /* block puck */ +#define DIBUTTON_HOCKEYD_FAKE 0x1A000405 /* hold down to fake tackle or intercept */ +#define DIBUTTON_HOCKEYD_MENU 0x1A0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_HOCKEYD_SCROLL 0x1A004601 /* scroll view */ +#define DIBUTTON_HOCKEYD_ZOOM 0x1A004406 /* Zoom view in / out */ +#define DIBUTTON_HOCKEYD_STRATEGY 0x1A004407 /* Invoke coaching menu for strategy help */ +#define DIBUTTON_HOCKEYD_TIMEOUT 0x1A004408 /* Call for time out */ +#define DIBUTTON_HOCKEYD_SUBSTITUTE 0x1A004409 /* substitute one player for another */ +#define DIBUTTON_HOCKEYD_LEFT_LINK 0x1A00C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_HOCKEYD_RIGHT_LINK 0x1A00C4EC /* Fallback sidestep right button */ +#define DIBUTTON_HOCKEYD_FORWARD_LINK 0x1A0144E0 /* Fallback move forward button */ +#define DIBUTTON_HOCKEYD_BACK_LINK 0x1A0144E8 /* Fallback move back button */ +#define DIBUTTON_HOCKEYD_DEVICE 0x1A0044FE /* Show input device and controls */ +#define DIBUTTON_HOCKEYD_PAUSE 0x1A0044FC /* Start / Pause / Restart game */ + +/*--- Sports - Hockey - Goalie + Goal tending ---*/ +#define DIVIRTUAL_SPORTS_HOCKEY_GOALIE 0x1B000000 +#define DIAXIS_HOCKEYG_LATERAL 0x1B008201 /* Move / Aim: left / right */ +#define DIAXIS_HOCKEYG_MOVE 0x1B010202 /* Move / Aim: up / down */ +#define DIBUTTON_HOCKEYG_PASS 0x1B000401 /* pass puck */ +#define DIBUTTON_HOCKEYG_POKE 0x1B000402 /* poke / check / hack */ +#define DIBUTTON_HOCKEYG_STEAL 0x1B000403 /* attempt steal */ +#define DIBUTTON_HOCKEYG_BLOCK 0x1B000404 /* block puck */ +#define DIBUTTON_HOCKEYG_MENU 0x1B0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_HOCKEYG_SCROLL 0x1B004601 /* scroll view */ +#define DIBUTTON_HOCKEYG_ZOOM 0x1B004405 /* Zoom view in / out */ +#define DIBUTTON_HOCKEYG_STRATEGY 0x1B004406 /* Invoke coaching menu for strategy help */ +#define DIBUTTON_HOCKEYG_TIMEOUT 0x1B004407 /* Call for time out */ +#define DIBUTTON_HOCKEYG_SUBSTITUTE 0x1B004408 /* substitute one player for another */ +#define DIBUTTON_HOCKEYG_LEFT_LINK 0x1B00C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_HOCKEYG_RIGHT_LINK 0x1B00C4EC /* Fallback sidestep right button */ +#define DIBUTTON_HOCKEYG_FORWARD_LINK 0x1B0144E0 /* Fallback move forward button */ +#define DIBUTTON_HOCKEYG_BACK_LINK 0x1B0144E8 /* Fallback move back button */ +#define DIBUTTON_HOCKEYG_DEVICE 0x1B0044FE /* Show input device and controls */ +#define DIBUTTON_HOCKEYG_PAUSE 0x1B0044FC /* Start / Pause / Restart game */ + +/*--- Sports - Mountain Biking + ---*/ +#define DIVIRTUAL_SPORTS_BIKING_MOUNTAIN 0x1C000000 +#define DIAXIS_BIKINGM_TURN 0x1C008201 /* left / right */ +#define DIAXIS_BIKINGM_PEDAL 0x1C010202 /* Pedal faster / slower / brake */ +#define DIBUTTON_BIKINGM_JUMP 0x1C000401 /* jump over obstacle */ +#define DIBUTTON_BIKINGM_CAMERA 0x1C000402 /* switch camera view */ +#define DIBUTTON_BIKINGM_SPECIAL1 0x1C000403 /* perform first special move */ +#define DIBUTTON_BIKINGM_SELECT 0x1C000404 /* Select */ +#define DIBUTTON_BIKINGM_SPECIAL2 0x1C000405 /* perform second special move */ +#define DIBUTTON_BIKINGM_MENU 0x1C0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_BIKINGM_SCROLL 0x1C004601 /* scroll view */ +#define DIBUTTON_BIKINGM_ZOOM 0x1C004406 /* Zoom view in / out */ +#define DIAXIS_BIKINGM_BRAKE 0x1C044203 /* Brake axis */ +#define DIBUTTON_BIKINGM_LEFT_LINK 0x1C00C4E4 /* Fallback turn left button */ +#define DIBUTTON_BIKINGM_RIGHT_LINK 0x1C00C4EC /* Fallback turn right button */ +#define DIBUTTON_BIKINGM_FASTER_LINK 0x1C0144E0 /* Fallback pedal faster button */ +#define DIBUTTON_BIKINGM_SLOWER_LINK 0x1C0144E8 /* Fallback pedal slower button */ +#define DIBUTTON_BIKINGM_BRAKE_BUTTON_LINK 0x1C0444E8 /* Fallback brake button */ +#define DIBUTTON_BIKINGM_DEVICE 0x1C0044FE /* Show input device and controls */ +#define DIBUTTON_BIKINGM_PAUSE 0x1C0044FC /* Start / Pause / Restart game */ + +/*--- Sports: Skiing / Snowboarding / Skateboarding + ---*/ +#define DIVIRTUAL_SPORTS_SKIING 0x1D000000 +#define DIAXIS_SKIING_TURN 0x1D008201 /* left / right */ +#define DIAXIS_SKIING_SPEED 0x1D010202 /* faster / slower */ +#define DIBUTTON_SKIING_JUMP 0x1D000401 /* Jump */ +#define DIBUTTON_SKIING_CROUCH 0x1D000402 /* crouch down */ +#define DIBUTTON_SKIING_CAMERA 0x1D000403 /* switch camera view */ +#define DIBUTTON_SKIING_SPECIAL1 0x1D000404 /* perform first special move */ +#define DIBUTTON_SKIING_SELECT 0x1D000405 /* Select */ +#define DIBUTTON_SKIING_SPECIAL2 0x1D000406 /* perform second special move */ +#define DIBUTTON_SKIING_MENU 0x1D0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_SKIING_GLANCE 0x1D004601 /* scroll view */ +#define DIBUTTON_SKIING_ZOOM 0x1D004407 /* Zoom view in / out */ +#define DIBUTTON_SKIING_LEFT_LINK 0x1D00C4E4 /* Fallback turn left button */ +#define DIBUTTON_SKIING_RIGHT_LINK 0x1D00C4EC /* Fallback turn right button */ +#define DIBUTTON_SKIING_FASTER_LINK 0x1D0144E0 /* Fallback increase speed button */ +#define DIBUTTON_SKIING_SLOWER_LINK 0x1D0144E8 /* Fallback decrease speed button */ +#define DIBUTTON_SKIING_DEVICE 0x1D0044FE /* Show input device and controls */ +#define DIBUTTON_SKIING_PAUSE 0x1D0044FC /* Start / Pause / Restart game */ + +/*--- Sports - Soccer - Offense + Offense ---*/ +#define DIVIRTUAL_SPORTS_SOCCER_OFFENSE 0x1E000000 +#define DIAXIS_SOCCERO_LATERAL 0x1E008201 /* Move / Aim: left / right */ +#define DIAXIS_SOCCERO_MOVE 0x1E010202 /* Move / Aim: up / down */ +#define DIAXIS_SOCCERO_BEND 0x1E018203 /* Bend to soccer shot/pass */ +#define DIBUTTON_SOCCERO_SHOOT 0x1E000401 /* Shoot the ball */ +#define DIBUTTON_SOCCERO_PASS 0x1E000402 /* Pass */ +#define DIBUTTON_SOCCERO_FAKE 0x1E000403 /* Fake */ +#define DIBUTTON_SOCCERO_PLAYER 0x1E000404 /* Select next player */ +#define DIBUTTON_SOCCERO_SPECIAL1 0x1E000405 /* Apply special move */ +#define DIBUTTON_SOCCERO_SELECT 0x1E000406 /* Select special move */ +#define DIBUTTON_SOCCERO_MENU 0x1E0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_SOCCERO_GLANCE 0x1E004601 /* scroll view */ +#define DIBUTTON_SOCCERO_SUBSTITUTE 0x1E004407 /* Substitute one player for another */ +#define DIBUTTON_SOCCERO_SHOOTLOW 0x1E004408 /* Shoot the ball low */ +#define DIBUTTON_SOCCERO_SHOOTHIGH 0x1E004409 /* Shoot the ball high */ +#define DIBUTTON_SOCCERO_PASSTHRU 0x1E00440A /* Make a thru pass */ +#define DIBUTTON_SOCCERO_SPRINT 0x1E00440B /* Sprint / turbo boost */ +#define DIBUTTON_SOCCERO_CONTROL 0x1E00440C /* Obtain control of the ball */ +#define DIBUTTON_SOCCERO_HEAD 0x1E00440D /* Attempt to head the ball */ +#define DIBUTTON_SOCCERO_LEFT_LINK 0x1E00C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_SOCCERO_RIGHT_LINK 0x1E00C4EC /* Fallback sidestep right button */ +#define DIBUTTON_SOCCERO_FORWARD_LINK 0x1E0144E0 /* Fallback move forward button */ +#define DIBUTTON_SOCCERO_BACK_LINK 0x1E0144E8 /* Fallback move back button */ +#define DIBUTTON_SOCCERO_DEVICE 0x1E0044FE /* Show input device and controls */ +#define DIBUTTON_SOCCERO_PAUSE 0x1E0044FC /* Start / Pause / Restart game */ + +/*--- Sports - Soccer - Defense + Defense ---*/ +#define DIVIRTUAL_SPORTS_SOCCER_DEFENSE 0x1F000000 +#define DIAXIS_SOCCERD_LATERAL 0x1F008201 /* Move / Aim: left / right */ +#define DIAXIS_SOCCERD_MOVE 0x1F010202 /* Move / Aim: up / down */ +#define DIBUTTON_SOCCERD_BLOCK 0x1F000401 /* Attempt to block shot */ +#define DIBUTTON_SOCCERD_STEAL 0x1F000402 /* Attempt to steal ball */ +#define DIBUTTON_SOCCERD_FAKE 0x1F000403 /* Fake a block or a steal */ +#define DIBUTTON_SOCCERD_PLAYER 0x1F000404 /* Select next player */ +#define DIBUTTON_SOCCERD_SPECIAL 0x1F000405 /* Apply special move */ +#define DIBUTTON_SOCCERD_SELECT 0x1F000406 /* Select special move */ +#define DIBUTTON_SOCCERD_SLIDE 0x1F000407 /* Attempt a slide tackle */ +#define DIBUTTON_SOCCERD_MENU 0x1F0004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_SOCCERD_GLANCE 0x1F004601 /* scroll view */ +#define DIBUTTON_SOCCERD_FOUL 0x1F004408 /* Initiate a foul / hard-foul */ +#define DIBUTTON_SOCCERD_HEAD 0x1F004409 /* Attempt a Header */ +#define DIBUTTON_SOCCERD_CLEAR 0x1F00440A /* Attempt to clear the ball down the field */ +#define DIBUTTON_SOCCERD_GOALIECHARGE 0x1F00440B /* Make the goalie charge out of the box */ +#define DIBUTTON_SOCCERD_SUBSTITUTE 0x1F00440C /* Substitute one player for another */ +#define DIBUTTON_SOCCERD_LEFT_LINK 0x1F00C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_SOCCERD_RIGHT_LINK 0x1F00C4EC /* Fallback sidestep right button */ +#define DIBUTTON_SOCCERD_FORWARD_LINK 0x1F0144E0 /* Fallback move forward button */ +#define DIBUTTON_SOCCERD_BACK_LINK 0x1F0144E8 /* Fallback move back button */ +#define DIBUTTON_SOCCERD_DEVICE 0x1F0044FE /* Show input device and controls */ +#define DIBUTTON_SOCCERD_PAUSE 0x1F0044FC /* Start / Pause / Restart game */ + +/*--- Sports - Racquet + Tennis - Table-Tennis - Squash ---*/ +#define DIVIRTUAL_SPORTS_RACQUET 0x20000000 +#define DIAXIS_RACQUET_LATERAL 0x20008201 /* Move / Aim: left / right */ +#define DIAXIS_RACQUET_MOVE 0x20010202 /* Move / Aim: up / down */ +#define DIBUTTON_RACQUET_SWING 0x20000401 /* Swing racquet */ +#define DIBUTTON_RACQUET_BACKSWING 0x20000402 /* Swing backhand */ +#define DIBUTTON_RACQUET_SMASH 0x20000403 /* Smash shot */ +#define DIBUTTON_RACQUET_SPECIAL 0x20000404 /* Special shot */ +#define DIBUTTON_RACQUET_SELECT 0x20000405 /* Select special shot */ +#define DIBUTTON_RACQUET_MENU 0x200004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_RACQUET_GLANCE 0x20004601 /* scroll view */ +#define DIBUTTON_RACQUET_TIMEOUT 0x20004406 /* Call for time out */ +#define DIBUTTON_RACQUET_SUBSTITUTE 0x20004407 /* Substitute one player for another */ +#define DIBUTTON_RACQUET_LEFT_LINK 0x2000C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_RACQUET_RIGHT_LINK 0x2000C4EC /* Fallback sidestep right button */ +#define DIBUTTON_RACQUET_FORWARD_LINK 0x200144E0 /* Fallback move forward button */ +#define DIBUTTON_RACQUET_BACK_LINK 0x200144E8 /* Fallback move back button */ +#define DIBUTTON_RACQUET_DEVICE 0x200044FE /* Show input device and controls */ +#define DIBUTTON_RACQUET_PAUSE 0x200044FC /* Start / Pause / Restart game */ + +/*--- Arcade- 2D + Side to Side movement ---*/ +#define DIVIRTUAL_ARCADE_SIDE2SIDE 0x21000000 +#define DIAXIS_ARCADES_LATERAL 0x21008201 /* left / right */ +#define DIAXIS_ARCADES_MOVE 0x21010202 /* up / down */ +#define DIBUTTON_ARCADES_THROW 0x21000401 /* throw object */ +#define DIBUTTON_ARCADES_CARRY 0x21000402 /* carry object */ +#define DIBUTTON_ARCADES_ATTACK 0x21000403 /* attack */ +#define DIBUTTON_ARCADES_SPECIAL 0x21000404 /* apply special move */ +#define DIBUTTON_ARCADES_SELECT 0x21000405 /* select special move */ +#define DIBUTTON_ARCADES_MENU 0x210004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_ARCADES_VIEW 0x21004601 /* scroll view left / right / up / down */ +#define DIBUTTON_ARCADES_LEFT_LINK 0x2100C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_ARCADES_RIGHT_LINK 0x2100C4EC /* Fallback sidestep right button */ +#define DIBUTTON_ARCADES_FORWARD_LINK 0x210144E0 /* Fallback move forward button */ +#define DIBUTTON_ARCADES_BACK_LINK 0x210144E8 /* Fallback move back button */ +#define DIBUTTON_ARCADES_VIEW_UP_LINK 0x2107C4E0 /* Fallback scroll view up button */ +#define DIBUTTON_ARCADES_VIEW_DOWN_LINK 0x2107C4E8 /* Fallback scroll view down button */ +#define DIBUTTON_ARCADES_VIEW_LEFT_LINK 0x2107C4E4 /* Fallback scroll view left button */ +#define DIBUTTON_ARCADES_VIEW_RIGHT_LINK 0x2107C4EC /* Fallback scroll view right button */ +#define DIBUTTON_ARCADES_DEVICE 0x210044FE /* Show input device and controls */ +#define DIBUTTON_ARCADES_PAUSE 0x210044FC /* Start / Pause / Restart game */ + +/*--- Arcade - Platform Game + Character moves around on screen ---*/ +#define DIVIRTUAL_ARCADE_PLATFORM 0x22000000 +#define DIAXIS_ARCADEP_LATERAL 0x22008201 /* Left / right */ +#define DIAXIS_ARCADEP_MOVE 0x22010202 /* Up / down */ +#define DIBUTTON_ARCADEP_JUMP 0x22000401 /* Jump */ +#define DIBUTTON_ARCADEP_FIRE 0x22000402 /* Fire */ +#define DIBUTTON_ARCADEP_CROUCH 0x22000403 /* Crouch */ +#define DIBUTTON_ARCADEP_SPECIAL 0x22000404 /* Apply special move */ +#define DIBUTTON_ARCADEP_SELECT 0x22000405 /* Select special move */ +#define DIBUTTON_ARCADEP_MENU 0x220004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_ARCADEP_VIEW 0x22004601 /* Scroll view */ +#define DIBUTTON_ARCADEP_FIRESECONDARY 0x22004406 /* Alternative fire button */ +#define DIBUTTON_ARCADEP_LEFT_LINK 0x2200C4E4 /* Fallback sidestep left button */ +#define DIBUTTON_ARCADEP_RIGHT_LINK 0x2200C4EC /* Fallback sidestep right button */ +#define DIBUTTON_ARCADEP_FORWARD_LINK 0x220144E0 /* Fallback move forward button */ +#define DIBUTTON_ARCADEP_BACK_LINK 0x220144E8 /* Fallback move back button */ +#define DIBUTTON_ARCADEP_VIEW_UP_LINK 0x2207C4E0 /* Fallback scroll view up button */ +#define DIBUTTON_ARCADEP_VIEW_DOWN_LINK 0x2207C4E8 /* Fallback scroll view down button */ +#define DIBUTTON_ARCADEP_VIEW_LEFT_LINK 0x2207C4E4 /* Fallback scroll view left button */ +#define DIBUTTON_ARCADEP_VIEW_RIGHT_LINK 0x2207C4EC /* Fallback scroll view right button */ +#define DIBUTTON_ARCADEP_DEVICE 0x220044FE /* Show input device and controls */ +#define DIBUTTON_ARCADEP_PAUSE 0x220044FC /* Start / Pause / Restart game */ + +/*--- CAD - 2D Object Control + Controls to select and move objects in 2D ---*/ +#define DIVIRTUAL_CAD_2DCONTROL 0x23000000 +#define DIAXIS_2DCONTROL_LATERAL 0x23008201 /* Move view left / right */ +#define DIAXIS_2DCONTROL_MOVE 0x23010202 /* Move view up / down */ +#define DIAXIS_2DCONTROL_INOUT 0x23018203 /* Zoom - in / out */ +#define DIBUTTON_2DCONTROL_SELECT 0x23000401 /* Select Object */ +#define DIBUTTON_2DCONTROL_SPECIAL1 0x23000402 /* Do first special operation */ +#define DIBUTTON_2DCONTROL_SPECIAL 0x23000403 /* Select special operation */ +#define DIBUTTON_2DCONTROL_SPECIAL2 0x23000404 /* Do second special operation */ +#define DIBUTTON_2DCONTROL_MENU 0x230004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_2DCONTROL_HATSWITCH 0x23004601 /* Hat switch */ +#define DIAXIS_2DCONTROL_ROTATEZ 0x23024204 /* Rotate view clockwise / counterclockwise */ +#define DIBUTTON_2DCONTROL_DISPLAY 0x23004405 /* Shows next on-screen display options */ +#define DIBUTTON_2DCONTROL_DEVICE 0x230044FE /* Show input device and controls */ +#define DIBUTTON_2DCONTROL_PAUSE 0x230044FC /* Start / Pause / Restart game */ + +/*--- CAD - 3D object control + Controls to select and move objects within a 3D environment ---*/ +#define DIVIRTUAL_CAD_3DCONTROL 0x24000000 +#define DIAXIS_3DCONTROL_LATERAL 0x24008201 /* Move view left / right */ +#define DIAXIS_3DCONTROL_MOVE 0x24010202 /* Move view up / down */ +#define DIAXIS_3DCONTROL_INOUT 0x24018203 /* Zoom - in / out */ +#define DIBUTTON_3DCONTROL_SELECT 0x24000401 /* Select Object */ +#define DIBUTTON_3DCONTROL_SPECIAL1 0x24000402 /* Do first special operation */ +#define DIBUTTON_3DCONTROL_SPECIAL 0x24000403 /* Select special operation */ +#define DIBUTTON_3DCONTROL_SPECIAL2 0x24000404 /* Do second special operation */ +#define DIBUTTON_3DCONTROL_MENU 0x240004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_3DCONTROL_HATSWITCH 0x24004601 /* Hat switch */ +#define DIAXIS_3DCONTROL_ROTATEX 0x24034204 /* Rotate view forward or up / backward or down */ +#define DIAXIS_3DCONTROL_ROTATEY 0x2402C205 /* Rotate view clockwise / counterclockwise */ +#define DIAXIS_3DCONTROL_ROTATEZ 0x24024206 /* Rotate view left / right */ +#define DIBUTTON_3DCONTROL_DISPLAY 0x24004405 /* Show next on-screen display options */ +#define DIBUTTON_3DCONTROL_DEVICE 0x240044FE /* Show input device and controls */ +#define DIBUTTON_3DCONTROL_PAUSE 0x240044FC /* Start / Pause / Restart game */ + +/*--- CAD - 3D Navigation - Fly through + Controls for 3D modeling ---*/ +#define DIVIRTUAL_CAD_FLYBY 0x25000000 +#define DIAXIS_CADF_LATERAL 0x25008201 /* move view left / right */ +#define DIAXIS_CADF_MOVE 0x25010202 /* move view up / down */ +#define DIAXIS_CADF_INOUT 0x25018203 /* in / out */ +#define DIBUTTON_CADF_SELECT 0x25000401 /* Select Object */ +#define DIBUTTON_CADF_SPECIAL1 0x25000402 /* do first special operation */ +#define DIBUTTON_CADF_SPECIAL 0x25000403 /* Select special operation */ +#define DIBUTTON_CADF_SPECIAL2 0x25000404 /* do second special operation */ +#define DIBUTTON_CADF_MENU 0x250004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_CADF_HATSWITCH 0x25004601 /* Hat switch */ +#define DIAXIS_CADF_ROTATEX 0x25034204 /* Rotate view forward or up / backward or down */ +#define DIAXIS_CADF_ROTATEY 0x2502C205 /* Rotate view clockwise / counterclockwise */ +#define DIAXIS_CADF_ROTATEZ 0x25024206 /* Rotate view left / right */ +#define DIBUTTON_CADF_DISPLAY 0x25004405 /* shows next on-screen display options */ +#define DIBUTTON_CADF_DEVICE 0x250044FE /* Show input device and controls */ +#define DIBUTTON_CADF_PAUSE 0x250044FC /* Start / Pause / Restart game */ + +/*--- CAD - 3D Model Control + Controls for 3D modeling ---*/ +#define DIVIRTUAL_CAD_MODEL 0x26000000 +#define DIAXIS_CADM_LATERAL 0x26008201 /* move view left / right */ +#define DIAXIS_CADM_MOVE 0x26010202 /* move view up / down */ +#define DIAXIS_CADM_INOUT 0x26018203 /* in / out */ +#define DIBUTTON_CADM_SELECT 0x26000401 /* Select Object */ +#define DIBUTTON_CADM_SPECIAL1 0x26000402 /* do first special operation */ +#define DIBUTTON_CADM_SPECIAL 0x26000403 /* Select special operation */ +#define DIBUTTON_CADM_SPECIAL2 0x26000404 /* do second special operation */ +#define DIBUTTON_CADM_MENU 0x260004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIHATSWITCH_CADM_HATSWITCH 0x26004601 /* Hat switch */ +#define DIAXIS_CADM_ROTATEX 0x26034204 /* Rotate view forward or up / backward or down */ +#define DIAXIS_CADM_ROTATEY 0x2602C205 /* Rotate view clockwise / counterclockwise */ +#define DIAXIS_CADM_ROTATEZ 0x26024206 /* Rotate view left / right */ +#define DIBUTTON_CADM_DISPLAY 0x26004405 /* shows next on-screen display options */ +#define DIBUTTON_CADM_DEVICE 0x260044FE /* Show input device and controls */ +#define DIBUTTON_CADM_PAUSE 0x260044FC /* Start / Pause / Restart game */ + +/*--- Control - Media Equipment + Remote ---*/ +#define DIVIRTUAL_REMOTE_CONTROL 0x27000000 +#define DIAXIS_REMOTE_SLIDER 0x27050201 /* Slider for adjustment: volume / color / bass / etc */ +#define DIBUTTON_REMOTE_MUTE 0x27000401 /* Set volume on current device to zero */ +#define DIBUTTON_REMOTE_SELECT 0x27000402 /* Next/previous: channel/ track / chapter / picture / station */ +#define DIBUTTON_REMOTE_PLAY 0x27002403 /* Start or pause entertainment on current device */ +#define DIBUTTON_REMOTE_CUE 0x27002404 /* Move through current media */ +#define DIBUTTON_REMOTE_REVIEW 0x27002405 /* Move through current media */ +#define DIBUTTON_REMOTE_CHANGE 0x27002406 /* Select next device */ +#define DIBUTTON_REMOTE_RECORD 0x27002407 /* Start recording the current media */ +#define DIBUTTON_REMOTE_MENU 0x270004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIAXIS_REMOTE_SLIDER2 0x27054202 /* Slider for adjustment: volume */ +#define DIBUTTON_REMOTE_TV 0x27005C08 /* Select TV */ +#define DIBUTTON_REMOTE_CABLE 0x27005C09 /* Select cable box */ +#define DIBUTTON_REMOTE_CD 0x27005C0A /* Select CD player */ +#define DIBUTTON_REMOTE_VCR 0x27005C0B /* Select VCR */ +#define DIBUTTON_REMOTE_TUNER 0x27005C0C /* Select tuner */ +#define DIBUTTON_REMOTE_DVD 0x27005C0D /* Select DVD player */ +#define DIBUTTON_REMOTE_ADJUST 0x27005C0E /* Enter device adjustment menu */ +#define DIBUTTON_REMOTE_DIGIT0 0x2700540F /* Digit 0 */ +#define DIBUTTON_REMOTE_DIGIT1 0x27005410 /* Digit 1 */ +#define DIBUTTON_REMOTE_DIGIT2 0x27005411 /* Digit 2 */ +#define DIBUTTON_REMOTE_DIGIT3 0x27005412 /* Digit 3 */ +#define DIBUTTON_REMOTE_DIGIT4 0x27005413 /* Digit 4 */ +#define DIBUTTON_REMOTE_DIGIT5 0x27005414 /* Digit 5 */ +#define DIBUTTON_REMOTE_DIGIT6 0x27005415 /* Digit 6 */ +#define DIBUTTON_REMOTE_DIGIT7 0x27005416 /* Digit 7 */ +#define DIBUTTON_REMOTE_DIGIT8 0x27005417 /* Digit 8 */ +#define DIBUTTON_REMOTE_DIGIT9 0x27005418 /* Digit 9 */ +#define DIBUTTON_REMOTE_DEVICE 0x270044FE /* Show input device and controls */ +#define DIBUTTON_REMOTE_PAUSE 0x270044FC /* Start / Pause / Restart game */ + +/*--- Control- Web + Help or Browser ---*/ +#define DIVIRTUAL_BROWSER_CONTROL 0x28000000 +#define DIAXIS_BROWSER_LATERAL 0x28008201 /* Move on screen pointer */ +#define DIAXIS_BROWSER_MOVE 0x28010202 /* Move on screen pointer */ +#define DIBUTTON_BROWSER_SELECT 0x28000401 /* Select current item */ +#define DIAXIS_BROWSER_VIEW 0x28018203 /* Move view up/down */ +#define DIBUTTON_BROWSER_REFRESH 0x28000402 /* Refresh */ +#define DIBUTTON_BROWSER_MENU 0x280004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_BROWSER_SEARCH 0x28004403 /* Use search tool */ +#define DIBUTTON_BROWSER_STOP 0x28004404 /* Cease current update */ +#define DIBUTTON_BROWSER_HOME 0x28004405 /* Go directly to "home" location */ +#define DIBUTTON_BROWSER_FAVORITES 0x28004406 /* Mark current site as favorite */ +#define DIBUTTON_BROWSER_NEXT 0x28004407 /* Select Next page */ +#define DIBUTTON_BROWSER_PREVIOUS 0x28004408 /* Select Previous page */ +#define DIBUTTON_BROWSER_HISTORY 0x28004409 /* Show/Hide History */ +#define DIBUTTON_BROWSER_PRINT 0x2800440A /* Print current page */ +#define DIBUTTON_BROWSER_DEVICE 0x280044FE /* Show input device and controls */ +#define DIBUTTON_BROWSER_PAUSE 0x280044FC /* Start / Pause / Restart game */ + +/*--- Driving Simulator - Giant Walking Robot + Walking tank with weapons ---*/ +#define DIVIRTUAL_DRIVING_MECHA 0x29000000 +#define DIAXIS_MECHA_STEER 0x29008201 /* Turns mecha left/right */ +#define DIAXIS_MECHA_TORSO 0x29010202 /* Tilts torso forward/backward */ +#define DIAXIS_MECHA_ROTATE 0x29020203 /* Turns torso left/right */ +#define DIAXIS_MECHA_THROTTLE 0x29038204 /* Engine Speed */ +#define DIBUTTON_MECHA_FIRE 0x29000401 /* Fire */ +#define DIBUTTON_MECHA_WEAPONS 0x29000402 /* Select next weapon group */ +#define DIBUTTON_MECHA_TARGET 0x29000403 /* Select closest enemy available target */ +#define DIBUTTON_MECHA_REVERSE 0x29000404 /* Toggles throttle in/out of reverse */ +#define DIBUTTON_MECHA_ZOOM 0x29000405 /* Zoom in/out targeting reticule */ +#define DIBUTTON_MECHA_JUMP 0x29000406 /* Fires jump jets */ +#define DIBUTTON_MECHA_MENU 0x290004FD /* Show menu options */ +/*--- Priority 2 controls ---*/ + +#define DIBUTTON_MECHA_CENTER 0x29004407 /* Center torso to legs */ +#define DIHATSWITCH_MECHA_GLANCE 0x29004601 /* Look around */ +#define DIBUTTON_MECHA_VIEW 0x29004408 /* Cycle through view options */ +#define DIBUTTON_MECHA_FIRESECONDARY 0x29004409 /* Alternative fire button */ +#define DIBUTTON_MECHA_LEFT_LINK 0x2900C4E4 /* Fallback steer left button */ +#define DIBUTTON_MECHA_RIGHT_LINK 0x2900C4EC /* Fallback steer right button */ +#define DIBUTTON_MECHA_FORWARD_LINK 0x290144E0 /* Fallback tilt torso forward button */ +#define DIBUTTON_MECHA_BACK_LINK 0x290144E8 /* Fallback tilt toroso backward button */ +#define DIBUTTON_MECHA_ROTATE_LEFT_LINK 0x290244E4 /* Fallback rotate toroso right button */ +#define DIBUTTON_MECHA_ROTATE_RIGHT_LINK 0x290244EC /* Fallback rotate torso left button */ +#define DIBUTTON_MECHA_FASTER_LINK 0x2903C4E0 /* Fallback increase engine speed */ +#define DIBUTTON_MECHA_SLOWER_LINK 0x2903C4E8 /* Fallback decrease engine speed */ +#define DIBUTTON_MECHA_DEVICE 0x290044FE /* Show input device and controls */ +#define DIBUTTON_MECHA_PAUSE 0x290044FC /* Start / Pause / Restart game */ + +/* + * "ANY" semantics can be used as a last resort to get mappings for actions + * that match nothing in the chosen virtual genre. These semantics will be + * mapped at a lower priority that virtual genre semantics. Also, hardware + * vendors will not be able to provide sensible mappings for these unless + * they provide application specific mappings. + */ +#define DIAXIS_ANY_X_1 0xFF00C201 +#define DIAXIS_ANY_X_2 0xFF00C202 +#define DIAXIS_ANY_Y_1 0xFF014201 +#define DIAXIS_ANY_Y_2 0xFF014202 +#define DIAXIS_ANY_Z_1 0xFF01C201 +#define DIAXIS_ANY_Z_2 0xFF01C202 +#define DIAXIS_ANY_R_1 0xFF024201 +#define DIAXIS_ANY_R_2 0xFF024202 +#define DIAXIS_ANY_U_1 0xFF02C201 +#define DIAXIS_ANY_U_2 0xFF02C202 +#define DIAXIS_ANY_V_1 0xFF034201 +#define DIAXIS_ANY_V_2 0xFF034202 +#define DIAXIS_ANY_A_1 0xFF03C201 +#define DIAXIS_ANY_A_2 0xFF03C202 +#define DIAXIS_ANY_B_1 0xFF044201 +#define DIAXIS_ANY_B_2 0xFF044202 +#define DIAXIS_ANY_C_1 0xFF04C201 +#define DIAXIS_ANY_C_2 0xFF04C202 +#define DIAXIS_ANY_S_1 0xFF054201 +#define DIAXIS_ANY_S_2 0xFF054202 + +#define DIAXIS_ANY_1 0xFF004201 +#define DIAXIS_ANY_2 0xFF004202 +#define DIAXIS_ANY_3 0xFF004203 +#define DIAXIS_ANY_4 0xFF004204 + +#define DIPOV_ANY_1 0xFF004601 +#define DIPOV_ANY_2 0xFF004602 +#define DIPOV_ANY_3 0xFF004603 +#define DIPOV_ANY_4 0xFF004604 + +#define DIBUTTON_ANY(instance) ( 0xFF004400 | instance ) + + +#ifdef __cplusplus +}; +#endif + +#endif /* __DINPUT_INCLUDED__ */ + +/**************************************************************************** + * + * Definitions for non-IDirectInput (VJoyD) features defined more recently + * than the current sdk files + * + ****************************************************************************/ + +#ifdef _INC_MMSYSTEM +#ifndef MMNOJOY + +#ifndef __VJOYDX_INCLUDED__ +#define __VJOYDX_INCLUDED__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Flag to indicate that the dwReserved2 field of the JOYINFOEX structure + * contains mini-driver specific data to be passed by VJoyD to the mini- + * driver instead of doing a poll. + */ +#define JOY_PASSDRIVERDATA 0x10000000l + +/* + * Informs the joystick driver that the configuration has been changed + * and should be reloaded from the registery. + * dwFlags is reserved and should be set to zero + */ +WINMMAPI MMRESULT WINAPI joyConfigChanged( DWORD dwFlags ); + +#ifndef DIJ_RINGZERO +/* + * Invoke the joystick control panel directly, using the passed window handle + * as the parent of the dialog. This API is only supported for compatibility + * purposes; new applications should use the RunControlPanel method of a + * device interface for a game controller. + * The API is called by using the function pointer returned by + * GetProcAddress( hCPL, TEXT("ShowJoyCPL") ) where hCPL is a HMODULE returned + * by LoadLibrary( TEXT("joy.cpl") ). The typedef is provided to allow + * declaration and casting of an appropriately typed variable. + */ +void WINAPI ShowJoyCPL( HWND hWnd ); +typedef void (WINAPI* LPFNSHOWJOYCPL)( HWND hWnd ); +#endif /* DIJ_RINGZERO */ + + +/* + * Hardware Setting indicating that the device is a headtracker + */ +#define JOY_HWS_ISHEADTRACKER 0x02000000l + +/* + * Hardware Setting indicating that the VxD is used to replace + * the standard analog polling + */ +#define JOY_HWS_ISGAMEPORTDRIVER 0x04000000l + +/* + * Hardware Setting indicating that the driver needs a standard + * gameport in order to communicate with the device. + */ +#define JOY_HWS_ISANALOGPORTDRIVER 0x08000000l + +/* + * Hardware Setting indicating that VJoyD should not load this + * driver, it will be loaded externally and will register with + * VJoyD of it's own accord. + */ +#define JOY_HWS_AUTOLOAD 0x10000000l + +/* + * Hardware Setting indicating that the driver acquires any + * resources needed without needing a devnode through VJoyD. + */ +#define JOY_HWS_NODEVNODE 0x20000000l + + +/* + * Hardware Setting indicating that the device is a gameport bus + */ +#define JOY_HWS_ISGAMEPORTBUS 0x80000000l +#define JOY_HWS_GAMEPORTBUSBUSY 0x00000001l + +/* + * Usage Setting indicating that the settings are volatile and + * should be removed if still present on a reboot. + */ +#define JOY_US_VOLATILE 0x00000008L + +#ifdef __cplusplus +}; +#endif + +#endif /* __VJOYDX_INCLUDED__ */ + +#endif /* not MMNOJOY */ +#endif /* _INC_MMSYSTEM */ + +/**************************************************************************** + * + * Definitions for non-IDirectInput (VJoyD) features defined more recently + * than the current ddk files + * + ****************************************************************************/ + +#ifndef DIJ_RINGZERO + +#ifdef _INC_MMDDK +#ifndef MMNOJOYDEV + +#ifndef __VJOYDXD_INCLUDED__ +#define __VJOYDXD_INCLUDED__ +/* + * Poll type in which the do_other field of the JOYOEMPOLLDATA + * structure contains mini-driver specific data passed from an app. + */ +#define JOY_OEMPOLL_PASSDRIVERDATA 7 + +#endif /* __VJOYDXD_INCLUDED__ */ + +#endif /* not MMNOJOYDEV */ +#endif /* _INC_MMDDK */ + +#endif /* DIJ_RINGZERO */ + diff --git a/src/drivers/win/dsound.h b/src/drivers/win/dsound.h new file mode 100644 index 00000000..c088b63a --- /dev/null +++ b/src/drivers/win/dsound.h @@ -0,0 +1,2358 @@ +/*==========================================================================; + * + * Copyright (c) Microsoft Corporation. All rights reserved. + * + * File: dsound.h + * Content: DirectSound include file + * + **************************************************************************/ + +#define COM_NO_WINDOWS_H +#include +#include + +#ifndef DIRECTSOUND_VERSION +#define DIRECTSOUND_VERSION 0x0900 /* Version 9.0 */ +#endif + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +#ifndef __DSOUND_INCLUDED__ +#define __DSOUND_INCLUDED__ + +/* Type definitions shared with Direct3D */ + +#ifndef DX_SHARED_DEFINES + +typedef float D3DVALUE, *LPD3DVALUE; + +#ifndef D3DCOLOR_DEFINED +typedef DWORD D3DCOLOR; +#define D3DCOLOR_DEFINED +#endif + +#ifndef LPD3DCOLOR_DEFINED +typedef DWORD *LPD3DCOLOR; +#define LPD3DCOLOR_DEFINED +#endif + +#ifndef D3DVECTOR_DEFINED +typedef struct _D3DVECTOR { + float x; + float y; + float z; +} D3DVECTOR; +#define D3DVECTOR_DEFINED +#endif + +#ifndef LPD3DVECTOR_DEFINED +typedef D3DVECTOR *LPD3DVECTOR; +#define LPD3DVECTOR_DEFINED +#endif + +#define DX_SHARED_DEFINES +#endif // DX_SHARED_DEFINES + +#define _FACDS 0x878 /* DirectSound's facility code */ +#define MAKE_DSHRESULT(code) MAKE_HRESULT(1, _FACDS, code) + +// DirectSound Component GUID {47D4D946-62E8-11CF-93BC-444553540000} +DEFINE_GUID(CLSID_DirectSound, 0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); + +// DirectSound 8.0 Component GUID {3901CC3F-84B5-4FA4-BA35-AA8172B8A09B} +DEFINE_GUID(CLSID_DirectSound8, 0x3901cc3f, 0x84b5, 0x4fa4, 0xba, 0x35, 0xaa, 0x81, 0x72, 0xb8, 0xa0, 0x9b); + +// DirectSound Capture Component GUID {B0210780-89CD-11D0-AF08-00A0C925CD16} +DEFINE_GUID(CLSID_DirectSoundCapture, 0xb0210780, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); + +// DirectSound 8.0 Capture Component GUID {E4BCAC13-7F99-4908-9A8E-74E3BF24B6E1} +DEFINE_GUID(CLSID_DirectSoundCapture8, 0xe4bcac13, 0x7f99, 0x4908, 0x9a, 0x8e, 0x74, 0xe3, 0xbf, 0x24, 0xb6, 0xe1); + +// DirectSound Full Duplex Component GUID {FEA4300C-7959-4147-B26A-2377B9E7A91D} +DEFINE_GUID(CLSID_DirectSoundFullDuplex, 0xfea4300c, 0x7959, 0x4147, 0xb2, 0x6a, 0x23, 0x77, 0xb9, 0xe7, 0xa9, 0x1d); + + +// DirectSound default playback device GUID {DEF00000-9C6D-47ED-AAF1-4DDA8F2B5C03} +DEFINE_GUID(DSDEVID_DefaultPlayback, 0xdef00000, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); + +// DirectSound default capture device GUID {DEF00001-9C6D-47ED-AAF1-4DDA8F2B5C03} +DEFINE_GUID(DSDEVID_DefaultCapture, 0xdef00001, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); + +// DirectSound default device for voice playback {DEF00002-9C6D-47ED-AAF1-4DDA8F2B5C03} +DEFINE_GUID(DSDEVID_DefaultVoicePlayback, 0xdef00002, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); + +// DirectSound default device for voice capture {DEF00003-9C6D-47ED-AAF1-4DDA8F2B5C03} +DEFINE_GUID(DSDEVID_DefaultVoiceCapture, 0xdef00003, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); + + +// +// Forward declarations for interfaces. +// 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined +// + +#ifdef __cplusplus +struct IDirectSound; +struct IDirectSoundBuffer; +struct IDirectSound3DListener; +struct IDirectSound3DBuffer; +struct IDirectSoundCapture; +struct IDirectSoundCaptureBuffer; +struct IDirectSoundNotify; +#endif // __cplusplus + + +// +// DirectSound 8.0 interfaces. +// + +#if DIRECTSOUND_VERSION >= 0x0800 + +#ifdef __cplusplus +struct IDirectSound8; +struct IDirectSoundBuffer8; +struct IDirectSoundCaptureBuffer8; +struct IDirectSoundFXGargle; +struct IDirectSoundFXChorus; +struct IDirectSoundFXFlanger; +struct IDirectSoundFXEcho; +struct IDirectSoundFXDistortion; +struct IDirectSoundFXCompressor; +struct IDirectSoundFXParamEq; +struct IDirectSoundFXWavesReverb; +struct IDirectSoundFXI3DL2Reverb; +struct IDirectSoundCaptureFXAec; +struct IDirectSoundCaptureFXNoiseSuppress; +struct IDirectSoundFullDuplex; +#endif // __cplusplus + +// IDirectSound8, IDirectSoundBuffer8 and IDirectSoundCaptureBuffer8 are the +// only DirectSound 7.0 interfaces with changed functionality in version 8.0. +// The other level 8 interfaces as equivalent to their level 7 counterparts: + +#define IDirectSoundCapture8 IDirectSoundCapture +#define IDirectSound3DListener8 IDirectSound3DListener +#define IDirectSound3DBuffer8 IDirectSound3DBuffer +#define IDirectSoundNotify8 IDirectSoundNotify +#define IDirectSoundFXGargle8 IDirectSoundFXGargle +#define IDirectSoundFXChorus8 IDirectSoundFXChorus +#define IDirectSoundFXFlanger8 IDirectSoundFXFlanger +#define IDirectSoundFXEcho8 IDirectSoundFXEcho +#define IDirectSoundFXDistortion8 IDirectSoundFXDistortion +#define IDirectSoundFXCompressor8 IDirectSoundFXCompressor +#define IDirectSoundFXParamEq8 IDirectSoundFXParamEq +#define IDirectSoundFXWavesReverb8 IDirectSoundFXWavesReverb +#define IDirectSoundFXI3DL2Reverb8 IDirectSoundFXI3DL2Reverb +#define IDirectSoundCaptureFXAec8 IDirectSoundCaptureFXAec +#define IDirectSoundCaptureFXNoiseSuppress8 IDirectSoundCaptureFXNoiseSuppress +#define IDirectSoundFullDuplex8 IDirectSoundFullDuplex + +#endif // DIRECTSOUND_VERSION >= 0x0800 + +typedef struct IDirectSound *LPDIRECTSOUND; +typedef struct IDirectSoundBuffer *LPDIRECTSOUNDBUFFER; +typedef struct IDirectSound3DListener *LPDIRECTSOUND3DLISTENER; +typedef struct IDirectSound3DBuffer *LPDIRECTSOUND3DBUFFER; +typedef struct IDirectSoundCapture *LPDIRECTSOUNDCAPTURE; +typedef struct IDirectSoundCaptureBuffer *LPDIRECTSOUNDCAPTUREBUFFER; +typedef struct IDirectSoundNotify *LPDIRECTSOUNDNOTIFY; + + +#if DIRECTSOUND_VERSION >= 0x0800 + +typedef struct IDirectSoundFXGargle *LPDIRECTSOUNDFXGARGLE; +typedef struct IDirectSoundFXChorus *LPDIRECTSOUNDFXCHORUS; +typedef struct IDirectSoundFXFlanger *LPDIRECTSOUNDFXFLANGER; +typedef struct IDirectSoundFXEcho *LPDIRECTSOUNDFXECHO; +typedef struct IDirectSoundFXDistortion *LPDIRECTSOUNDFXDISTORTION; +typedef struct IDirectSoundFXCompressor *LPDIRECTSOUNDFXCOMPRESSOR; +typedef struct IDirectSoundFXParamEq *LPDIRECTSOUNDFXPARAMEQ; +typedef struct IDirectSoundFXWavesReverb *LPDIRECTSOUNDFXWAVESREVERB; +typedef struct IDirectSoundFXI3DL2Reverb *LPDIRECTSOUNDFXI3DL2REVERB; +typedef struct IDirectSoundCaptureFXAec *LPDIRECTSOUNDCAPTUREFXAEC; +typedef struct IDirectSoundCaptureFXNoiseSuppress *LPDIRECTSOUNDCAPTUREFXNOISESUPPRESS; +typedef struct IDirectSoundFullDuplex *LPDIRECTSOUNDFULLDUPLEX; + +typedef struct IDirectSound8 *LPDIRECTSOUND8; +typedef struct IDirectSoundBuffer8 *LPDIRECTSOUNDBUFFER8; +typedef struct IDirectSound3DListener8 *LPDIRECTSOUND3DLISTENER8; +typedef struct IDirectSound3DBuffer8 *LPDIRECTSOUND3DBUFFER8; +typedef struct IDirectSoundCapture8 *LPDIRECTSOUNDCAPTURE8; +typedef struct IDirectSoundCaptureBuffer8 *LPDIRECTSOUNDCAPTUREBUFFER8; +typedef struct IDirectSoundNotify8 *LPDIRECTSOUNDNOTIFY8; +typedef struct IDirectSoundFXGargle8 *LPDIRECTSOUNDFXGARGLE8; +typedef struct IDirectSoundFXChorus8 *LPDIRECTSOUNDFXCHORUS8; +typedef struct IDirectSoundFXFlanger8 *LPDIRECTSOUNDFXFLANGER8; +typedef struct IDirectSoundFXEcho8 *LPDIRECTSOUNDFXECHO8; +typedef struct IDirectSoundFXDistortion8 *LPDIRECTSOUNDFXDISTORTION8; +typedef struct IDirectSoundFXCompressor8 *LPDIRECTSOUNDFXCOMPRESSOR8; +typedef struct IDirectSoundFXParamEq8 *LPDIRECTSOUNDFXPARAMEQ8; +typedef struct IDirectSoundFXWavesReverb8 *LPDIRECTSOUNDFXWAVESREVERB8; +typedef struct IDirectSoundFXI3DL2Reverb8 *LPDIRECTSOUNDFXI3DL2REVERB8; +typedef struct IDirectSoundCaptureFXAec8 *LPDIRECTSOUNDCAPTUREFXAEC8; +typedef struct IDirectSoundCaptureFXNoiseSuppress8 *LPDIRECTSOUNDCAPTUREFXNOISESUPPRESS8; +typedef struct IDirectSoundFullDuplex8 *LPDIRECTSOUNDFULLDUPLEX8; + +#endif // DIRECTSOUND_VERSION >= 0x0800 + +// +// IID definitions for the unchanged DirectSound 8.0 interfaces +// + +#if DIRECTSOUND_VERSION >= 0x0800 + +#define IID_IDirectSoundCapture8 IID_IDirectSoundCapture +#define IID_IDirectSound3DListener8 IID_IDirectSound3DListener +#define IID_IDirectSound3DBuffer8 IID_IDirectSound3DBuffer +#define IID_IDirectSoundNotify8 IID_IDirectSoundNotify +#define IID_IDirectSoundFXGargle8 IID_IDirectSoundFXGargle +#define IID_IDirectSoundFXChorus8 IID_IDirectSoundFXChorus +#define IID_IDirectSoundFXFlanger8 IID_IDirectSoundFXFlanger +#define IID_IDirectSoundFXEcho8 IID_IDirectSoundFXEcho +#define IID_IDirectSoundFXDistortion8 IID_IDirectSoundFXDistortion +#define IID_IDirectSoundFXCompressor8 IID_IDirectSoundFXCompressor +#define IID_IDirectSoundFXParamEq8 IID_IDirectSoundFXParamEq +#define IID_IDirectSoundFXWavesReverb8 IID_IDirectSoundFXWavesReverb +#define IID_IDirectSoundFXI3DL2Reverb8 IID_IDirectSoundFXI3DL2Reverb +#define IID_IDirectSoundCaptureFXAec8 IID_IDirectSoundCaptureFXAec +#define IID_IDirectSoundCaptureFXNoiseSuppress8 IID_IDirectSoundCaptureFXNoiseSuppress +#define IID_IDirectSoundFullDuplex8 IID_IDirectSoundFullDuplex + +#endif // DIRECTSOUND_VERSION >= 0x0800 + +// +// Compatibility typedefs +// + +#ifndef _LPCWAVEFORMATEX_DEFINED +#define _LPCWAVEFORMATEX_DEFINED +typedef const WAVEFORMATEX *LPCWAVEFORMATEX; +#endif // _LPCWAVEFORMATEX_DEFINED + +#ifndef __LPCGUID_DEFINED__ +#define __LPCGUID_DEFINED__ +typedef const GUID *LPCGUID; +#endif // __LPCGUID_DEFINED__ + +typedef LPDIRECTSOUND *LPLPDIRECTSOUND; +typedef LPDIRECTSOUNDBUFFER *LPLPDIRECTSOUNDBUFFER; +typedef LPDIRECTSOUND3DLISTENER *LPLPDIRECTSOUND3DLISTENER; +typedef LPDIRECTSOUND3DBUFFER *LPLPDIRECTSOUND3DBUFFER; +typedef LPDIRECTSOUNDCAPTURE *LPLPDIRECTSOUNDCAPTURE; +typedef LPDIRECTSOUNDCAPTUREBUFFER *LPLPDIRECTSOUNDCAPTUREBUFFER; +typedef LPDIRECTSOUNDNOTIFY *LPLPDIRECTSOUNDNOTIFY; + +#if DIRECTSOUND_VERSION >= 0x0800 +typedef LPDIRECTSOUND8 *LPLPDIRECTSOUND8; +typedef LPDIRECTSOUNDBUFFER8 *LPLPDIRECTSOUNDBUFFER8; +typedef LPDIRECTSOUNDCAPTURE8 *LPLPDIRECTSOUNDCAPTURE8; +typedef LPDIRECTSOUNDCAPTUREBUFFER8 *LPLPDIRECTSOUNDCAPTUREBUFFER8; +#endif // DIRECTSOUND_VERSION >= 0x0800 + +// +// Structures +// + +typedef struct _DSCAPS +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwMinSecondarySampleRate; + DWORD dwMaxSecondarySampleRate; + DWORD dwPrimaryBuffers; + DWORD dwMaxHwMixingAllBuffers; + DWORD dwMaxHwMixingStaticBuffers; + DWORD dwMaxHwMixingStreamingBuffers; + DWORD dwFreeHwMixingAllBuffers; + DWORD dwFreeHwMixingStaticBuffers; + DWORD dwFreeHwMixingStreamingBuffers; + DWORD dwMaxHw3DAllBuffers; + DWORD dwMaxHw3DStaticBuffers; + DWORD dwMaxHw3DStreamingBuffers; + DWORD dwFreeHw3DAllBuffers; + DWORD dwFreeHw3DStaticBuffers; + DWORD dwFreeHw3DStreamingBuffers; + DWORD dwTotalHwMemBytes; + DWORD dwFreeHwMemBytes; + DWORD dwMaxContigFreeHwMemBytes; + DWORD dwUnlockTransferRateHwBuffers; + DWORD dwPlayCpuOverheadSwBuffers; + DWORD dwReserved1; + DWORD dwReserved2; +} DSCAPS, *LPDSCAPS; + +typedef const DSCAPS *LPCDSCAPS; + +typedef struct _DSBCAPS +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwUnlockTransferRate; + DWORD dwPlayCpuOverhead; +} DSBCAPS, *LPDSBCAPS; + +typedef const DSBCAPS *LPCDSBCAPS; + +#if DIRECTSOUND_VERSION >= 0x0800 + + typedef struct _DSEFFECTDESC + { + DWORD dwSize; + DWORD dwFlags; + GUID guidDSFXClass; + DWORD_PTR dwReserved1; + DWORD_PTR dwReserved2; + } DSEFFECTDESC, *LPDSEFFECTDESC; + typedef const DSEFFECTDESC *LPCDSEFFECTDESC; + + #define DSFX_LOCHARDWARE 0x00000001 + #define DSFX_LOCSOFTWARE 0x00000002 + + enum + { + DSFXR_PRESENT, // 0 + DSFXR_LOCHARDWARE, // 1 + DSFXR_LOCSOFTWARE, // 2 + DSFXR_UNALLOCATED, // 3 + DSFXR_FAILED, // 4 + DSFXR_UNKNOWN, // 5 + DSFXR_SENDLOOP // 6 + }; + + typedef struct _DSCEFFECTDESC + { + DWORD dwSize; + DWORD dwFlags; + GUID guidDSCFXClass; + GUID guidDSCFXInstance; + DWORD dwReserved1; + DWORD dwReserved2; + } DSCEFFECTDESC, *LPDSCEFFECTDESC; + typedef const DSCEFFECTDESC *LPCDSCEFFECTDESC; + + #define DSCFX_LOCHARDWARE 0x00000001 + #define DSCFX_LOCSOFTWARE 0x00000002 + + #define DSCFXR_LOCHARDWARE 0x00000010 + #define DSCFXR_LOCSOFTWARE 0x00000020 + +#endif // DIRECTSOUND_VERSION >= 0x0800 + +typedef struct _DSBUFFERDESC +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + LPWAVEFORMATEX lpwfxFormat; +#if DIRECTSOUND_VERSION >= 0x0700 + GUID guid3DAlgorithm; +#endif +} DSBUFFERDESC, *LPDSBUFFERDESC; + +typedef const DSBUFFERDESC *LPCDSBUFFERDESC; + +// Older version of this structure: + +typedef struct _DSBUFFERDESC1 +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + LPWAVEFORMATEX lpwfxFormat; +} DSBUFFERDESC1, *LPDSBUFFERDESC1; + +typedef const DSBUFFERDESC1 *LPCDSBUFFERDESC1; + +typedef struct _DS3DBUFFER +{ + DWORD dwSize; + D3DVECTOR vPosition; + D3DVECTOR vVelocity; + DWORD dwInsideConeAngle; + DWORD dwOutsideConeAngle; + D3DVECTOR vConeOrientation; + LONG lConeOutsideVolume; + D3DVALUE flMinDistance; + D3DVALUE flMaxDistance; + DWORD dwMode; +} DS3DBUFFER, *LPDS3DBUFFER; + +typedef const DS3DBUFFER *LPCDS3DBUFFER; + +typedef struct _DS3DLISTENER +{ + DWORD dwSize; + D3DVECTOR vPosition; + D3DVECTOR vVelocity; + D3DVECTOR vOrientFront; + D3DVECTOR vOrientTop; + D3DVALUE flDistanceFactor; + D3DVALUE flRolloffFactor; + D3DVALUE flDopplerFactor; +} DS3DLISTENER, *LPDS3DLISTENER; + +typedef const DS3DLISTENER *LPCDS3DLISTENER; + +typedef struct _DSCCAPS +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwFormats; + DWORD dwChannels; +} DSCCAPS, *LPDSCCAPS; + +typedef const DSCCAPS *LPCDSCCAPS; + +typedef struct _DSCBUFFERDESC1 +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + LPWAVEFORMATEX lpwfxFormat; +} DSCBUFFERDESC1, *LPDSCBUFFERDESC1; + +typedef struct _DSCBUFFERDESC +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + LPWAVEFORMATEX lpwfxFormat; +#if DIRECTSOUND_VERSION >= 0x0800 + DWORD dwFXCount; + LPDSCEFFECTDESC lpDSCFXDesc; +#endif +} DSCBUFFERDESC, *LPDSCBUFFERDESC; + +typedef const DSCBUFFERDESC *LPCDSCBUFFERDESC; + +typedef struct _DSCBCAPS +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; +} DSCBCAPS, *LPDSCBCAPS; + +typedef const DSCBCAPS *LPCDSCBCAPS; + +typedef struct _DSBPOSITIONNOTIFY +{ + DWORD dwOffset; + HANDLE hEventNotify; +} DSBPOSITIONNOTIFY, *LPDSBPOSITIONNOTIFY; + +typedef const DSBPOSITIONNOTIFY *LPCDSBPOSITIONNOTIFY; + +// +// DirectSound API +// + +typedef BOOL (CALLBACK *LPDSENUMCALLBACKA)(LPGUID, LPCSTR, LPCSTR, LPVOID); +typedef BOOL (CALLBACK *LPDSENUMCALLBACKW)(LPGUID, LPCWSTR, LPCWSTR, LPVOID); + +extern HRESULT WINAPI DirectSoundCreate(LPCGUID pcGuidDevice, LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter); +extern HRESULT WINAPI DirectSoundEnumerateA(LPDSENUMCALLBACKA pDSEnumCallback, LPVOID pContext); +extern HRESULT WINAPI DirectSoundEnumerateW(LPDSENUMCALLBACKW pDSEnumCallback, LPVOID pContext); + +extern HRESULT WINAPI DirectSoundCaptureCreate(LPCGUID pcGuidDevice, LPDIRECTSOUNDCAPTURE *ppDSC, LPUNKNOWN pUnkOuter); +extern HRESULT WINAPI DirectSoundCaptureEnumerateA(LPDSENUMCALLBACKA pDSEnumCallback, LPVOID pContext); +extern HRESULT WINAPI DirectSoundCaptureEnumerateW(LPDSENUMCALLBACKW pDSEnumCallback, LPVOID pContext); + +#if DIRECTSOUND_VERSION >= 0x0800 +extern HRESULT WINAPI DirectSoundCreate8(LPCGUID pcGuidDevice, LPDIRECTSOUND8 *ppDS8, LPUNKNOWN pUnkOuter); +extern HRESULT WINAPI DirectSoundCaptureCreate8(LPCGUID pcGuidDevice, LPDIRECTSOUNDCAPTURE8 *ppDSC8, LPUNKNOWN pUnkOuter); +extern HRESULT WINAPI DirectSoundFullDuplexCreate(LPCGUID pcGuidCaptureDevice, LPCGUID pcGuidRenderDevice, + LPCDSCBUFFERDESC pcDSCBufferDesc, LPCDSBUFFERDESC pcDSBufferDesc, HWND hWnd, + DWORD dwLevel, LPDIRECTSOUNDFULLDUPLEX* ppDSFD, LPDIRECTSOUNDCAPTUREBUFFER8 *ppDSCBuffer8, + LPDIRECTSOUNDBUFFER8 *ppDSBuffer8, LPUNKNOWN pUnkOuter); +#define DirectSoundFullDuplexCreate8 DirectSoundFullDuplexCreate + +extern HRESULT WINAPI GetDeviceID(LPCGUID pGuidSrc, LPGUID pGuidDest); +#endif // DIRECTSOUND_VERSION >= 0x0800 + +#ifdef UNICODE +#define LPDSENUMCALLBACK LPDSENUMCALLBACKW +#define DirectSoundEnumerate DirectSoundEnumerateW +#define DirectSoundCaptureEnumerate DirectSoundCaptureEnumerateW +#else // UNICODE +#define LPDSENUMCALLBACK LPDSENUMCALLBACKA +#define DirectSoundEnumerate DirectSoundEnumerateA +#define DirectSoundCaptureEnumerate DirectSoundCaptureEnumerateA +#endif // UNICODE + +// +// IUnknown +// + +#if !defined(__cplusplus) || defined(CINTERFACE) +#ifndef IUnknown_QueryInterface +#define IUnknown_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#endif // IUnknown_QueryInterface +#ifndef IUnknown_AddRef +#define IUnknown_AddRef(p) (p)->lpVtbl->AddRef(p) +#endif // IUnknown_AddRef +#ifndef IUnknown_Release +#define IUnknown_Release(p) (p)->lpVtbl->Release(p) +#endif // IUnknown_Release +#else // !defined(__cplusplus) || defined(CINTERFACE) +#ifndef IUnknown_QueryInterface +#define IUnknown_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#endif // IUnknown_QueryInterface +#ifndef IUnknown_AddRef +#define IUnknown_AddRef(p) (p)->AddRef() +#endif // IUnknown_AddRef +#ifndef IUnknown_Release +#define IUnknown_Release(p) (p)->Release() +#endif // IUnknown_Release +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +#ifndef __IReferenceClock_INTERFACE_DEFINED__ +#define __IReferenceClock_INTERFACE_DEFINED__ + +typedef LONGLONG REFERENCE_TIME; +typedef REFERENCE_TIME *LPREFERENCE_TIME; + +DEFINE_GUID(IID_IReferenceClock, 0x56a86897, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); + +#undef INTERFACE +#define INTERFACE IReferenceClock + +DECLARE_INTERFACE_(IReferenceClock, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IReferenceClock methods + STDMETHOD(GetTime) (THIS_ REFERENCE_TIME *pTime) PURE; + STDMETHOD(AdviseTime) (THIS_ REFERENCE_TIME rtBaseTime, REFERENCE_TIME rtStreamTime, + HANDLE hEvent, LPDWORD pdwAdviseCookie) PURE; + STDMETHOD(AdvisePeriodic) (THIS_ REFERENCE_TIME rtStartTime, REFERENCE_TIME rtPeriodTime, + HANDLE hSemaphore, LPDWORD pdwAdviseCookie) PURE; + STDMETHOD(Unadvise) (THIS_ DWORD dwAdviseCookie) PURE; +}; + +#endif // __IReferenceClock_INTERFACE_DEFINED__ + +#ifndef IReferenceClock_QueryInterface + +#define IReferenceClock_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IReferenceClock_AddRef(p) IUnknown_AddRef(p) +#define IReferenceClock_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IReferenceClock_GetTime(p,a) (p)->lpVtbl->GetTime(p,a) +#define IReferenceClock_AdviseTime(p,a,b,c,d) (p)->lpVtbl->AdviseTime(p,a,b,c,d) +#define IReferenceClock_AdvisePeriodic(p,a,b,c,d) (p)->lpVtbl->AdvisePeriodic(p,a,b,c,d) +#define IReferenceClock_Unadvise(p,a) (p)->lpVtbl->Unadvise(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IReferenceClock_GetTime(p,a) (p)->GetTime(a) +#define IReferenceClock_AdviseTime(p,a,b,c,d) (p)->AdviseTime(a,b,c,d) +#define IReferenceClock_AdvisePeriodic(p,a,b,c,d) (p)->AdvisePeriodic(a,b,c,d) +#define IReferenceClock_Unadvise(p,a) (p)->Unadvise(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +#endif // IReferenceClock_QueryInterface + +// +// IDirectSound +// + +DEFINE_GUID(IID_IDirectSound, 0x279AFA83, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); + +#undef INTERFACE +#define INTERFACE IDirectSound + +DECLARE_INTERFACE_(IDirectSound, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSound methods + STDMETHOD(CreateSoundBuffer) (THIS_ LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(GetCaps) (THIS_ LPDSCAPS pDSCaps) PURE; + STDMETHOD(DuplicateSoundBuffer) (THIS_ LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate) PURE; + STDMETHOD(SetCooperativeLevel) (THIS_ HWND hwnd, DWORD dwLevel) PURE; + STDMETHOD(Compact) (THIS) PURE; + STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD pdwSpeakerConfig) PURE; + STDMETHOD(SetSpeakerConfig) (THIS_ DWORD dwSpeakerConfig) PURE; + STDMETHOD(Initialize) (THIS_ LPCGUID pcGuidDevice) PURE; +}; + +#define IDirectSound_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSound_AddRef(p) IUnknown_AddRef(p) +#define IDirectSound_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSound_CreateSoundBuffer(p,a,b,c) (p)->lpVtbl->CreateSoundBuffer(p,a,b,c) +#define IDirectSound_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) +#define IDirectSound_DuplicateSoundBuffer(p,a,b) (p)->lpVtbl->DuplicateSoundBuffer(p,a,b) +#define IDirectSound_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) +#define IDirectSound_Compact(p) (p)->lpVtbl->Compact(p) +#define IDirectSound_GetSpeakerConfig(p,a) (p)->lpVtbl->GetSpeakerConfig(p,a) +#define IDirectSound_SetSpeakerConfig(p,b) (p)->lpVtbl->SetSpeakerConfig(p,b) +#define IDirectSound_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSound_CreateSoundBuffer(p,a,b,c) (p)->CreateSoundBuffer(a,b,c) +#define IDirectSound_GetCaps(p,a) (p)->GetCaps(a) +#define IDirectSound_DuplicateSoundBuffer(p,a,b) (p)->DuplicateSoundBuffer(a,b) +#define IDirectSound_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) +#define IDirectSound_Compact(p) (p)->Compact() +#define IDirectSound_GetSpeakerConfig(p,a) (p)->GetSpeakerConfig(a) +#define IDirectSound_SetSpeakerConfig(p,b) (p)->SetSpeakerConfig(b) +#define IDirectSound_Initialize(p,a) (p)->Initialize(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +#if DIRECTSOUND_VERSION >= 0x0800 + +// +// IDirectSound8 +// + +DEFINE_GUID(IID_IDirectSound8, 0xC50A7E93, 0xF395, 0x4834, 0x9E, 0xF6, 0x7F, 0xA9, 0x9D, 0xE5, 0x09, 0x66); + +#undef INTERFACE +#define INTERFACE IDirectSound8 + +DECLARE_INTERFACE_(IDirectSound8, IDirectSound) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSound methods + STDMETHOD(CreateSoundBuffer) (THIS_ LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(GetCaps) (THIS_ LPDSCAPS pDSCaps) PURE; + STDMETHOD(DuplicateSoundBuffer) (THIS_ LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate) PURE; + STDMETHOD(SetCooperativeLevel) (THIS_ HWND hwnd, DWORD dwLevel) PURE; + STDMETHOD(Compact) (THIS) PURE; + STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD pdwSpeakerConfig) PURE; + STDMETHOD(SetSpeakerConfig) (THIS_ DWORD dwSpeakerConfig) PURE; + STDMETHOD(Initialize) (THIS_ LPCGUID pcGuidDevice) PURE; + + // IDirectSound8 methods + STDMETHOD(VerifyCertification) (THIS_ LPDWORD pdwCertified) PURE; +}; + +#define IDirectSound8_QueryInterface(p,a,b) IDirectSound_QueryInterface(p,a,b) +#define IDirectSound8_AddRef(p) IDirectSound_AddRef(p) +#define IDirectSound8_Release(p) IDirectSound_Release(p) +#define IDirectSound8_CreateSoundBuffer(p,a,b,c) IDirectSound_CreateSoundBuffer(p,a,b,c) +#define IDirectSound8_GetCaps(p,a) IDirectSound_GetCaps(p,a) +#define IDirectSound8_DuplicateSoundBuffer(p,a,b) IDirectSound_DuplicateSoundBuffer(p,a,b) +#define IDirectSound8_SetCooperativeLevel(p,a,b) IDirectSound_SetCooperativeLevel(p,a,b) +#define IDirectSound8_Compact(p) IDirectSound_Compact(p) +#define IDirectSound8_GetSpeakerConfig(p,a) IDirectSound_GetSpeakerConfig(p,a) +#define IDirectSound8_SetSpeakerConfig(p,a) IDirectSound_SetSpeakerConfig(p,a) +#define IDirectSound8_Initialize(p,a) IDirectSound_Initialize(p,a) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSound8_VerifyCertification(p,a) (p)->lpVtbl->VerifyCertification(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSound8_VerifyCertification(p,a) (p)->VerifyCertification(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +#endif // DIRECTSOUND_VERSION >= 0x0800 + +// +// IDirectSoundBuffer +// + +DEFINE_GUID(IID_IDirectSoundBuffer, 0x279AFA85, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); + +#undef INTERFACE +#define INTERFACE IDirectSoundBuffer + +DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundBuffer methods + STDMETHOD(GetCaps) (THIS_ LPDSBCAPS pDSBufferCaps) PURE; + STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor) PURE; + STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; + STDMETHOD(GetVolume) (THIS_ LPLONG plVolume) PURE; + STDMETHOD(GetPan) (THIS_ LPLONG plPan) PURE; + STDMETHOD(GetFrequency) (THIS_ LPDWORD pdwFrequency) PURE; + STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; + STDMETHOD(Initialize) (THIS_ LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc) PURE; + STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, + LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; + STDMETHOD(Play) (THIS_ DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) PURE; + STDMETHOD(SetCurrentPosition) (THIS_ DWORD dwNewPosition) PURE; + STDMETHOD(SetFormat) (THIS_ LPCWAVEFORMATEX pcfxFormat) PURE; + STDMETHOD(SetVolume) (THIS_ LONG lVolume) PURE; + STDMETHOD(SetPan) (THIS_ LONG lPan) PURE; + STDMETHOD(SetFrequency) (THIS_ DWORD dwFrequency) PURE; + STDMETHOD(Stop) (THIS) PURE; + STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; + STDMETHOD(Restore) (THIS) PURE; +}; + +#define IDirectSoundBuffer_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundBuffer_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundBuffer_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundBuffer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) +#define IDirectSoundBuffer_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b) +#define IDirectSoundBuffer_GetFormat(p,a,b,c) (p)->lpVtbl->GetFormat(p,a,b,c) +#define IDirectSoundBuffer_GetVolume(p,a) (p)->lpVtbl->GetVolume(p,a) +#define IDirectSoundBuffer_GetPan(p,a) (p)->lpVtbl->GetPan(p,a) +#define IDirectSoundBuffer_GetFrequency(p,a) (p)->lpVtbl->GetFrequency(p,a) +#define IDirectSoundBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a) +#define IDirectSoundBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g) +#define IDirectSoundBuffer_Play(p,a,b,c) (p)->lpVtbl->Play(p,a,b,c) +#define IDirectSoundBuffer_SetCurrentPosition(p,a) (p)->lpVtbl->SetCurrentPosition(p,a) +#define IDirectSoundBuffer_SetFormat(p,a) (p)->lpVtbl->SetFormat(p,a) +#define IDirectSoundBuffer_SetVolume(p,a) (p)->lpVtbl->SetVolume(p,a) +#define IDirectSoundBuffer_SetPan(p,a) (p)->lpVtbl->SetPan(p,a) +#define IDirectSoundBuffer_SetFrequency(p,a) (p)->lpVtbl->SetFrequency(p,a) +#define IDirectSoundBuffer_Stop(p) (p)->lpVtbl->Stop(p) +#define IDirectSoundBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d) +#define IDirectSoundBuffer_Restore(p) (p)->lpVtbl->Restore(p) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundBuffer_GetCaps(p,a) (p)->GetCaps(a) +#define IDirectSoundBuffer_GetCurrentPosition(p,a,b) (p)->GetCurrentPosition(a,b) +#define IDirectSoundBuffer_GetFormat(p,a,b,c) (p)->GetFormat(a,b,c) +#define IDirectSoundBuffer_GetVolume(p,a) (p)->GetVolume(a) +#define IDirectSoundBuffer_GetPan(p,a) (p)->GetPan(a) +#define IDirectSoundBuffer_GetFrequency(p,a) (p)->GetFrequency(a) +#define IDirectSoundBuffer_GetStatus(p,a) (p)->GetStatus(a) +#define IDirectSoundBuffer_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) (p)->Lock(a,b,c,d,e,f,g) +#define IDirectSoundBuffer_Play(p,a,b,c) (p)->Play(a,b,c) +#define IDirectSoundBuffer_SetCurrentPosition(p,a) (p)->SetCurrentPosition(a) +#define IDirectSoundBuffer_SetFormat(p,a) (p)->SetFormat(a) +#define IDirectSoundBuffer_SetVolume(p,a) (p)->SetVolume(a) +#define IDirectSoundBuffer_SetPan(p,a) (p)->SetPan(a) +#define IDirectSoundBuffer_SetFrequency(p,a) (p)->SetFrequency(a) +#define IDirectSoundBuffer_Stop(p) (p)->Stop() +#define IDirectSoundBuffer_Unlock(p,a,b,c,d) (p)->Unlock(a,b,c,d) +#define IDirectSoundBuffer_Restore(p) (p)->Restore() +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +#if DIRECTSOUND_VERSION >= 0x0800 + +// +// IDirectSoundBuffer8 +// + +DEFINE_GUID(IID_IDirectSoundBuffer8, 0x6825a449, 0x7524, 0x4d82, 0x92, 0x0f, 0x50, 0xe3, 0x6a, 0xb3, 0xab, 0x1e); + +#undef INTERFACE +#define INTERFACE IDirectSoundBuffer8 + +DECLARE_INTERFACE_(IDirectSoundBuffer8, IDirectSoundBuffer) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundBuffer methods + STDMETHOD(GetCaps) (THIS_ LPDSBCAPS pDSBufferCaps) PURE; + STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor) PURE; + STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; + STDMETHOD(GetVolume) (THIS_ LPLONG plVolume) PURE; + STDMETHOD(GetPan) (THIS_ LPLONG plPan) PURE; + STDMETHOD(GetFrequency) (THIS_ LPDWORD pdwFrequency) PURE; + STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; + STDMETHOD(Initialize) (THIS_ LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc) PURE; + STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, + LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; + STDMETHOD(Play) (THIS_ DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) PURE; + STDMETHOD(SetCurrentPosition) (THIS_ DWORD dwNewPosition) PURE; + STDMETHOD(SetFormat) (THIS_ LPCWAVEFORMATEX pcfxFormat) PURE; + STDMETHOD(SetVolume) (THIS_ LONG lVolume) PURE; + STDMETHOD(SetPan) (THIS_ LONG lPan) PURE; + STDMETHOD(SetFrequency) (THIS_ DWORD dwFrequency) PURE; + STDMETHOD(Stop) (THIS) PURE; + STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; + STDMETHOD(Restore) (THIS) PURE; + + // IDirectSoundBuffer8 methods + STDMETHOD(SetFX) (THIS_ DWORD dwEffectsCount, LPDSEFFECTDESC pDSFXDesc, LPDWORD pdwResultCodes) PURE; + STDMETHOD(AcquireResources) (THIS_ DWORD dwFlags, DWORD dwEffectsCount, LPDWORD pdwResultCodes) PURE; + STDMETHOD(GetObjectInPath) (THIS_ REFGUID rguidObject, DWORD dwIndex, REFGUID rguidInterface, LPVOID *ppObject) PURE; +}; + +// Special GUID meaning "select all objects" for use in GetObjectInPath() +DEFINE_GUID(GUID_All_Objects, 0xaa114de5, 0xc262, 0x4169, 0xa1, 0xc8, 0x23, 0xd6, 0x98, 0xcc, 0x73, 0xb5); + +#define IDirectSoundBuffer8_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundBuffer8_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundBuffer8_Release(p) IUnknown_Release(p) + +#define IDirectSoundBuffer8_GetCaps(p,a) IDirectSoundBuffer_GetCaps(p,a) +#define IDirectSoundBuffer8_GetCurrentPosition(p,a,b) IDirectSoundBuffer_GetCurrentPosition(p,a,b) +#define IDirectSoundBuffer8_GetFormat(p,a,b,c) IDirectSoundBuffer_GetFormat(p,a,b,c) +#define IDirectSoundBuffer8_GetVolume(p,a) IDirectSoundBuffer_GetVolume(p,a) +#define IDirectSoundBuffer8_GetPan(p,a) IDirectSoundBuffer_GetPan(p,a) +#define IDirectSoundBuffer8_GetFrequency(p,a) IDirectSoundBuffer_GetFrequency(p,a) +#define IDirectSoundBuffer8_GetStatus(p,a) IDirectSoundBuffer_GetStatus(p,a) +#define IDirectSoundBuffer8_Initialize(p,a,b) IDirectSoundBuffer_Initialize(p,a,b) +#define IDirectSoundBuffer8_Lock(p,a,b,c,d,e,f,g) IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) +#define IDirectSoundBuffer8_Play(p,a,b,c) IDirectSoundBuffer_Play(p,a,b,c) +#define IDirectSoundBuffer8_SetCurrentPosition(p,a) IDirectSoundBuffer_SetCurrentPosition(p,a) +#define IDirectSoundBuffer8_SetFormat(p,a) IDirectSoundBuffer_SetFormat(p,a) +#define IDirectSoundBuffer8_SetVolume(p,a) IDirectSoundBuffer_SetVolume(p,a) +#define IDirectSoundBuffer8_SetPan(p,a) IDirectSoundBuffer_SetPan(p,a) +#define IDirectSoundBuffer8_SetFrequency(p,a) IDirectSoundBuffer_SetFrequency(p,a) +#define IDirectSoundBuffer8_Stop(p) IDirectSoundBuffer_Stop(p) +#define IDirectSoundBuffer8_Unlock(p,a,b,c,d) IDirectSoundBuffer_Unlock(p,a,b,c,d) +#define IDirectSoundBuffer8_Restore(p) IDirectSoundBuffer_Restore(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundBuffer8_SetFX(p,a,b,c) (p)->lpVtbl->SetFX(p,a,b,c) +#define IDirectSoundBuffer8_AcquireResources(p,a,b,c) (p)->lpVtbl->AcquireResources(p,a,b,c) +#define IDirectSoundBuffer8_GetObjectInPath(p,a,b,c,d) (p)->lpVtbl->GetObjectInPath(p,a,b,c,d) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundBuffer8_SetFX(p,a,b,c) (p)->SetFX(a,b,c) +#define IDirectSoundBuffer8_AcquireResources(p,a,b,c) (p)->AcquireResources(a,b,c) +#define IDirectSoundBuffer8_GetObjectInPath(p,a,b,c,d) (p)->GetObjectInPath(a,b,c,d) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +#endif // DIRECTSOUND_VERSION >= 0x0800 + +// +// IDirectSound3DListener +// + +DEFINE_GUID(IID_IDirectSound3DListener, 0x279AFA84, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); + +#undef INTERFACE +#define INTERFACE IDirectSound3DListener + +DECLARE_INTERFACE_(IDirectSound3DListener, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSound3DListener methods + STDMETHOD(GetAllParameters) (THIS_ LPDS3DLISTENER pListener) PURE; + STDMETHOD(GetDistanceFactor) (THIS_ D3DVALUE* pflDistanceFactor) PURE; + STDMETHOD(GetDopplerFactor) (THIS_ D3DVALUE* pflDopplerFactor) PURE; + STDMETHOD(GetOrientation) (THIS_ D3DVECTOR* pvOrientFront, D3DVECTOR* pvOrientTop) PURE; + STDMETHOD(GetPosition) (THIS_ D3DVECTOR* pvPosition) PURE; + STDMETHOD(GetRolloffFactor) (THIS_ D3DVALUE* pflRolloffFactor) PURE; + STDMETHOD(GetVelocity) (THIS_ D3DVECTOR* pvVelocity) PURE; + STDMETHOD(SetAllParameters) (THIS_ LPCDS3DLISTENER pcListener, DWORD dwApply) PURE; + STDMETHOD(SetDistanceFactor) (THIS_ D3DVALUE flDistanceFactor, DWORD dwApply) PURE; + STDMETHOD(SetDopplerFactor) (THIS_ D3DVALUE flDopplerFactor, DWORD dwApply) PURE; + STDMETHOD(SetOrientation) (THIS_ D3DVALUE xFront, D3DVALUE yFront, D3DVALUE zFront, + D3DVALUE xTop, D3DVALUE yTop, D3DVALUE zTop, DWORD dwApply) PURE; + STDMETHOD(SetPosition) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; + STDMETHOD(SetRolloffFactor) (THIS_ D3DVALUE flRolloffFactor, DWORD dwApply) PURE; + STDMETHOD(SetVelocity) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; + STDMETHOD(CommitDeferredSettings) (THIS) PURE; +}; + +#define IDirectSound3DListener_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSound3DListener_AddRef(p) IUnknown_AddRef(p) +#define IDirectSound3DListener_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSound3DListener_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#define IDirectSound3DListener_GetDistanceFactor(p,a) (p)->lpVtbl->GetDistanceFactor(p,a) +#define IDirectSound3DListener_GetDopplerFactor(p,a) (p)->lpVtbl->GetDopplerFactor(p,a) +#define IDirectSound3DListener_GetOrientation(p,a,b) (p)->lpVtbl->GetOrientation(p,a,b) +#define IDirectSound3DListener_GetPosition(p,a) (p)->lpVtbl->GetPosition(p,a) +#define IDirectSound3DListener_GetRolloffFactor(p,a) (p)->lpVtbl->GetRolloffFactor(p,a) +#define IDirectSound3DListener_GetVelocity(p,a) (p)->lpVtbl->GetVelocity(p,a) +#define IDirectSound3DListener_SetAllParameters(p,a,b) (p)->lpVtbl->SetAllParameters(p,a,b) +#define IDirectSound3DListener_SetDistanceFactor(p,a,b) (p)->lpVtbl->SetDistanceFactor(p,a,b) +#define IDirectSound3DListener_SetDopplerFactor(p,a,b) (p)->lpVtbl->SetDopplerFactor(p,a,b) +#define IDirectSound3DListener_SetOrientation(p,a,b,c,d,e,f,g) (p)->lpVtbl->SetOrientation(p,a,b,c,d,e,f,g) +#define IDirectSound3DListener_SetPosition(p,a,b,c,d) (p)->lpVtbl->SetPosition(p,a,b,c,d) +#define IDirectSound3DListener_SetRolloffFactor(p,a,b) (p)->lpVtbl->SetRolloffFactor(p,a,b) +#define IDirectSound3DListener_SetVelocity(p,a,b,c,d) (p)->lpVtbl->SetVelocity(p,a,b,c,d) +#define IDirectSound3DListener_CommitDeferredSettings(p) (p)->lpVtbl->CommitDeferredSettings(p) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSound3DListener_GetAllParameters(p,a) (p)->GetAllParameters(a) +#define IDirectSound3DListener_GetDistanceFactor(p,a) (p)->GetDistanceFactor(a) +#define IDirectSound3DListener_GetDopplerFactor(p,a) (p)->GetDopplerFactor(a) +#define IDirectSound3DListener_GetOrientation(p,a,b) (p)->GetOrientation(a,b) +#define IDirectSound3DListener_GetPosition(p,a) (p)->GetPosition(a) +#define IDirectSound3DListener_GetRolloffFactor(p,a) (p)->GetRolloffFactor(a) +#define IDirectSound3DListener_GetVelocity(p,a) (p)->GetVelocity(a) +#define IDirectSound3DListener_SetAllParameters(p,a,b) (p)->SetAllParameters(a,b) +#define IDirectSound3DListener_SetDistanceFactor(p,a,b) (p)->SetDistanceFactor(a,b) +#define IDirectSound3DListener_SetDopplerFactor(p,a,b) (p)->SetDopplerFactor(a,b) +#define IDirectSound3DListener_SetOrientation(p,a,b,c,d,e,f,g) (p)->SetOrientation(a,b,c,d,e,f,g) +#define IDirectSound3DListener_SetPosition(p,a,b,c,d) (p)->SetPosition(a,b,c,d) +#define IDirectSound3DListener_SetRolloffFactor(p,a,b) (p)->SetRolloffFactor(a,b) +#define IDirectSound3DListener_SetVelocity(p,a,b,c,d) (p)->SetVelocity(a,b,c,d) +#define IDirectSound3DListener_CommitDeferredSettings(p) (p)->CommitDeferredSettings() +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSound3DBuffer +// + +DEFINE_GUID(IID_IDirectSound3DBuffer, 0x279AFA86, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); + +#undef INTERFACE +#define INTERFACE IDirectSound3DBuffer + +DECLARE_INTERFACE_(IDirectSound3DBuffer, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSound3DBuffer methods + STDMETHOD(GetAllParameters) (THIS_ LPDS3DBUFFER pDs3dBuffer) PURE; + STDMETHOD(GetConeAngles) (THIS_ LPDWORD pdwInsideConeAngle, LPDWORD pdwOutsideConeAngle) PURE; + STDMETHOD(GetConeOrientation) (THIS_ D3DVECTOR* pvOrientation) PURE; + STDMETHOD(GetConeOutsideVolume) (THIS_ LPLONG plConeOutsideVolume) PURE; + STDMETHOD(GetMaxDistance) (THIS_ D3DVALUE* pflMaxDistance) PURE; + STDMETHOD(GetMinDistance) (THIS_ D3DVALUE* pflMinDistance) PURE; + STDMETHOD(GetMode) (THIS_ LPDWORD pdwMode) PURE; + STDMETHOD(GetPosition) (THIS_ D3DVECTOR* pvPosition) PURE; + STDMETHOD(GetVelocity) (THIS_ D3DVECTOR* pvVelocity) PURE; + STDMETHOD(SetAllParameters) (THIS_ LPCDS3DBUFFER pcDs3dBuffer, DWORD dwApply) PURE; + STDMETHOD(SetConeAngles) (THIS_ DWORD dwInsideConeAngle, DWORD dwOutsideConeAngle, DWORD dwApply) PURE; + STDMETHOD(SetConeOrientation) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; + STDMETHOD(SetConeOutsideVolume) (THIS_ LONG lConeOutsideVolume, DWORD dwApply) PURE; + STDMETHOD(SetMaxDistance) (THIS_ D3DVALUE flMaxDistance, DWORD dwApply) PURE; + STDMETHOD(SetMinDistance) (THIS_ D3DVALUE flMinDistance, DWORD dwApply) PURE; + STDMETHOD(SetMode) (THIS_ DWORD dwMode, DWORD dwApply) PURE; + STDMETHOD(SetPosition) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; + STDMETHOD(SetVelocity) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; +}; + +#define IDirectSound3DBuffer_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSound3DBuffer_AddRef(p) IUnknown_AddRef(p) +#define IDirectSound3DBuffer_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSound3DBuffer_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#define IDirectSound3DBuffer_GetConeAngles(p,a,b) (p)->lpVtbl->GetConeAngles(p,a,b) +#define IDirectSound3DBuffer_GetConeOrientation(p,a) (p)->lpVtbl->GetConeOrientation(p,a) +#define IDirectSound3DBuffer_GetConeOutsideVolume(p,a) (p)->lpVtbl->GetConeOutsideVolume(p,a) +#define IDirectSound3DBuffer_GetPosition(p,a) (p)->lpVtbl->GetPosition(p,a) +#define IDirectSound3DBuffer_GetMinDistance(p,a) (p)->lpVtbl->GetMinDistance(p,a) +#define IDirectSound3DBuffer_GetMaxDistance(p,a) (p)->lpVtbl->GetMaxDistance(p,a) +#define IDirectSound3DBuffer_GetMode(p,a) (p)->lpVtbl->GetMode(p,a) +#define IDirectSound3DBuffer_GetVelocity(p,a) (p)->lpVtbl->GetVelocity(p,a) +#define IDirectSound3DBuffer_SetAllParameters(p,a,b) (p)->lpVtbl->SetAllParameters(p,a,b) +#define IDirectSound3DBuffer_SetConeAngles(p,a,b,c) (p)->lpVtbl->SetConeAngles(p,a,b,c) +#define IDirectSound3DBuffer_SetConeOrientation(p,a,b,c,d) (p)->lpVtbl->SetConeOrientation(p,a,b,c,d) +#define IDirectSound3DBuffer_SetConeOutsideVolume(p,a,b) (p)->lpVtbl->SetConeOutsideVolume(p,a,b) +#define IDirectSound3DBuffer_SetPosition(p,a,b,c,d) (p)->lpVtbl->SetPosition(p,a,b,c,d) +#define IDirectSound3DBuffer_SetMinDistance(p,a,b) (p)->lpVtbl->SetMinDistance(p,a,b) +#define IDirectSound3DBuffer_SetMaxDistance(p,a,b) (p)->lpVtbl->SetMaxDistance(p,a,b) +#define IDirectSound3DBuffer_SetMode(p,a,b) (p)->lpVtbl->SetMode(p,a,b) +#define IDirectSound3DBuffer_SetVelocity(p,a,b,c,d) (p)->lpVtbl->SetVelocity(p,a,b,c,d) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSound3DBuffer_GetAllParameters(p,a) (p)->GetAllParameters(a) +#define IDirectSound3DBuffer_GetConeAngles(p,a,b) (p)->GetConeAngles(a,b) +#define IDirectSound3DBuffer_GetConeOrientation(p,a) (p)->GetConeOrientation(a) +#define IDirectSound3DBuffer_GetConeOutsideVolume(p,a) (p)->GetConeOutsideVolume(a) +#define IDirectSound3DBuffer_GetPosition(p,a) (p)->GetPosition(a) +#define IDirectSound3DBuffer_GetMinDistance(p,a) (p)->GetMinDistance(a) +#define IDirectSound3DBuffer_GetMaxDistance(p,a) (p)->GetMaxDistance(a) +#define IDirectSound3DBuffer_GetMode(p,a) (p)->GetMode(a) +#define IDirectSound3DBuffer_GetVelocity(p,a) (p)->GetVelocity(a) +#define IDirectSound3DBuffer_SetAllParameters(p,a,b) (p)->SetAllParameters(a,b) +#define IDirectSound3DBuffer_SetConeAngles(p,a,b,c) (p)->SetConeAngles(a,b,c) +#define IDirectSound3DBuffer_SetConeOrientation(p,a,b,c,d) (p)->SetConeOrientation(a,b,c,d) +#define IDirectSound3DBuffer_SetConeOutsideVolume(p,a,b) (p)->SetConeOutsideVolume(a,b) +#define IDirectSound3DBuffer_SetPosition(p,a,b,c,d) (p)->SetPosition(a,b,c,d) +#define IDirectSound3DBuffer_SetMinDistance(p,a,b) (p)->SetMinDistance(a,b) +#define IDirectSound3DBuffer_SetMaxDistance(p,a,b) (p)->SetMaxDistance(a,b) +#define IDirectSound3DBuffer_SetMode(p,a,b) (p)->SetMode(a,b) +#define IDirectSound3DBuffer_SetVelocity(p,a,b,c,d) (p)->SetVelocity(a,b,c,d) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundCapture +// + +DEFINE_GUID(IID_IDirectSoundCapture, 0xb0210781, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); + +#undef INTERFACE +#define INTERFACE IDirectSoundCapture + +DECLARE_INTERFACE_(IDirectSoundCapture, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundCapture methods + STDMETHOD(CreateCaptureBuffer) (THIS_ LPCDSCBUFFERDESC pcDSCBufferDesc, LPDIRECTSOUNDCAPTUREBUFFER *ppDSCBuffer, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(GetCaps) (THIS_ LPDSCCAPS pDSCCaps) PURE; + STDMETHOD(Initialize) (THIS_ LPCGUID pcGuidDevice) PURE; +}; + +#define IDirectSoundCapture_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundCapture_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundCapture_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundCapture_CreateCaptureBuffer(p,a,b,c) (p)->lpVtbl->CreateCaptureBuffer(p,a,b,c) +#define IDirectSoundCapture_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) +#define IDirectSoundCapture_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundCapture_CreateCaptureBuffer(p,a,b,c) (p)->CreateCaptureBuffer(a,b,c) +#define IDirectSoundCapture_GetCaps(p,a) (p)->GetCaps(a) +#define IDirectSoundCapture_Initialize(p,a) (p)->Initialize(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundCaptureBuffer +// + +DEFINE_GUID(IID_IDirectSoundCaptureBuffer, 0xb0210782, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); + +#undef INTERFACE +#define INTERFACE IDirectSoundCaptureBuffer + +DECLARE_INTERFACE_(IDirectSoundCaptureBuffer, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundCaptureBuffer methods + STDMETHOD(GetCaps) (THIS_ LPDSCBCAPS pDSCBCaps) PURE; + STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCapturePosition, LPDWORD pdwReadPosition) PURE; + STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; + STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; + STDMETHOD(Initialize) (THIS_ LPDIRECTSOUNDCAPTURE pDirectSoundCapture, LPCDSCBUFFERDESC pcDSCBufferDesc) PURE; + STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, + LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; + STDMETHOD(Start) (THIS_ DWORD dwFlags) PURE; + STDMETHOD(Stop) (THIS) PURE; + STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; +}; + +#define IDirectSoundCaptureBuffer_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundCaptureBuffer_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundCaptureBuffer_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundCaptureBuffer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) +#define IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b) +#define IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) (p)->lpVtbl->GetFormat(p,a,b,c) +#define IDirectSoundCaptureBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a) +#define IDirectSoundCaptureBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g) +#define IDirectSoundCaptureBuffer_Start(p,a) (p)->lpVtbl->Start(p,a) +#define IDirectSoundCaptureBuffer_Stop(p) (p)->lpVtbl->Stop(p) +#define IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundCaptureBuffer_GetCaps(p,a) (p)->GetCaps(a) +#define IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) (p)->GetCurrentPosition(a,b) +#define IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) (p)->GetFormat(a,b,c) +#define IDirectSoundCaptureBuffer_GetStatus(p,a) (p)->GetStatus(a) +#define IDirectSoundCaptureBuffer_Initialize(p,a,b) (p)->Initialize(a,b) +#define IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) (p)->Lock(a,b,c,d,e,f,g) +#define IDirectSoundCaptureBuffer_Start(p,a) (p)->Start(a) +#define IDirectSoundCaptureBuffer_Stop(p) (p)->Stop() +#define IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) (p)->Unlock(a,b,c,d) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + + +#if DIRECTSOUND_VERSION >= 0x0800 + +// +// IDirectSoundCaptureBuffer8 +// + +DEFINE_GUID(IID_IDirectSoundCaptureBuffer8, 0x990df4, 0xdbb, 0x4872, 0x83, 0x3e, 0x6d, 0x30, 0x3e, 0x80, 0xae, 0xb6); + +#undef INTERFACE +#define INTERFACE IDirectSoundCaptureBuffer8 + +DECLARE_INTERFACE_(IDirectSoundCaptureBuffer8, IDirectSoundCaptureBuffer) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundCaptureBuffer methods + STDMETHOD(GetCaps) (THIS_ LPDSCBCAPS pDSCBCaps) PURE; + STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCapturePosition, LPDWORD pdwReadPosition) PURE; + STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; + STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; + STDMETHOD(Initialize) (THIS_ LPDIRECTSOUNDCAPTURE pDirectSoundCapture, LPCDSCBUFFERDESC pcDSCBufferDesc) PURE; + STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, + LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; + STDMETHOD(Start) (THIS_ DWORD dwFlags) PURE; + STDMETHOD(Stop) (THIS) PURE; + STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; + + // IDirectSoundCaptureBuffer8 methods + STDMETHOD(GetObjectInPath) (THIS_ REFGUID rguidObject, DWORD dwIndex, REFGUID rguidInterface, LPVOID *ppObject) PURE; + STDMETHOD(GetFXStatus) (DWORD dwFXCount, LPDWORD pdwFXStatus) PURE; +}; + +#define IDirectSoundCaptureBuffer8_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundCaptureBuffer8_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundCaptureBuffer8_Release(p) IUnknown_Release(p) + +#define IDirectSoundCaptureBuffer8_GetCaps(p,a) IDirectSoundCaptureBuffer_GetCaps(p,a) +#define IDirectSoundCaptureBuffer8_GetCurrentPosition(p,a,b) IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) +#define IDirectSoundCaptureBuffer8_GetFormat(p,a,b,c) IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) +#define IDirectSoundCaptureBuffer8_GetStatus(p,a) IDirectSoundCaptureBuffer_GetStatus(p,a) +#define IDirectSoundCaptureBuffer8_Initialize(p,a,b) IDirectSoundCaptureBuffer_Initialize(p,a,b) +#define IDirectSoundCaptureBuffer8_Lock(p,a,b,c,d,e,f,g) IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) +#define IDirectSoundCaptureBuffer8_Start(p,a) IDirectSoundCaptureBuffer_Start(p,a) +#define IDirectSoundCaptureBuffer8_Stop(p) IDirectSoundCaptureBuffer_Stop(p)) +#define IDirectSoundCaptureBuffer8_Unlock(p,a,b,c,d) IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundCaptureBuffer8_GetObjectInPath(p,a,b,c,d) (p)->lpVtbl->GetObjectInPath(p,a,b,c,d) +#define IDirectSoundCaptureBuffer8_GetFXStatus(p,a,b) (p)->lpVtbl->GetFXStatus(p,a,b) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundCaptureBuffer8_GetObjectInPath(p,a,b,c,d) (p)->GetObjectInPath(a,b,c,d) +#define IDirectSoundCaptureBuffer8_GetFXStatus(p,a,b) (p)->GetFXStatus(a,b) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +#endif // DIRECTSOUND_VERSION >= 0x0800 + +// +// IDirectSoundNotify +// + +DEFINE_GUID(IID_IDirectSoundNotify, 0xb0210783, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); + +#undef INTERFACE +#define INTERFACE IDirectSoundNotify + +DECLARE_INTERFACE_(IDirectSoundNotify, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundNotify methods + STDMETHOD(SetNotificationPositions) (THIS_ DWORD dwPositionNotifies, LPCDSBPOSITIONNOTIFY pcPositionNotifies) PURE; +}; + +#define IDirectSoundNotify_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundNotify_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundNotify_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->lpVtbl->SetNotificationPositions(p,a,b) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->SetNotificationPositions(a,b) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IKsPropertySet +// + +#ifndef _IKsPropertySet_ +#define _IKsPropertySet_ + +#ifdef __cplusplus +// 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined +struct IKsPropertySet; +#endif // __cplusplus + +typedef struct IKsPropertySet *LPKSPROPERTYSET; + +#define KSPROPERTY_SUPPORT_GET 0x00000001 +#define KSPROPERTY_SUPPORT_SET 0x00000002 + +DEFINE_GUID(IID_IKsPropertySet, 0x31efac30, 0x515c, 0x11d0, 0xa9, 0xaa, 0x00, 0xaa, 0x00, 0x61, 0xbe, 0x93); + +#undef INTERFACE +#define INTERFACE IKsPropertySet + +DECLARE_INTERFACE_(IKsPropertySet, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IKsPropertySet methods + STDMETHOD(Get) (THIS_ REFGUID rguidPropSet, ULONG ulId, LPVOID pInstanceData, ULONG ulInstanceLength, + LPVOID pPropertyData, ULONG ulDataLength, PULONG pulBytesReturned) PURE; + STDMETHOD(Set) (THIS_ REFGUID rguidPropSet, ULONG ulId, LPVOID pInstanceData, ULONG ulInstanceLength, + LPVOID pPropertyData, ULONG ulDataLength) PURE; + STDMETHOD(QuerySupport) (THIS_ REFGUID rguidPropSet, ULONG ulId, PULONG pulTypeSupport) PURE; +}; + +#define IKsPropertySet_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IKsPropertySet_AddRef(p) IUnknown_AddRef(p) +#define IKsPropertySet_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IKsPropertySet_Get(p,a,b,c,d,e,f,g) (p)->lpVtbl->Get(p,a,b,c,d,e,f,g) +#define IKsPropertySet_Set(p,a,b,c,d,e,f) (p)->lpVtbl->Set(p,a,b,c,d,e,f) +#define IKsPropertySet_QuerySupport(p,a,b,c) (p)->lpVtbl->QuerySupport(p,a,b,c) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IKsPropertySet_Get(p,a,b,c,d,e,f,g) (p)->Get(a,b,c,d,e,f,g) +#define IKsPropertySet_Set(p,a,b,c,d,e,f) (p)->Set(a,b,c,d,e,f) +#define IKsPropertySet_QuerySupport(p,a,b,c) (p)->QuerySupport(a,b,c) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +#endif // _IKsPropertySet_ + +#if DIRECTSOUND_VERSION >= 0x0800 + +// +// IDirectSoundFXGargle +// + +DEFINE_GUID(IID_IDirectSoundFXGargle, 0xd616f352, 0xd622, 0x11ce, 0xaa, 0xc5, 0x00, 0x20, 0xaf, 0x0b, 0x99, 0xa3); + +typedef struct _DSFXGargle +{ + DWORD dwRateHz; // Rate of modulation in hz + DWORD dwWaveShape; // DSFXGARGLE_WAVE_xxx +} DSFXGargle, *LPDSFXGargle; + +#define DSFXGARGLE_WAVE_TRIANGLE 0 +#define DSFXGARGLE_WAVE_SQUARE 1 + +typedef const DSFXGargle *LPCDSFXGargle; + +#define DSFXGARGLE_RATEHZ_MIN 1 +#define DSFXGARGLE_RATEHZ_MAX 1000 + +#undef INTERFACE +#define INTERFACE IDirectSoundFXGargle + +DECLARE_INTERFACE_(IDirectSoundFXGargle, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundFXGargle methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSFXGargle pcDsFxGargle) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSFXGargle pDsFxGargle) PURE; +}; + +#define IDirectSoundFXGargle_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundFXGargle_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundFXGargle_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXGargle_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundFXGargle_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXGargle_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundFXGargle_GetAllParameters(p,a) (p)->GetAllParameters(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundFXChorus +// + +DEFINE_GUID(IID_IDirectSoundFXChorus, 0x880842e3, 0x145f, 0x43e6, 0xa9, 0x34, 0xa7, 0x18, 0x06, 0xe5, 0x05, 0x47); + +typedef struct _DSFXChorus +{ + FLOAT fWetDryMix; + FLOAT fDepth; + FLOAT fFeedback; + FLOAT fFrequency; + LONG lWaveform; // LFO shape; DSFXCHORUS_WAVE_xxx + FLOAT fDelay; + LONG lPhase; +} DSFXChorus, *LPDSFXChorus; + +typedef const DSFXChorus *LPCDSFXChorus; + +#define DSFXCHORUS_WAVE_TRIANGLE 0 +#define DSFXCHORUS_WAVE_SIN 1 + +#define DSFXCHORUS_WETDRYMIX_MIN 0.0f +#define DSFXCHORUS_WETDRYMIX_MAX 100.0f +#define DSFXCHORUS_DEPTH_MIN 0.0f +#define DSFXCHORUS_DEPTH_MAX 100.0f +#define DSFXCHORUS_FEEDBACK_MIN -99.0f +#define DSFXCHORUS_FEEDBACK_MAX 99.0f +#define DSFXCHORUS_FREQUENCY_MIN 0.0f +#define DSFXCHORUS_FREQUENCY_MAX 10.0f +#define DSFXCHORUS_DELAY_MIN 0.0f +#define DSFXCHORUS_DELAY_MAX 20.0f +#define DSFXCHORUS_PHASE_MIN 0 +#define DSFXCHORUS_PHASE_MAX 4 + +#define DSFXCHORUS_PHASE_NEG_180 0 +#define DSFXCHORUS_PHASE_NEG_90 1 +#define DSFXCHORUS_PHASE_ZERO 2 +#define DSFXCHORUS_PHASE_90 3 +#define DSFXCHORUS_PHASE_180 4 + +#undef INTERFACE +#define INTERFACE IDirectSoundFXChorus + +DECLARE_INTERFACE_(IDirectSoundFXChorus, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundFXChorus methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSFXChorus pcDsFxChorus) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSFXChorus pDsFxChorus) PURE; +}; + +#define IDirectSoundFXChorus_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundFXChorus_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundFXChorus_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXChorus_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundFXChorus_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXChorus_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundFXChorus_GetAllParameters(p,a) (p)->GetAllParameters(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundFXFlanger +// + +DEFINE_GUID(IID_IDirectSoundFXFlanger, 0x903e9878, 0x2c92, 0x4072, 0x9b, 0x2c, 0xea, 0x68, 0xf5, 0x39, 0x67, 0x83); + +typedef struct _DSFXFlanger +{ + FLOAT fWetDryMix; + FLOAT fDepth; + FLOAT fFeedback; + FLOAT fFrequency; + LONG lWaveform; + FLOAT fDelay; + LONG lPhase; +} DSFXFlanger, *LPDSFXFlanger; + +typedef const DSFXFlanger *LPCDSFXFlanger; + +#define DSFXFLANGER_WAVE_TRIANGLE 0 +#define DSFXFLANGER_WAVE_SIN 1 + +#define DSFXFLANGER_WETDRYMIX_MIN 0.0f +#define DSFXFLANGER_WETDRYMIX_MAX 100.0f +#define DSFXFLANGER_FREQUENCY_MIN 0.0f +#define DSFXFLANGER_FREQUENCY_MAX 10.0f +#define DSFXFLANGER_DEPTH_MIN 0.0f +#define DSFXFLANGER_DEPTH_MAX 100.0f +#define DSFXFLANGER_PHASE_MIN 0 +#define DSFXFLANGER_PHASE_MAX 4 +#define DSFXFLANGER_FEEDBACK_MIN -99.0f +#define DSFXFLANGER_FEEDBACK_MAX 99.0f +#define DSFXFLANGER_DELAY_MIN 0.0f +#define DSFXFLANGER_DELAY_MAX 4.0f + +#define DSFXFLANGER_PHASE_NEG_180 0 +#define DSFXFLANGER_PHASE_NEG_90 1 +#define DSFXFLANGER_PHASE_ZERO 2 +#define DSFXFLANGER_PHASE_90 3 +#define DSFXFLANGER_PHASE_180 4 + +#undef INTERFACE +#define INTERFACE IDirectSoundFXFlanger + +DECLARE_INTERFACE_(IDirectSoundFXFlanger, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundFXFlanger methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSFXFlanger pcDsFxFlanger) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSFXFlanger pDsFxFlanger) PURE; +}; + +#define IDirectSoundFXFlanger_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundFXFlanger_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundFXFlanger_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXFlanger_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundFXFlanger_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXFlanger_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundFXFlanger_GetAllParameters(p,a) (p)->GetAllParameters(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundFXEcho +// + +DEFINE_GUID(IID_IDirectSoundFXEcho, 0x8bd28edf, 0x50db, 0x4e92, 0xa2, 0xbd, 0x44, 0x54, 0x88, 0xd1, 0xed, 0x42); + +typedef struct _DSFXEcho +{ + FLOAT fWetDryMix; + FLOAT fFeedback; + FLOAT fLeftDelay; + FLOAT fRightDelay; + LONG lPanDelay; +} DSFXEcho, *LPDSFXEcho; + +typedef const DSFXEcho *LPCDSFXEcho; + +#define DSFXECHO_WETDRYMIX_MIN 0.0f +#define DSFXECHO_WETDRYMIX_MAX 100.0f +#define DSFXECHO_FEEDBACK_MIN 0.0f +#define DSFXECHO_FEEDBACK_MAX 100.0f +#define DSFXECHO_LEFTDELAY_MIN 1.0f +#define DSFXECHO_LEFTDELAY_MAX 2000.0f +#define DSFXECHO_RIGHTDELAY_MIN 1.0f +#define DSFXECHO_RIGHTDELAY_MAX 2000.0f +#define DSFXECHO_PANDELAY_MIN 0 +#define DSFXECHO_PANDELAY_MAX 1 + +#undef INTERFACE +#define INTERFACE IDirectSoundFXEcho + +DECLARE_INTERFACE_(IDirectSoundFXEcho, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundFXEcho methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSFXEcho pcDsFxEcho) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSFXEcho pDsFxEcho) PURE; +}; + +#define IDirectSoundFXEcho_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundFXEcho_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundFXEcho_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXEcho_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundFXEcho_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXEcho_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundFXEcho_GetAllParameters(p,a) (p)->GetAllParameters(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundFXDistortion +// + +DEFINE_GUID(IID_IDirectSoundFXDistortion, 0x8ecf4326, 0x455f, 0x4d8b, 0xbd, 0xa9, 0x8d, 0x5d, 0x3e, 0x9e, 0x3e, 0x0b); + +typedef struct _DSFXDistortion +{ + FLOAT fGain; + FLOAT fEdge; + FLOAT fPostEQCenterFrequency; + FLOAT fPostEQBandwidth; + FLOAT fPreLowpassCutoff; +} DSFXDistortion, *LPDSFXDistortion; + +typedef const DSFXDistortion *LPCDSFXDistortion; + +#define DSFXDISTORTION_GAIN_MIN -60.0f +#define DSFXDISTORTION_GAIN_MAX 0.0f +#define DSFXDISTORTION_EDGE_MIN 0.0f +#define DSFXDISTORTION_EDGE_MAX 100.0f +#define DSFXDISTORTION_POSTEQCENTERFREQUENCY_MIN 100.0f +#define DSFXDISTORTION_POSTEQCENTERFREQUENCY_MAX 8000.0f +#define DSFXDISTORTION_POSTEQBANDWIDTH_MIN 100.0f +#define DSFXDISTORTION_POSTEQBANDWIDTH_MAX 8000.0f +#define DSFXDISTORTION_PRELOWPASSCUTOFF_MIN 100.0f +#define DSFXDISTORTION_PRELOWPASSCUTOFF_MAX 8000.0f + +#undef INTERFACE +#define INTERFACE IDirectSoundFXDistortion + +DECLARE_INTERFACE_(IDirectSoundFXDistortion, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundFXDistortion methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSFXDistortion pcDsFxDistortion) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSFXDistortion pDsFxDistortion) PURE; +}; + +#define IDirectSoundFXDistortion_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundFXDistortion_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundFXDistortion_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXDistortion_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundFXDistortion_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXDistortion_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundFXDistortion_GetAllParameters(p,a) (p)->GetAllParameters(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundFXCompressor +// + +DEFINE_GUID(IID_IDirectSoundFXCompressor, 0x4bbd1154, 0x62f6, 0x4e2c, 0xa1, 0x5c, 0xd3, 0xb6, 0xc4, 0x17, 0xf7, 0xa0); + +typedef struct _DSFXCompressor +{ + FLOAT fGain; + FLOAT fAttack; + FLOAT fRelease; + FLOAT fThreshold; + FLOAT fRatio; + FLOAT fPredelay; +} DSFXCompressor, *LPDSFXCompressor; + +typedef const DSFXCompressor *LPCDSFXCompressor; + +#define DSFXCOMPRESSOR_GAIN_MIN -60.0f +#define DSFXCOMPRESSOR_GAIN_MAX 60.0f +#define DSFXCOMPRESSOR_ATTACK_MIN 0.01f +#define DSFXCOMPRESSOR_ATTACK_MAX 500.0f +#define DSFXCOMPRESSOR_RELEASE_MIN 50.0f +#define DSFXCOMPRESSOR_RELEASE_MAX 3000.0f +#define DSFXCOMPRESSOR_THRESHOLD_MIN -60.0f +#define DSFXCOMPRESSOR_THRESHOLD_MAX 0.0f +#define DSFXCOMPRESSOR_RATIO_MIN 1.0f +#define DSFXCOMPRESSOR_RATIO_MAX 100.0f +#define DSFXCOMPRESSOR_PREDELAY_MIN 0.0f +#define DSFXCOMPRESSOR_PREDELAY_MAX 4.0f + +#undef INTERFACE +#define INTERFACE IDirectSoundFXCompressor + +DECLARE_INTERFACE_(IDirectSoundFXCompressor, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundFXCompressor methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSFXCompressor pcDsFxCompressor) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSFXCompressor pDsFxCompressor) PURE; +}; + +#define IDirectSoundFXCompressor_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundFXCompressor_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundFXCompressor_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXCompressor_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundFXCompressor_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXCompressor_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundFXCompressor_GetAllParameters(p,a) (p)->GetAllParameters(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundFXParamEq +// + +DEFINE_GUID(IID_IDirectSoundFXParamEq, 0xc03ca9fe, 0xfe90, 0x4204, 0x80, 0x78, 0x82, 0x33, 0x4c, 0xd1, 0x77, 0xda); + +typedef struct _DSFXParamEq +{ + FLOAT fCenter; + FLOAT fBandwidth; + FLOAT fGain; +} DSFXParamEq, *LPDSFXParamEq; + +typedef const DSFXParamEq *LPCDSFXParamEq; + +#define DSFXPARAMEQ_CENTER_MIN 80.0f +#define DSFXPARAMEQ_CENTER_MAX 16000.0f +#define DSFXPARAMEQ_BANDWIDTH_MIN 1.0f +#define DSFXPARAMEQ_BANDWIDTH_MAX 36.0f +#define DSFXPARAMEQ_GAIN_MIN -15.0f +#define DSFXPARAMEQ_GAIN_MAX 15.0f + +#undef INTERFACE +#define INTERFACE IDirectSoundFXParamEq + +DECLARE_INTERFACE_(IDirectSoundFXParamEq, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundFXParamEq methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSFXParamEq pcDsFxParamEq) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSFXParamEq pDsFxParamEq) PURE; +}; + +#define IDirectSoundFXParamEq_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundFXParamEq_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundFXParamEq_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXParamEq_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundFXParamEq_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXParamEq_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundFXParamEq_GetAllParameters(p,a) (p)->GetAllParameters(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundFXI3DL2Reverb +// + +DEFINE_GUID(IID_IDirectSoundFXI3DL2Reverb, 0x4b166a6a, 0x0d66, 0x43f3, 0x80, 0xe3, 0xee, 0x62, 0x80, 0xde, 0xe1, 0xa4); + +typedef struct _DSFXI3DL2Reverb +{ + LONG lRoom; // [-10000, 0] default: -1000 mB + LONG lRoomHF; // [-10000, 0] default: 0 mB + FLOAT flRoomRolloffFactor; // [0.0, 10.0] default: 0.0 + FLOAT flDecayTime; // [0.1, 20.0] default: 1.49s + FLOAT flDecayHFRatio; // [0.1, 2.0] default: 0.83 + LONG lReflections; // [-10000, 1000] default: -2602 mB + FLOAT flReflectionsDelay; // [0.0, 0.3] default: 0.007 s + LONG lReverb; // [-10000, 2000] default: 200 mB + FLOAT flReverbDelay; // [0.0, 0.1] default: 0.011 s + FLOAT flDiffusion; // [0.0, 100.0] default: 100.0 % + FLOAT flDensity; // [0.0, 100.0] default: 100.0 % + FLOAT flHFReference; // [20.0, 20000.0] default: 5000.0 Hz +} DSFXI3DL2Reverb, *LPDSFXI3DL2Reverb; + +typedef const DSFXI3DL2Reverb *LPCDSFXI3DL2Reverb; + +#define DSFX_I3DL2REVERB_ROOM_MIN (-10000) +#define DSFX_I3DL2REVERB_ROOM_MAX 0 +#define DSFX_I3DL2REVERB_ROOM_DEFAULT (-1000) + +#define DSFX_I3DL2REVERB_ROOMHF_MIN (-10000) +#define DSFX_I3DL2REVERB_ROOMHF_MAX 0 +#define DSFX_I3DL2REVERB_ROOMHF_DEFAULT (-100) + +#define DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MIN 0.0f +#define DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MAX 10.0f +#define DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_DEFAULT 0.0f + +#define DSFX_I3DL2REVERB_DECAYTIME_MIN 0.1f +#define DSFX_I3DL2REVERB_DECAYTIME_MAX 20.0f +#define DSFX_I3DL2REVERB_DECAYTIME_DEFAULT 1.49f + +#define DSFX_I3DL2REVERB_DECAYHFRATIO_MIN 0.1f +#define DSFX_I3DL2REVERB_DECAYHFRATIO_MAX 2.0f +#define DSFX_I3DL2REVERB_DECAYHFRATIO_DEFAULT 0.83f + +#define DSFX_I3DL2REVERB_REFLECTIONS_MIN (-10000) +#define DSFX_I3DL2REVERB_REFLECTIONS_MAX 1000 +#define DSFX_I3DL2REVERB_REFLECTIONS_DEFAULT (-2602) + +#define DSFX_I3DL2REVERB_REFLECTIONSDELAY_MIN 0.0f +#define DSFX_I3DL2REVERB_REFLECTIONSDELAY_MAX 0.3f +#define DSFX_I3DL2REVERB_REFLECTIONSDELAY_DEFAULT 0.007f + +#define DSFX_I3DL2REVERB_REVERB_MIN (-10000) +#define DSFX_I3DL2REVERB_REVERB_MAX 2000 +#define DSFX_I3DL2REVERB_REVERB_DEFAULT (200) + +#define DSFX_I3DL2REVERB_REVERBDELAY_MIN 0.0f +#define DSFX_I3DL2REVERB_REVERBDELAY_MAX 0.1f +#define DSFX_I3DL2REVERB_REVERBDELAY_DEFAULT 0.011f + +#define DSFX_I3DL2REVERB_DIFFUSION_MIN 0.0f +#define DSFX_I3DL2REVERB_DIFFUSION_MAX 100.0f +#define DSFX_I3DL2REVERB_DIFFUSION_DEFAULT 100.0f + +#define DSFX_I3DL2REVERB_DENSITY_MIN 0.0f +#define DSFX_I3DL2REVERB_DENSITY_MAX 100.0f +#define DSFX_I3DL2REVERB_DENSITY_DEFAULT 100.0f + +#define DSFX_I3DL2REVERB_HFREFERENCE_MIN 20.0f +#define DSFX_I3DL2REVERB_HFREFERENCE_MAX 20000.0f +#define DSFX_I3DL2REVERB_HFREFERENCE_DEFAULT 5000.0f + +#define DSFX_I3DL2REVERB_QUALITY_MIN 0 +#define DSFX_I3DL2REVERB_QUALITY_MAX 3 +#define DSFX_I3DL2REVERB_QUALITY_DEFAULT 2 + +#undef INTERFACE +#define INTERFACE IDirectSoundFXI3DL2Reverb + +DECLARE_INTERFACE_(IDirectSoundFXI3DL2Reverb, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundFXI3DL2Reverb methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSFXI3DL2Reverb pcDsFxI3DL2Reverb) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSFXI3DL2Reverb pDsFxI3DL2Reverb) PURE; + STDMETHOD(SetPreset) (THIS_ DWORD dwPreset) PURE; + STDMETHOD(GetPreset) (THIS_ LPDWORD pdwPreset) PURE; + STDMETHOD(SetQuality) (THIS_ LONG lQuality) PURE; + STDMETHOD(GetQuality) (THIS_ LONG *plQuality) PURE; +}; + +#define IDirectSoundFXI3DL2Reverb_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundFXI3DL2Reverb_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundFXI3DL2Reverb_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXI3DL2Reverb_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundFXI3DL2Reverb_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#define IDirectSoundFXI3DL2Reverb_SetPreset(p,a) (p)->lpVtbl->SetPreset(p,a) +#define IDirectSoundFXI3DL2Reverb_GetPreset(p,a) (p)->lpVtbl->GetPreset(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXI3DL2Reverb_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundFXI3DL2Reverb_GetAllParameters(p,a) (p)->GetAllParameters(a) +#define IDirectSoundFXI3DL2Reverb_SetPreset(p,a) (p)->SetPreset(a) +#define IDirectSoundFXI3DL2Reverb_GetPreset(p,a) (p)->GetPreset(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundFXWavesReverb +// + +DEFINE_GUID(IID_IDirectSoundFXWavesReverb,0x46858c3a,0x0dc6,0x45e3,0xb7,0x60,0xd4,0xee,0xf1,0x6c,0xb3,0x25); + +typedef struct _DSFXWavesReverb +{ + FLOAT fInGain; // [-96.0,0.0] default: 0.0 dB + FLOAT fReverbMix; // [-96.0,0.0] default: 0.0 db + FLOAT fReverbTime; // [0.001,3000.0] default: 1000.0 ms + FLOAT fHighFreqRTRatio; // [0.001,0.999] default: 0.001 +} DSFXWavesReverb, *LPDSFXWavesReverb; + +typedef const DSFXWavesReverb *LPCDSFXWavesReverb; + +#define DSFX_WAVESREVERB_INGAIN_MIN -96.0f +#define DSFX_WAVESREVERB_INGAIN_MAX 0.0f +#define DSFX_WAVESREVERB_INGAIN_DEFAULT 0.0f +#define DSFX_WAVESREVERB_REVERBMIX_MIN -96.0f +#define DSFX_WAVESREVERB_REVERBMIX_MAX 0.0f +#define DSFX_WAVESREVERB_REVERBMIX_DEFAULT 0.0f +#define DSFX_WAVESREVERB_REVERBTIME_MIN 0.001f +#define DSFX_WAVESREVERB_REVERBTIME_MAX 3000.0f +#define DSFX_WAVESREVERB_REVERBTIME_DEFAULT 1000.0f +#define DSFX_WAVESREVERB_HIGHFREQRTRATIO_MIN 0.001f +#define DSFX_WAVESREVERB_HIGHFREQRTRATIO_MAX 0.999f +#define DSFX_WAVESREVERB_HIGHFREQRTRATIO_DEFAULT 0.001f + +#undef INTERFACE +#define INTERFACE IDirectSoundFXWavesReverb + +DECLARE_INTERFACE_(IDirectSoundFXWavesReverb, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundFXWavesReverb methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSFXWavesReverb pcDsFxWavesReverb) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSFXWavesReverb pDsFxWavesReverb) PURE; +}; + +#define IDirectSoundFXWavesReverb_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundFXWavesReverb_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundFXWavesReverb_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXWavesReverb_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundFXWavesReverb_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFXWavesReverb_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundFXWavesReverb_GetAllParameters(p,a) (p)->GetAllParameters(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +// +// IDirectSoundCaptureFXAec +// + +DEFINE_GUID(IID_IDirectSoundCaptureFXAec, 0xad74143d, 0x903d, 0x4ab7, 0x80, 0x66, 0x28, 0xd3, 0x63, 0x03, 0x6d, 0x65); + +typedef struct _DSCFXAec +{ + BOOL fEnable; + BOOL fNoiseFill; + DWORD dwMode; +} DSCFXAec, *LPDSCFXAec; + +typedef const DSCFXAec *LPCDSCFXAec; + +// These match the AEC_MODE_* constants in the DDK's ksmedia.h file +#define DSCFX_AEC_MODE_PASS_THROUGH 0x0 +#define DSCFX_AEC_MODE_HALF_DUPLEX 0x1 +#define DSCFX_AEC_MODE_FULL_DUPLEX 0x2 + +// These match the AEC_STATUS_* constants in ksmedia.h +#define DSCFX_AEC_STATUS_HISTORY_UNINITIALIZED 0x0 +#define DSCFX_AEC_STATUS_HISTORY_CONTINUOUSLY_CONVERGED 0x1 +#define DSCFX_AEC_STATUS_HISTORY_PREVIOUSLY_DIVERGED 0x2 +#define DSCFX_AEC_STATUS_CURRENTLY_CONVERGED 0x8 + +#undef INTERFACE +#define INTERFACE IDirectSoundCaptureFXAec + +DECLARE_INTERFACE_(IDirectSoundCaptureFXAec, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundCaptureFXAec methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSCFXAec pDscFxAec) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSCFXAec pDscFxAec) PURE; + STDMETHOD(GetStatus) (THIS_ PDWORD pdwStatus) PURE; + STDMETHOD(Reset) (THIS) PURE; +}; + +#define IDirectSoundCaptureFXAec_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundCaptureFXAec_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundCaptureFXAec_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundCaptureFXAec_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundCaptureFXAec_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundCaptureFXAec_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundCaptureFXAec_GetAllParameters(p,a) (p)->GetAllParameters(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + + +// +// IDirectSoundCaptureFXNoiseSuppress +// + +DEFINE_GUID(IID_IDirectSoundCaptureFXNoiseSuppress, 0xed311e41, 0xfbae, 0x4175, 0x96, 0x25, 0xcd, 0x8, 0x54, 0xf6, 0x93, 0xca); + +typedef struct _DSCFXNoiseSuppress +{ + BOOL fEnable; +} DSCFXNoiseSuppress, *LPDSCFXNoiseSuppress; + +typedef const DSCFXNoiseSuppress *LPCDSCFXNoiseSuppress; + +#undef INTERFACE +#define INTERFACE IDirectSoundCaptureFXNoiseSuppress + +DECLARE_INTERFACE_(IDirectSoundCaptureFXNoiseSuppress, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundCaptureFXNoiseSuppress methods + STDMETHOD(SetAllParameters) (THIS_ LPCDSCFXNoiseSuppress pcDscFxNoiseSuppress) PURE; + STDMETHOD(GetAllParameters) (THIS_ LPDSCFXNoiseSuppress pDscFxNoiseSuppress) PURE; + STDMETHOD(Reset) (THIS) PURE; +}; + +#define IDirectSoundCaptureFXNoiseSuppress_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundCaptureFXNoiseSuppress_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundCaptureFXNoiseSuppress_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundCaptureFXNoiseSuppress_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) +#define IDirectSoundCaptureFXNoiseSuppress_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundCaptureFXNoiseSuppress_SetAllParameters(p,a) (p)->SetAllParameters(a) +#define IDirectSoundCaptureFXNoiseSuppress_GetAllParameters(p,a) (p)->GetAllParameters(a) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + + +// +// IDirectSoundFullDuplex +// + +#ifndef _IDirectSoundFullDuplex_ +#define _IDirectSoundFullDuplex_ + +#ifdef __cplusplus +// 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined +struct IDirectSoundFullDuplex; +#endif // __cplusplus + +typedef struct IDirectSoundFullDuplex *LPDIRECTSOUNDFULLDUPLEX; + +DEFINE_GUID(IID_IDirectSoundFullDuplex, 0xedcb4c7a, 0xdaab, 0x4216, 0xa4, 0x2e, 0x6c, 0x50, 0x59, 0x6d, 0xdc, 0x1d); + +#undef INTERFACE +#define INTERFACE IDirectSoundFullDuplex + +DECLARE_INTERFACE_(IDirectSoundFullDuplex, IUnknown) +{ + // IUnknown methods + STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // IDirectSoundFullDuplex methods + STDMETHOD(Initialize) (THIS_ LPCGUID pCaptureGuid, LPCGUID pRenderGuid, LPCDSCBUFFERDESC lpDscBufferDesc, LPCDSBUFFERDESC lpDsBufferDesc, HWND hWnd, DWORD dwLevel, LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8, LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8) PURE; +}; + +#define IDirectSoundFullDuplex_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) +#define IDirectSoundFullDuplex_AddRef(p) IUnknown_AddRef(p) +#define IDirectSoundFullDuplex_Release(p) IUnknown_Release(p) + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFullDuplex_Initialize(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->Initialize(p,a,b,c,d,e,f,g,h) +#else // !defined(__cplusplus) || defined(CINTERFACE) +#define IDirectSoundFullDuplex_Initialize(p,a,b,c,d,e,f,g,h) (p)->Initialize(a,b,c,d,e,f,g,h) +#endif // !defined(__cplusplus) || defined(CINTERFACE) + +#endif // _IDirectSoundFullDuplex_ + +#endif // DIRECTSOUND_VERSION >= 0x0800 + +// +// Return Codes +// + +// The function completed successfully +#define DS_OK S_OK + +// The call succeeded, but we had to substitute the 3D algorithm +#define DS_NO_VIRTUALIZATION MAKE_HRESULT(0, _FACDS, 10) + +// The call failed because resources (such as a priority level) +// were already being used by another caller +#define DSERR_ALLOCATED MAKE_DSHRESULT(10) + +// The control (vol, pan, etc.) requested by the caller is not available +#define DSERR_CONTROLUNAVAIL MAKE_DSHRESULT(30) + +// An invalid parameter was passed to the returning function +#define DSERR_INVALIDPARAM E_INVALIDARG + +// This call is not valid for the current state of this object +#define DSERR_INVALIDCALL MAKE_DSHRESULT(50) + +// An undetermined error occurred inside the DirectSound subsystem +#define DSERR_GENERIC E_FAIL + +// The caller does not have the priority level required for the function to +// succeed +#define DSERR_PRIOLEVELNEEDED MAKE_DSHRESULT(70) + +// Not enough free memory is available to complete the operation +#define DSERR_OUTOFMEMORY E_OUTOFMEMORY + +// The specified WAVE format is not supported +#define DSERR_BADFORMAT MAKE_DSHRESULT(100) + +// The function called is not supported at this time +#define DSERR_UNSUPPORTED E_NOTIMPL + +// No sound driver is available for use +#define DSERR_NODRIVER MAKE_DSHRESULT(120) + +// This object is already initialized +#define DSERR_ALREADYINITIALIZED MAKE_DSHRESULT(130) + +// This object does not support aggregation +#define DSERR_NOAGGREGATION CLASS_E_NOAGGREGATION + +// The buffer memory has been lost, and must be restored +#define DSERR_BUFFERLOST MAKE_DSHRESULT(150) + +// Another app has a higher priority level, preventing this call from +// succeeding +#define DSERR_OTHERAPPHASPRIO MAKE_DSHRESULT(160) + +// This object has not been initialized +#define DSERR_UNINITIALIZED MAKE_DSHRESULT(170) + +// The requested COM interface is not available +#define DSERR_NOINTERFACE E_NOINTERFACE + +// Access is denied +#define DSERR_ACCESSDENIED E_ACCESSDENIED + +// Tried to create a DSBCAPS_CTRLFX buffer shorter than DSBSIZE_FX_MIN milliseconds +#define DSERR_BUFFERTOOSMALL MAKE_DSHRESULT(180) + +// Attempt to use DirectSound 8 functionality on an older DirectSound object +#define DSERR_DS8_REQUIRED MAKE_DSHRESULT(190) + +// A circular loop of send effects was detected +#define DSERR_SENDLOOP MAKE_DSHRESULT(200) + +// The GUID specified in an audiopath file does not match a valid MIXIN buffer +#define DSERR_BADSENDBUFFERGUID MAKE_DSHRESULT(210) + +// The object requested was not found (numerically equal to DMUS_E_NOT_FOUND) +#define DSERR_OBJECTNOTFOUND MAKE_DSHRESULT(4449) + +// The effects requested could not be found on the system, or they were found +// but in the wrong order, or in the wrong hardware/software locations. +#define DSERR_FXUNAVAILABLE MAKE_DSHRESULT(220) + +// +// Flags +// + +#define DSCAPS_PRIMARYMONO 0x00000001 +#define DSCAPS_PRIMARYSTEREO 0x00000002 +#define DSCAPS_PRIMARY8BIT 0x00000004 +#define DSCAPS_PRIMARY16BIT 0x00000008 +#define DSCAPS_CONTINUOUSRATE 0x00000010 +#define DSCAPS_EMULDRIVER 0x00000020 +#define DSCAPS_CERTIFIED 0x00000040 +#define DSCAPS_SECONDARYMONO 0x00000100 +#define DSCAPS_SECONDARYSTEREO 0x00000200 +#define DSCAPS_SECONDARY8BIT 0x00000400 +#define DSCAPS_SECONDARY16BIT 0x00000800 + +#define DSSCL_NORMAL 0x00000001 +#define DSSCL_PRIORITY 0x00000002 +#define DSSCL_EXCLUSIVE 0x00000003 +#define DSSCL_WRITEPRIMARY 0x00000004 + +#define DSSPEAKER_DIRECTOUT 0x00000000 +#define DSSPEAKER_HEADPHONE 0x00000001 +#define DSSPEAKER_MONO 0x00000002 +#define DSSPEAKER_QUAD 0x00000003 +#define DSSPEAKER_STEREO 0x00000004 +#define DSSPEAKER_SURROUND 0x00000005 +#define DSSPEAKER_5POINT1 0x00000006 +#define DSSPEAKER_7POINT1 0x00000007 + +#define DSSPEAKER_GEOMETRY_MIN 0x00000005 // 5 degrees +#define DSSPEAKER_GEOMETRY_NARROW 0x0000000A // 10 degrees +#define DSSPEAKER_GEOMETRY_WIDE 0x00000014 // 20 degrees +#define DSSPEAKER_GEOMETRY_MAX 0x000000B4 // 180 degrees + +#define DSSPEAKER_COMBINED(c, g) ((DWORD)(((BYTE)(c)) | ((DWORD)((BYTE)(g))) << 16)) +#define DSSPEAKER_CONFIG(a) ((BYTE)(a)) +#define DSSPEAKER_GEOMETRY(a) ((BYTE)(((DWORD)(a) >> 16) & 0x00FF)) + +#define DSBCAPS_PRIMARYBUFFER 0x00000001 +#define DSBCAPS_STATIC 0x00000002 +#define DSBCAPS_LOCHARDWARE 0x00000004 +#define DSBCAPS_LOCSOFTWARE 0x00000008 +#define DSBCAPS_CTRL3D 0x00000010 +#define DSBCAPS_CTRLFREQUENCY 0x00000020 +#define DSBCAPS_CTRLPAN 0x00000040 +#define DSBCAPS_CTRLVOLUME 0x00000080 +#define DSBCAPS_CTRLPOSITIONNOTIFY 0x00000100 +#define DSBCAPS_CTRLFX 0x00000200 +#define DSBCAPS_STICKYFOCUS 0x00004000 +#define DSBCAPS_GLOBALFOCUS 0x00008000 +#define DSBCAPS_GETCURRENTPOSITION2 0x00010000 +#define DSBCAPS_MUTE3DATMAXDISTANCE 0x00020000 +#define DSBCAPS_LOCDEFER 0x00040000 + +#define DSBPLAY_LOOPING 0x00000001 +#define DSBPLAY_LOCHARDWARE 0x00000002 +#define DSBPLAY_LOCSOFTWARE 0x00000004 +#define DSBPLAY_TERMINATEBY_TIME 0x00000008 +#define DSBPLAY_TERMINATEBY_DISTANCE 0x000000010 +#define DSBPLAY_TERMINATEBY_PRIORITY 0x000000020 + +#define DSBSTATUS_PLAYING 0x00000001 +#define DSBSTATUS_BUFFERLOST 0x00000002 +#define DSBSTATUS_LOOPING 0x00000004 +#define DSBSTATUS_LOCHARDWARE 0x00000008 +#define DSBSTATUS_LOCSOFTWARE 0x00000010 +#define DSBSTATUS_TERMINATED 0x00000020 + +#define DSBLOCK_FROMWRITECURSOR 0x00000001 +#define DSBLOCK_ENTIREBUFFER 0x00000002 + +#define DSBFREQUENCY_ORIGINAL 0 +#define DSBFREQUENCY_MIN 100 +#if DIRECTSOUND_VERSION >= 0x0900 +#define DSBFREQUENCY_MAX 200000 +#else +#define DSBFREQUENCY_MAX 100000 +#endif + +#define DSBPAN_LEFT -10000 +#define DSBPAN_CENTER 0 +#define DSBPAN_RIGHT 10000 + +#define DSBVOLUME_MIN -10000 +#define DSBVOLUME_MAX 0 + +#define DSBSIZE_MIN 4 +#define DSBSIZE_MAX 0x0FFFFFFF +#define DSBSIZE_FX_MIN 150 // NOTE: Milliseconds, not bytes + +#define DS3DMODE_NORMAL 0x00000000 +#define DS3DMODE_HEADRELATIVE 0x00000001 +#define DS3DMODE_DISABLE 0x00000002 + +#define DS3D_IMMEDIATE 0x00000000 +#define DS3D_DEFERRED 0x00000001 + +#define DS3D_MINDISTANCEFACTOR FLT_MIN +#define DS3D_MAXDISTANCEFACTOR FLT_MAX +#define DS3D_DEFAULTDISTANCEFACTOR 1.0f + +#define DS3D_MINROLLOFFFACTOR 0.0f +#define DS3D_MAXROLLOFFFACTOR 10.0f +#define DS3D_DEFAULTROLLOFFFACTOR 1.0f + +#define DS3D_MINDOPPLERFACTOR 0.0f +#define DS3D_MAXDOPPLERFACTOR 10.0f +#define DS3D_DEFAULTDOPPLERFACTOR 1.0f + +#define DS3D_DEFAULTMINDISTANCE 1.0f +#define DS3D_DEFAULTMAXDISTANCE 1000000000.0f + +#define DS3D_MINCONEANGLE 0 +#define DS3D_MAXCONEANGLE 360 +#define DS3D_DEFAULTCONEANGLE 360 + +#define DS3D_DEFAULTCONEOUTSIDEVOLUME DSBVOLUME_MAX + +// IDirectSoundCapture attributes + +#define DSCCAPS_EMULDRIVER DSCAPS_EMULDRIVER +#define DSCCAPS_CERTIFIED DSCAPS_CERTIFIED +#define DSCCAPS_MULTIPLECAPTURE 0x00000001 + +// IDirectSoundCaptureBuffer attributes + +#define DSCBCAPS_WAVEMAPPED 0x80000000 + +#if DIRECTSOUND_VERSION >= 0x0800 +#define DSCBCAPS_CTRLFX 0x00000200 +#endif + + +#define DSCBLOCK_ENTIREBUFFER 0x00000001 + +#define DSCBSTATUS_CAPTURING 0x00000001 +#define DSCBSTATUS_LOOPING 0x00000002 + +#define DSCBSTART_LOOPING 0x00000001 + +#define DSBPN_OFFSETSTOP 0xFFFFFFFF + +#define DS_CERTIFIED 0x00000000 +#define DS_UNCERTIFIED 0x00000001 + + +// +// Flags for the I3DL2 effects +// + +// +// I3DL2 Material Presets +// + +enum +{ + DSFX_I3DL2_MATERIAL_PRESET_SINGLEWINDOW, + DSFX_I3DL2_MATERIAL_PRESET_DOUBLEWINDOW, + DSFX_I3DL2_MATERIAL_PRESET_THINDOOR, + DSFX_I3DL2_MATERIAL_PRESET_THICKDOOR, + DSFX_I3DL2_MATERIAL_PRESET_WOODWALL, + DSFX_I3DL2_MATERIAL_PRESET_BRICKWALL, + DSFX_I3DL2_MATERIAL_PRESET_STONEWALL, + DSFX_I3DL2_MATERIAL_PRESET_CURTAIN +}; + +#define I3DL2_MATERIAL_PRESET_SINGLEWINDOW -2800,0.71f +#define I3DL2_MATERIAL_PRESET_DOUBLEWINDOW -5000,0.40f +#define I3DL2_MATERIAL_PRESET_THINDOOR -1800,0.66f +#define I3DL2_MATERIAL_PRESET_THICKDOOR -4400,0.64f +#define I3DL2_MATERIAL_PRESET_WOODWALL -4000,0.50f +#define I3DL2_MATERIAL_PRESET_BRICKWALL -5000,0.60f +#define I3DL2_MATERIAL_PRESET_STONEWALL -6000,0.68f +#define I3DL2_MATERIAL_PRESET_CURTAIN -1200,0.15f + +enum +{ + DSFX_I3DL2_ENVIRONMENT_PRESET_DEFAULT, + DSFX_I3DL2_ENVIRONMENT_PRESET_GENERIC, + DSFX_I3DL2_ENVIRONMENT_PRESET_PADDEDCELL, + DSFX_I3DL2_ENVIRONMENT_PRESET_ROOM, + DSFX_I3DL2_ENVIRONMENT_PRESET_BATHROOM, + DSFX_I3DL2_ENVIRONMENT_PRESET_LIVINGROOM, + DSFX_I3DL2_ENVIRONMENT_PRESET_STONEROOM, + DSFX_I3DL2_ENVIRONMENT_PRESET_AUDITORIUM, + DSFX_I3DL2_ENVIRONMENT_PRESET_CONCERTHALL, + DSFX_I3DL2_ENVIRONMENT_PRESET_CAVE, + DSFX_I3DL2_ENVIRONMENT_PRESET_ARENA, + DSFX_I3DL2_ENVIRONMENT_PRESET_HANGAR, + DSFX_I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY, + DSFX_I3DL2_ENVIRONMENT_PRESET_HALLWAY, + DSFX_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR, + DSFX_I3DL2_ENVIRONMENT_PRESET_ALLEY, + DSFX_I3DL2_ENVIRONMENT_PRESET_FOREST, + DSFX_I3DL2_ENVIRONMENT_PRESET_CITY, + DSFX_I3DL2_ENVIRONMENT_PRESET_MOUNTAINS, + DSFX_I3DL2_ENVIRONMENT_PRESET_QUARRY, + DSFX_I3DL2_ENVIRONMENT_PRESET_PLAIN, + DSFX_I3DL2_ENVIRONMENT_PRESET_PARKINGLOT, + DSFX_I3DL2_ENVIRONMENT_PRESET_SEWERPIPE, + DSFX_I3DL2_ENVIRONMENT_PRESET_UNDERWATER, + DSFX_I3DL2_ENVIRONMENT_PRESET_SMALLROOM, + DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM, + DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEROOM, + DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL, + DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEHALL, + DSFX_I3DL2_ENVIRONMENT_PRESET_PLATE +}; + +// +// I3DL2 Reverberation Presets Values +// + +#define I3DL2_ENVIRONMENT_PRESET_DEFAULT -1000, -100, 0.0f, 1.49f, 0.83f, -2602, 0.007f, 200, 0.011f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_GENERIC -1000, -100, 0.0f, 1.49f, 0.83f, -2602, 0.007f, 200, 0.011f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_PADDEDCELL -1000,-6000, 0.0f, 0.17f, 0.10f, -1204, 0.001f, 207, 0.002f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_ROOM -1000, -454, 0.0f, 0.40f, 0.83f, -1646, 0.002f, 53, 0.003f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_BATHROOM -1000,-1200, 0.0f, 1.49f, 0.54f, -370, 0.007f, 1030, 0.011f, 100.0f, 60.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_LIVINGROOM -1000,-6000, 0.0f, 0.50f, 0.10f, -1376, 0.003f, -1104, 0.004f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_STONEROOM -1000, -300, 0.0f, 2.31f, 0.64f, -711, 0.012f, 83, 0.017f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_AUDITORIUM -1000, -476, 0.0f, 4.32f, 0.59f, -789, 0.020f, -289, 0.030f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_CONCERTHALL -1000, -500, 0.0f, 3.92f, 0.70f, -1230, 0.020f, -2, 0.029f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_CAVE -1000, 0, 0.0f, 2.91f, 1.30f, -602, 0.015f, -302, 0.022f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_ARENA -1000, -698, 0.0f, 7.24f, 0.33f, -1166, 0.020f, 16, 0.030f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_HANGAR -1000,-1000, 0.0f,10.05f, 0.23f, -602, 0.020f, 198, 0.030f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY -1000,-4000, 0.0f, 0.30f, 0.10f, -1831, 0.002f, -1630, 0.030f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_HALLWAY -1000, -300, 0.0f, 1.49f, 0.59f, -1219, 0.007f, 441, 0.011f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR -1000, -237, 0.0f, 2.70f, 0.79f, -1214, 0.013f, 395, 0.020f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_ALLEY -1000, -270, 0.0f, 1.49f, 0.86f, -1204, 0.007f, -4, 0.011f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_FOREST -1000,-3300, 0.0f, 1.49f, 0.54f, -2560, 0.162f, -613, 0.088f, 79.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_CITY -1000, -800, 0.0f, 1.49f, 0.67f, -2273, 0.007f, -2217, 0.011f, 50.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_MOUNTAINS -1000,-2500, 0.0f, 1.49f, 0.21f, -2780, 0.300f, -2014, 0.100f, 27.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_QUARRY -1000,-1000, 0.0f, 1.49f, 0.83f,-10000, 0.061f, 500, 0.025f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_PLAIN -1000,-2000, 0.0f, 1.49f, 0.50f, -2466, 0.179f, -2514, 0.100f, 21.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_PARKINGLOT -1000, 0, 0.0f, 1.65f, 1.50f, -1363, 0.008f, -1153, 0.012f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_SEWERPIPE -1000,-1000, 0.0f, 2.81f, 0.14f, 429, 0.014f, 648, 0.021f, 80.0f, 60.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_UNDERWATER -1000,-4000, 0.0f, 1.49f, 0.10f, -449, 0.007f, 1700, 0.011f, 100.0f, 100.0f, 5000.0f + +// +// Examples simulating 'musical' reverb presets +// +// Name Decay time Description +// Small Room 1.1s A small size room with a length of 5m or so. +// Medium Room 1.3s A medium size room with a length of 10m or so. +// Large Room 1.5s A large size room suitable for live performances. +// Medium Hall 1.8s A medium size concert hall. +// Large Hall 1.8s A large size concert hall suitable for a full orchestra. +// Plate 1.3s A plate reverb simulation. +// + +#define I3DL2_ENVIRONMENT_PRESET_SMALLROOM -1000, -600, 0.0f, 1.10f, 0.83f, -400, 0.005f, 500, 0.010f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM -1000, -600, 0.0f, 1.30f, 0.83f, -1000, 0.010f, -200, 0.020f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_LARGEROOM -1000, -600, 0.0f, 1.50f, 0.83f, -1600, 0.020f, -1000, 0.040f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL -1000, -600, 0.0f, 1.80f, 0.70f, -1300, 0.015f, -800, 0.030f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_LARGEHALL -1000, -600, 0.0f, 1.80f, 0.70f, -2000, 0.030f, -1400, 0.060f, 100.0f, 100.0f, 5000.0f +#define I3DL2_ENVIRONMENT_PRESET_PLATE -1000, -200, 0.0f, 1.30f, 0.90f, 0, 0.002f, 0, 0.010f, 100.0f, 75.0f, 5000.0f + +// +// DirectSound3D Algorithms +// + +// Default DirectSound3D algorithm {00000000-0000-0000-0000-000000000000} +#define DS3DALG_DEFAULT GUID_NULL + +// No virtualization (Pan3D) {C241333F-1C1B-11d2-94F5-00C04FC28ACA} +DEFINE_GUID(DS3DALG_NO_VIRTUALIZATION, 0xc241333f, 0x1c1b, 0x11d2, 0x94, 0xf5, 0x0, 0xc0, 0x4f, 0xc2, 0x8a, 0xca); + +// High-quality HRTF algorithm {C2413340-1C1B-11d2-94F5-00C04FC28ACA} +DEFINE_GUID(DS3DALG_HRTF_FULL, 0xc2413340, 0x1c1b, 0x11d2, 0x94, 0xf5, 0x0, 0xc0, 0x4f, 0xc2, 0x8a, 0xca); + +// Lower-quality HRTF algorithm {C2413342-1C1B-11d2-94F5-00C04FC28ACA} +DEFINE_GUID(DS3DALG_HRTF_LIGHT, 0xc2413342, 0x1c1b, 0x11d2, 0x94, 0xf5, 0x0, 0xc0, 0x4f, 0xc2, 0x8a, 0xca); + + +#if DIRECTSOUND_VERSION >= 0x0800 + +// +// DirectSound Internal Effect Algorithms +// + + +// Gargle {DAFD8210-5711-4B91-9FE3-F75B7AE279BF} +DEFINE_GUID(GUID_DSFX_STANDARD_GARGLE, 0xdafd8210, 0x5711, 0x4b91, 0x9f, 0xe3, 0xf7, 0x5b, 0x7a, 0xe2, 0x79, 0xbf); + +// Chorus {EFE6629C-81F7-4281-BD91-C9D604A95AF6} +DEFINE_GUID(GUID_DSFX_STANDARD_CHORUS, 0xefe6629c, 0x81f7, 0x4281, 0xbd, 0x91, 0xc9, 0xd6, 0x04, 0xa9, 0x5a, 0xf6); + +// Flanger {EFCA3D92-DFD8-4672-A603-7420894BAD98} +DEFINE_GUID(GUID_DSFX_STANDARD_FLANGER, 0xefca3d92, 0xdfd8, 0x4672, 0xa6, 0x03, 0x74, 0x20, 0x89, 0x4b, 0xad, 0x98); + +// Echo/Delay {EF3E932C-D40B-4F51-8CCF-3F98F1B29D5D} +DEFINE_GUID(GUID_DSFX_STANDARD_ECHO, 0xef3e932c, 0xd40b, 0x4f51, 0x8c, 0xcf, 0x3f, 0x98, 0xf1, 0xb2, 0x9d, 0x5d); + +// Distortion {EF114C90-CD1D-484E-96E5-09CFAF912A21} +DEFINE_GUID(GUID_DSFX_STANDARD_DISTORTION, 0xef114c90, 0xcd1d, 0x484e, 0x96, 0xe5, 0x09, 0xcf, 0xaf, 0x91, 0x2a, 0x21); + +// Compressor/Limiter {EF011F79-4000-406D-87AF-BFFB3FC39D57} +DEFINE_GUID(GUID_DSFX_STANDARD_COMPRESSOR, 0xef011f79, 0x4000, 0x406d, 0x87, 0xaf, 0xbf, 0xfb, 0x3f, 0xc3, 0x9d, 0x57); + +// Parametric Equalization {120CED89-3BF4-4173-A132-3CB406CF3231} +DEFINE_GUID(GUID_DSFX_STANDARD_PARAMEQ, 0x120ced89, 0x3bf4, 0x4173, 0xa1, 0x32, 0x3c, 0xb4, 0x06, 0xcf, 0x32, 0x31); + +// I3DL2 Environmental Reverberation: Reverb (Listener) Effect {EF985E71-D5C7-42D4-BA4D-2D073E2E96F4} +DEFINE_GUID(GUID_DSFX_STANDARD_I3DL2REVERB, 0xef985e71, 0xd5c7, 0x42d4, 0xba, 0x4d, 0x2d, 0x07, 0x3e, 0x2e, 0x96, 0xf4); + +// Waves Reverberation {87FC0268-9A55-4360-95AA-004A1D9DE26C} +DEFINE_GUID(GUID_DSFX_WAVES_REVERB, 0x87fc0268, 0x9a55, 0x4360, 0x95, 0xaa, 0x00, 0x4a, 0x1d, 0x9d, 0xe2, 0x6c); + +// +// DirectSound Capture Effect Algorithms +// + + +// Acoustic Echo Canceller {BF963D80-C559-11D0-8A2B-00A0C9255AC1} +// Matches KSNODETYPE_ACOUSTIC_ECHO_CANCEL in ksmedia.h +DEFINE_GUID(GUID_DSCFX_CLASS_AEC, 0xBF963D80L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1); + +// Microsoft AEC {CDEBB919-379A-488a-8765-F53CFD36DE40} +DEFINE_GUID(GUID_DSCFX_MS_AEC, 0xcdebb919, 0x379a, 0x488a, 0x87, 0x65, 0xf5, 0x3c, 0xfd, 0x36, 0xde, 0x40); + +// System AEC {1C22C56D-9879-4f5b-A389-27996DDC2810} +DEFINE_GUID(GUID_DSCFX_SYSTEM_AEC, 0x1c22c56d, 0x9879, 0x4f5b, 0xa3, 0x89, 0x27, 0x99, 0x6d, 0xdc, 0x28, 0x10); + +// Noise Supression {E07F903F-62FD-4e60-8CDD-DEA7236665B5} +// Matches KSNODETYPE_NOISE_SUPPRESS in post Windows ME DDK's ksmedia.h +DEFINE_GUID(GUID_DSCFX_CLASS_NS, 0xe07f903f, 0x62fd, 0x4e60, 0x8c, 0xdd, 0xde, 0xa7, 0x23, 0x66, 0x65, 0xb5); + +// Microsoft Noise Suppresion {11C5C73B-66E9-4ba1-A0BA-E814C6EED92D} +DEFINE_GUID(GUID_DSCFX_MS_NS, 0x11c5c73b, 0x66e9, 0x4ba1, 0xa0, 0xba, 0xe8, 0x14, 0xc6, 0xee, 0xd9, 0x2d); + +// System Noise Suppresion {5AB0882E-7274-4516-877D-4EEE99BA4FD0} +DEFINE_GUID(GUID_DSCFX_SYSTEM_NS, 0x5ab0882e, 0x7274, 0x4516, 0x87, 0x7d, 0x4e, 0xee, 0x99, 0xba, 0x4f, 0xd0); + +#endif // DIRECTSOUND_VERSION >= 0x0800 + +#endif // __DSOUND_INCLUDED__ + + + +#ifdef __cplusplus +}; +#endif // __cplusplus + + diff --git a/src/drivers/win/input.cpp b/src/drivers/win/input.cpp index 883d4a44..dbff8238 100644 --- a/src/drivers/win/input.cpp +++ b/src/drivers/win/input.cpp @@ -22,7 +22,7 @@ #define _WIN32_IE 0x0300 #include "common.h" -#include +#include "dinput.h" #include #include diff --git a/src/drivers/win/joystick.cpp b/src/drivers/win/joystick.cpp index bd590552..2083d383 100644 --- a/src/drivers/win/joystick.cpp +++ b/src/drivers/win/joystick.cpp @@ -19,7 +19,7 @@ */ #include "common.h" -#include +#include "dinput.h" #include "input.h" #include "joystick.h" diff --git a/src/drivers/win/keyboard.cpp b/src/drivers/win/keyboard.cpp index 41b61616..a2f5d15e 100644 --- a/src/drivers/win/keyboard.cpp +++ b/src/drivers/win/keyboard.cpp @@ -19,7 +19,7 @@ */ #include "common.h" -#include +#include "dinput.h" #include "input.h" #include "keyboard.h" diff --git a/src/drivers/win/main.cpp b/src/drivers/win/main.cpp index abfc5caf..c2fc4c8d 100644 --- a/src/drivers/win/main.cpp +++ b/src/drivers/win/main.cpp @@ -24,10 +24,10 @@ // I like hacks. #define uint8 __UNO492032 #include -#include +#include "ddraw.h" #undef LPCWAVEFORMATEX -#include -#include +#include "dsound.h" +#include "dinput.h" //#include //mbg merge 7/17/06 removed #include #include // For directories configuration dialog. diff --git a/vc8/fceux.vcproj b/vc8/fceux.vcproj index a1dd3fc8..8040c470 100644 --- a/vc8/fceux.vcproj +++ b/vc8/fceux.vcproj @@ -67,7 +67,7 @@ /> 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 DK9pXB literal 0 HcmV?d00001 diff --git a/vc_libs/x86/dsound.lib b/vc_libs/x86/dsound.lib new file mode 100644 index 0000000000000000000000000000000000000000..37bf188bc4409f2b75e7063389efd9d5cf2aeb02 GIT binary patch literal 4042 zcmcIn&2JJx6n}vIf>NqBu`wE{>7k7Y0_96%3|Oj?QrZBGC$k`|mV_39(0Ho%#y_D~ zoBj*ln)K|!gSTEx`e!t$@9pfzEIYeh{FvnJ?7olr&3p6S%wP&Ji{mh@-L7OK<1E(p2D@?(jdIzHz{o5X*}ZYLQ^cIz zYQ5VZ^km10T2!p|=6P9tWkZ;?97Yj4q0UtwMbUaC_w(|8t05QihUY^}4(a8f-OdlX zZTXYxav~}Svrvm0h1q7D7M2Nl8$OJ7rWT!%t0rw!O%TiGU>x9h65xCa;1C&?NZlEL zlK?q&AL%syO9XC20ln`QpF|_*)Y04;w?p3 zRn`jTLTe)wPvRPMT`VqnVaOT2Iq-J7G25gg&32nr(sid!;z>+Db&4JzJe}Lm20VD~ zU`=52M4Ixu!H2~P`vl10%NOlK?XxiZBGPKs`}M`RCYr;S??}H?h7bEJL{C+{l*-0> z1Gqxc^oXB@@TnL3n^=$3{DxCYaC>$FSu`BA2`tmI(5;PDqu2S^dEXB&m6yZCLTR0e zhn@sRmNWujq0`$eKF5?d0|lqh=5lNF6idGb~JPrnHOt5b_eD;-$kLna&9g*m!k`yQ2Lsm_2@kn6!}zJk}2xIspy5Kk(TBn@$KP zY&zin20NJ$`~47c@zQ3-Hco2}(s*?j>7$l07siG5r|G}_(1v2nP&*6lPzjqOr?iZ5zV#PuI25isC1^@s6 literal 0 HcmV?d00001 diff --git a/vc_libs/x86/dxguid.lib b/vc_libs/x86/dxguid.lib new file mode 100644 index 0000000000000000000000000000000000000000..66119132708c7704ecb4bf712eaaa262727a0fac GIT binary patch literal 565850 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 Wx<$-kJGDt&y296x~o0+@OZ-nWgtU^HtcILnyjA zgrXZm*iI1XWK)AA8w!LUP2UKrX`7&$dIi-`o7d5*sI1T$d)d5|V#vU?#7d9jy_LT5 zA}bv(Cw4k?!mNNfdvo6AjG@Kq?-KsCcCreiFv&E^W4hV=$kQOuX!CiP{{3%!d{uG* zJdXv7=&-}T4mv*GPWe|3enAI*?RfLs;(Z6bvIblCmiL?qt|a|ILiGrp6aG6Y*z0yvcP;b{FM`R*Flt9-%PDR|?U?O`y5_4wp77C~i31YPj~xWV$_r zuod}XAigiYl*ZAdeldBeN%O(4q`a{Ty0hnE{BmmMV~+;AJR0W@XxgyKLNMIc)KPQ9 z?#>B5Z_?PoN6H}`guGZ1jRs-QX=6-`E5$F?@_WER3FV(!GFe_t%81%!0pHb1-6}Bo z=MNaN`oI+A7s8g%lcHkKh;q@V`x{3Y*I4;wFhJ^pW*Qs5br!uj6qM_!P-A9LN5FmZ z4&#X}G|G*LAtDv7**mdbLeuP}88Lm7(EwO%`zX{AattCs2c@G?ZFJtEo^B}s1DHPg F@_%!USjGSV literal 0 HcmV?d00001