/*** Autogenerated by WIDL 8.21 from include/xapo.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __xapo_h__
#define __xapo_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IXAPO_FWD_DEFINED__
#define __IXAPO_FWD_DEFINED__
typedef interface IXAPO IXAPO;
#ifdef __cplusplus
interface IXAPO;
#endif /* __cplusplus */
#endif

#ifndef __IXAPOParameters_FWD_DEFINED__
#define __IXAPOParameters_FWD_DEFINED__
typedef interface IXAPOParameters IXAPOParameters;
#ifdef __cplusplus
interface IXAPOParameters;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>

#ifdef __cplusplus
extern "C" {
#endif

#define XAPO_FLAG_CHANNELS_MUST_MATCH 0x1
#define XAPO_FLAG_FRAMERATE_MUST_MATCH 0x2
#define XAPO_FLAG_BITSPERSAMPLE_MUST_MATCH 0x4
#define XAPO_FLAG_BUFFERCOUNT_MUST_MATCH 0x8
#define XAPO_FLAG_INPLACE_SUPPORTED 0x10
#define XAPO_FLAG_INPLACE_REQUIRED 0x20
#if 0
typedef struct WAVEFORMATEX {
    WORD wFormatTag;
    WORD nChannels;
    DWORD nSamplesPerSec;
    DWORD nAvgBytesPerSec;
    WORD nBlockAlign;
    WORD wBitsPerSample;
    WORD cbSize;
} WAVEFORMATEX;
typedef struct __WIDL_xapo_generated_name_0000000C {
    WAVEFORMATEX Format;
    union {
        WORD wValidBitsPerSample;
        WORD wSamplesPerBlock;
        WORD wReserved;
    } Samples;
    DWORD dwChannelMask;
    GUID SubFormat;
} WAVEFORMATEXTENSIBLE;
typedef struct __WIDL_xapo_generated_name_0000000C *PWAVEFORMATEXTENSIBLE;
#else
#include <mmreg.h>
#endif
typedef struct XAPO_REGISTRATION_PROPERTIES {
    CLSID clsid;
    WCHAR FriendlyName[256];
    WCHAR CopyrightInfo[256];
    UINT32 MajorVersion;
    UINT32 MinorVersion;
    UINT32 Flags;
    UINT32 MinInputBufferCount;
    UINT32 MaxInputBufferCount;
    UINT32 MinOutputBufferCount;
    UINT32 MaxOutputBufferCount;
} XAPO_REGISTRATION_PROPERTIES;
typedef struct XAPO20_REGISTRATION_PROPERTIES {
    CLSID clsid;
    WCHAR FriendlyName[256];
    WCHAR CopyrightInfo[256];
    UINT32 MajorVersion;
    UINT32 MinorVersion;
    UINT32 Flags;
    UINT32 MinInputBufferCount;
    UINT32 MaxInputBufferCount;
    UINT32 MinOutputBufferCount;
    UINT32 MaxOutputBufferCount;
    UINT32 InterfaceCount;
    IID InterfaceArray[1];
} XAPO20_REGISTRATION_PROPERTIES;
typedef struct XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS {
    const WAVEFORMATEX *pFormat;
    UINT32 MaxFrameCount;
} XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS;
typedef enum XAPO_BUFFER_FLAGS {
    XAPO_BUFFER_SILENT = 0,
    XAPO_BUFFER_VALID = 1
} XAPO_BUFFER_FLAGS;
typedef struct XAPO_PROCESS_BUFFER_PARAMETERS {
    void *pBuffer;
    XAPO_BUFFER_FLAGS BufferFlags;
    UINT32 ValidFrameCount;
} XAPO_PROCESS_BUFFER_PARAMETERS;
/*****************************************************************************
 * IXAPO interface
 */
#ifndef __IXAPO_INTERFACE_DEFINED__
#define __IXAPO_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXAPO, 0xa410b984, 0x9839, 0x4819, 0xa0,0xbe, 0x28,0x56,0xae,0x6b,0x3a,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a410b984-9839-4819-a0be-2856ae6b3adb")
IXAPO : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetRegistrationProperties(
        XAPO_REGISTRATION_PROPERTIES **props) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsInputFormatSupported(
        const WAVEFORMATEX *output_fmt,
        const WAVEFORMATEX *input_fmt,
        WAVEFORMATEX **supported_fmt) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsOutputFormatSupported(
        const WAVEFORMATEX *input_fmt,
        const WAVEFORMATEX *output_fmt,
        WAVEFORMATEX **supported_fmt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Initialize(
        const void *data,
        UINT32 data_len) = 0;

    virtual void STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE LockForProcess(
        UINT32 in_params_count,
        const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *in_params,
        UINT32 out_params_count,
        const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *out_params) = 0;

    virtual void STDMETHODCALLTYPE UnlockForProcess(
        ) = 0;

    virtual void STDMETHODCALLTYPE Process(
        UINT32 in_params_count,
        const XAPO_PROCESS_BUFFER_PARAMETERS *in_params,
        UINT32 out_params_count,
        XAPO_PROCESS_BUFFER_PARAMETERS *out_params,
        WINBOOL enabled) = 0;

    virtual UINT32 STDMETHODCALLTYPE CalcInputFrames(
        UINT32 output_frames) = 0;

    virtual UINT32 STDMETHODCALLTYPE CalcOutputFrames(
        UINT32 input_frames) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXAPO, 0xa410b984, 0x9839, 0x4819, 0xa0,0xbe, 0x28,0x56,0xae,0x6b,0x3a,0xdb)
#endif
#else
typedef struct IXAPOVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXAPO *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXAPO *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXAPO *This);

    /*** IXAPO methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRegistrationProperties)(
        IXAPO *This,
        XAPO_REGISTRATION_PROPERTIES **props);

    HRESULT (STDMETHODCALLTYPE *IsInputFormatSupported)(
        IXAPO *This,
        const WAVEFORMATEX *output_fmt,
        const WAVEFORMATEX *input_fmt,
        WAVEFORMATEX **supported_fmt);

    HRESULT (STDMETHODCALLTYPE *IsOutputFormatSupported)(
        IXAPO *This,
        const WAVEFORMATEX *input_fmt,
        const WAVEFORMATEX *output_fmt,
        WAVEFORMATEX **supported_fmt);

    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IXAPO *This,
        const void *data,
        UINT32 data_len);

    void (STDMETHODCALLTYPE *Reset)(
        IXAPO *This);

    HRESULT (STDMETHODCALLTYPE *LockForProcess)(
        IXAPO *This,
        UINT32 in_params_count,
        const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *in_params,
        UINT32 out_params_count,
        const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *out_params);

    void (STDMETHODCALLTYPE *UnlockForProcess)(
        IXAPO *This);

    void (STDMETHODCALLTYPE *Process)(
        IXAPO *This,
        UINT32 in_params_count,
        const XAPO_PROCESS_BUFFER_PARAMETERS *in_params,
        UINT32 out_params_count,
        XAPO_PROCESS_BUFFER_PARAMETERS *out_params,
        WINBOOL enabled);

    UINT32 (STDMETHODCALLTYPE *CalcInputFrames)(
        IXAPO *This,
        UINT32 output_frames);

    UINT32 (STDMETHODCALLTYPE *CalcOutputFrames)(
        IXAPO *This,
        UINT32 input_frames);

    END_INTERFACE
} IXAPOVtbl;

interface IXAPO {
    CONST_VTBL IXAPOVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXAPO_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXAPO_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXAPO_Release(This) (This)->lpVtbl->Release(This)
/*** IXAPO methods ***/
#define IXAPO_GetRegistrationProperties(This,props) (This)->lpVtbl->GetRegistrationProperties(This,props)
#define IXAPO_IsInputFormatSupported(This,output_fmt,input_fmt,supported_fmt) (This)->lpVtbl->IsInputFormatSupported(This,output_fmt,input_fmt,supported_fmt)
#define IXAPO_IsOutputFormatSupported(This,input_fmt,output_fmt,supported_fmt) (This)->lpVtbl->IsOutputFormatSupported(This,input_fmt,output_fmt,supported_fmt)
#define IXAPO_Initialize(This,data,data_len) (This)->lpVtbl->Initialize(This,data,data_len)
#define IXAPO_Reset(This) (This)->lpVtbl->Reset(This)
#define IXAPO_LockForProcess(This,in_params_count,in_params,out_params_count,out_params) (This)->lpVtbl->LockForProcess(This,in_params_count,in_params,out_params_count,out_params)
#define IXAPO_UnlockForProcess(This) (This)->lpVtbl->UnlockForProcess(This)
#define IXAPO_Process(This,in_params_count,in_params,out_params_count,out_params,enabled) (This)->lpVtbl->Process(This,in_params_count,in_params,out_params_count,out_params,enabled)
#define IXAPO_CalcInputFrames(This,output_frames) (This)->lpVtbl->CalcInputFrames(This,output_frames)
#define IXAPO_CalcOutputFrames(This,input_frames) (This)->lpVtbl->CalcOutputFrames(This,input_frames)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXAPO_QueryInterface(IXAPO* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXAPO_AddRef(IXAPO* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXAPO_Release(IXAPO* This) {
    return This->lpVtbl->Release(This);
}
/*** IXAPO methods ***/
static __WIDL_INLINE HRESULT IXAPO_GetRegistrationProperties(IXAPO* This,XAPO_REGISTRATION_PROPERTIES **props) {
    return This->lpVtbl->GetRegistrationProperties(This,props);
}
static __WIDL_INLINE HRESULT IXAPO_IsInputFormatSupported(IXAPO* This,const WAVEFORMATEX *output_fmt,const WAVEFORMATEX *input_fmt,WAVEFORMATEX **supported_fmt) {
    return This->lpVtbl->IsInputFormatSupported(This,output_fmt,input_fmt,supported_fmt);
}
static __WIDL_INLINE HRESULT IXAPO_IsOutputFormatSupported(IXAPO* This,const WAVEFORMATEX *input_fmt,const WAVEFORMATEX *output_fmt,WAVEFORMATEX **supported_fmt) {
    return This->lpVtbl->IsOutputFormatSupported(This,input_fmt,output_fmt,supported_fmt);
}
static __WIDL_INLINE HRESULT IXAPO_Initialize(IXAPO* This,const void *data,UINT32 data_len) {
    return This->lpVtbl->Initialize(This,data,data_len);
}
static __WIDL_INLINE void IXAPO_Reset(IXAPO* This) {
    This->lpVtbl->Reset(This);
}
static __WIDL_INLINE HRESULT IXAPO_LockForProcess(IXAPO* This,UINT32 in_params_count,const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *in_params,UINT32 out_params_count,const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *out_params) {
    return This->lpVtbl->LockForProcess(This,in_params_count,in_params,out_params_count,out_params);
}
static __WIDL_INLINE void IXAPO_UnlockForProcess(IXAPO* This) {
    This->lpVtbl->UnlockForProcess(This);
}
static __WIDL_INLINE void IXAPO_Process(IXAPO* This,UINT32 in_params_count,const XAPO_PROCESS_BUFFER_PARAMETERS *in_params,UINT32 out_params_count,XAPO_PROCESS_BUFFER_PARAMETERS *out_params,WINBOOL enabled) {
    This->lpVtbl->Process(This,in_params_count,in_params,out_params_count,out_params,enabled);
}
static __WIDL_INLINE UINT32 IXAPO_CalcInputFrames(IXAPO* This,UINT32 output_frames) {
    return This->lpVtbl->CalcInputFrames(This,output_frames);
}
static __WIDL_INLINE UINT32 IXAPO_CalcOutputFrames(IXAPO* This,UINT32 input_frames) {
    return This->lpVtbl->CalcOutputFrames(This,input_frames);
}
#endif
#endif

#endif


#endif  /* __IXAPO_INTERFACE_DEFINED__ */

DEFINE_GUID(IID_IXAPO27, 0xa90bc001, 0xe897, 0xe897, 0x55, 0xe4, 0x9e, 0x47, 0x00, 0x00, 0x00, 0x00);
/*****************************************************************************
 * IXAPOParameters interface
 */
#ifndef __IXAPOParameters_INTERFACE_DEFINED__
#define __IXAPOParameters_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXAPOParameters, 0x26d95c66, 0x80f2, 0x499a, 0xad,0x54, 0x5a,0xe7,0xf0,0x1c,0x6d,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("26d95c66-80f2-499a-ad54-5ae7f01c6d98")
IXAPOParameters : public IUnknown
{
    virtual void STDMETHODCALLTYPE SetParameters(
        const void *params,
        UINT32 params_len) = 0;

    virtual void STDMETHODCALLTYPE GetParameters(
        void *params,
        UINT32 params_len) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXAPOParameters, 0x26d95c66, 0x80f2, 0x499a, 0xad,0x54, 0x5a,0xe7,0xf0,0x1c,0x6d,0x98)
#endif
#else
typedef struct IXAPOParametersVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXAPOParameters *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXAPOParameters *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXAPOParameters *This);

    /*** IXAPOParameters methods ***/
    void (STDMETHODCALLTYPE *SetParameters)(
        IXAPOParameters *This,
        const void *params,
        UINT32 params_len);

    void (STDMETHODCALLTYPE *GetParameters)(
        IXAPOParameters *This,
        void *params,
        UINT32 params_len);

    END_INTERFACE
} IXAPOParametersVtbl;

interface IXAPOParameters {
    CONST_VTBL IXAPOParametersVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXAPOParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXAPOParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXAPOParameters_Release(This) (This)->lpVtbl->Release(This)
/*** IXAPOParameters methods ***/
#define IXAPOParameters_SetParameters(This,params,params_len) (This)->lpVtbl->SetParameters(This,params,params_len)
#define IXAPOParameters_GetParameters(This,params,params_len) (This)->lpVtbl->GetParameters(This,params,params_len)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXAPOParameters_QueryInterface(IXAPOParameters* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXAPOParameters_AddRef(IXAPOParameters* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXAPOParameters_Release(IXAPOParameters* This) {
    return This->lpVtbl->Release(This);
}
/*** IXAPOParameters methods ***/
static __WIDL_INLINE void IXAPOParameters_SetParameters(IXAPOParameters* This,const void *params,UINT32 params_len) {
    This->lpVtbl->SetParameters(This,params,params_len);
}
static __WIDL_INLINE void IXAPOParameters_GetParameters(IXAPOParameters* This,void *params,UINT32 params_len) {
    This->lpVtbl->GetParameters(This,params,params_len);
}
#endif
#endif

#endif


#endif  /* __IXAPOParameters_INTERFACE_DEFINED__ */

DEFINE_GUID(IID_IXAPO27Parameters, 0xa90bc001, 0xe897, 0xe897, 0x55, 0xe4, 0x9e, 0x47, 0x00, 0x00, 0x00, 0x01);
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __xapo_h__ */
