/*
 *  msacm.h     Audio Compression Manager (ACM) functions
 *
 * =========================================================================
 *
 *                          Open Watcom Project
 *
 * Copyright (c) 2004-2014 The Open Watcom Contributors. All Rights Reserved.
 *
 *    This file is automatically generated. Do not edit directly.
 *
 * =========================================================================
 */

#ifndef _INC_ACM
#define _INC_ACM

#ifndef _ENABLE_AUTODEPEND
 #pragma read_only_file;
#endif

#ifdef __cplusplus
extern "C" {
#endif

/* ACM calling convention */
#define ACMAPI  WINAPI

/* ACM handle data types */
DECLARE_HANDLE( HACMDRIVERID );
DECLARE_HANDLE( HACMDRIVER );
DECLARE_HANDLE( HACMSTREAM );
DECLARE_HANDLE( HACMOBJ );

/* Pointers to handles */
typedef HACMDRIVERID    *PHACMDRIVERID;
typedef HACMDRIVERID    *LPHACMDRIVERID;
typedef HACMDRIVER      *PHACMDRIVER;
typedef HACMDRIVER      *LPHACMDRIVER;
typedef HACMSTREAM      *PHACMSTREAM;
typedef HACMSTREAM      *LPHACMSTREAM;
typedef HACMOBJ         *PHACMOBJ;
typedef HACMOBJ         *LPHACMOBJ;

/* Mapper driver messages */
#define DRV_MAPPER_PREFERRED_INPUT_GET  (DRV_USER + 0)
#define DRV_MAPPER_PREFERRED_OUTPUT_GET (DRV_USER + 2)
#define DRVM_MAPPER                     0x2000
#define DRVM_MAPPER_STATUS              (DRVM_MAPPER + 0)
#define WIDM_MAPPER_STATUS              (DRVM_MAPPER_STATUS + 0)
#define WODM_MAPPER_STATUS              (DRVM_MAPPER_STATUS + 0)

/* Wave input mapper status values */
#define WAVEIN_MAPPER_STATUS_DEVICE 0
#define WAVEIN_MAPPER_STATUS_MAPPED 1
#define WAVEIN_MAPPER_STATUS_FORMAT 2

/* Wave output mapper status values */
#define WAVEOUT_MAPPER_STATUS_DEVICE    0
#define WAVEOUT_MAPPER_STATUS_MAPPED    1
#define WAVEOUT_MAPPER_STATUS_FORMAT    2

/* ACM error codes */
#define ACMERR_BASE         512
#define ACMERR_NOTPOSSIBLE  (ACMERR_BASE + 0)
#define ACMERR_BUSY         (ACMERR_BASE + 1)
#define ACMERR_UNPREPARED   (ACMERR_BASE + 2)
#define ACMERR_CANCELED     (ACMERR_BASE + 3)

/* ACM messages */
#define MM_ACM_OPEN         MM_STREAM_OPEN
#define MM_ACM_CLOSE        MM_STREAM_CLOSE
#define MM_ACM_DONE         MM_STREAM_DONE
#define MM_ACM_FORMATCHOOSE 0x8000
#define MM_ACM_FILTERCHOOSE 0x8000

/* acmMetrics() indices */
#define ACM_METRIC_COUNT_DRIVERS            1
#define ACM_METRIC_COUNT_CODECS             2
#define ACM_METRIC_COUNT_CONVERTERS         3
#define ACM_METRIC_COUNT_FILTERS            4
#define ACM_METRIC_COUNT_DISABLED           5
#define ACM_METRIC_COUNT_HARDWARE           6
#define ACM_METRIC_COUNT_LOCAL_DRIVERS      20
#define ACM_METRIC_COUNT_LOCAL_CODECS       21
#define ACM_METRIC_COUNT_LOCAL_CONVERTERS   22
#define ACM_METRIC_COUNT_LOCAL_FILTERS      23
#define ACM_METRIC_COUNT_LOCAL_DISABLED     24
#define ACM_METRIC_HARDWARE_WAVE_INPUT      30
#define ACM_METRIC_HARDWARE_WAVE_OUTPUT     31
#define ACM_METRIC_MAX_SIZE_FORMAT          50
#define ACM_METRIC_MAX_SIZE_FILTER          51
#define ACM_METRIC_DRIVER_SUPPORT           100
#define ACM_METRIC_DRIVER_PRIORITY          101

/* acmDriverEnum() flags */
#define ACM_DRIVERENUMF_NOLOCAL     0x40000000L
#define ACM_DRIVERENUMF_DISABLED    0x80000000L

/* acmDriverAdd() flags */
#define ACM_DRIVERADDF_NAME         0x00000001L
#define ACM_DRIVERADDF_FUNCTION     0x00000003L
#define ACM_DRIVERADDF_NOTIFYHWND   0x00000004L
#define ACM_DRIVERADDF_TYPEMASK     0x00000007L
#define ACM_DRIVERADDF_LOCAL        0x00000000L
#define ACM_DRIVERADDF_GLOBAL       0x00000008L

/* ACM driver messages */
#define ACMDM_USER          (DRV_USER + 0x0000)
#define ACMDM_RESERVED_LOW  (DRV_USER + 0x2000)
#define ACMDM_RESERVED_HIGH (DRV_USER + 0x2FFF)
#define ACMDM_BASE          ACMDM_RESERVED_LOW
#define ACMDM_DRIVER_ABOUT  (ACMDM_BASE + 11)

/* acmDriverPriority() flags */
#define ACM_DRIVERPRIORITYF_ENABLE      0x00000001L
#define ACM_DRIVERPRIORITYF_DISABLE     0x00000002L
#define ACM_DRIVERPRIORITYF_ABLEMASK    0x00000003L
#define ACM_DRIVERPRIORITYF_BEGIN       0x00010000L
#define ACM_DRIVERPRIORITYF_END         0x00020000L
#define ACM_DRIVERPRIORITYF_DEFERMASK   0x00030000L

/* acmDriverDetails() string lengths */
#define ACMDRIVERDETAILS_SHORTNAME_CHARS    32
#define ACMDRIVERDETAILS_LONGNAME_CHARS     128
#define ACMDRIVERDETAILS_COPYRIGHT_CHARS    80
#define ACMDRIVERDETAILS_LICENSING_CHARS    128
#define ACMDRIVERDETAILS_FEATURES_CHARS     512

/* acmDriverDetails() special values */
#define ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC mmioFOURCC( 'a', 'u', 'd', 'c' )
#define ACMDRIVERDETAILS_FCCCOMP_UNDEFINED  mmioFOURCC( '\0', '\0', '\0', '\0' )

/* acmDriverDetails() support flags */
#define ACMDRIVERDETAILS_SUPPORTF_CODEC     0x00000001L
#define ACMDRIVERDETAILS_SUPPORTF_CONVERTER 0x00000002L
#define ACMDRIVERDETAILS_SUPPORTF_FILTER    0x00000004L
#define ACMDRIVERDETAILS_SUPPORTF_HARDWARE  0x00000008L
#define ACMDRIVERDETAILS_SUPPORTF_ASYNC     0x00000010L
#define ACMDRIVERDETAILS_SUPPORTF_LOCAL     0x40000000L
#define ACMDRIVERDETAILS_SUPPORTF_DISABLED  0x80000000L

/* acmFormatTagDetails() string length */
#define ACMFORMATTAGDETAILS_FORMATTAG_CHARS 48

/* acmFormatTagDetails() flags */
#define ACM_FORMATTAGDETAILSF_INDEX         0x00000000L
#define ACM_FORMATTAGDETAILSF_FORMATTAG     0x00000001L
#define ACM_FORMATTAGDETAILSF_LARGESTSIZE   0x00000002L
#define ACM_FORMATTAGDETAILSF_QUERYMASK     0x0000000FL

/* acmFormatDetails() string length */
#define ACMFORMATDETAILS_FORMAT_CHARS   128

/* acmFormatDetails() flags */
#define ACM_FORMATDETAILSF_INDEX        0x00000000L
#define ACM_FORMATDETAILSF_FORMAT       0x00000001L
#define ACM_FORMATDETAILSF_QUERYMASK    0x0000000FL

/* acmFormatEnum() flags */
#define ACM_FORMATENUMF_WFORMATTAG      0x00010000L
#define ACM_FORMATENUMF_NCHANNELS       0x00020000L
#define ACM_FORMATENUMF_NSAMPLESPERSEC  0x00040000L
#define ACM_FORMATENUMF_WBITSPERSAMPLE  0x00080000L
#define ACM_FORMATENUMF_CONVERT         0x00100000L
#define ACM_FORMATENUMF_SUGGEST         0x00200000L
#define ACM_FORMATENUMF_HARDWARE        0x00400000L
#define ACM_FORMATENUMF_INPUT           0x00800000L
#define ACM_FORMATENUMF_OUTPUT          0x01000000L

/* acmFormatSuggest() flags */
#define ACM_FORMATSUGGESTF_WFORMATTAG       0x00010000L
#define ACM_FORMATSUGGESTF_NCHANNELS        0x00020000L
#define ACM_FORMATSUGGESTF_NSAMPLESPERSEC   0x00040000L
#define ACM_FORMATSUGGESTF_WBITSPERSAMPLE   0x00080000L
#define ACM_FORMATSUGGESTF_TYPEMASK         0x00FF0000L

/* ACM registered messages */
#define ACMHELPMSGSTRINGA           "acmchoose_help"
#define ACMHELPMSGSTRINGW           L"acmchoose_help"
#define ACMHELPMSGCONTEXTMENUA      "acmchoose_contextmenu"
#define ACMHELPMSGCONTEXTMENUW      L"acmchoose_contextmenu"
#define ACMHELPMSGCONTEXTHELPA      "acmchoose_contexthelp"
#define ACMHELPMSGCONTEXTHELPW      L"acmchoose_contexthelp"
#ifdef UNICODE
    #define ACMHELPMSGSTRING        ACMHELPMSGSTRINGW
    #define ACMHELPMSGCONTEXTMENU   ACMHELPMSGCONTEXTMENUW
    #define ACMHELPMSGCONTEXTHELP   ACMHELPMSGCONTEXTHELPW
#else
    #define ACMHELPMSGSTRING        ACMHELPMSGSTRINGA
    #define ACMHELPMSGCONTEXTMENU   ACMHELPMSGCONTEXTMENUA
    #define ACMHELPMSGCONTEXTHELP   ACMHELPMSGCONTEXTHELPA
#endif

/* MM_ACM_FORMATCHOOSE codes */
#define FORMATCHOOSE_MESSAGE            0
#define FORMATCHOOSE_FORMATTAG_VERIFY   (FORMATCHOOSE_MESSAGE + 0)
#define FORMATCHOOSE_FORMAT_VERIFY      (FORMATCHOOSE_MESSAGE + 1)
#define FORMATCHOOSE_CUSTOM_VERIFY      (FORMATCHOOSE_MESSAGE + 2)

/* acmFormatChoose() style flags */
#define ACMFORMATCHOOSE_STYLEF_SHOWHELP             0x00000004L
#define ACMFORMATCHOOSE_STYLEF_ENABLEHOOK           0x00000008L
#define ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE       0x00000010L
#define ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE 0x00000020L
#define ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT      0x00000040L
#define ACMFORMATCHOOSE_STYLEF_CONTEXTHELP          0x00000080L

/* acmFilterTagDetails() string length */
#define ACMFILTERTAGDETAILS_FILTERTAG_CHARS 48

/* acmFilterTagDetails() flags */
#define ACM_FILTERTAGDETAILSF_INDEX         0x00000000L
#define ACM_FILTERTAGDETAILSF_FILTERTAG     0x00000001L
#define ACM_FILTERTAGDETAILSF_LARGESTSIZE   0x00000002L
#define ACM_FILTERTAGDETAILSF_QUERYMASK     0x0000000FL

/* acmFilterDetails() string length */
#define ACMFILTERDETAILS_FILTER_CHARS   128

/* acmFilterDetails() flags */
#define ACM_FILTERDETAILSF_INDEX        0x00000000L
#define ACM_FILTERDETAILSF_FILTER       0x00000001L
#define ACM_FILTERDETAILSF_QUERYMASK    0x0000000FL

/* acmFilterEnum() flags */
#define ACM_FILTERENUMF_DWFILTERTAG 0x00010000L

/* MM_ACM_FILTERCHOOSE codes */
#define FILTERCHOOSE_MESSAGE            0
#define FILTERCHOOSE_FILTERTAG_VERIFY   (FILTERCHOOSE_MESSAGE + 0)
#define FILTERCHOOSE_FILTER_VERIFY      (FILTERCHOOSE_MESSAGE + 1)
#define FILTERCHOOSE_CUSTOM_VERIFY      (FILTERCHOOSE_MESSAGE + 2)

/* acmFilterChoose() flags */
#define ACMFILTERCHOOSE_STYLEF_SHOWHELP             0x00000004L
#define ACMFILTERCHOOSE_STYLEF_ENABLEHOOK           0x00000008L
#define ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATE       0x00000010L
#define ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE 0x00000020L
#define ACMFILTERCHOOSE_STYLEF_INITTOFILTERSTRUCT   0x00000040L
#define ACMFILTERCHOOSE_STYLEF_CONTEXTHELP          0x00000080L

/* Size of driver reserved data */
#define _DRVRESERVED    10

/* ACM stream header status flags */
#define ACMSTREAMHEADER_STATUSF_DONE        0x00010000L
#define ACMSTREAMHEADER_STATUSF_PREPARED    0x00020000L
#define ACMSTREAMHEADER_STATUSF_INQUEUE     0x00100000L

/* acmStreamOpen() flags */
#define ACM_STREAMOPENF_QUERY       0x00000001L
#define ACM_STREAMOPENF_ASYNC       0x00000002L
#define ACM_STREAMOPENF_NONREALTIME 0x00000004L

/* acmStreamSize() flags */
#define ACM_STREAMSIZEF_SOURCE      0x00000000L
#define ACM_STREAMSIZEF_DESTINATION 0x00000001L
#define ACM_STREAMSIZEF_QUERYMASK   0x0000000FL

/* acmStreamConvert() flags */
#define ACM_STREAMCONVERTF_BLOCKALIGN   0x00000004L
#define ACM_STREAMCONVERTF_START        0x00000010L
#define ACM_STREAMCONVERTF_END          0x00000020L

/* ACM driver enumeration callback */
typedef BOOL (CALLBACK *ACMDRIVERENUMCB)( HACMDRIVERID, DWORD_PTR, DWORD );

/* ACM driver procedure */
typedef LRESULT (CALLBACK *ACMDRIVERPROC)( DWORD_PTR, HACMDRIVERID, UINT, LPARAM, LPARAM );
typedef ACMDRIVERPROC   *LPACMDRIVERPROC;

/* acmDriverDetails() parameters */
typedef struct tACMDRIVERDETAILSA {
    DWORD   cbStruct;
    FOURCC  fccType;
    FOURCC  fccComp;
    WORD    wMid;
    WORD    wPid;
    DWORD   vdwACM;
    DWORD   vdwDriver;
    DWORD   fdwSupport;
    DWORD   cFormatTags;
    DWORD   cFilterTags;
    HICON   hicon;
    char    szShortName[ACMDRIVERDETAILS_SHORTNAME_CHARS];
    char    szLongName[ACMDRIVERDETAILS_LONGNAME_CHARS];
    char    szCopyright[ACMDRIVERDETAILS_COPYRIGHT_CHARS];
    char    szLicensing[ACMDRIVERDETAILS_LICENSING_CHARS];
    char    szFeatures[ACMDRIVERDETAILS_FEATURES_CHARS];
} ACMDRIVERDETAILSA;
typedef ACMDRIVERDETAILSA   *PACMDRIVERDETAILSA;
typedef ACMDRIVERDETAILSA   *LPACMDRIVERDETAILSA;
typedef struct tACMDRIVERDETAILSW {
    DWORD   cbStruct;
    FOURCC  fccType;
    FOURCC  fccComp;
    WORD    wMid;
    WORD    wPid;
    DWORD   vdwACM;
    DWORD   vdwDriver;
    DWORD   fdwSupport;
    DWORD   cFormatTags;
    DWORD   cFilterTags;
    HICON   hicon;
    WCHAR   szShortName[ACMDRIVERDETAILS_SHORTNAME_CHARS];
    WCHAR   szLongName[ACMDRIVERDETAILS_LONGNAME_CHARS];
    WCHAR   szCopyright[ACMDRIVERDETAILS_COPYRIGHT_CHARS];
    WCHAR   szLicensing[ACMDRIVERDETAILS_LICENSING_CHARS];
    WCHAR   szFeatures[ACMDRIVERDETAILS_FEATURES_CHARS];
} ACMDRIVERDETAILSW;
typedef ACMDRIVERDETAILSW   *PACMDRIVERDETAILSW;
typedef ACMDRIVERDETAILSW   *LPACMDRIVERDETAILSW;
#ifdef UNICODE
typedef ACMDRIVERDETAILSW   ACMDRIVERDETAILS;
typedef PACMDRIVERDETAILSW  PACMDRIVERDETAILS;
typedef LPACMDRIVERDETAILSW LPACMDRIVERDETAILS;
#else
typedef ACMDRIVERDETAILSA   ACMDRIVERDETAILS;
typedef PACMDRIVERDETAILSA  PACMDRIVERDETAILS;
typedef LPACMDRIVERDETAILSA LPACMDRIVERDETAILS;
#endif

/* acmFormatTagDetails() parameters */
typedef struct tACMFORMATTAGDETAILSA {
    DWORD   cbStruct;
    DWORD   dwFormatTagIndex;
    DWORD   dwFormatTag;
    DWORD   cbFormatSize;
    DWORD   fdwSupport;
    DWORD   cStandardFormats;
    char    szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
} ACMFORMATTAGDETAILSA;
typedef ACMFORMATTAGDETAILSA    *PACMFORMATTAGDETAILSA;
typedef ACMFORMATTAGDETAILSA    *LPACMFORMATTAGDETAILSA;
typedef struct tACMFORMATTAGDETAILSW {
    DWORD   cbStruct;
    DWORD   dwFormatTagIndex;
    DWORD   dwFormatTag;
    DWORD   cbFormatSize;
    DWORD   fdwSupport;
    DWORD   cStandardFormats;
    WCHAR   szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
} ACMFORMATTAGDETAILSW;
typedef ACMFORMATTAGDETAILSW    *PACMFORMATTAGDETAILSW;
typedef ACMFORMATTAGDETAILSW    *LPACMFORMATTAGDETAILSW;
#ifdef UNICODE
typedef ACMFORMATTAGDETAILSW    ACMFORMATTAGDETAILS;
typedef PACMFORMATTAGDETAILSW   PACMFORMATTAGDETAILS;
typedef LPACMFORMATTAGDETAILSW  LPACMFORMATTAGDETAILS;
#else
typedef ACMFORMATTAGDETAILSA    ACMFORMATTAGDETAILS;
typedef PACMFORMATTAGDETAILSA   PACMFORMATTAGDETAILS;
typedef LPACMFORMATTAGDETAILSA  LPACMFORMATTAGDETAILS;
#endif

/* ACM format tag enumeration callback */
typedef BOOL (CALLBACK *ACMFORMATTAGENUMCBA)( HACMDRIVERID, LPACMFORMATTAGDETAILSA, DWORD_PTR, DWORD );
typedef BOOL (CALLBACK *ACMFORMATTAGENUMCBW)( HACMDRIVERID, LPACMFORMATTAGDETAILSW, DWORD_PTR, DWORD );
#ifdef UNICODE
    #define ACMFORMATTAGENUMCB  ACMFORMATTAGENUMCBW
#else
    #define ACMFORMATTAGENUMCB  ACMFORMATTAGENUMCBA
#endif

/* acmFormatDetails() parameters */
typedef struct tACMFORMATDETAILSA {
    DWORD           cbStruct;
    DWORD           dwFormatIndex;
    DWORD           dwFormatTag;
    DWORD           fdwSupport;
    LPWAVEFORMATEX  pwfx;
    DWORD           cbwfx;
    char            szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
} ACMFORMATDETAILSA;
typedef ACMFORMATDETAILSA   *PACMFORMATDETAILSA;
typedef ACMFORMATDETAILSA   *LPACMFORMATDETAILSA;
typedef struct tACMFORMATDETAILSW {
    DWORD           cbStruct;
    DWORD           dwFormatIndex;
    DWORD           dwFormatTag;
    DWORD           fdwSupport;
    LPWAVEFORMATEX  pwfx;
    DWORD           cbwfx;
    WCHAR           szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
} ACMFORMATDETAILSW;
typedef ACMFORMATDETAILSW   *PACMFORMATDETAILSW;
typedef ACMFORMATDETAILSW   *LPACMFORMATDETAILSW;
#ifdef UNICODE
typedef ACMFORMATDETAILSW   ACMFORMATDETAILS;
typedef PACMFORMATDETAILSW  PACMFORMATDETAILS;
typedef LPACMFORMATDETAILSW LPACMFORMATDETAILS;
#else
typedef ACMFORMATDETAILSA   ACMFORMATDETAILS;
typedef PACMFORMATDETAILSA  PACMFORMATDETAILS;
typedef LPACMFORMATDETAILSA LPACMFORMATDETAILS;
#endif

/* ACM format enumeration callback */
typedef BOOL (CALLBACK *ACMFORMATENUMCBA)( HACMDRIVERID, LPACMFORMATDETAILSA, DWORD_PTR, DWORD );
typedef BOOL (CALLBACK *ACMFORMATENUMCBW)( HACMDRIVERID, LPACMFORMATDETAILSW, DWORD_PTR, DWORD );
#ifdef UNICODE
    #define ACMFORMATENUMCB ACMFORMATENUMCBW
#else
    #define ACMFORMATENUMCB ACMFORMATENUMCBA
#endif

/* acmFormatChoose() hook procedure */
typedef UINT (CALLBACK *ACMFORMATCHOOSEHOOKPROCA)( HWND, UINT, WPARAM, LPARAM );
typedef UINT (CALLBACK *ACMFORMATCHOOSEHOOKPROCW)( HWND, UINT, WPARAM, LPARAM );
#ifdef UNICODE
    #define ACMFORMATCHOOSEHOOKPROC ACMFORMATCHOOSEHOOKPROCW
#else
    #define ACMFORMATCHOOSEHOOKPROC ACMFORMATCHOOSEHOOKPROCA
#endif

/* acmFormatChoose() parameters */
typedef struct tACMFORMATCHOOSEA {
    DWORD                       cbStruct;
    DWORD                       fdwStyle;
    HWND                        hwndOwner;
    LPWAVEFORMATEX              pwfx;
    DWORD                       cbwfx;
    LPCSTR                      pszTitle;
    char                        szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
    char                        szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
    LPSTR                       pszName;
    DWORD                       cchName;
    DWORD                       fdwEnum;
    LPWAVEFORMATEX              pwfxEnum;
    HINSTANCE                   hInstance;
    LPCSTR                      pszTemplateName;
    LPARAM                      lCustData;
    ACMFORMATCHOOSEHOOKPROCA    pfnHook;
} ACMFORMATCHOOSEA;
typedef ACMFORMATCHOOSEA    *PACMFORMATCHOOSEA;
typedef ACMFORMATCHOOSEA    *LPACMFORMATCHOOSEA;
typedef struct tACMFORMATCHOOSEW {
    DWORD                       cbStruct;
    DWORD                       fdwStyle;
    HWND                        hwndOwner;
    LPWAVEFORMATEX              pwfx;
    DWORD                       cbwfx;
    LPCWSTR                     pszTitle;
    WCHAR                       szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
    WCHAR                       szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
    LPWSTR                      pszName;
    DWORD                       cchName;
    DWORD                       fdwEnum;
    LPWAVEFORMATEX              pwfxEnum;
    HINSTANCE                   hInstance;
    LPCWSTR                     pszTemplateName;
    LPARAM                      lCustData;
    ACMFORMATCHOOSEHOOKPROCW    pfnHook;
} ACMFORMATCHOOSEW;
typedef ACMFORMATCHOOSEW    *PACMFORMATCHOOSEW;
typedef ACMFORMATCHOOSEW    *LPACMFORMATCHOOSEW;
#ifdef UNICODE
typedef ACMFORMATCHOOSEW    ACMFORMATCHOOSE;
typedef PACMFORMATCHOOSEW   PACMFORMATCHOOSE;
typedef LPACMFORMATCHOOSEW  LPACMFORMATCHOOSE;
#else
typedef ACMFORMATCHOOSEA    ACMFORMATCHOOSE;
typedef PACMFORMATCHOOSEA   PACMFORMATCHOOSE;
typedef LPACMFORMATCHOOSEA  LPACMFORMATCHOOSE;
#endif

/* acmFilterTagDetails() parameters */
typedef struct tACMFILTERTAGDETAILSA {
    DWORD   cbStruct;
    DWORD   dwFilterTagIndex;
    DWORD   dwFilterTag;
    DWORD   cbFilterSize;
    DWORD   fdwSupport;
    DWORD   cStandardFilters;
    char    szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
} ACMFILTERTAGDETAILSA;
typedef ACMFILTERTAGDETAILSA    *PACMFILTERTAGDETAILSA;
typedef ACMFILTERTAGDETAILSA    *LPACMFILTERTAGDETAILSA;
typedef struct tACMFILTERTAGDETAILSW {
    DWORD   cbStruct;
    DWORD   dwFilterTagIndex;
    DWORD   dwFilterTag;
    DWORD   cbFilterSize;
    DWORD   fdwSupport;
    DWORD   cStandardFilters;
    WCHAR   szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
} ACMFILTERTAGDETAILSW;
typedef ACMFILTERTAGDETAILSW    *PACMFILTERTAGDETAILSW;
typedef ACMFILTERTAGDETAILSW    *LPACMFILTERTAGDETAILSW;
#ifdef UNICODE
typedef ACMFILTERTAGDETAILSW    ACMFILTERTAGDETAILS;
typedef PACMFILTERTAGDETAILSW   PACMFILTERTAGDETAILS;
typedef LPACMFILTERTAGDETAILSW  LPACMFILTERTAGDETAILS;
#else
typedef ACMFILTERTAGDETAILSA    ACMFILTERTAGDETAILS;
typedef PACMFILTERTAGDETAILSA   PACMFILTERTAGDETAILS;
typedef LPACMFILTERTAGDETAILSA  LPACMFILTERTAGDETAILS;
#endif

/* ACM filter tag enumeration callback */
typedef BOOL (CALLBACK *ACMFILTERTAGENUMCBA)( HACMDRIVERID, LPACMFILTERTAGDETAILSA, DWORD_PTR, DWORD );
typedef BOOL (CALLBACK *ACMFILTERTAGENUMCBW)( HACMDRIVERID, LPACMFILTERTAGDETAILSW, DWORD_PTR, DWORD );
#ifdef UNICODE
    #define ACMFILTERTAGENUMCB  ACMFILTERTAGENUMCBW
#else
    #define ACMFILTERTAGENUMCB  ACMFILTERTAGENUMCBA
#endif

/* acmFilterDetails() parameters */
typedef struct tACMFILTERDETAILSA {
    DWORD           cbStruct;
    DWORD           dwFilterIndex;
    DWORD           dwFilterTag;
    DWORD           fdwSupport;
    LPWAVEFILTER    pwfltr;
    DWORD           cbwfltr;
    char            szFilter[ACMFILTERDETAILS_FILTER_CHARS];
} ACMFILTERDETAILSA;
typedef ACMFILTERDETAILSA   *PACMFILTERDETAILSA;
typedef ACMFILTERDETAILSA   *LPACMFILTERDETAILSA;
typedef struct tACMFILTERDETAILSW {
    DWORD           cbStruct;
    DWORD           dwFilterIndex;
    DWORD           dwFilterTag;
    DWORD           fdwSupport;
    LPWAVEFILTER    pwfltr;
    DWORD           cbwfltr;
    WCHAR           szFilter[ACMFILTERDETAILS_FILTER_CHARS];
} ACMFILTERDETAILSW;
typedef ACMFILTERDETAILSW   *PACMFILTERDETAILSW;
typedef ACMFILTERDETAILSW   *LPACMFILTERDETAILSW;
#ifdef UNICODE
typedef ACMFILTERDETAILSW   ACMFILTERDETAILS;
typedef PACMFILTERDETAILSW  PACMFILTERDETAILS;
typedef LPACMFILTERDETAILSW LPACMFILTERDETAILS;
#else
typedef ACMFILTERDETAILSA   ACMFILTERDETAILS;
typedef PACMFILTERDETAILSA  PACMFILTERDETAILS;
typedef LPACMFILTERDETAILSA LPACMFILTERDETAILS;
#endif

/* ACM filter enumeration callback */
typedef BOOL (CALLBACK *ACMFILTERENUMCBA)( HACMDRIVERID, LPACMFILTERDETAILSA, DWORD_PTR, DWORD );
typedef BOOL (CALLBACK *ACMFILTERENUMCBW)( HACMDRIVERID, LPACMFILTERDETAILSW, DWORD_PTR, DWORD );
#ifdef UNICODE
    #define ACMFILTERENUMCB ACMFILTERENUMCBW
#else
    #define ACMFILTERENUMCB ACMFILTERENUMCBA
#endif

/* acmFilterChoose() callback procedure */
typedef UINT (CALLBACK *ACMFILTERCHOOSEHOOKPROCA)( HWND, UINT, WPARAM, LPARAM );
typedef UINT (CALLBACK *ACMFILTERCHOOSEHOOKPROCW)( HWND, UINT, WPARAM, LPARAM );
#ifdef UNICODE
    #define ACMFILTERCHOOSEHOOKPROC ACMFILTERCHOOSEHOOKPROCW
#else
    #define ACMFILTERCHOOSEHOOKPROC ACMFILTERCHOOSEHOOKPROCA
#endif

/* acmFilterChoose() parameters */
typedef struct tACMFILTERCHOOSEA {
    DWORD                       cbStruct;
    DWORD                       fdwStyle;
    HWND                        hwndOwner;
    LPWAVEFILTER                pwfltr;
    DWORD                       cbwfltr;
    LPCSTR                      pszTitle;
    char                        szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
    char                        szFilter[ACMFILTERDETAILS_FILTER_CHARS];
    LPSTR                       pszName;
    DWORD                       cchName;
    DWORD                       fdwEnum;
    LPWAVEFILTER                pwfltrEnum;
    HINSTANCE                   hInstance;
    LPCSTR                      pszTemplateName;
    LPARAM                      lCustData;
    ACMFILTERCHOOSEHOOKPROCA    pfnHook;
} ACMFILTERCHOOSEA;
typedef ACMFILTERCHOOSEA    *PACMFILTERCHOOSEA;
typedef ACMFILTERCHOOSEA    *LPACMFILTERCHOOSEA;
typedef struct tACMFILTERCHOOSEW {
    DWORD                       cbStruct;
    DWORD                       fdwStyle;
    HWND                        hwndOwner;
    LPWAVEFILTER                pwfltr;
    DWORD                       cbwfltr;
    LPCWSTR                     pszTitle;
    WCHAR                       szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
    WCHAR                       szFilter[ACMFILTERDETAILS_FILTER_CHARS];
    LPWSTR                      pszName;
    DWORD                       cchName;
    DWORD                       fdwEnum;
    LPWAVEFILTER                pwfltrEnum;
    HINSTANCE                   hInstance;
    LPCWSTR                     pszTemplateName;
    LPARAM                      lCustData;
    ACMFILTERCHOOSEHOOKPROCW    pfnHook;
} ACMFILTERCHOOSEW;
typedef ACMFILTERCHOOSEW    *PACMFILTERCHOOSEW;
typedef ACMFILTERCHOOSEW    *LPACMFILTERCHOOSEW;
#ifdef UNICODE
typedef ACMFILTERCHOOSEW    ACMFILTERCHOOSE;
typedef PACMFILTERCHOOSEW   PACMFILTERCHOOSE;
typedef LPACMFILTERCHOOSEW  LPACMFILTERCHOOSE;
#else
typedef ACMFILTERCHOOSEA    ACMFILTERCHOOSE;
typedef PACMFILTERCHOOSEA   PACMFILTERCHOOSE;
typedef LPACMFILTERCHOOSEA  LPACMFILTERCHOOSE;
#endif

/* ACM stream header */
typedef struct tACMSTREAMHEADER {
    DWORD       cbStruct;
    DWORD       fdwStatus;
    DWORD_PTR   dwUser;
    LPBYTE      pbSrc;
    DWORD       cbSrcLength;
    DWORD       cbSrcLengthUsed;
    DWORD_PTR   dwSrcUser;
    LPBYTE      pbDst;
    DWORD       cbDstLength;
    DWORD       cbDstLengthUsed;
    DWORD_PTR   dwDstUser;
    DWORD       dwReservedDriver[_DRVRESERVED];
} ACMSTREAMHEADER;
typedef ACMSTREAMHEADER *PACMSTREAMHEADER;
typedef ACMSTREAMHEADER *LPACMSTREAMHEADER;

/* Functions in MSACM32.DLL */
MMRESULT ACMAPI acmDriverAddA( LPHACMDRIVERID, HINSTANCE, LPARAM, DWORD, DWORD );
MMRESULT ACMAPI acmDriverAddW( LPHACMDRIVERID, HINSTANCE, LPARAM, DWORD, DWORD );
MMRESULT ACMAPI acmDriverClose( HACMDRIVER, DWORD );
MMRESULT ACMAPI acmDriverDetailsA( HACMDRIVERID, LPACMDRIVERDETAILSA, DWORD );
MMRESULT ACMAPI acmDriverDetailsW( HACMDRIVERID, LPACMDRIVERDETAILSW, DWORD );
MMRESULT ACMAPI acmDriverEnum( ACMDRIVERENUMCB, DWORD_PTR, DWORD );
MMRESULT ACMAPI acmDriverID( HACMOBJ, LPHACMDRIVERID, DWORD );
LRESULT ACMAPI  acmDriverMessage( HACMDRIVER, UINT, LPARAM, LPARAM );
MMRESULT ACMAPI acmDriverOpen( LPHACMDRIVER, HACMDRIVERID, DWORD );
MMRESULT ACMAPI acmDriverPriority( HACMDRIVERID, DWORD, DWORD );
MMRESULT ACMAPI acmDriverRemove( HACMDRIVERID, DWORD );
MMRESULT ACMAPI acmFilterChooseA( LPACMFILTERCHOOSEA );
MMRESULT ACMAPI acmFilterChooseW( LPACMFILTERCHOOSEW );
MMRESULT ACMAPI acmFilterDetailsA( HACMDRIVER, LPACMFILTERDETAILSA, DWORD );
MMRESULT ACMAPI acmFilterDetailsW( HACMDRIVER, LPACMFILTERDETAILSW, DWORD );
MMRESULT ACMAPI acmFilterEnumA( HACMDRIVER, LPACMFILTERDETAILSA, ACMFILTERENUMCBA, DWORD_PTR, DWORD );
MMRESULT ACMAPI acmFilterEnumW( HACMDRIVER, LPACMFILTERDETAILSW, ACMFILTERENUMCBW, DWORD_PTR, DWORD );
MMRESULT ACMAPI acmFilterTagDetailsA( HACMDRIVER, LPACMFILTERTAGDETAILSA, DWORD );
MMRESULT ACMAPI acmFilterTagDetailsW( HACMDRIVER, LPACMFILTERTAGDETAILSW, DWORD );
MMRESULT ACMAPI acmFilterTagEnumA( HACMDRIVER, LPACMFILTERTAGDETAILSA, ACMFILTERTAGENUMCBA, DWORD_PTR, DWORD );
MMRESULT ACMAPI acmFilterTagEnumW( HACMDRIVER, LPACMFILTERTAGDETAILSW, ACMFILTERTAGENUMCBW, DWORD_PTR, DWORD );
MMRESULT ACMAPI acmFormatChooseA( LPACMFORMATCHOOSEA );
MMRESULT ACMAPI acmFormatChooseW( LPACMFORMATCHOOSEW );
MMRESULT ACMAPI acmFormatDetailsA( HACMDRIVER, LPACMFORMATDETAILSA, DWORD );
MMRESULT ACMAPI acmFormatDetailsW( HACMDRIVER, LPACMFORMATDETAILSW, DWORD );
MMRESULT ACMAPI acmFormatEnumA( HACMDRIVER, LPACMFORMATDETAILSA, ACMFORMATENUMCBA, DWORD_PTR, DWORD );
MMRESULT ACMAPI acmFormatEnumW( HACMDRIVER, LPACMFORMATDETAILSW, ACMFORMATENUMCBW, DWORD_PTR, DWORD );
MMRESULT ACMAPI acmFormatSuggest( HACMDRIVER, LPWAVEFORMATEX, LPWAVEFORMATEX, DWORD, DWORD );
MMRESULT ACMAPI acmFormatTagDetailsA( HACMDRIVER, LPACMFORMATTAGDETAILSA, DWORD );
MMRESULT ACMAPI acmFormatTagDetailsW( HACMDRIVER, LPACMFORMATTAGDETAILSW, DWORD );
MMRESULT ACMAPI acmFormatTagEnumA( HACMDRIVER, LPACMFORMATTAGDETAILSA, ACMFORMATTAGENUMCBA, DWORD_PTR, DWORD );
MMRESULT ACMAPI acmFormatTagEnumW( HACMDRIVER, LPACMFORMATTAGDETAILSW, ACMFORMATTAGENUMCBW, DWORD_PTR, DWORD );
DWORD ACMAPI    acmGetVersion( void );
MMRESULT ACMAPI acmMetrics( HACMOBJ, UINT, LPVOID );
MMRESULT ACMAPI acmStreamClose( HACMSTREAM, DWORD );
MMRESULT ACMAPI acmStreamConvert( HACMSTREAM, LPACMSTREAMHEADER, DWORD );
MMRESULT ACMAPI acmStreamMessage( HACMSTREAM, UINT, LPARAM, LPARAM );
MMRESULT ACMAPI acmStreamOpen( LPHACMSTREAM, HACMDRIVER, LPWAVEFORMATEX, LPWAVEFORMATEX, LPWAVEFILTER, DWORD_PTR, DWORD_PTR, DWORD );
MMRESULT ACMAPI acmStreamPrepareHeader( HACMSTREAM, LPACMSTREAMHEADER, DWORD );
MMRESULT ACMAPI acmStreamReset( HACMSTREAM, DWORD );
MMRESULT ACMAPI acmStreamSize( HACMSTREAM, DWORD, LPDWORD, DWORD );
MMRESULT ACMAPI acmStreamUnprepareHeader( HACMSTREAM, LPACMSTREAMHEADER, DWORD );

/* Map generic function names to the appropriate ANSI or Unicode version. */
#ifdef UNICODE
    #define acmDriverAdd        acmDriverAddW
    #define acmDriverDetails    acmDriverDetailsW
    #define acmFilterChoose     acmFilterChooseW
    #define acmFilterDetails    acmFilterDetailsW
    #define acmFilterEnum       acmFilterEnumW
    #define acmFilterTagDetails acmFilterTagDetailsW
    #define acmFilterTagEnum    acmFilterTagEnumW
    #define acmFormatChoose     acmFormatChooseW
    #define acmFormatDetails    acmFormatDetailsW
    #define acmFormatEnum       acmFormatEnumW
    #define acmFormatTagDetails acmFormatTagDetailsW
    #define acmFormatTagEnum    acmFormatTagEnumW
#else
    #define acmDriverAdd        acmDriverAddA
    #define acmDriverDetails    acmDriverDetailsA
    #define acmFilterChoose     acmFilterChooseA
    #define acmFilterDetails    acmFilterDetailsA
    #define acmFilterEnum       acmFilterEnumA
    #define acmFilterTagDetails acmFilterTagDetailsA
    #define acmFilterTagEnum    acmFilterTagEnumA
    #define acmFormatChoose     acmFormatChooseA
    #define acmFormatDetails    acmFormatDetailsA
    #define acmFormatEnum       acmFormatEnumA
    #define acmFormatTagDetails acmFormatTagDetailsA
    #define acmFormatTagEnum    acmFormatTagEnumA
#endif

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* _INC_ACM */
