/*** Autogenerated by WIDL 1.6 from include/bdaiface.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

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

#ifndef __bdaiface_h__
#define __bdaiface_h__

/* Forward declarations */

#ifndef __IBDA_NetworkProvider_FWD_DEFINED__
#define __IBDA_NetworkProvider_FWD_DEFINED__
typedef interface IBDA_NetworkProvider IBDA_NetworkProvider;
#endif

#ifndef __IBDA_EthernetFilter_FWD_DEFINED__
#define __IBDA_EthernetFilter_FWD_DEFINED__
typedef interface IBDA_EthernetFilter IBDA_EthernetFilter;
#endif

#ifndef __IBDA_IPV4Filter_FWD_DEFINED__
#define __IBDA_IPV4Filter_FWD_DEFINED__
typedef interface IBDA_IPV4Filter IBDA_IPV4Filter;
#endif

#ifndef __IBDA_IPV6Filter_FWD_DEFINED__
#define __IBDA_IPV6Filter_FWD_DEFINED__
typedef interface IBDA_IPV6Filter IBDA_IPV6Filter;
#endif

#ifndef __IBDA_DeviceControl_FWD_DEFINED__
#define __IBDA_DeviceControl_FWD_DEFINED__
typedef interface IBDA_DeviceControl IBDA_DeviceControl;
#endif

#ifndef __IBDA_PinControl_FWD_DEFINED__
#define __IBDA_PinControl_FWD_DEFINED__
typedef interface IBDA_PinControl IBDA_PinControl;
#endif

#ifndef __IBDA_SignalProperties_FWD_DEFINED__
#define __IBDA_SignalProperties_FWD_DEFINED__
typedef interface IBDA_SignalProperties IBDA_SignalProperties;
#endif

#ifndef __IBDA_SignalStatistics_FWD_DEFINED__
#define __IBDA_SignalStatistics_FWD_DEFINED__
typedef interface IBDA_SignalStatistics IBDA_SignalStatistics;
#endif

#ifndef __IBDA_Topology_FWD_DEFINED__
#define __IBDA_Topology_FWD_DEFINED__
typedef interface IBDA_Topology IBDA_Topology;
#endif

#ifndef __IBDA_VoidTransform_FWD_DEFINED__
#define __IBDA_VoidTransform_FWD_DEFINED__
typedef interface IBDA_VoidTransform IBDA_VoidTransform;
#endif

#ifndef __IBDA_NullTransform_FWD_DEFINED__
#define __IBDA_NullTransform_FWD_DEFINED__
typedef interface IBDA_NullTransform IBDA_NullTransform;
#endif

#ifndef __IBDA_FrequencyFilter_FWD_DEFINED__
#define __IBDA_FrequencyFilter_FWD_DEFINED__
typedef interface IBDA_FrequencyFilter IBDA_FrequencyFilter;
#endif

#ifndef __IBDA_LNBInfo_FWD_DEFINED__
#define __IBDA_LNBInfo_FWD_DEFINED__
typedef interface IBDA_LNBInfo IBDA_LNBInfo;
#endif

#ifndef __IBDA_DiseqCommand_FWD_DEFINED__
#define __IBDA_DiseqCommand_FWD_DEFINED__
typedef interface IBDA_DiseqCommand IBDA_DiseqCommand;
#endif

#ifndef __IBDA_AutoDemodulate_FWD_DEFINED__
#define __IBDA_AutoDemodulate_FWD_DEFINED__
typedef interface IBDA_AutoDemodulate IBDA_AutoDemodulate;
#endif

#ifndef __IBDA_AutoDemodulateEx_FWD_DEFINED__
#define __IBDA_AutoDemodulateEx_FWD_DEFINED__
typedef interface IBDA_AutoDemodulateEx IBDA_AutoDemodulateEx;
#endif

#ifndef __IBDA_DigitalDemodulator_FWD_DEFINED__
#define __IBDA_DigitalDemodulator_FWD_DEFINED__
typedef interface IBDA_DigitalDemodulator IBDA_DigitalDemodulator;
#endif

#ifndef __IBDA_DigitalDemodulator2_FWD_DEFINED__
#define __IBDA_DigitalDemodulator2_FWD_DEFINED__
typedef interface IBDA_DigitalDemodulator2 IBDA_DigitalDemodulator2;
#endif

#ifndef __IBDA_DigitalDemodulator3_FWD_DEFINED__
#define __IBDA_DigitalDemodulator3_FWD_DEFINED__
typedef interface IBDA_DigitalDemodulator3 IBDA_DigitalDemodulator3;
#endif

#ifndef __ICCSubStreamFiltering_FWD_DEFINED__
#define __ICCSubStreamFiltering_FWD_DEFINED__
typedef interface ICCSubStreamFiltering ICCSubStreamFiltering;
#endif

#ifndef __IBDA_IPSinkControl_FWD_DEFINED__
#define __IBDA_IPSinkControl_FWD_DEFINED__
typedef interface IBDA_IPSinkControl IBDA_IPSinkControl;
#endif

#ifndef __IBDA_IPSinkInfo_FWD_DEFINED__
#define __IBDA_IPSinkInfo_FWD_DEFINED__
typedef interface IBDA_IPSinkInfo IBDA_IPSinkInfo;
#endif

#ifndef __IEnumPIDMap_FWD_DEFINED__
#define __IEnumPIDMap_FWD_DEFINED__
typedef interface IEnumPIDMap IEnumPIDMap;
#endif

#ifndef __IMPEG2PIDMap_FWD_DEFINED__
#define __IMPEG2PIDMap_FWD_DEFINED__
typedef interface IMPEG2PIDMap IMPEG2PIDMap;
#endif

#ifndef __IFrequencyMap_FWD_DEFINED__
#define __IFrequencyMap_FWD_DEFINED__
typedef interface IFrequencyMap IFrequencyMap;
#endif

#ifndef __IBDA_EasMessage_FWD_DEFINED__
#define __IBDA_EasMessage_FWD_DEFINED__
typedef interface IBDA_EasMessage IBDA_EasMessage;
#endif

#ifndef __IBDA_TransportStreamInfo_FWD_DEFINED__
#define __IBDA_TransportStreamInfo_FWD_DEFINED__
typedef interface IBDA_TransportStreamInfo IBDA_TransportStreamInfo;
#endif

#ifndef __IBDA_ConditionalAccess_FWD_DEFINED__
#define __IBDA_ConditionalAccess_FWD_DEFINED__
typedef interface IBDA_ConditionalAccess IBDA_ConditionalAccess;
#endif

#ifndef __IBDA_DiagnosticProperties_FWD_DEFINED__
#define __IBDA_DiagnosticProperties_FWD_DEFINED__
typedef interface IBDA_DiagnosticProperties IBDA_DiagnosticProperties;
#endif

#ifndef __IBDA_DRM_FWD_DEFINED__
#define __IBDA_DRM_FWD_DEFINED__
typedef interface IBDA_DRM IBDA_DRM;
#endif

#ifndef __IBDA_NameValueService_FWD_DEFINED__
#define __IBDA_NameValueService_FWD_DEFINED__
typedef interface IBDA_NameValueService IBDA_NameValueService;
#endif

#ifndef __IBDA_ConditionalAccessEx_FWD_DEFINED__
#define __IBDA_ConditionalAccessEx_FWD_DEFINED__
typedef interface IBDA_ConditionalAccessEx IBDA_ConditionalAccessEx;
#endif

#ifndef __IBDA_ISDBConditionalAccess_FWD_DEFINED__
#define __IBDA_ISDBConditionalAccess_FWD_DEFINED__
typedef interface IBDA_ISDBConditionalAccess IBDA_ISDBConditionalAccess;
#endif

#ifndef __IBDA_EventingService_FWD_DEFINED__
#define __IBDA_EventingService_FWD_DEFINED__
typedef interface IBDA_EventingService IBDA_EventingService;
#endif

#ifndef __IBDA_AUX_FWD_DEFINED__
#define __IBDA_AUX_FWD_DEFINED__
typedef interface IBDA_AUX IBDA_AUX;
#endif

#ifndef __IBDA_Encoder_FWD_DEFINED__
#define __IBDA_Encoder_FWD_DEFINED__
typedef interface IBDA_Encoder IBDA_Encoder;
#endif

#ifndef __IBDA_FDC_FWD_DEFINED__
#define __IBDA_FDC_FWD_DEFINED__
typedef interface IBDA_FDC IBDA_FDC;
#endif

#ifndef __IBDA_GuideDataDeliveryService_FWD_DEFINED__
#define __IBDA_GuideDataDeliveryService_FWD_DEFINED__
typedef interface IBDA_GuideDataDeliveryService IBDA_GuideDataDeliveryService;
#endif

#ifndef __IBDA_DRMService_FWD_DEFINED__
#define __IBDA_DRMService_FWD_DEFINED__
typedef interface IBDA_DRMService IBDA_DRMService;
#endif

#ifndef __IBDA_WMDRMSession_FWD_DEFINED__
#define __IBDA_WMDRMSession_FWD_DEFINED__
typedef interface IBDA_WMDRMSession IBDA_WMDRMSession;
#endif

#ifndef __IBDA_WMDRMTuner_FWD_DEFINED__
#define __IBDA_WMDRMTuner_FWD_DEFINED__
typedef interface IBDA_WMDRMTuner IBDA_WMDRMTuner;
#endif

#ifndef __IBDA_DRIDRMService_FWD_DEFINED__
#define __IBDA_DRIDRMService_FWD_DEFINED__
typedef interface IBDA_DRIDRMService IBDA_DRIDRMService;
#endif

#ifndef __IBDA_DRIWMDRMSession_FWD_DEFINED__
#define __IBDA_DRIWMDRMSession_FWD_DEFINED__
typedef interface IBDA_DRIWMDRMSession IBDA_DRIWMDRMSession;
#endif

#ifndef __IBDA_MUX_FWD_DEFINED__
#define __IBDA_MUX_FWD_DEFINED__
typedef interface IBDA_MUX IBDA_MUX;
#endif

#ifndef __IBDA_TransportStreamSelector_FWD_DEFINED__
#define __IBDA_TransportStreamSelector_FWD_DEFINED__
typedef interface IBDA_TransportStreamSelector IBDA_TransportStreamSelector;
#endif

#ifndef __IBDA_UserActivityService_FWD_DEFINED__
#define __IBDA_UserActivityService_FWD_DEFINED__
typedef interface IBDA_UserActivityService IBDA_UserActivityService;
#endif

/* Headers for imported files */

#include <unknwn.h>
#include <strmif.h>
#include <bdatypes.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
typedef enum SmartCardStatusType {
    CardInserted = 0,
    CardRemoved = 1,
    CardError = 2,
    CardDataChanged = 3,
    CardFirmwareUpgrade = 4
} SmartCardStatusType;
typedef enum SmartCardAssociationType {
    NotAssociated = 0,
    Associated = 1,
    AssociationUnknown = 2
} SmartCardAssociationType;
typedef enum LocationCodeSchemeType {
    SCTE_18 = 0
} LocationCodeSchemeType;
typedef enum EntitlementType {
    Entitled = 0,
    NotEntitled = 1,
    TechnicalFailure = 2
} EntitlementType;
typedef enum UICloseReasonType {
    NotReady = 0,
    UserClosed = 1,
    SystemClosed = 2,
    DeviceClosed = 3,
    ErrorClosed = 4
} UICloseReasonType;
typedef enum BDA_DrmPairingError {
    BDA_DrmPairing_Succeeded = 0,
    BDA_DrmPairing_HardwareFailure = 1,
    BDA_DrmPairing_NeedRevocationData = 2,
    BDA_DrmPairing_NeedIndiv = 3,
    BDA_DrmPairing_Other = 4,
    BDA_DrmPairing_DrmInitFailed = 5,
    BDA_DrmPairing_DrmNotPaired = 6,
    BDA_DrmPairing_DrmRePairSoon = 7,
    BDA_DrmPairing_Aborted = 8,
    BDA_DrmPairing_NeedSDKUpdate = 9
} BDA_DrmPairingError;
typedef struct EALocationCodeType {
    LocationCodeSchemeType LocationCodeScheme;
    BYTE state_code;
    BYTE county_subdivision;
    WORD county_code;
} EALocationCodeType;
typedef struct SmartCardApplication {
    ApplicationTypeType ApplicationType;
    USHORT ApplicationVersion;
    BSTR pbstrApplicationName;
    BSTR pbstrApplicationURL;
} SmartCardApplication;

#define PBDA_Encoder_Audio_AlgorithmType_MPEG1LayerII 0x0
#define PBDA_Encoder_Audio_AlgorithmType_AC3 0x1

#define PBDA_Encoder_Video_MPEG2PartII 0x0
#define PBDA_Encoder_Video_MPEG4Part10 0x1

#define PBDA_Encoder_Video_AVC 0x1
#define PBDA_Encoder_Video_H264 0x1

#define PBDA_Encoder_BitrateMode_Constant 1
#define PBDA_Encoder_BitrateMode_Variable 2
#define PBDA_Encoder_BitrateMode_Average 3
typedef enum __WIDL_bdaiface_generated_name_0000000F {
    KSPROPERTY_IPSINK_MULTICASTLIST = 0,
    KSPROPERTY_IPSINK_ADAPTER_DESCRIPTION = 1,
    KSPROPERTY_IPSINK_ADAPTER_ADDRESS = 2
} KSPROPERTY_IPSINK;
/*****************************************************************************
 * IBDA_NetworkProvider interface
 */
#ifndef __IBDA_NetworkProvider_INTERFACE_DEFINED__
#define __IBDA_NetworkProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_NetworkProvider, 0xfd501041, 0x8ebe, 0x11ce, 0x81,0x83, 0x00,0xaa,0x00,0x57,0x7d,0xa2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fd501041-8ebe-11ce-8183-00aa00577da2")
IBDA_NetworkProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE PutSignalSource(
        ULONG ulSignalSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignalSource(
        ULONG *pulSignalSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNetworkType(
        GUID *pguidNetworkType) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutTuningSpace(
        REFGUID guidTuningSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTuningSpace(
        GUID *pguidTuingSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterDeviceFilter(
        IUnknown *pUnkFilterControl,
        ULONG *ppvRegisitrationContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnRegisterDeviceFilter(
        ULONG pvRegistrationContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_NetworkProvider, 0xfd501041, 0x8ebe, 0x11ce, 0x81,0x83, 0x00,0xaa,0x00,0x57,0x7d,0xa2)
#endif
#else
typedef struct IBDA_NetworkProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_NetworkProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *PutSignalSource)(
        IBDA_NetworkProvider* This,
        ULONG ulSignalSource);

    HRESULT (STDMETHODCALLTYPE *GetSignalSource)(
        IBDA_NetworkProvider* This,
        ULONG *pulSignalSource);

    HRESULT (STDMETHODCALLTYPE *GetNetworkType)(
        IBDA_NetworkProvider* This,
        GUID *pguidNetworkType);

    HRESULT (STDMETHODCALLTYPE *PutTuningSpace)(
        IBDA_NetworkProvider* This,
        REFGUID guidTuningSpace);

    HRESULT (STDMETHODCALLTYPE *GetTuningSpace)(
        IBDA_NetworkProvider* This,
        GUID *pguidTuingSpace);

    HRESULT (STDMETHODCALLTYPE *RegisterDeviceFilter)(
        IBDA_NetworkProvider* This,
        IUnknown *pUnkFilterControl,
        ULONG *ppvRegisitrationContext);

    HRESULT (STDMETHODCALLTYPE *UnRegisterDeviceFilter)(
        IBDA_NetworkProvider* This,
        ULONG pvRegistrationContext);

    END_INTERFACE
} IBDA_NetworkProviderVtbl;
interface IBDA_NetworkProvider {
    CONST_VTBL IBDA_NetworkProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_NetworkProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_NetworkProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_NetworkProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_NetworkProvider methods ***/
#define IBDA_NetworkProvider_PutSignalSource(This,ulSignalSource) (This)->lpVtbl->PutSignalSource(This,ulSignalSource)
#define IBDA_NetworkProvider_GetSignalSource(This,pulSignalSource) (This)->lpVtbl->GetSignalSource(This,pulSignalSource)
#define IBDA_NetworkProvider_GetNetworkType(This,pguidNetworkType) (This)->lpVtbl->GetNetworkType(This,pguidNetworkType)
#define IBDA_NetworkProvider_PutTuningSpace(This,guidTuningSpace) (This)->lpVtbl->PutTuningSpace(This,guidTuningSpace)
#define IBDA_NetworkProvider_GetTuningSpace(This,pguidTuingSpace) (This)->lpVtbl->GetTuningSpace(This,pguidTuingSpace)
#define IBDA_NetworkProvider_RegisterDeviceFilter(This,pUnkFilterControl,ppvRegisitrationContext) (This)->lpVtbl->RegisterDeviceFilter(This,pUnkFilterControl,ppvRegisitrationContext)
#define IBDA_NetworkProvider_UnRegisterDeviceFilter(This,pvRegistrationContext) (This)->lpVtbl->UnRegisterDeviceFilter(This,pvRegistrationContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_NetworkProvider_QueryInterface(IBDA_NetworkProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_NetworkProvider_AddRef(IBDA_NetworkProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_NetworkProvider_Release(IBDA_NetworkProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_NetworkProvider methods ***/
static FORCEINLINE HRESULT IBDA_NetworkProvider_PutSignalSource(IBDA_NetworkProvider* This,ULONG ulSignalSource) {
    return This->lpVtbl->PutSignalSource(This,ulSignalSource);
}
static FORCEINLINE HRESULT IBDA_NetworkProvider_GetSignalSource(IBDA_NetworkProvider* This,ULONG *pulSignalSource) {
    return This->lpVtbl->GetSignalSource(This,pulSignalSource);
}
static FORCEINLINE HRESULT IBDA_NetworkProvider_GetNetworkType(IBDA_NetworkProvider* This,GUID *pguidNetworkType) {
    return This->lpVtbl->GetNetworkType(This,pguidNetworkType);
}
static FORCEINLINE HRESULT IBDA_NetworkProvider_PutTuningSpace(IBDA_NetworkProvider* This,REFGUID guidTuningSpace) {
    return This->lpVtbl->PutTuningSpace(This,guidTuningSpace);
}
static FORCEINLINE HRESULT IBDA_NetworkProvider_GetTuningSpace(IBDA_NetworkProvider* This,GUID *pguidTuingSpace) {
    return This->lpVtbl->GetTuningSpace(This,pguidTuingSpace);
}
static FORCEINLINE HRESULT IBDA_NetworkProvider_RegisterDeviceFilter(IBDA_NetworkProvider* This,IUnknown *pUnkFilterControl,ULONG *ppvRegisitrationContext) {
    return This->lpVtbl->RegisterDeviceFilter(This,pUnkFilterControl,ppvRegisitrationContext);
}
static FORCEINLINE HRESULT IBDA_NetworkProvider_UnRegisterDeviceFilter(IBDA_NetworkProvider* This,ULONG pvRegistrationContext) {
    return This->lpVtbl->UnRegisterDeviceFilter(This,pvRegistrationContext);
}
#endif
#endif

#endif


#endif  /* __IBDA_NetworkProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_EthernetFilter interface
 */
#ifndef __IBDA_EthernetFilter_INTERFACE_DEFINED__
#define __IBDA_EthernetFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_EthernetFilter, 0x71985f43, 0x1ca1, 0x11d3, 0x9c,0xc8, 0x00,0xc0,0x4f,0x79,0x71,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("71985f43-1ca1-11d3-9cc8-00c04f7971e0")
IBDA_EthernetFilter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetMulticastListSize(
        ULONG *pulcbAddresses) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutMulticastList(
        ULONG ulcbAddresses,
        BYTE pAddressList[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMulticastList(
        ULONG *pulcbAddresses,
        BYTE pAddressList[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutMulticastMode(
        ULONG ulModeMask) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMulticastMode(
        ULONG *pulModeMask) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_EthernetFilter, 0x71985f43, 0x1ca1, 0x11d3, 0x9c,0xc8, 0x00,0xc0,0x4f,0x79,0x71,0xe0)
#endif
#else
typedef struct IBDA_EthernetFilterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_EthernetFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMulticastListSize)(
        IBDA_EthernetFilter* This,
        ULONG *pulcbAddresses);

    HRESULT (STDMETHODCALLTYPE *PutMulticastList)(
        IBDA_EthernetFilter* This,
        ULONG ulcbAddresses,
        BYTE pAddressList[]);

    HRESULT (STDMETHODCALLTYPE *GetMulticastList)(
        IBDA_EthernetFilter* This,
        ULONG *pulcbAddresses,
        BYTE pAddressList[]);

    HRESULT (STDMETHODCALLTYPE *PutMulticastMode)(
        IBDA_EthernetFilter* This,
        ULONG ulModeMask);

    HRESULT (STDMETHODCALLTYPE *GetMulticastMode)(
        IBDA_EthernetFilter* This,
        ULONG *pulModeMask);

    END_INTERFACE
} IBDA_EthernetFilterVtbl;
interface IBDA_EthernetFilter {
    CONST_VTBL IBDA_EthernetFilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_EthernetFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_EthernetFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_EthernetFilter_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_EthernetFilter methods ***/
#define IBDA_EthernetFilter_GetMulticastListSize(This,pulcbAddresses) (This)->lpVtbl->GetMulticastListSize(This,pulcbAddresses)
#define IBDA_EthernetFilter_PutMulticastList(This,ulcbAddresses,pAddressList) (This)->lpVtbl->PutMulticastList(This,ulcbAddresses,pAddressList)
#define IBDA_EthernetFilter_GetMulticastList(This,pulcbAddresses,pAddressList) (This)->lpVtbl->GetMulticastList(This,pulcbAddresses,pAddressList)
#define IBDA_EthernetFilter_PutMulticastMode(This,ulModeMask) (This)->lpVtbl->PutMulticastMode(This,ulModeMask)
#define IBDA_EthernetFilter_GetMulticastMode(This,pulModeMask) (This)->lpVtbl->GetMulticastMode(This,pulModeMask)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_EthernetFilter_QueryInterface(IBDA_EthernetFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_EthernetFilter_AddRef(IBDA_EthernetFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_EthernetFilter_Release(IBDA_EthernetFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_EthernetFilter methods ***/
static FORCEINLINE HRESULT IBDA_EthernetFilter_GetMulticastListSize(IBDA_EthernetFilter* This,ULONG *pulcbAddresses) {
    return This->lpVtbl->GetMulticastListSize(This,pulcbAddresses);
}
static FORCEINLINE HRESULT IBDA_EthernetFilter_PutMulticastList(IBDA_EthernetFilter* This,ULONG ulcbAddresses,BYTE pAddressList[]) {
    return This->lpVtbl->PutMulticastList(This,ulcbAddresses,pAddressList);
}
static FORCEINLINE HRESULT IBDA_EthernetFilter_GetMulticastList(IBDA_EthernetFilter* This,ULONG *pulcbAddresses,BYTE pAddressList[]) {
    return This->lpVtbl->GetMulticastList(This,pulcbAddresses,pAddressList);
}
static FORCEINLINE HRESULT IBDA_EthernetFilter_PutMulticastMode(IBDA_EthernetFilter* This,ULONG ulModeMask) {
    return This->lpVtbl->PutMulticastMode(This,ulModeMask);
}
static FORCEINLINE HRESULT IBDA_EthernetFilter_GetMulticastMode(IBDA_EthernetFilter* This,ULONG *pulModeMask) {
    return This->lpVtbl->GetMulticastMode(This,pulModeMask);
}
#endif
#endif

#endif


#endif  /* __IBDA_EthernetFilter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_IPV4Filter interface
 */
#ifndef __IBDA_IPV4Filter_INTERFACE_DEFINED__
#define __IBDA_IPV4Filter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_IPV4Filter, 0x71985f44, 0x1ca1, 0x11d3, 0x9c,0xc8, 0x00,0xc0,0x4f,0x79,0x71,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("71985f44-1ca1-11d3-9cc8-00c04f7971e0")
IBDA_IPV4Filter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetMulticastListSize(
        ULONG *pulcbAddresses) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutMulticastList(
        ULONG ulcbAddresses,
        BYTE pAddressList[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMulticastList(
        ULONG *pulcbAddresses,
        BYTE pAddressList[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutMulticastMode(
        ULONG ulModeMask) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMulticastMode(
        ULONG *pulModeMask) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_IPV4Filter, 0x71985f44, 0x1ca1, 0x11d3, 0x9c,0xc8, 0x00,0xc0,0x4f,0x79,0x71,0xe0)
#endif
#else
typedef struct IBDA_IPV4FilterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_IPV4Filter methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMulticastListSize)(
        IBDA_IPV4Filter* This,
        ULONG *pulcbAddresses);

    HRESULT (STDMETHODCALLTYPE *PutMulticastList)(
        IBDA_IPV4Filter* This,
        ULONG ulcbAddresses,
        BYTE pAddressList[]);

    HRESULT (STDMETHODCALLTYPE *GetMulticastList)(
        IBDA_IPV4Filter* This,
        ULONG *pulcbAddresses,
        BYTE pAddressList[]);

    HRESULT (STDMETHODCALLTYPE *PutMulticastMode)(
        IBDA_IPV4Filter* This,
        ULONG ulModeMask);

    HRESULT (STDMETHODCALLTYPE *GetMulticastMode)(
        IBDA_IPV4Filter* This,
        ULONG *pulModeMask);

    END_INTERFACE
} IBDA_IPV4FilterVtbl;
interface IBDA_IPV4Filter {
    CONST_VTBL IBDA_IPV4FilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_IPV4Filter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_IPV4Filter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_IPV4Filter_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_IPV4Filter methods ***/
#define IBDA_IPV4Filter_GetMulticastListSize(This,pulcbAddresses) (This)->lpVtbl->GetMulticastListSize(This,pulcbAddresses)
#define IBDA_IPV4Filter_PutMulticastList(This,ulcbAddresses,pAddressList) (This)->lpVtbl->PutMulticastList(This,ulcbAddresses,pAddressList)
#define IBDA_IPV4Filter_GetMulticastList(This,pulcbAddresses,pAddressList) (This)->lpVtbl->GetMulticastList(This,pulcbAddresses,pAddressList)
#define IBDA_IPV4Filter_PutMulticastMode(This,ulModeMask) (This)->lpVtbl->PutMulticastMode(This,ulModeMask)
#define IBDA_IPV4Filter_GetMulticastMode(This,pulModeMask) (This)->lpVtbl->GetMulticastMode(This,pulModeMask)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_IPV4Filter_QueryInterface(IBDA_IPV4Filter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_IPV4Filter_AddRef(IBDA_IPV4Filter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_IPV4Filter_Release(IBDA_IPV4Filter* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_IPV4Filter methods ***/
static FORCEINLINE HRESULT IBDA_IPV4Filter_GetMulticastListSize(IBDA_IPV4Filter* This,ULONG *pulcbAddresses) {
    return This->lpVtbl->GetMulticastListSize(This,pulcbAddresses);
}
static FORCEINLINE HRESULT IBDA_IPV4Filter_PutMulticastList(IBDA_IPV4Filter* This,ULONG ulcbAddresses,BYTE pAddressList[]) {
    return This->lpVtbl->PutMulticastList(This,ulcbAddresses,pAddressList);
}
static FORCEINLINE HRESULT IBDA_IPV4Filter_GetMulticastList(IBDA_IPV4Filter* This,ULONG *pulcbAddresses,BYTE pAddressList[]) {
    return This->lpVtbl->GetMulticastList(This,pulcbAddresses,pAddressList);
}
static FORCEINLINE HRESULT IBDA_IPV4Filter_PutMulticastMode(IBDA_IPV4Filter* This,ULONG ulModeMask) {
    return This->lpVtbl->PutMulticastMode(This,ulModeMask);
}
static FORCEINLINE HRESULT IBDA_IPV4Filter_GetMulticastMode(IBDA_IPV4Filter* This,ULONG *pulModeMask) {
    return This->lpVtbl->GetMulticastMode(This,pulModeMask);
}
#endif
#endif

#endif


#endif  /* __IBDA_IPV4Filter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_IPV6Filter interface
 */
#ifndef __IBDA_IPV6Filter_INTERFACE_DEFINED__
#define __IBDA_IPV6Filter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_IPV6Filter, 0xe1785a74, 0x2a23, 0x4fb3, 0x92,0x45, 0xa8,0xf8,0x80,0x17,0xef,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e1785a74-2a23-4fb3-9245-a8f88017ef33")
IBDA_IPV6Filter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetMulticastListSize(
        ULONG *pulcbAddresses) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutMulticastList(
        ULONG ulcbAddresses,
        BYTE pAddressList[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMulticastList(
        ULONG *pulcbAddresses,
        BYTE pAddressList[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutMulticastMode(
        ULONG ulModeMask) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMulticastMode(
        ULONG *pulModeMask) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_IPV6Filter, 0xe1785a74, 0x2a23, 0x4fb3, 0x92,0x45, 0xa8,0xf8,0x80,0x17,0xef,0x33)
#endif
#else
typedef struct IBDA_IPV6FilterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_IPV6Filter methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMulticastListSize)(
        IBDA_IPV6Filter* This,
        ULONG *pulcbAddresses);

    HRESULT (STDMETHODCALLTYPE *PutMulticastList)(
        IBDA_IPV6Filter* This,
        ULONG ulcbAddresses,
        BYTE pAddressList[]);

    HRESULT (STDMETHODCALLTYPE *GetMulticastList)(
        IBDA_IPV6Filter* This,
        ULONG *pulcbAddresses,
        BYTE pAddressList[]);

    HRESULT (STDMETHODCALLTYPE *PutMulticastMode)(
        IBDA_IPV6Filter* This,
        ULONG ulModeMask);

    HRESULT (STDMETHODCALLTYPE *GetMulticastMode)(
        IBDA_IPV6Filter* This,
        ULONG *pulModeMask);

    END_INTERFACE
} IBDA_IPV6FilterVtbl;
interface IBDA_IPV6Filter {
    CONST_VTBL IBDA_IPV6FilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_IPV6Filter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_IPV6Filter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_IPV6Filter_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_IPV6Filter methods ***/
#define IBDA_IPV6Filter_GetMulticastListSize(This,pulcbAddresses) (This)->lpVtbl->GetMulticastListSize(This,pulcbAddresses)
#define IBDA_IPV6Filter_PutMulticastList(This,ulcbAddresses,pAddressList) (This)->lpVtbl->PutMulticastList(This,ulcbAddresses,pAddressList)
#define IBDA_IPV6Filter_GetMulticastList(This,pulcbAddresses,pAddressList) (This)->lpVtbl->GetMulticastList(This,pulcbAddresses,pAddressList)
#define IBDA_IPV6Filter_PutMulticastMode(This,ulModeMask) (This)->lpVtbl->PutMulticastMode(This,ulModeMask)
#define IBDA_IPV6Filter_GetMulticastMode(This,pulModeMask) (This)->lpVtbl->GetMulticastMode(This,pulModeMask)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_IPV6Filter_QueryInterface(IBDA_IPV6Filter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_IPV6Filter_AddRef(IBDA_IPV6Filter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_IPV6Filter_Release(IBDA_IPV6Filter* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_IPV6Filter methods ***/
static FORCEINLINE HRESULT IBDA_IPV6Filter_GetMulticastListSize(IBDA_IPV6Filter* This,ULONG *pulcbAddresses) {
    return This->lpVtbl->GetMulticastListSize(This,pulcbAddresses);
}
static FORCEINLINE HRESULT IBDA_IPV6Filter_PutMulticastList(IBDA_IPV6Filter* This,ULONG ulcbAddresses,BYTE pAddressList[]) {
    return This->lpVtbl->PutMulticastList(This,ulcbAddresses,pAddressList);
}
static FORCEINLINE HRESULT IBDA_IPV6Filter_GetMulticastList(IBDA_IPV6Filter* This,ULONG *pulcbAddresses,BYTE pAddressList[]) {
    return This->lpVtbl->GetMulticastList(This,pulcbAddresses,pAddressList);
}
static FORCEINLINE HRESULT IBDA_IPV6Filter_PutMulticastMode(IBDA_IPV6Filter* This,ULONG ulModeMask) {
    return This->lpVtbl->PutMulticastMode(This,ulModeMask);
}
static FORCEINLINE HRESULT IBDA_IPV6Filter_GetMulticastMode(IBDA_IPV6Filter* This,ULONG *pulModeMask) {
    return This->lpVtbl->GetMulticastMode(This,pulModeMask);
}
#endif
#endif

#endif


#endif  /* __IBDA_IPV6Filter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_DeviceControl interface
 */
#ifndef __IBDA_DeviceControl_INTERFACE_DEFINED__
#define __IBDA_DeviceControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_DeviceControl, 0xfd0a5af3, 0xb41d, 0x11d2, 0x9c,0x95, 0x00,0xc0,0x4f,0x79,0x71,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fd0a5af3-b41d-11d2-9c95-00c04f7971e0")
IBDA_DeviceControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StartChanges(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CheckChanges(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitChanges(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetChangeState(
        ULONG *pState) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_DeviceControl, 0xfd0a5af3, 0xb41d, 0x11d2, 0x9c,0x95, 0x00,0xc0,0x4f,0x79,0x71,0xe0)
#endif
#else
typedef struct IBDA_DeviceControlVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_DeviceControl methods ***/
    HRESULT (STDMETHODCALLTYPE *StartChanges)(
        IBDA_DeviceControl* This);

    HRESULT (STDMETHODCALLTYPE *CheckChanges)(
        IBDA_DeviceControl* This);

    HRESULT (STDMETHODCALLTYPE *CommitChanges)(
        IBDA_DeviceControl* This);

    HRESULT (STDMETHODCALLTYPE *GetChangeState)(
        IBDA_DeviceControl* This,
        ULONG *pState);

    END_INTERFACE
} IBDA_DeviceControlVtbl;
interface IBDA_DeviceControl {
    CONST_VTBL IBDA_DeviceControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_DeviceControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_DeviceControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_DeviceControl_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_DeviceControl methods ***/
#define IBDA_DeviceControl_StartChanges(This) (This)->lpVtbl->StartChanges(This)
#define IBDA_DeviceControl_CheckChanges(This) (This)->lpVtbl->CheckChanges(This)
#define IBDA_DeviceControl_CommitChanges(This) (This)->lpVtbl->CommitChanges(This)
#define IBDA_DeviceControl_GetChangeState(This,pState) (This)->lpVtbl->GetChangeState(This,pState)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_DeviceControl_QueryInterface(IBDA_DeviceControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_DeviceControl_AddRef(IBDA_DeviceControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_DeviceControl_Release(IBDA_DeviceControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_DeviceControl methods ***/
static FORCEINLINE HRESULT IBDA_DeviceControl_StartChanges(IBDA_DeviceControl* This) {
    return This->lpVtbl->StartChanges(This);
}
static FORCEINLINE HRESULT IBDA_DeviceControl_CheckChanges(IBDA_DeviceControl* This) {
    return This->lpVtbl->CheckChanges(This);
}
static FORCEINLINE HRESULT IBDA_DeviceControl_CommitChanges(IBDA_DeviceControl* This) {
    return This->lpVtbl->CommitChanges(This);
}
static FORCEINLINE HRESULT IBDA_DeviceControl_GetChangeState(IBDA_DeviceControl* This,ULONG *pState) {
    return This->lpVtbl->GetChangeState(This,pState);
}
#endif
#endif

#endif


#endif  /* __IBDA_DeviceControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_PinControl interface
 */
#ifndef __IBDA_PinControl_INTERFACE_DEFINED__
#define __IBDA_PinControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_PinControl, 0x0ded49d5, 0xa8b7, 0x4d5d, 0x97,0xa1, 0x12,0xb0,0xc1,0x95,0x87,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0ded49d5-a8b7-4d5d-97a1-12b0c195874d")
IBDA_PinControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPinID(
        ULONG *pulPinID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPinType(
        ULONG *pulPinType) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegistrationContext(
        ULONG *pulRegistrationCtx) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_PinControl, 0x0ded49d5, 0xa8b7, 0x4d5d, 0x97,0xa1, 0x12,0xb0,0xc1,0x95,0x87,0x4d)
#endif
#else
typedef struct IBDA_PinControlVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_PinControl methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPinID)(
        IBDA_PinControl* This,
        ULONG *pulPinID);

    HRESULT (STDMETHODCALLTYPE *GetPinType)(
        IBDA_PinControl* This,
        ULONG *pulPinType);

    HRESULT (STDMETHODCALLTYPE *RegistrationContext)(
        IBDA_PinControl* This,
        ULONG *pulRegistrationCtx);

    END_INTERFACE
} IBDA_PinControlVtbl;
interface IBDA_PinControl {
    CONST_VTBL IBDA_PinControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_PinControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_PinControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_PinControl_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_PinControl methods ***/
#define IBDA_PinControl_GetPinID(This,pulPinID) (This)->lpVtbl->GetPinID(This,pulPinID)
#define IBDA_PinControl_GetPinType(This,pulPinType) (This)->lpVtbl->GetPinType(This,pulPinType)
#define IBDA_PinControl_RegistrationContext(This,pulRegistrationCtx) (This)->lpVtbl->RegistrationContext(This,pulRegistrationCtx)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_PinControl_QueryInterface(IBDA_PinControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_PinControl_AddRef(IBDA_PinControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_PinControl_Release(IBDA_PinControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_PinControl methods ***/
static FORCEINLINE HRESULT IBDA_PinControl_GetPinID(IBDA_PinControl* This,ULONG *pulPinID) {
    return This->lpVtbl->GetPinID(This,pulPinID);
}
static FORCEINLINE HRESULT IBDA_PinControl_GetPinType(IBDA_PinControl* This,ULONG *pulPinType) {
    return This->lpVtbl->GetPinType(This,pulPinType);
}
static FORCEINLINE HRESULT IBDA_PinControl_RegistrationContext(IBDA_PinControl* This,ULONG *pulRegistrationCtx) {
    return This->lpVtbl->RegistrationContext(This,pulRegistrationCtx);
}
#endif
#endif

#endif


#endif  /* __IBDA_PinControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_SignalProperties interface
 */
#ifndef __IBDA_SignalProperties_INTERFACE_DEFINED__
#define __IBDA_SignalProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_SignalProperties, 0xd2f1644b, 0xb409, 0x11d2, 0xbc,0x69, 0x00,0xa0,0xc9,0xee,0x9e,0x16);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d2f1644b-b409-11d2-bc69-00a0c9ee9e16")
IBDA_SignalProperties : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE PutNetworkType(
        REFGUID guidNetworkType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNetworkType(
        GUID *pguidNetworkType) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutSignalSource(
        ULONG ulSignalSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignalSource(
        ULONG *pulSignalSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutTuningSpace(
        REFGUID guidTuningSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTuningSpace(
        GUID *pguidTuingSpace) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_SignalProperties, 0xd2f1644b, 0xb409, 0x11d2, 0xbc,0x69, 0x00,0xa0,0xc9,0xee,0x9e,0x16)
#endif
#else
typedef struct IBDA_SignalPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_SignalProperties methods ***/
    HRESULT (STDMETHODCALLTYPE *PutNetworkType)(
        IBDA_SignalProperties* This,
        REFGUID guidNetworkType);

    HRESULT (STDMETHODCALLTYPE *GetNetworkType)(
        IBDA_SignalProperties* This,
        GUID *pguidNetworkType);

    HRESULT (STDMETHODCALLTYPE *PutSignalSource)(
        IBDA_SignalProperties* This,
        ULONG ulSignalSource);

    HRESULT (STDMETHODCALLTYPE *GetSignalSource)(
        IBDA_SignalProperties* This,
        ULONG *pulSignalSource);

    HRESULT (STDMETHODCALLTYPE *PutTuningSpace)(
        IBDA_SignalProperties* This,
        REFGUID guidTuningSpace);

    HRESULT (STDMETHODCALLTYPE *GetTuningSpace)(
        IBDA_SignalProperties* This,
        GUID *pguidTuingSpace);

    END_INTERFACE
} IBDA_SignalPropertiesVtbl;
interface IBDA_SignalProperties {
    CONST_VTBL IBDA_SignalPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_SignalProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_SignalProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_SignalProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_SignalProperties methods ***/
#define IBDA_SignalProperties_PutNetworkType(This,guidNetworkType) (This)->lpVtbl->PutNetworkType(This,guidNetworkType)
#define IBDA_SignalProperties_GetNetworkType(This,pguidNetworkType) (This)->lpVtbl->GetNetworkType(This,pguidNetworkType)
#define IBDA_SignalProperties_PutSignalSource(This,ulSignalSource) (This)->lpVtbl->PutSignalSource(This,ulSignalSource)
#define IBDA_SignalProperties_GetSignalSource(This,pulSignalSource) (This)->lpVtbl->GetSignalSource(This,pulSignalSource)
#define IBDA_SignalProperties_PutTuningSpace(This,guidTuningSpace) (This)->lpVtbl->PutTuningSpace(This,guidTuningSpace)
#define IBDA_SignalProperties_GetTuningSpace(This,pguidTuingSpace) (This)->lpVtbl->GetTuningSpace(This,pguidTuingSpace)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_SignalProperties_QueryInterface(IBDA_SignalProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_SignalProperties_AddRef(IBDA_SignalProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_SignalProperties_Release(IBDA_SignalProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_SignalProperties methods ***/
static FORCEINLINE HRESULT IBDA_SignalProperties_PutNetworkType(IBDA_SignalProperties* This,REFGUID guidNetworkType) {
    return This->lpVtbl->PutNetworkType(This,guidNetworkType);
}
static FORCEINLINE HRESULT IBDA_SignalProperties_GetNetworkType(IBDA_SignalProperties* This,GUID *pguidNetworkType) {
    return This->lpVtbl->GetNetworkType(This,pguidNetworkType);
}
static FORCEINLINE HRESULT IBDA_SignalProperties_PutSignalSource(IBDA_SignalProperties* This,ULONG ulSignalSource) {
    return This->lpVtbl->PutSignalSource(This,ulSignalSource);
}
static FORCEINLINE HRESULT IBDA_SignalProperties_GetSignalSource(IBDA_SignalProperties* This,ULONG *pulSignalSource) {
    return This->lpVtbl->GetSignalSource(This,pulSignalSource);
}
static FORCEINLINE HRESULT IBDA_SignalProperties_PutTuningSpace(IBDA_SignalProperties* This,REFGUID guidTuningSpace) {
    return This->lpVtbl->PutTuningSpace(This,guidTuningSpace);
}
static FORCEINLINE HRESULT IBDA_SignalProperties_GetTuningSpace(IBDA_SignalProperties* This,GUID *pguidTuingSpace) {
    return This->lpVtbl->GetTuningSpace(This,pguidTuingSpace);
}
#endif
#endif

#endif


#endif  /* __IBDA_SignalProperties_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_SignalStatistics interface
 */
#ifndef __IBDA_SignalStatistics_INTERFACE_DEFINED__
#define __IBDA_SignalStatistics_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_SignalStatistics, 0x1347d106, 0xcf3a, 0x428a, 0xa5,0xcb, 0xac,0x0d,0x9a,0x2a,0x43,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1347d106-cf3a-428a-a5cb-ac0d9a2a4338")
IBDA_SignalStatistics : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE put_SignalStrength(
        LONG lDbStrength) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SignalStrength(
        LONG *plDbStrength) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SignalQuality(
        LONG lPercentQuality) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SignalQuality(
        LONG *plPercentQuality) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SignalPresent(
        BOOLEAN fPresent) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SignalPresent(
        BOOLEAN *pfPresent) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SignalLocked(
        BOOLEAN fLocked) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SignalLocked(
        BOOLEAN *pfLocked) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SampleTime(
        LONG lmsSampleTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SampleTime(
        LONG *plmsSampleTime) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_SignalStatistics, 0x1347d106, 0xcf3a, 0x428a, 0xa5,0xcb, 0xac,0x0d,0x9a,0x2a,0x43,0x38)
#endif
#else
typedef struct IBDA_SignalStatisticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_SignalStatistics methods ***/
    HRESULT (STDMETHODCALLTYPE *put_SignalStrength)(
        IBDA_SignalStatistics* This,
        LONG lDbStrength);

    HRESULT (STDMETHODCALLTYPE *get_SignalStrength)(
        IBDA_SignalStatistics* This,
        LONG *plDbStrength);

    HRESULT (STDMETHODCALLTYPE *put_SignalQuality)(
        IBDA_SignalStatistics* This,
        LONG lPercentQuality);

    HRESULT (STDMETHODCALLTYPE *get_SignalQuality)(
        IBDA_SignalStatistics* This,
        LONG *plPercentQuality);

    HRESULT (STDMETHODCALLTYPE *put_SignalPresent)(
        IBDA_SignalStatistics* This,
        BOOLEAN fPresent);

    HRESULT (STDMETHODCALLTYPE *get_SignalPresent)(
        IBDA_SignalStatistics* This,
        BOOLEAN *pfPresent);

    HRESULT (STDMETHODCALLTYPE *put_SignalLocked)(
        IBDA_SignalStatistics* This,
        BOOLEAN fLocked);

    HRESULT (STDMETHODCALLTYPE *get_SignalLocked)(
        IBDA_SignalStatistics* This,
        BOOLEAN *pfLocked);

    HRESULT (STDMETHODCALLTYPE *put_SampleTime)(
        IBDA_SignalStatistics* This,
        LONG lmsSampleTime);

    HRESULT (STDMETHODCALLTYPE *get_SampleTime)(
        IBDA_SignalStatistics* This,
        LONG *plmsSampleTime);

    END_INTERFACE
} IBDA_SignalStatisticsVtbl;
interface IBDA_SignalStatistics {
    CONST_VTBL IBDA_SignalStatisticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_SignalStatistics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_SignalStatistics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_SignalStatistics_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_SignalStatistics methods ***/
#define IBDA_SignalStatistics_put_SignalStrength(This,lDbStrength) (This)->lpVtbl->put_SignalStrength(This,lDbStrength)
#define IBDA_SignalStatistics_get_SignalStrength(This,plDbStrength) (This)->lpVtbl->get_SignalStrength(This,plDbStrength)
#define IBDA_SignalStatistics_put_SignalQuality(This,lPercentQuality) (This)->lpVtbl->put_SignalQuality(This,lPercentQuality)
#define IBDA_SignalStatistics_get_SignalQuality(This,plPercentQuality) (This)->lpVtbl->get_SignalQuality(This,plPercentQuality)
#define IBDA_SignalStatistics_put_SignalPresent(This,fPresent) (This)->lpVtbl->put_SignalPresent(This,fPresent)
#define IBDA_SignalStatistics_get_SignalPresent(This,pfPresent) (This)->lpVtbl->get_SignalPresent(This,pfPresent)
#define IBDA_SignalStatistics_put_SignalLocked(This,fLocked) (This)->lpVtbl->put_SignalLocked(This,fLocked)
#define IBDA_SignalStatistics_get_SignalLocked(This,pfLocked) (This)->lpVtbl->get_SignalLocked(This,pfLocked)
#define IBDA_SignalStatistics_put_SampleTime(This,lmsSampleTime) (This)->lpVtbl->put_SampleTime(This,lmsSampleTime)
#define IBDA_SignalStatistics_get_SampleTime(This,plmsSampleTime) (This)->lpVtbl->get_SampleTime(This,plmsSampleTime)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_SignalStatistics_QueryInterface(IBDA_SignalStatistics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_SignalStatistics_AddRef(IBDA_SignalStatistics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_SignalStatistics_Release(IBDA_SignalStatistics* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_SignalStatistics methods ***/
static FORCEINLINE HRESULT IBDA_SignalStatistics_put_SignalStrength(IBDA_SignalStatistics* This,LONG lDbStrength) {
    return This->lpVtbl->put_SignalStrength(This,lDbStrength);
}
static FORCEINLINE HRESULT IBDA_SignalStatistics_get_SignalStrength(IBDA_SignalStatistics* This,LONG *plDbStrength) {
    return This->lpVtbl->get_SignalStrength(This,plDbStrength);
}
static FORCEINLINE HRESULT IBDA_SignalStatistics_put_SignalQuality(IBDA_SignalStatistics* This,LONG lPercentQuality) {
    return This->lpVtbl->put_SignalQuality(This,lPercentQuality);
}
static FORCEINLINE HRESULT IBDA_SignalStatistics_get_SignalQuality(IBDA_SignalStatistics* This,LONG *plPercentQuality) {
    return This->lpVtbl->get_SignalQuality(This,plPercentQuality);
}
static FORCEINLINE HRESULT IBDA_SignalStatistics_put_SignalPresent(IBDA_SignalStatistics* This,BOOLEAN fPresent) {
    return This->lpVtbl->put_SignalPresent(This,fPresent);
}
static FORCEINLINE HRESULT IBDA_SignalStatistics_get_SignalPresent(IBDA_SignalStatistics* This,BOOLEAN *pfPresent) {
    return This->lpVtbl->get_SignalPresent(This,pfPresent);
}
static FORCEINLINE HRESULT IBDA_SignalStatistics_put_SignalLocked(IBDA_SignalStatistics* This,BOOLEAN fLocked) {
    return This->lpVtbl->put_SignalLocked(This,fLocked);
}
static FORCEINLINE HRESULT IBDA_SignalStatistics_get_SignalLocked(IBDA_SignalStatistics* This,BOOLEAN *pfLocked) {
    return This->lpVtbl->get_SignalLocked(This,pfLocked);
}
static FORCEINLINE HRESULT IBDA_SignalStatistics_put_SampleTime(IBDA_SignalStatistics* This,LONG lmsSampleTime) {
    return This->lpVtbl->put_SampleTime(This,lmsSampleTime);
}
static FORCEINLINE HRESULT IBDA_SignalStatistics_get_SampleTime(IBDA_SignalStatistics* This,LONG *plmsSampleTime) {
    return This->lpVtbl->get_SampleTime(This,plmsSampleTime);
}
#endif
#endif

#endif


#endif  /* __IBDA_SignalStatistics_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_Topology interface
 */
#ifndef __IBDA_Topology_INTERFACE_DEFINED__
#define __IBDA_Topology_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_Topology, 0x79b56888, 0x7fea, 0x4690, 0xb4,0x5d, 0x38,0xfd,0x3c,0x78,0x49,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("79b56888-7fea-4690-b45d-38fd3c7849be")
IBDA_Topology : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetNodeTypes(
        ULONG *pulcNodeTypes,
        ULONG ulcNodeTypesMax,
        ULONG rgulNodeTypes[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNodeDescriptors(
        ULONG *ulcNodeDescriptors,
        ULONG ulcNodeDescriptorsMax,
        BDANODE_DESCRIPTOR rgNodeDescriptors[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNodeInterfaces(
        ULONG ulNodeType,
        ULONG *pulcInterfaces,
        ULONG ulcInterfacesMax,
        GUID rgguidInterfaces[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPinTypes(
        ULONG *pulcPinTypes,
        ULONG ulcPinTypesMax,
        ULONG rgulPinTypes[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTemplateConnections(
        ULONG *pulcConnections,
        ULONG ulcConnectionsMax,
        BDA_TEMPLATE_CONNECTION rgConnections[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePin(
        ULONG ulPinType,
        ULONG *pulPinId) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeletePin(
        ULONG ulPinId) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaType(
        ULONG ulPinId,
        AM_MEDIA_TYPE *pMediaType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMedium(
        ULONG ulPinId,
        REGPINMEDIUM *pMedium) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateTopology(
        ULONG ulInputPinId,
        ULONG ulOutputPinId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetControlNode(
        ULONG ulInputPinId,
        ULONG ulOutputPinId,
        ULONG ulNodeType,
        IUnknown **ppControlNode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_Topology, 0x79b56888, 0x7fea, 0x4690, 0xb4,0x5d, 0x38,0xfd,0x3c,0x78,0x49,0xbe)
#endif
#else
typedef struct IBDA_TopologyVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_Topology methods ***/
    HRESULT (STDMETHODCALLTYPE *GetNodeTypes)(
        IBDA_Topology* This,
        ULONG *pulcNodeTypes,
        ULONG ulcNodeTypesMax,
        ULONG rgulNodeTypes[]);

    HRESULT (STDMETHODCALLTYPE *GetNodeDescriptors)(
        IBDA_Topology* This,
        ULONG *ulcNodeDescriptors,
        ULONG ulcNodeDescriptorsMax,
        BDANODE_DESCRIPTOR rgNodeDescriptors[]);

    HRESULT (STDMETHODCALLTYPE *GetNodeInterfaces)(
        IBDA_Topology* This,
        ULONG ulNodeType,
        ULONG *pulcInterfaces,
        ULONG ulcInterfacesMax,
        GUID rgguidInterfaces[]);

    HRESULT (STDMETHODCALLTYPE *GetPinTypes)(
        IBDA_Topology* This,
        ULONG *pulcPinTypes,
        ULONG ulcPinTypesMax,
        ULONG rgulPinTypes[]);

    HRESULT (STDMETHODCALLTYPE *GetTemplateConnections)(
        IBDA_Topology* This,
        ULONG *pulcConnections,
        ULONG ulcConnectionsMax,
        BDA_TEMPLATE_CONNECTION rgConnections[]);

    HRESULT (STDMETHODCALLTYPE *CreatePin)(
        IBDA_Topology* This,
        ULONG ulPinType,
        ULONG *pulPinId);

    HRESULT (STDMETHODCALLTYPE *DeletePin)(
        IBDA_Topology* This,
        ULONG ulPinId);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        IBDA_Topology* This,
        ULONG ulPinId,
        AM_MEDIA_TYPE *pMediaType);

    HRESULT (STDMETHODCALLTYPE *SetMedium)(
        IBDA_Topology* This,
        ULONG ulPinId,
        REGPINMEDIUM *pMedium);

    HRESULT (STDMETHODCALLTYPE *CreateTopology)(
        IBDA_Topology* This,
        ULONG ulInputPinId,
        ULONG ulOutputPinId);

    HRESULT (STDMETHODCALLTYPE *GetControlNode)(
        IBDA_Topology* This,
        ULONG ulInputPinId,
        ULONG ulOutputPinId,
        ULONG ulNodeType,
        IUnknown **ppControlNode);

    END_INTERFACE
} IBDA_TopologyVtbl;
interface IBDA_Topology {
    CONST_VTBL IBDA_TopologyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_Topology_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_Topology_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_Topology_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_Topology methods ***/
#define IBDA_Topology_GetNodeTypes(This,pulcNodeTypes,ulcNodeTypesMax,rgulNodeTypes) (This)->lpVtbl->GetNodeTypes(This,pulcNodeTypes,ulcNodeTypesMax,rgulNodeTypes)
#define IBDA_Topology_GetNodeDescriptors(This,ulcNodeDescriptors,ulcNodeDescriptorsMax,rgNodeDescriptors) (This)->lpVtbl->GetNodeDescriptors(This,ulcNodeDescriptors,ulcNodeDescriptorsMax,rgNodeDescriptors)
#define IBDA_Topology_GetNodeInterfaces(This,ulNodeType,pulcInterfaces,ulcInterfacesMax,rgguidInterfaces) (This)->lpVtbl->GetNodeInterfaces(This,ulNodeType,pulcInterfaces,ulcInterfacesMax,rgguidInterfaces)
#define IBDA_Topology_GetPinTypes(This,pulcPinTypes,ulcPinTypesMax,rgulPinTypes) (This)->lpVtbl->GetPinTypes(This,pulcPinTypes,ulcPinTypesMax,rgulPinTypes)
#define IBDA_Topology_GetTemplateConnections(This,pulcConnections,ulcConnectionsMax,rgConnections) (This)->lpVtbl->GetTemplateConnections(This,pulcConnections,ulcConnectionsMax,rgConnections)
#define IBDA_Topology_CreatePin(This,ulPinType,pulPinId) (This)->lpVtbl->CreatePin(This,ulPinType,pulPinId)
#define IBDA_Topology_DeletePin(This,ulPinId) (This)->lpVtbl->DeletePin(This,ulPinId)
#define IBDA_Topology_SetMediaType(This,ulPinId,pMediaType) (This)->lpVtbl->SetMediaType(This,ulPinId,pMediaType)
#define IBDA_Topology_SetMedium(This,ulPinId,pMedium) (This)->lpVtbl->SetMedium(This,ulPinId,pMedium)
#define IBDA_Topology_CreateTopology(This,ulInputPinId,ulOutputPinId) (This)->lpVtbl->CreateTopology(This,ulInputPinId,ulOutputPinId)
#define IBDA_Topology_GetControlNode(This,ulInputPinId,ulOutputPinId,ulNodeType,ppControlNode) (This)->lpVtbl->GetControlNode(This,ulInputPinId,ulOutputPinId,ulNodeType,ppControlNode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_Topology_QueryInterface(IBDA_Topology* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_Topology_AddRef(IBDA_Topology* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_Topology_Release(IBDA_Topology* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_Topology methods ***/
static FORCEINLINE HRESULT IBDA_Topology_GetNodeTypes(IBDA_Topology* This,ULONG *pulcNodeTypes,ULONG ulcNodeTypesMax,ULONG rgulNodeTypes[]) {
    return This->lpVtbl->GetNodeTypes(This,pulcNodeTypes,ulcNodeTypesMax,rgulNodeTypes);
}
static FORCEINLINE HRESULT IBDA_Topology_GetNodeDescriptors(IBDA_Topology* This,ULONG *ulcNodeDescriptors,ULONG ulcNodeDescriptorsMax,BDANODE_DESCRIPTOR rgNodeDescriptors[]) {
    return This->lpVtbl->GetNodeDescriptors(This,ulcNodeDescriptors,ulcNodeDescriptorsMax,rgNodeDescriptors);
}
static FORCEINLINE HRESULT IBDA_Topology_GetNodeInterfaces(IBDA_Topology* This,ULONG ulNodeType,ULONG *pulcInterfaces,ULONG ulcInterfacesMax,GUID rgguidInterfaces[]) {
    return This->lpVtbl->GetNodeInterfaces(This,ulNodeType,pulcInterfaces,ulcInterfacesMax,rgguidInterfaces);
}
static FORCEINLINE HRESULT IBDA_Topology_GetPinTypes(IBDA_Topology* This,ULONG *pulcPinTypes,ULONG ulcPinTypesMax,ULONG rgulPinTypes[]) {
    return This->lpVtbl->GetPinTypes(This,pulcPinTypes,ulcPinTypesMax,rgulPinTypes);
}
static FORCEINLINE HRESULT IBDA_Topology_GetTemplateConnections(IBDA_Topology* This,ULONG *pulcConnections,ULONG ulcConnectionsMax,BDA_TEMPLATE_CONNECTION rgConnections[]) {
    return This->lpVtbl->GetTemplateConnections(This,pulcConnections,ulcConnectionsMax,rgConnections);
}
static FORCEINLINE HRESULT IBDA_Topology_CreatePin(IBDA_Topology* This,ULONG ulPinType,ULONG *pulPinId) {
    return This->lpVtbl->CreatePin(This,ulPinType,pulPinId);
}
static FORCEINLINE HRESULT IBDA_Topology_DeletePin(IBDA_Topology* This,ULONG ulPinId) {
    return This->lpVtbl->DeletePin(This,ulPinId);
}
static FORCEINLINE HRESULT IBDA_Topology_SetMediaType(IBDA_Topology* This,ULONG ulPinId,AM_MEDIA_TYPE *pMediaType) {
    return This->lpVtbl->SetMediaType(This,ulPinId,pMediaType);
}
static FORCEINLINE HRESULT IBDA_Topology_SetMedium(IBDA_Topology* This,ULONG ulPinId,REGPINMEDIUM *pMedium) {
    return This->lpVtbl->SetMedium(This,ulPinId,pMedium);
}
static FORCEINLINE HRESULT IBDA_Topology_CreateTopology(IBDA_Topology* This,ULONG ulInputPinId,ULONG ulOutputPinId) {
    return This->lpVtbl->CreateTopology(This,ulInputPinId,ulOutputPinId);
}
static FORCEINLINE HRESULT IBDA_Topology_GetControlNode(IBDA_Topology* This,ULONG ulInputPinId,ULONG ulOutputPinId,ULONG ulNodeType,IUnknown **ppControlNode) {
    return This->lpVtbl->GetControlNode(This,ulInputPinId,ulOutputPinId,ulNodeType,ppControlNode);
}
#endif
#endif

#endif


#endif  /* __IBDA_Topology_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_VoidTransform interface
 */
#ifndef __IBDA_VoidTransform_INTERFACE_DEFINED__
#define __IBDA_VoidTransform_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_VoidTransform, 0x71985f46, 0x1ca1, 0x11d3, 0x9c,0xc8, 0x00,0xc0,0x4f,0x79,0x71,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("71985f46-1ca1-11d3-9cc8-00c04f7971e0")
IBDA_VoidTransform : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Start(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_VoidTransform, 0x71985f46, 0x1ca1, 0x11d3, 0x9c,0xc8, 0x00,0xc0,0x4f,0x79,0x71,0xe0)
#endif
#else
typedef struct IBDA_VoidTransformVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_VoidTransform methods ***/
    HRESULT (STDMETHODCALLTYPE *Start)(
        IBDA_VoidTransform* This);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IBDA_VoidTransform* This);

    END_INTERFACE
} IBDA_VoidTransformVtbl;
interface IBDA_VoidTransform {
    CONST_VTBL IBDA_VoidTransformVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_VoidTransform_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_VoidTransform_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_VoidTransform_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_VoidTransform methods ***/
#define IBDA_VoidTransform_Start(This) (This)->lpVtbl->Start(This)
#define IBDA_VoidTransform_Stop(This) (This)->lpVtbl->Stop(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_VoidTransform_QueryInterface(IBDA_VoidTransform* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_VoidTransform_AddRef(IBDA_VoidTransform* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_VoidTransform_Release(IBDA_VoidTransform* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_VoidTransform methods ***/
static FORCEINLINE HRESULT IBDA_VoidTransform_Start(IBDA_VoidTransform* This) {
    return This->lpVtbl->Start(This);
}
static FORCEINLINE HRESULT IBDA_VoidTransform_Stop(IBDA_VoidTransform* This) {
    return This->lpVtbl->Stop(This);
}
#endif
#endif

#endif


#endif  /* __IBDA_VoidTransform_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_NullTransform interface
 */
#ifndef __IBDA_NullTransform_INTERFACE_DEFINED__
#define __IBDA_NullTransform_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_NullTransform, 0xddf15b0d, 0xbd25, 0x11d2, 0x9c,0xa0, 0x00,0xc0,0x4f,0x79,0x71,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ddf15b0d-bd25-11d2-9ca0-00c04f7971e0")
IBDA_NullTransform : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Start(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_NullTransform, 0xddf15b0d, 0xbd25, 0x11d2, 0x9c,0xa0, 0x00,0xc0,0x4f,0x79,0x71,0xe0)
#endif
#else
typedef struct IBDA_NullTransformVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_NullTransform methods ***/
    HRESULT (STDMETHODCALLTYPE *Start)(
        IBDA_NullTransform* This);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IBDA_NullTransform* This);

    END_INTERFACE
} IBDA_NullTransformVtbl;
interface IBDA_NullTransform {
    CONST_VTBL IBDA_NullTransformVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_NullTransform_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_NullTransform_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_NullTransform_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_NullTransform methods ***/
#define IBDA_NullTransform_Start(This) (This)->lpVtbl->Start(This)
#define IBDA_NullTransform_Stop(This) (This)->lpVtbl->Stop(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_NullTransform_QueryInterface(IBDA_NullTransform* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_NullTransform_AddRef(IBDA_NullTransform* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_NullTransform_Release(IBDA_NullTransform* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_NullTransform methods ***/
static FORCEINLINE HRESULT IBDA_NullTransform_Start(IBDA_NullTransform* This) {
    return This->lpVtbl->Start(This);
}
static FORCEINLINE HRESULT IBDA_NullTransform_Stop(IBDA_NullTransform* This) {
    return This->lpVtbl->Stop(This);
}
#endif
#endif

#endif


#endif  /* __IBDA_NullTransform_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_FrequencyFilter interface
 */
#ifndef __IBDA_FrequencyFilter_INTERFACE_DEFINED__
#define __IBDA_FrequencyFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_FrequencyFilter, 0x71985f47, 0x1ca1, 0x11d3, 0x9c,0xc8, 0x00,0xc0,0x4f,0x79,0x71,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("71985f47-1ca1-11d3-9cc8-00c04f7971e0")
IBDA_FrequencyFilter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE put_Autotune(
        ULONG ulTransponder) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Autotune(
        ULONG *pulTransponder) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Frequency(
        ULONG ulFrequency) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Frequency(
        ULONG *pulFrequency) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Polarity(
        Polarisation Polarity) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Polarity(
        Polarisation *pPolarity) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Range(
        ULONG ulRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Range(
        ULONG *pulRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Bandwidth(
        ULONG ulBandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Bandwidth(
        ULONG *pulBandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FrequencyMultiplier(
        ULONG ulMultiplier) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FrequencyMultiplier(
        ULONG *pulMultiplier) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_FrequencyFilter, 0x71985f47, 0x1ca1, 0x11d3, 0x9c,0xc8, 0x00,0xc0,0x4f,0x79,0x71,0xe0)
#endif
#else
typedef struct IBDA_FrequencyFilterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_FrequencyFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Autotune)(
        IBDA_FrequencyFilter* This,
        ULONG ulTransponder);

    HRESULT (STDMETHODCALLTYPE *get_Autotune)(
        IBDA_FrequencyFilter* This,
        ULONG *pulTransponder);

    HRESULT (STDMETHODCALLTYPE *put_Frequency)(
        IBDA_FrequencyFilter* This,
        ULONG ulFrequency);

    HRESULT (STDMETHODCALLTYPE *get_Frequency)(
        IBDA_FrequencyFilter* This,
        ULONG *pulFrequency);

    HRESULT (STDMETHODCALLTYPE *put_Polarity)(
        IBDA_FrequencyFilter* This,
        Polarisation Polarity);

    HRESULT (STDMETHODCALLTYPE *get_Polarity)(
        IBDA_FrequencyFilter* This,
        Polarisation *pPolarity);

    HRESULT (STDMETHODCALLTYPE *put_Range)(
        IBDA_FrequencyFilter* This,
        ULONG ulRange);

    HRESULT (STDMETHODCALLTYPE *get_Range)(
        IBDA_FrequencyFilter* This,
        ULONG *pulRange);

    HRESULT (STDMETHODCALLTYPE *put_Bandwidth)(
        IBDA_FrequencyFilter* This,
        ULONG ulBandwidth);

    HRESULT (STDMETHODCALLTYPE *get_Bandwidth)(
        IBDA_FrequencyFilter* This,
        ULONG *pulBandwidth);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMultiplier)(
        IBDA_FrequencyFilter* This,
        ULONG ulMultiplier);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMultiplier)(
        IBDA_FrequencyFilter* This,
        ULONG *pulMultiplier);

    END_INTERFACE
} IBDA_FrequencyFilterVtbl;
interface IBDA_FrequencyFilter {
    CONST_VTBL IBDA_FrequencyFilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_FrequencyFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_FrequencyFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_FrequencyFilter_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_FrequencyFilter methods ***/
#define IBDA_FrequencyFilter_put_Autotune(This,ulTransponder) (This)->lpVtbl->put_Autotune(This,ulTransponder)
#define IBDA_FrequencyFilter_get_Autotune(This,pulTransponder) (This)->lpVtbl->get_Autotune(This,pulTransponder)
#define IBDA_FrequencyFilter_put_Frequency(This,ulFrequency) (This)->lpVtbl->put_Frequency(This,ulFrequency)
#define IBDA_FrequencyFilter_get_Frequency(This,pulFrequency) (This)->lpVtbl->get_Frequency(This,pulFrequency)
#define IBDA_FrequencyFilter_put_Polarity(This,Polarity) (This)->lpVtbl->put_Polarity(This,Polarity)
#define IBDA_FrequencyFilter_get_Polarity(This,pPolarity) (This)->lpVtbl->get_Polarity(This,pPolarity)
#define IBDA_FrequencyFilter_put_Range(This,ulRange) (This)->lpVtbl->put_Range(This,ulRange)
#define IBDA_FrequencyFilter_get_Range(This,pulRange) (This)->lpVtbl->get_Range(This,pulRange)
#define IBDA_FrequencyFilter_put_Bandwidth(This,ulBandwidth) (This)->lpVtbl->put_Bandwidth(This,ulBandwidth)
#define IBDA_FrequencyFilter_get_Bandwidth(This,pulBandwidth) (This)->lpVtbl->get_Bandwidth(This,pulBandwidth)
#define IBDA_FrequencyFilter_put_FrequencyMultiplier(This,ulMultiplier) (This)->lpVtbl->put_FrequencyMultiplier(This,ulMultiplier)
#define IBDA_FrequencyFilter_get_FrequencyMultiplier(This,pulMultiplier) (This)->lpVtbl->get_FrequencyMultiplier(This,pulMultiplier)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_FrequencyFilter_QueryInterface(IBDA_FrequencyFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_FrequencyFilter_AddRef(IBDA_FrequencyFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_FrequencyFilter_Release(IBDA_FrequencyFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_FrequencyFilter methods ***/
static FORCEINLINE HRESULT IBDA_FrequencyFilter_put_Autotune(IBDA_FrequencyFilter* This,ULONG ulTransponder) {
    return This->lpVtbl->put_Autotune(This,ulTransponder);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_get_Autotune(IBDA_FrequencyFilter* This,ULONG *pulTransponder) {
    return This->lpVtbl->get_Autotune(This,pulTransponder);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_put_Frequency(IBDA_FrequencyFilter* This,ULONG ulFrequency) {
    return This->lpVtbl->put_Frequency(This,ulFrequency);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_get_Frequency(IBDA_FrequencyFilter* This,ULONG *pulFrequency) {
    return This->lpVtbl->get_Frequency(This,pulFrequency);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_put_Polarity(IBDA_FrequencyFilter* This,Polarisation Polarity) {
    return This->lpVtbl->put_Polarity(This,Polarity);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_get_Polarity(IBDA_FrequencyFilter* This,Polarisation *pPolarity) {
    return This->lpVtbl->get_Polarity(This,pPolarity);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_put_Range(IBDA_FrequencyFilter* This,ULONG ulRange) {
    return This->lpVtbl->put_Range(This,ulRange);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_get_Range(IBDA_FrequencyFilter* This,ULONG *pulRange) {
    return This->lpVtbl->get_Range(This,pulRange);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_put_Bandwidth(IBDA_FrequencyFilter* This,ULONG ulBandwidth) {
    return This->lpVtbl->put_Bandwidth(This,ulBandwidth);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_get_Bandwidth(IBDA_FrequencyFilter* This,ULONG *pulBandwidth) {
    return This->lpVtbl->get_Bandwidth(This,pulBandwidth);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_put_FrequencyMultiplier(IBDA_FrequencyFilter* This,ULONG ulMultiplier) {
    return This->lpVtbl->put_FrequencyMultiplier(This,ulMultiplier);
}
static FORCEINLINE HRESULT IBDA_FrequencyFilter_get_FrequencyMultiplier(IBDA_FrequencyFilter* This,ULONG *pulMultiplier) {
    return This->lpVtbl->get_FrequencyMultiplier(This,pulMultiplier);
}
#endif
#endif

#endif


#endif  /* __IBDA_FrequencyFilter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_LNBInfo interface
 */
#ifndef __IBDA_LNBInfo_INTERFACE_DEFINED__
#define __IBDA_LNBInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_LNBInfo, 0x992cf102, 0x49f9, 0x4719, 0xa6,0x64, 0xc4,0xf2,0x3e,0x24,0x08,0xf4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("992cf102-49f9-4719-a664-c4f23e2408f4")
IBDA_LNBInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE put_LocalOscilatorFrequencyLowBand(
        ULONG ulLOFLow) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalOscilatorFrequencyLowBand(
        ULONG *pulLOFLow) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LocalOscilatorFrequencyHighBand(
        ULONG ulLOFHigh) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalOscilatorFrequencyHighBand(
        ULONG *pulLOFHigh) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_HighLowSwitchFrequency(
        ULONG ulSwitchFrequency) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HighLowSwitchFrequency(
        ULONG *pulSwitchFrequency) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_LNBInfo, 0x992cf102, 0x49f9, 0x4719, 0xa6,0x64, 0xc4,0xf2,0x3e,0x24,0x08,0xf4)
#endif
#else
typedef struct IBDA_LNBInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_LNBInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *put_LocalOscilatorFrequencyLowBand)(
        IBDA_LNBInfo* This,
        ULONG ulLOFLow);

    HRESULT (STDMETHODCALLTYPE *get_LocalOscilatorFrequencyLowBand)(
        IBDA_LNBInfo* This,
        ULONG *pulLOFLow);

    HRESULT (STDMETHODCALLTYPE *put_LocalOscilatorFrequencyHighBand)(
        IBDA_LNBInfo* This,
        ULONG ulLOFHigh);

    HRESULT (STDMETHODCALLTYPE *get_LocalOscilatorFrequencyHighBand)(
        IBDA_LNBInfo* This,
        ULONG *pulLOFHigh);

    HRESULT (STDMETHODCALLTYPE *put_HighLowSwitchFrequency)(
        IBDA_LNBInfo* This,
        ULONG ulSwitchFrequency);

    HRESULT (STDMETHODCALLTYPE *get_HighLowSwitchFrequency)(
        IBDA_LNBInfo* This,
        ULONG *pulSwitchFrequency);

    END_INTERFACE
} IBDA_LNBInfoVtbl;
interface IBDA_LNBInfo {
    CONST_VTBL IBDA_LNBInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_LNBInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_LNBInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_LNBInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_LNBInfo methods ***/
#define IBDA_LNBInfo_put_LocalOscilatorFrequencyLowBand(This,ulLOFLow) (This)->lpVtbl->put_LocalOscilatorFrequencyLowBand(This,ulLOFLow)
#define IBDA_LNBInfo_get_LocalOscilatorFrequencyLowBand(This,pulLOFLow) (This)->lpVtbl->get_LocalOscilatorFrequencyLowBand(This,pulLOFLow)
#define IBDA_LNBInfo_put_LocalOscilatorFrequencyHighBand(This,ulLOFHigh) (This)->lpVtbl->put_LocalOscilatorFrequencyHighBand(This,ulLOFHigh)
#define IBDA_LNBInfo_get_LocalOscilatorFrequencyHighBand(This,pulLOFHigh) (This)->lpVtbl->get_LocalOscilatorFrequencyHighBand(This,pulLOFHigh)
#define IBDA_LNBInfo_put_HighLowSwitchFrequency(This,ulSwitchFrequency) (This)->lpVtbl->put_HighLowSwitchFrequency(This,ulSwitchFrequency)
#define IBDA_LNBInfo_get_HighLowSwitchFrequency(This,pulSwitchFrequency) (This)->lpVtbl->get_HighLowSwitchFrequency(This,pulSwitchFrequency)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_LNBInfo_QueryInterface(IBDA_LNBInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_LNBInfo_AddRef(IBDA_LNBInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_LNBInfo_Release(IBDA_LNBInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_LNBInfo methods ***/
static FORCEINLINE HRESULT IBDA_LNBInfo_put_LocalOscilatorFrequencyLowBand(IBDA_LNBInfo* This,ULONG ulLOFLow) {
    return This->lpVtbl->put_LocalOscilatorFrequencyLowBand(This,ulLOFLow);
}
static FORCEINLINE HRESULT IBDA_LNBInfo_get_LocalOscilatorFrequencyLowBand(IBDA_LNBInfo* This,ULONG *pulLOFLow) {
    return This->lpVtbl->get_LocalOscilatorFrequencyLowBand(This,pulLOFLow);
}
static FORCEINLINE HRESULT IBDA_LNBInfo_put_LocalOscilatorFrequencyHighBand(IBDA_LNBInfo* This,ULONG ulLOFHigh) {
    return This->lpVtbl->put_LocalOscilatorFrequencyHighBand(This,ulLOFHigh);
}
static FORCEINLINE HRESULT IBDA_LNBInfo_get_LocalOscilatorFrequencyHighBand(IBDA_LNBInfo* This,ULONG *pulLOFHigh) {
    return This->lpVtbl->get_LocalOscilatorFrequencyHighBand(This,pulLOFHigh);
}
static FORCEINLINE HRESULT IBDA_LNBInfo_put_HighLowSwitchFrequency(IBDA_LNBInfo* This,ULONG ulSwitchFrequency) {
    return This->lpVtbl->put_HighLowSwitchFrequency(This,ulSwitchFrequency);
}
static FORCEINLINE HRESULT IBDA_LNBInfo_get_HighLowSwitchFrequency(IBDA_LNBInfo* This,ULONG *pulSwitchFrequency) {
    return This->lpVtbl->get_HighLowSwitchFrequency(This,pulSwitchFrequency);
}
#endif
#endif

#endif


#endif  /* __IBDA_LNBInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_DiseqCommand interface
 */
#ifndef __IBDA_DiseqCommand_INTERFACE_DEFINED__
#define __IBDA_DiseqCommand_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_DiseqCommand, 0xf84e2ab0, 0x3c6b, 0x45e3, 0xa0,0xfc, 0x86,0x69,0xd4,0xb8,0x1f,0x11);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f84e2ab0-3c6b-45e3-a0fc-8669d4b81f11")
IBDA_DiseqCommand : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE put_EnableDiseqCommands(
        BOOLEAN bEnable) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DiseqLNBSource(
        ULONG ulLNBSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DiseqUseToneBurst(
        BOOLEAN bUseToneBurst) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DiseqRepeats(
        ULONG ulRepeats) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DiseqSendCommand(
        ULONG ulRequestId,
        ULONG ulcbCommandLen,
        BYTE *pbCommand) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DiseqResponse(
        ULONG ulRequestId,
        ULONG *pulcbResponseLen,
        BYTE pbResponse[]) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_DiseqCommand, 0xf84e2ab0, 0x3c6b, 0x45e3, 0xa0,0xfc, 0x86,0x69,0xd4,0xb8,0x1f,0x11)
#endif
#else
typedef struct IBDA_DiseqCommandVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_DiseqCommand methods ***/
    HRESULT (STDMETHODCALLTYPE *put_EnableDiseqCommands)(
        IBDA_DiseqCommand* This,
        BOOLEAN bEnable);

    HRESULT (STDMETHODCALLTYPE *put_DiseqLNBSource)(
        IBDA_DiseqCommand* This,
        ULONG ulLNBSource);

    HRESULT (STDMETHODCALLTYPE *put_DiseqUseToneBurst)(
        IBDA_DiseqCommand* This,
        BOOLEAN bUseToneBurst);

    HRESULT (STDMETHODCALLTYPE *put_DiseqRepeats)(
        IBDA_DiseqCommand* This,
        ULONG ulRepeats);

    HRESULT (STDMETHODCALLTYPE *put_DiseqSendCommand)(
        IBDA_DiseqCommand* This,
        ULONG ulRequestId,
        ULONG ulcbCommandLen,
        BYTE *pbCommand);

    HRESULT (STDMETHODCALLTYPE *get_DiseqResponse)(
        IBDA_DiseqCommand* This,
        ULONG ulRequestId,
        ULONG *pulcbResponseLen,
        BYTE pbResponse[]);

    END_INTERFACE
} IBDA_DiseqCommandVtbl;
interface IBDA_DiseqCommand {
    CONST_VTBL IBDA_DiseqCommandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_DiseqCommand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_DiseqCommand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_DiseqCommand_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_DiseqCommand methods ***/
#define IBDA_DiseqCommand_put_EnableDiseqCommands(This,bEnable) (This)->lpVtbl->put_EnableDiseqCommands(This,bEnable)
#define IBDA_DiseqCommand_put_DiseqLNBSource(This,ulLNBSource) (This)->lpVtbl->put_DiseqLNBSource(This,ulLNBSource)
#define IBDA_DiseqCommand_put_DiseqUseToneBurst(This,bUseToneBurst) (This)->lpVtbl->put_DiseqUseToneBurst(This,bUseToneBurst)
#define IBDA_DiseqCommand_put_DiseqRepeats(This,ulRepeats) (This)->lpVtbl->put_DiseqRepeats(This,ulRepeats)
#define IBDA_DiseqCommand_put_DiseqSendCommand(This,ulRequestId,ulcbCommandLen,pbCommand) (This)->lpVtbl->put_DiseqSendCommand(This,ulRequestId,ulcbCommandLen,pbCommand)
#define IBDA_DiseqCommand_get_DiseqResponse(This,ulRequestId,pulcbResponseLen,pbResponse) (This)->lpVtbl->get_DiseqResponse(This,ulRequestId,pulcbResponseLen,pbResponse)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_DiseqCommand_QueryInterface(IBDA_DiseqCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_DiseqCommand_AddRef(IBDA_DiseqCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_DiseqCommand_Release(IBDA_DiseqCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_DiseqCommand methods ***/
static FORCEINLINE HRESULT IBDA_DiseqCommand_put_EnableDiseqCommands(IBDA_DiseqCommand* This,BOOLEAN bEnable) {
    return This->lpVtbl->put_EnableDiseqCommands(This,bEnable);
}
static FORCEINLINE HRESULT IBDA_DiseqCommand_put_DiseqLNBSource(IBDA_DiseqCommand* This,ULONG ulLNBSource) {
    return This->lpVtbl->put_DiseqLNBSource(This,ulLNBSource);
}
static FORCEINLINE HRESULT IBDA_DiseqCommand_put_DiseqUseToneBurst(IBDA_DiseqCommand* This,BOOLEAN bUseToneBurst) {
    return This->lpVtbl->put_DiseqUseToneBurst(This,bUseToneBurst);
}
static FORCEINLINE HRESULT IBDA_DiseqCommand_put_DiseqRepeats(IBDA_DiseqCommand* This,ULONG ulRepeats) {
    return This->lpVtbl->put_DiseqRepeats(This,ulRepeats);
}
static FORCEINLINE HRESULT IBDA_DiseqCommand_put_DiseqSendCommand(IBDA_DiseqCommand* This,ULONG ulRequestId,ULONG ulcbCommandLen,BYTE *pbCommand) {
    return This->lpVtbl->put_DiseqSendCommand(This,ulRequestId,ulcbCommandLen,pbCommand);
}
static FORCEINLINE HRESULT IBDA_DiseqCommand_get_DiseqResponse(IBDA_DiseqCommand* This,ULONG ulRequestId,ULONG *pulcbResponseLen,BYTE pbResponse[]) {
    return This->lpVtbl->get_DiseqResponse(This,ulRequestId,pulcbResponseLen,pbResponse);
}
#endif
#endif

#endif


#endif  /* __IBDA_DiseqCommand_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_AutoDemodulate interface
 */
#ifndef __IBDA_AutoDemodulate_INTERFACE_DEFINED__
#define __IBDA_AutoDemodulate_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_AutoDemodulate, 0xddf15b12, 0xbd25, 0x11d2, 0x9c,0xa0, 0x00,0xc0,0x4f,0x79,0x71,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ddf15b12-bd25-11d2-9ca0-00c04f7971e0")
IBDA_AutoDemodulate : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE put_AutoDemodulate(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_AutoDemodulate, 0xddf15b12, 0xbd25, 0x11d2, 0x9c,0xa0, 0x00,0xc0,0x4f,0x79,0x71,0xe0)
#endif
#else
typedef struct IBDA_AutoDemodulateVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_AutoDemodulate methods ***/
    HRESULT (STDMETHODCALLTYPE *put_AutoDemodulate)(
        IBDA_AutoDemodulate* This);

    END_INTERFACE
} IBDA_AutoDemodulateVtbl;
interface IBDA_AutoDemodulate {
    CONST_VTBL IBDA_AutoDemodulateVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_AutoDemodulate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_AutoDemodulate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_AutoDemodulate_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_AutoDemodulate methods ***/
#define IBDA_AutoDemodulate_put_AutoDemodulate(This) (This)->lpVtbl->put_AutoDemodulate(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_AutoDemodulate_QueryInterface(IBDA_AutoDemodulate* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_AutoDemodulate_AddRef(IBDA_AutoDemodulate* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_AutoDemodulate_Release(IBDA_AutoDemodulate* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_AutoDemodulate methods ***/
static FORCEINLINE HRESULT IBDA_AutoDemodulate_put_AutoDemodulate(IBDA_AutoDemodulate* This) {
    return This->lpVtbl->put_AutoDemodulate(This);
}
#endif
#endif

#endif


#endif  /* __IBDA_AutoDemodulate_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_AutoDemodulateEx interface
 */
#ifndef __IBDA_AutoDemodulateEx_INTERFACE_DEFINED__
#define __IBDA_AutoDemodulateEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_AutoDemodulateEx, 0x34518d13, 0x1182, 0x48e6, 0xb2,0x8f, 0xb2,0x49,0x87,0x78,0x73,0x26);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("34518d13-1182-48e6-b28f-b24987787326")
IBDA_AutoDemodulateEx : public IBDA_AutoDemodulate
{
    virtual HRESULT STDMETHODCALLTYPE get_SupportedDeviceNodeTypes(
        ULONG ulcDeviceNodeTypesMax,
        ULONG *pulcDeviceNodeTypes,
        GUID *pguidDeviceNodeTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SupportedVideoFormats(
        ULONG *pulAMTunerModeType,
        ULONG *pulAnalogVideoStandard) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AuxInputCount(
        ULONG *pulCompositeCount,
        ULONG *pulSvideoCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_AutoDemodulateEx, 0x34518d13, 0x1182, 0x48e6, 0xb2,0x8f, 0xb2,0x49,0x87,0x78,0x73,0x26)
#endif
#else
typedef struct IBDA_AutoDemodulateExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_AutoDemodulate methods ***/
    HRESULT (STDMETHODCALLTYPE *put_AutoDemodulate)(
        IBDA_AutoDemodulateEx* This);

    /*** IBDA_AutoDemodulateEx methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SupportedDeviceNodeTypes)(
        IBDA_AutoDemodulateEx* This,
        ULONG ulcDeviceNodeTypesMax,
        ULONG *pulcDeviceNodeTypes,
        GUID *pguidDeviceNodeTypes);

    HRESULT (STDMETHODCALLTYPE *get_SupportedVideoFormats)(
        IBDA_AutoDemodulateEx* This,
        ULONG *pulAMTunerModeType,
        ULONG *pulAnalogVideoStandard);

    HRESULT (STDMETHODCALLTYPE *get_AuxInputCount)(
        IBDA_AutoDemodulateEx* This,
        ULONG *pulCompositeCount,
        ULONG *pulSvideoCount);

    END_INTERFACE
} IBDA_AutoDemodulateExVtbl;
interface IBDA_AutoDemodulateEx {
    CONST_VTBL IBDA_AutoDemodulateExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_AutoDemodulateEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_AutoDemodulateEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_AutoDemodulateEx_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_AutoDemodulate methods ***/
#define IBDA_AutoDemodulateEx_put_AutoDemodulate(This) (This)->lpVtbl->put_AutoDemodulate(This)
/*** IBDA_AutoDemodulateEx methods ***/
#define IBDA_AutoDemodulateEx_get_SupportedDeviceNodeTypes(This,ulcDeviceNodeTypesMax,pulcDeviceNodeTypes,pguidDeviceNodeTypes) (This)->lpVtbl->get_SupportedDeviceNodeTypes(This,ulcDeviceNodeTypesMax,pulcDeviceNodeTypes,pguidDeviceNodeTypes)
#define IBDA_AutoDemodulateEx_get_SupportedVideoFormats(This,pulAMTunerModeType,pulAnalogVideoStandard) (This)->lpVtbl->get_SupportedVideoFormats(This,pulAMTunerModeType,pulAnalogVideoStandard)
#define IBDA_AutoDemodulateEx_get_AuxInputCount(This,pulCompositeCount,pulSvideoCount) (This)->lpVtbl->get_AuxInputCount(This,pulCompositeCount,pulSvideoCount)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_AutoDemodulateEx_QueryInterface(IBDA_AutoDemodulateEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_AutoDemodulateEx_AddRef(IBDA_AutoDemodulateEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_AutoDemodulateEx_Release(IBDA_AutoDemodulateEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_AutoDemodulate methods ***/
static FORCEINLINE HRESULT IBDA_AutoDemodulateEx_put_AutoDemodulate(IBDA_AutoDemodulateEx* This) {
    return This->lpVtbl->put_AutoDemodulate(This);
}
/*** IBDA_AutoDemodulateEx methods ***/
static FORCEINLINE HRESULT IBDA_AutoDemodulateEx_get_SupportedDeviceNodeTypes(IBDA_AutoDemodulateEx* This,ULONG ulcDeviceNodeTypesMax,ULONG *pulcDeviceNodeTypes,GUID *pguidDeviceNodeTypes) {
    return This->lpVtbl->get_SupportedDeviceNodeTypes(This,ulcDeviceNodeTypesMax,pulcDeviceNodeTypes,pguidDeviceNodeTypes);
}
static FORCEINLINE HRESULT IBDA_AutoDemodulateEx_get_SupportedVideoFormats(IBDA_AutoDemodulateEx* This,ULONG *pulAMTunerModeType,ULONG *pulAnalogVideoStandard) {
    return This->lpVtbl->get_SupportedVideoFormats(This,pulAMTunerModeType,pulAnalogVideoStandard);
}
static FORCEINLINE HRESULT IBDA_AutoDemodulateEx_get_AuxInputCount(IBDA_AutoDemodulateEx* This,ULONG *pulCompositeCount,ULONG *pulSvideoCount) {
    return This->lpVtbl->get_AuxInputCount(This,pulCompositeCount,pulSvideoCount);
}
#endif
#endif

#endif


#endif  /* __IBDA_AutoDemodulateEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_DigitalDemodulator interface
 */
#ifndef __IBDA_DigitalDemodulator_INTERFACE_DEFINED__
#define __IBDA_DigitalDemodulator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_DigitalDemodulator, 0xef30f379, 0x985b, 0x4d10, 0xb6,0x40, 0xa7,0x9d,0x5e,0x04,0xe1,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ef30f379-985b-4d10-b640-a79d5e04e1e0")
IBDA_DigitalDemodulator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE put_ModulationType(
        ModulationType *pModulationType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ModulationType(
        ModulationType *pModulationType) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_InnerFECMethod(
        FECMethod *pFECMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_InnerFECMethod(
        FECMethod *pFECMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_InnerFECRate(
        BinaryConvolutionCodeRate *pFECRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_InnerFECRate(
        BinaryConvolutionCodeRate *pFECRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_OuterFECMethod(
        FECMethod *pFECMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OuterFECMethod(
        FECMethod *pFECMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_OuterFECRate(
        BinaryConvolutionCodeRate *pFECRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OuterFECRate(
        BinaryConvolutionCodeRate *pFECRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SymbolRate(
        ULONG *pSymbolRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SymbolRate(
        ULONG *pSymbolRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SpectralInversion(
        SpectralInversion *pSpectralInversion) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SpectralInversion(
        SpectralInversion *pSpectralInversion) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_DigitalDemodulator, 0xef30f379, 0x985b, 0x4d10, 0xb6,0x40, 0xa7,0x9d,0x5e,0x04,0xe1,0xe0)
#endif
#else
typedef struct IBDA_DigitalDemodulatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_DigitalDemodulator methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ModulationType)(
        IBDA_DigitalDemodulator* This,
        ModulationType *pModulationType);

    HRESULT (STDMETHODCALLTYPE *get_ModulationType)(
        IBDA_DigitalDemodulator* This,
        ModulationType *pModulationType);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECMethod)(
        IBDA_DigitalDemodulator* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECMethod)(
        IBDA_DigitalDemodulator* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IBDA_DigitalDemodulator* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IBDA_DigitalDemodulator* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECMethod)(
        IBDA_DigitalDemodulator* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECMethod)(
        IBDA_DigitalDemodulator* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IBDA_DigitalDemodulator* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IBDA_DigitalDemodulator* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IBDA_DigitalDemodulator* This,
        ULONG *pSymbolRate);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IBDA_DigitalDemodulator* This,
        ULONG *pSymbolRate);

    HRESULT (STDMETHODCALLTYPE *put_SpectralInversion)(
        IBDA_DigitalDemodulator* This,
        SpectralInversion *pSpectralInversion);

    HRESULT (STDMETHODCALLTYPE *get_SpectralInversion)(
        IBDA_DigitalDemodulator* This,
        SpectralInversion *pSpectralInversion);

    END_INTERFACE
} IBDA_DigitalDemodulatorVtbl;
interface IBDA_DigitalDemodulator {
    CONST_VTBL IBDA_DigitalDemodulatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_DigitalDemodulator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_DigitalDemodulator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_DigitalDemodulator_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_DigitalDemodulator methods ***/
#define IBDA_DigitalDemodulator_put_ModulationType(This,pModulationType) (This)->lpVtbl->put_ModulationType(This,pModulationType)
#define IBDA_DigitalDemodulator_get_ModulationType(This,pModulationType) (This)->lpVtbl->get_ModulationType(This,pModulationType)
#define IBDA_DigitalDemodulator_put_InnerFECMethod(This,pFECMethod) (This)->lpVtbl->put_InnerFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator_get_InnerFECMethod(This,pFECMethod) (This)->lpVtbl->get_InnerFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator_put_InnerFECRate(This,pFECRate) (This)->lpVtbl->put_InnerFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator_get_InnerFECRate(This,pFECRate) (This)->lpVtbl->get_InnerFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator_put_OuterFECMethod(This,pFECMethod) (This)->lpVtbl->put_OuterFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator_get_OuterFECMethod(This,pFECMethod) (This)->lpVtbl->get_OuterFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator_put_OuterFECRate(This,pFECRate) (This)->lpVtbl->put_OuterFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator_get_OuterFECRate(This,pFECRate) (This)->lpVtbl->get_OuterFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator_put_SymbolRate(This,pSymbolRate) (This)->lpVtbl->put_SymbolRate(This,pSymbolRate)
#define IBDA_DigitalDemodulator_get_SymbolRate(This,pSymbolRate) (This)->lpVtbl->get_SymbolRate(This,pSymbolRate)
#define IBDA_DigitalDemodulator_put_SpectralInversion(This,pSpectralInversion) (This)->lpVtbl->put_SpectralInversion(This,pSpectralInversion)
#define IBDA_DigitalDemodulator_get_SpectralInversion(This,pSpectralInversion) (This)->lpVtbl->get_SpectralInversion(This,pSpectralInversion)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_QueryInterface(IBDA_DigitalDemodulator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_DigitalDemodulator_AddRef(IBDA_DigitalDemodulator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_DigitalDemodulator_Release(IBDA_DigitalDemodulator* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_DigitalDemodulator methods ***/
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_put_ModulationType(IBDA_DigitalDemodulator* This,ModulationType *pModulationType) {
    return This->lpVtbl->put_ModulationType(This,pModulationType);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_get_ModulationType(IBDA_DigitalDemodulator* This,ModulationType *pModulationType) {
    return This->lpVtbl->get_ModulationType(This,pModulationType);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_put_InnerFECMethod(IBDA_DigitalDemodulator* This,FECMethod *pFECMethod) {
    return This->lpVtbl->put_InnerFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_get_InnerFECMethod(IBDA_DigitalDemodulator* This,FECMethod *pFECMethod) {
    return This->lpVtbl->get_InnerFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_put_InnerFECRate(IBDA_DigitalDemodulator* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->put_InnerFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_get_InnerFECRate(IBDA_DigitalDemodulator* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->get_InnerFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_put_OuterFECMethod(IBDA_DigitalDemodulator* This,FECMethod *pFECMethod) {
    return This->lpVtbl->put_OuterFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_get_OuterFECMethod(IBDA_DigitalDemodulator* This,FECMethod *pFECMethod) {
    return This->lpVtbl->get_OuterFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_put_OuterFECRate(IBDA_DigitalDemodulator* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->put_OuterFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_get_OuterFECRate(IBDA_DigitalDemodulator* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->get_OuterFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_put_SymbolRate(IBDA_DigitalDemodulator* This,ULONG *pSymbolRate) {
    return This->lpVtbl->put_SymbolRate(This,pSymbolRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_get_SymbolRate(IBDA_DigitalDemodulator* This,ULONG *pSymbolRate) {
    return This->lpVtbl->get_SymbolRate(This,pSymbolRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_put_SpectralInversion(IBDA_DigitalDemodulator* This,SpectralInversion *pSpectralInversion) {
    return This->lpVtbl->put_SpectralInversion(This,pSpectralInversion);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator_get_SpectralInversion(IBDA_DigitalDemodulator* This,SpectralInversion *pSpectralInversion) {
    return This->lpVtbl->get_SpectralInversion(This,pSpectralInversion);
}
#endif
#endif

#endif


#endif  /* __IBDA_DigitalDemodulator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_DigitalDemodulator2 interface
 */
#ifndef __IBDA_DigitalDemodulator2_INTERFACE_DEFINED__
#define __IBDA_DigitalDemodulator2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_DigitalDemodulator2, 0x525ed3ee, 0x5cf3, 0x4e1e, 0x9a,0x06, 0x53,0x68,0xa8,0x4f,0x9a,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("525ed3ee-5cf3-4e1e-9a06-5368a84f9a6e")
IBDA_DigitalDemodulator2 : public IBDA_DigitalDemodulator
{
    virtual HRESULT STDMETHODCALLTYPE put_GuardInterval(
        GuardInterval *pGuardInterval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_GuardInterval(
        GuardInterval *pGuardInterval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_TransmissionMode(
        TransmissionMode *pTransmissionMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TransmissionMode(
        TransmissionMode *pTransmissionMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RollOff(
        RollOff *pRollOff) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RollOff(
        RollOff *pRollOff) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Pilot(
        Pilot *pPilot) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Pilot(
        Pilot *pPilot) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_DigitalDemodulator2, 0x525ed3ee, 0x5cf3, 0x4e1e, 0x9a,0x06, 0x53,0x68,0xa8,0x4f,0x9a,0x6e)
#endif
#else
typedef struct IBDA_DigitalDemodulator2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_DigitalDemodulator methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ModulationType)(
        IBDA_DigitalDemodulator2* This,
        ModulationType *pModulationType);

    HRESULT (STDMETHODCALLTYPE *get_ModulationType)(
        IBDA_DigitalDemodulator2* This,
        ModulationType *pModulationType);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECMethod)(
        IBDA_DigitalDemodulator2* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECMethod)(
        IBDA_DigitalDemodulator2* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IBDA_DigitalDemodulator2* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IBDA_DigitalDemodulator2* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECMethod)(
        IBDA_DigitalDemodulator2* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECMethod)(
        IBDA_DigitalDemodulator2* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IBDA_DigitalDemodulator2* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IBDA_DigitalDemodulator2* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IBDA_DigitalDemodulator2* This,
        ULONG *pSymbolRate);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IBDA_DigitalDemodulator2* This,
        ULONG *pSymbolRate);

    HRESULT (STDMETHODCALLTYPE *put_SpectralInversion)(
        IBDA_DigitalDemodulator2* This,
        SpectralInversion *pSpectralInversion);

    HRESULT (STDMETHODCALLTYPE *get_SpectralInversion)(
        IBDA_DigitalDemodulator2* This,
        SpectralInversion *pSpectralInversion);

    /*** IBDA_DigitalDemodulator2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_GuardInterval)(
        IBDA_DigitalDemodulator2* This,
        GuardInterval *pGuardInterval);

    HRESULT (STDMETHODCALLTYPE *get_GuardInterval)(
        IBDA_DigitalDemodulator2* This,
        GuardInterval *pGuardInterval);

    HRESULT (STDMETHODCALLTYPE *put_TransmissionMode)(
        IBDA_DigitalDemodulator2* This,
        TransmissionMode *pTransmissionMode);

    HRESULT (STDMETHODCALLTYPE *get_TransmissionMode)(
        IBDA_DigitalDemodulator2* This,
        TransmissionMode *pTransmissionMode);

    HRESULT (STDMETHODCALLTYPE *put_RollOff)(
        IBDA_DigitalDemodulator2* This,
        RollOff *pRollOff);

    HRESULT (STDMETHODCALLTYPE *get_RollOff)(
        IBDA_DigitalDemodulator2* This,
        RollOff *pRollOff);

    HRESULT (STDMETHODCALLTYPE *put_Pilot)(
        IBDA_DigitalDemodulator2* This,
        Pilot *pPilot);

    HRESULT (STDMETHODCALLTYPE *get_Pilot)(
        IBDA_DigitalDemodulator2* This,
        Pilot *pPilot);

    END_INTERFACE
} IBDA_DigitalDemodulator2Vtbl;
interface IBDA_DigitalDemodulator2 {
    CONST_VTBL IBDA_DigitalDemodulator2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_DigitalDemodulator2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_DigitalDemodulator2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_DigitalDemodulator2_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_DigitalDemodulator methods ***/
#define IBDA_DigitalDemodulator2_put_ModulationType(This,pModulationType) (This)->lpVtbl->put_ModulationType(This,pModulationType)
#define IBDA_DigitalDemodulator2_get_ModulationType(This,pModulationType) (This)->lpVtbl->get_ModulationType(This,pModulationType)
#define IBDA_DigitalDemodulator2_put_InnerFECMethod(This,pFECMethod) (This)->lpVtbl->put_InnerFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator2_get_InnerFECMethod(This,pFECMethod) (This)->lpVtbl->get_InnerFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator2_put_InnerFECRate(This,pFECRate) (This)->lpVtbl->put_InnerFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator2_get_InnerFECRate(This,pFECRate) (This)->lpVtbl->get_InnerFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator2_put_OuterFECMethod(This,pFECMethod) (This)->lpVtbl->put_OuterFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator2_get_OuterFECMethod(This,pFECMethod) (This)->lpVtbl->get_OuterFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator2_put_OuterFECRate(This,pFECRate) (This)->lpVtbl->put_OuterFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator2_get_OuterFECRate(This,pFECRate) (This)->lpVtbl->get_OuterFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator2_put_SymbolRate(This,pSymbolRate) (This)->lpVtbl->put_SymbolRate(This,pSymbolRate)
#define IBDA_DigitalDemodulator2_get_SymbolRate(This,pSymbolRate) (This)->lpVtbl->get_SymbolRate(This,pSymbolRate)
#define IBDA_DigitalDemodulator2_put_SpectralInversion(This,pSpectralInversion) (This)->lpVtbl->put_SpectralInversion(This,pSpectralInversion)
#define IBDA_DigitalDemodulator2_get_SpectralInversion(This,pSpectralInversion) (This)->lpVtbl->get_SpectralInversion(This,pSpectralInversion)
/*** IBDA_DigitalDemodulator2 methods ***/
#define IBDA_DigitalDemodulator2_put_GuardInterval(This,pGuardInterval) (This)->lpVtbl->put_GuardInterval(This,pGuardInterval)
#define IBDA_DigitalDemodulator2_get_GuardInterval(This,pGuardInterval) (This)->lpVtbl->get_GuardInterval(This,pGuardInterval)
#define IBDA_DigitalDemodulator2_put_TransmissionMode(This,pTransmissionMode) (This)->lpVtbl->put_TransmissionMode(This,pTransmissionMode)
#define IBDA_DigitalDemodulator2_get_TransmissionMode(This,pTransmissionMode) (This)->lpVtbl->get_TransmissionMode(This,pTransmissionMode)
#define IBDA_DigitalDemodulator2_put_RollOff(This,pRollOff) (This)->lpVtbl->put_RollOff(This,pRollOff)
#define IBDA_DigitalDemodulator2_get_RollOff(This,pRollOff) (This)->lpVtbl->get_RollOff(This,pRollOff)
#define IBDA_DigitalDemodulator2_put_Pilot(This,pPilot) (This)->lpVtbl->put_Pilot(This,pPilot)
#define IBDA_DigitalDemodulator2_get_Pilot(This,pPilot) (This)->lpVtbl->get_Pilot(This,pPilot)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_QueryInterface(IBDA_DigitalDemodulator2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_DigitalDemodulator2_AddRef(IBDA_DigitalDemodulator2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_DigitalDemodulator2_Release(IBDA_DigitalDemodulator2* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_DigitalDemodulator methods ***/
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_ModulationType(IBDA_DigitalDemodulator2* This,ModulationType *pModulationType) {
    return This->lpVtbl->put_ModulationType(This,pModulationType);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_ModulationType(IBDA_DigitalDemodulator2* This,ModulationType *pModulationType) {
    return This->lpVtbl->get_ModulationType(This,pModulationType);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_InnerFECMethod(IBDA_DigitalDemodulator2* This,FECMethod *pFECMethod) {
    return This->lpVtbl->put_InnerFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_InnerFECMethod(IBDA_DigitalDemodulator2* This,FECMethod *pFECMethod) {
    return This->lpVtbl->get_InnerFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_InnerFECRate(IBDA_DigitalDemodulator2* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->put_InnerFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_InnerFECRate(IBDA_DigitalDemodulator2* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->get_InnerFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_OuterFECMethod(IBDA_DigitalDemodulator2* This,FECMethod *pFECMethod) {
    return This->lpVtbl->put_OuterFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_OuterFECMethod(IBDA_DigitalDemodulator2* This,FECMethod *pFECMethod) {
    return This->lpVtbl->get_OuterFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_OuterFECRate(IBDA_DigitalDemodulator2* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->put_OuterFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_OuterFECRate(IBDA_DigitalDemodulator2* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->get_OuterFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_SymbolRate(IBDA_DigitalDemodulator2* This,ULONG *pSymbolRate) {
    return This->lpVtbl->put_SymbolRate(This,pSymbolRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_SymbolRate(IBDA_DigitalDemodulator2* This,ULONG *pSymbolRate) {
    return This->lpVtbl->get_SymbolRate(This,pSymbolRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_SpectralInversion(IBDA_DigitalDemodulator2* This,SpectralInversion *pSpectralInversion) {
    return This->lpVtbl->put_SpectralInversion(This,pSpectralInversion);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_SpectralInversion(IBDA_DigitalDemodulator2* This,SpectralInversion *pSpectralInversion) {
    return This->lpVtbl->get_SpectralInversion(This,pSpectralInversion);
}
/*** IBDA_DigitalDemodulator2 methods ***/
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_GuardInterval(IBDA_DigitalDemodulator2* This,GuardInterval *pGuardInterval) {
    return This->lpVtbl->put_GuardInterval(This,pGuardInterval);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_GuardInterval(IBDA_DigitalDemodulator2* This,GuardInterval *pGuardInterval) {
    return This->lpVtbl->get_GuardInterval(This,pGuardInterval);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_TransmissionMode(IBDA_DigitalDemodulator2* This,TransmissionMode *pTransmissionMode) {
    return This->lpVtbl->put_TransmissionMode(This,pTransmissionMode);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_TransmissionMode(IBDA_DigitalDemodulator2* This,TransmissionMode *pTransmissionMode) {
    return This->lpVtbl->get_TransmissionMode(This,pTransmissionMode);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_RollOff(IBDA_DigitalDemodulator2* This,RollOff *pRollOff) {
    return This->lpVtbl->put_RollOff(This,pRollOff);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_RollOff(IBDA_DigitalDemodulator2* This,RollOff *pRollOff) {
    return This->lpVtbl->get_RollOff(This,pRollOff);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_put_Pilot(IBDA_DigitalDemodulator2* This,Pilot *pPilot) {
    return This->lpVtbl->put_Pilot(This,pPilot);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator2_get_Pilot(IBDA_DigitalDemodulator2* This,Pilot *pPilot) {
    return This->lpVtbl->get_Pilot(This,pPilot);
}
#endif
#endif

#endif


#endif  /* __IBDA_DigitalDemodulator2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_DigitalDemodulator3 interface
 */
#ifndef __IBDA_DigitalDemodulator3_INTERFACE_DEFINED__
#define __IBDA_DigitalDemodulator3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_DigitalDemodulator3, 0x13f19604, 0x7d32, 0x4359, 0x93,0xa2, 0xa0,0x52,0x05,0xd9,0x0a,0xc9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("13f19604-7d32-4359-93a2-a05205d90ac9")
IBDA_DigitalDemodulator3 : public IBDA_DigitalDemodulator2
{
    virtual HRESULT STDMETHODCALLTYPE put_SignalTimeouts(
        BDA_SIGNAL_TIMEOUTS *pSignalTimeouts) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SignalTimeouts(
        BDA_SIGNAL_TIMEOUTS *pSignalTimeouts) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PLPNumber(
        ULONG *pPLPNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PLPNumber(
        ULONG *pPLPNumber) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_DigitalDemodulator3, 0x13f19604, 0x7d32, 0x4359, 0x93,0xa2, 0xa0,0x52,0x05,0xd9,0x0a,0xc9)
#endif
#else
typedef struct IBDA_DigitalDemodulator3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_DigitalDemodulator methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ModulationType)(
        IBDA_DigitalDemodulator3* This,
        ModulationType *pModulationType);

    HRESULT (STDMETHODCALLTYPE *get_ModulationType)(
        IBDA_DigitalDemodulator3* This,
        ModulationType *pModulationType);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECMethod)(
        IBDA_DigitalDemodulator3* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECMethod)(
        IBDA_DigitalDemodulator3* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IBDA_DigitalDemodulator3* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IBDA_DigitalDemodulator3* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECMethod)(
        IBDA_DigitalDemodulator3* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECMethod)(
        IBDA_DigitalDemodulator3* This,
        FECMethod *pFECMethod);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IBDA_DigitalDemodulator3* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IBDA_DigitalDemodulator3* This,
        BinaryConvolutionCodeRate *pFECRate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IBDA_DigitalDemodulator3* This,
        ULONG *pSymbolRate);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IBDA_DigitalDemodulator3* This,
        ULONG *pSymbolRate);

    HRESULT (STDMETHODCALLTYPE *put_SpectralInversion)(
        IBDA_DigitalDemodulator3* This,
        SpectralInversion *pSpectralInversion);

    HRESULT (STDMETHODCALLTYPE *get_SpectralInversion)(
        IBDA_DigitalDemodulator3* This,
        SpectralInversion *pSpectralInversion);

    /*** IBDA_DigitalDemodulator2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_GuardInterval)(
        IBDA_DigitalDemodulator3* This,
        GuardInterval *pGuardInterval);

    HRESULT (STDMETHODCALLTYPE *get_GuardInterval)(
        IBDA_DigitalDemodulator3* This,
        GuardInterval *pGuardInterval);

    HRESULT (STDMETHODCALLTYPE *put_TransmissionMode)(
        IBDA_DigitalDemodulator3* This,
        TransmissionMode *pTransmissionMode);

    HRESULT (STDMETHODCALLTYPE *get_TransmissionMode)(
        IBDA_DigitalDemodulator3* This,
        TransmissionMode *pTransmissionMode);

    HRESULT (STDMETHODCALLTYPE *put_RollOff)(
        IBDA_DigitalDemodulator3* This,
        RollOff *pRollOff);

    HRESULT (STDMETHODCALLTYPE *get_RollOff)(
        IBDA_DigitalDemodulator3* This,
        RollOff *pRollOff);

    HRESULT (STDMETHODCALLTYPE *put_Pilot)(
        IBDA_DigitalDemodulator3* This,
        Pilot *pPilot);

    HRESULT (STDMETHODCALLTYPE *get_Pilot)(
        IBDA_DigitalDemodulator3* This,
        Pilot *pPilot);

    /*** IBDA_DigitalDemodulator3 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_SignalTimeouts)(
        IBDA_DigitalDemodulator3* This,
        BDA_SIGNAL_TIMEOUTS *pSignalTimeouts);

    HRESULT (STDMETHODCALLTYPE *get_SignalTimeouts)(
        IBDA_DigitalDemodulator3* This,
        BDA_SIGNAL_TIMEOUTS *pSignalTimeouts);

    HRESULT (STDMETHODCALLTYPE *put_PLPNumber)(
        IBDA_DigitalDemodulator3* This,
        ULONG *pPLPNumber);

    HRESULT (STDMETHODCALLTYPE *get_PLPNumber)(
        IBDA_DigitalDemodulator3* This,
        ULONG *pPLPNumber);

    END_INTERFACE
} IBDA_DigitalDemodulator3Vtbl;
interface IBDA_DigitalDemodulator3 {
    CONST_VTBL IBDA_DigitalDemodulator3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_DigitalDemodulator3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_DigitalDemodulator3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_DigitalDemodulator3_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_DigitalDemodulator methods ***/
#define IBDA_DigitalDemodulator3_put_ModulationType(This,pModulationType) (This)->lpVtbl->put_ModulationType(This,pModulationType)
#define IBDA_DigitalDemodulator3_get_ModulationType(This,pModulationType) (This)->lpVtbl->get_ModulationType(This,pModulationType)
#define IBDA_DigitalDemodulator3_put_InnerFECMethod(This,pFECMethod) (This)->lpVtbl->put_InnerFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator3_get_InnerFECMethod(This,pFECMethod) (This)->lpVtbl->get_InnerFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator3_put_InnerFECRate(This,pFECRate) (This)->lpVtbl->put_InnerFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator3_get_InnerFECRate(This,pFECRate) (This)->lpVtbl->get_InnerFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator3_put_OuterFECMethod(This,pFECMethod) (This)->lpVtbl->put_OuterFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator3_get_OuterFECMethod(This,pFECMethod) (This)->lpVtbl->get_OuterFECMethod(This,pFECMethod)
#define IBDA_DigitalDemodulator3_put_OuterFECRate(This,pFECRate) (This)->lpVtbl->put_OuterFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator3_get_OuterFECRate(This,pFECRate) (This)->lpVtbl->get_OuterFECRate(This,pFECRate)
#define IBDA_DigitalDemodulator3_put_SymbolRate(This,pSymbolRate) (This)->lpVtbl->put_SymbolRate(This,pSymbolRate)
#define IBDA_DigitalDemodulator3_get_SymbolRate(This,pSymbolRate) (This)->lpVtbl->get_SymbolRate(This,pSymbolRate)
#define IBDA_DigitalDemodulator3_put_SpectralInversion(This,pSpectralInversion) (This)->lpVtbl->put_SpectralInversion(This,pSpectralInversion)
#define IBDA_DigitalDemodulator3_get_SpectralInversion(This,pSpectralInversion) (This)->lpVtbl->get_SpectralInversion(This,pSpectralInversion)
/*** IBDA_DigitalDemodulator2 methods ***/
#define IBDA_DigitalDemodulator3_put_GuardInterval(This,pGuardInterval) (This)->lpVtbl->put_GuardInterval(This,pGuardInterval)
#define IBDA_DigitalDemodulator3_get_GuardInterval(This,pGuardInterval) (This)->lpVtbl->get_GuardInterval(This,pGuardInterval)
#define IBDA_DigitalDemodulator3_put_TransmissionMode(This,pTransmissionMode) (This)->lpVtbl->put_TransmissionMode(This,pTransmissionMode)
#define IBDA_DigitalDemodulator3_get_TransmissionMode(This,pTransmissionMode) (This)->lpVtbl->get_TransmissionMode(This,pTransmissionMode)
#define IBDA_DigitalDemodulator3_put_RollOff(This,pRollOff) (This)->lpVtbl->put_RollOff(This,pRollOff)
#define IBDA_DigitalDemodulator3_get_RollOff(This,pRollOff) (This)->lpVtbl->get_RollOff(This,pRollOff)
#define IBDA_DigitalDemodulator3_put_Pilot(This,pPilot) (This)->lpVtbl->put_Pilot(This,pPilot)
#define IBDA_DigitalDemodulator3_get_Pilot(This,pPilot) (This)->lpVtbl->get_Pilot(This,pPilot)
/*** IBDA_DigitalDemodulator3 methods ***/
#define IBDA_DigitalDemodulator3_put_SignalTimeouts(This,pSignalTimeouts) (This)->lpVtbl->put_SignalTimeouts(This,pSignalTimeouts)
#define IBDA_DigitalDemodulator3_get_SignalTimeouts(This,pSignalTimeouts) (This)->lpVtbl->get_SignalTimeouts(This,pSignalTimeouts)
#define IBDA_DigitalDemodulator3_put_PLPNumber(This,pPLPNumber) (This)->lpVtbl->put_PLPNumber(This,pPLPNumber)
#define IBDA_DigitalDemodulator3_get_PLPNumber(This,pPLPNumber) (This)->lpVtbl->get_PLPNumber(This,pPLPNumber)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_QueryInterface(IBDA_DigitalDemodulator3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_DigitalDemodulator3_AddRef(IBDA_DigitalDemodulator3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_DigitalDemodulator3_Release(IBDA_DigitalDemodulator3* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_DigitalDemodulator methods ***/
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_ModulationType(IBDA_DigitalDemodulator3* This,ModulationType *pModulationType) {
    return This->lpVtbl->put_ModulationType(This,pModulationType);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_ModulationType(IBDA_DigitalDemodulator3* This,ModulationType *pModulationType) {
    return This->lpVtbl->get_ModulationType(This,pModulationType);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_InnerFECMethod(IBDA_DigitalDemodulator3* This,FECMethod *pFECMethod) {
    return This->lpVtbl->put_InnerFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_InnerFECMethod(IBDA_DigitalDemodulator3* This,FECMethod *pFECMethod) {
    return This->lpVtbl->get_InnerFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_InnerFECRate(IBDA_DigitalDemodulator3* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->put_InnerFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_InnerFECRate(IBDA_DigitalDemodulator3* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->get_InnerFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_OuterFECMethod(IBDA_DigitalDemodulator3* This,FECMethod *pFECMethod) {
    return This->lpVtbl->put_OuterFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_OuterFECMethod(IBDA_DigitalDemodulator3* This,FECMethod *pFECMethod) {
    return This->lpVtbl->get_OuterFECMethod(This,pFECMethod);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_OuterFECRate(IBDA_DigitalDemodulator3* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->put_OuterFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_OuterFECRate(IBDA_DigitalDemodulator3* This,BinaryConvolutionCodeRate *pFECRate) {
    return This->lpVtbl->get_OuterFECRate(This,pFECRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_SymbolRate(IBDA_DigitalDemodulator3* This,ULONG *pSymbolRate) {
    return This->lpVtbl->put_SymbolRate(This,pSymbolRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_SymbolRate(IBDA_DigitalDemodulator3* This,ULONG *pSymbolRate) {
    return This->lpVtbl->get_SymbolRate(This,pSymbolRate);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_SpectralInversion(IBDA_DigitalDemodulator3* This,SpectralInversion *pSpectralInversion) {
    return This->lpVtbl->put_SpectralInversion(This,pSpectralInversion);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_SpectralInversion(IBDA_DigitalDemodulator3* This,SpectralInversion *pSpectralInversion) {
    return This->lpVtbl->get_SpectralInversion(This,pSpectralInversion);
}
/*** IBDA_DigitalDemodulator2 methods ***/
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_GuardInterval(IBDA_DigitalDemodulator3* This,GuardInterval *pGuardInterval) {
    return This->lpVtbl->put_GuardInterval(This,pGuardInterval);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_GuardInterval(IBDA_DigitalDemodulator3* This,GuardInterval *pGuardInterval) {
    return This->lpVtbl->get_GuardInterval(This,pGuardInterval);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_TransmissionMode(IBDA_DigitalDemodulator3* This,TransmissionMode *pTransmissionMode) {
    return This->lpVtbl->put_TransmissionMode(This,pTransmissionMode);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_TransmissionMode(IBDA_DigitalDemodulator3* This,TransmissionMode *pTransmissionMode) {
    return This->lpVtbl->get_TransmissionMode(This,pTransmissionMode);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_RollOff(IBDA_DigitalDemodulator3* This,RollOff *pRollOff) {
    return This->lpVtbl->put_RollOff(This,pRollOff);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_RollOff(IBDA_DigitalDemodulator3* This,RollOff *pRollOff) {
    return This->lpVtbl->get_RollOff(This,pRollOff);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_Pilot(IBDA_DigitalDemodulator3* This,Pilot *pPilot) {
    return This->lpVtbl->put_Pilot(This,pPilot);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_Pilot(IBDA_DigitalDemodulator3* This,Pilot *pPilot) {
    return This->lpVtbl->get_Pilot(This,pPilot);
}
/*** IBDA_DigitalDemodulator3 methods ***/
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_SignalTimeouts(IBDA_DigitalDemodulator3* This,BDA_SIGNAL_TIMEOUTS *pSignalTimeouts) {
    return This->lpVtbl->put_SignalTimeouts(This,pSignalTimeouts);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_SignalTimeouts(IBDA_DigitalDemodulator3* This,BDA_SIGNAL_TIMEOUTS *pSignalTimeouts) {
    return This->lpVtbl->get_SignalTimeouts(This,pSignalTimeouts);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_put_PLPNumber(IBDA_DigitalDemodulator3* This,ULONG *pPLPNumber) {
    return This->lpVtbl->put_PLPNumber(This,pPLPNumber);
}
static FORCEINLINE HRESULT IBDA_DigitalDemodulator3_get_PLPNumber(IBDA_DigitalDemodulator3* This,ULONG *pPLPNumber) {
    return This->lpVtbl->get_PLPNumber(This,pPLPNumber);
}
#endif
#endif

#endif


#endif  /* __IBDA_DigitalDemodulator3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICCSubStreamFiltering interface
 */
#ifndef __ICCSubStreamFiltering_INTERFACE_DEFINED__
#define __ICCSubStreamFiltering_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICCSubStreamFiltering, 0x4b2bd7ea, 0x8347, 0x467b, 0x8d,0xbf, 0x62,0xf7,0x84,0x92,0x9c,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4b2bd7ea-8347-467b-8dbf-62f784929cc3")
ICCSubStreamFiltering : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_SubstreamTypes(
        LONG *pTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SubstreamTypes(
        LONG Types) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICCSubStreamFiltering, 0x4b2bd7ea, 0x8347, 0x467b, 0x8d,0xbf, 0x62,0xf7,0x84,0x92,0x9c,0xc3)
#endif
#else
typedef struct ICCSubStreamFilteringVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICCSubStreamFiltering methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SubstreamTypes)(
        ICCSubStreamFiltering* This,
        LONG *pTypes);

    HRESULT (STDMETHODCALLTYPE *put_SubstreamTypes)(
        ICCSubStreamFiltering* This,
        LONG Types);

    END_INTERFACE
} ICCSubStreamFilteringVtbl;
interface ICCSubStreamFiltering {
    CONST_VTBL ICCSubStreamFilteringVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICCSubStreamFiltering_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICCSubStreamFiltering_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICCSubStreamFiltering_Release(This) (This)->lpVtbl->Release(This)
/*** ICCSubStreamFiltering methods ***/
#define ICCSubStreamFiltering_get_SubstreamTypes(This,pTypes) (This)->lpVtbl->get_SubstreamTypes(This,pTypes)
#define ICCSubStreamFiltering_put_SubstreamTypes(This,Types) (This)->lpVtbl->put_SubstreamTypes(This,Types)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICCSubStreamFiltering_QueryInterface(ICCSubStreamFiltering* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICCSubStreamFiltering_AddRef(ICCSubStreamFiltering* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICCSubStreamFiltering_Release(ICCSubStreamFiltering* This) {
    return This->lpVtbl->Release(This);
}
/*** ICCSubStreamFiltering methods ***/
static FORCEINLINE HRESULT ICCSubStreamFiltering_get_SubstreamTypes(ICCSubStreamFiltering* This,LONG *pTypes) {
    return This->lpVtbl->get_SubstreamTypes(This,pTypes);
}
static FORCEINLINE HRESULT ICCSubStreamFiltering_put_SubstreamTypes(ICCSubStreamFiltering* This,LONG Types) {
    return This->lpVtbl->put_SubstreamTypes(This,Types);
}
#endif
#endif

#endif


#endif  /* __ICCSubStreamFiltering_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_IPSinkControl interface
 */
#ifndef __IBDA_IPSinkControl_INTERFACE_DEFINED__
#define __IBDA_IPSinkControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_IPSinkControl, 0x3f4dc8e2, 0x4050, 0x11d3, 0x8f,0x4b, 0x00,0xc0,0x4f,0x79,0x71,0xe2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3f4dc8e2-4050-11d3-8f4b-00c04f7971e2")
IBDA_IPSinkControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetMulticastList(
        ULONG *pulcbSize,
        BYTE **pbBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAdapterIPAddress(
        ULONG *pulcbSize,
        BYTE **pbBuffer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_IPSinkControl, 0x3f4dc8e2, 0x4050, 0x11d3, 0x8f,0x4b, 0x00,0xc0,0x4f,0x79,0x71,0xe2)
#endif
#else
typedef struct IBDA_IPSinkControlVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_IPSinkControl methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMulticastList)(
        IBDA_IPSinkControl* This,
        ULONG *pulcbSize,
        BYTE **pbBuffer);

    HRESULT (STDMETHODCALLTYPE *GetAdapterIPAddress)(
        IBDA_IPSinkControl* This,
        ULONG *pulcbSize,
        BYTE **pbBuffer);

    END_INTERFACE
} IBDA_IPSinkControlVtbl;
interface IBDA_IPSinkControl {
    CONST_VTBL IBDA_IPSinkControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_IPSinkControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_IPSinkControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_IPSinkControl_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_IPSinkControl methods ***/
#define IBDA_IPSinkControl_GetMulticastList(This,pulcbSize,pbBuffer) (This)->lpVtbl->GetMulticastList(This,pulcbSize,pbBuffer)
#define IBDA_IPSinkControl_GetAdapterIPAddress(This,pulcbSize,pbBuffer) (This)->lpVtbl->GetAdapterIPAddress(This,pulcbSize,pbBuffer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_IPSinkControl_QueryInterface(IBDA_IPSinkControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_IPSinkControl_AddRef(IBDA_IPSinkControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_IPSinkControl_Release(IBDA_IPSinkControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_IPSinkControl methods ***/
static FORCEINLINE HRESULT IBDA_IPSinkControl_GetMulticastList(IBDA_IPSinkControl* This,ULONG *pulcbSize,BYTE **pbBuffer) {
    return This->lpVtbl->GetMulticastList(This,pulcbSize,pbBuffer);
}
static FORCEINLINE HRESULT IBDA_IPSinkControl_GetAdapterIPAddress(IBDA_IPSinkControl* This,ULONG *pulcbSize,BYTE **pbBuffer) {
    return This->lpVtbl->GetAdapterIPAddress(This,pulcbSize,pbBuffer);
}
#endif
#endif

#endif


#endif  /* __IBDA_IPSinkControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_IPSinkInfo interface
 */
#ifndef __IBDA_IPSinkInfo_INTERFACE_DEFINED__
#define __IBDA_IPSinkInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_IPSinkInfo, 0xa750108f, 0x492e, 0x4d51, 0x95,0xf7, 0x64,0x9b,0x23,0xff,0x7a,0xd7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a750108f-492e-4d51-95f7-649b23ff7ad7")
IBDA_IPSinkInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_MulticastList(
        ULONG *pulcbAddresses,
        BYTE **ppbAddressList) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AdapterIPAddress(
        BSTR *pbstrBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AdapterDescription(
        BSTR *pbstrBuffer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_IPSinkInfo, 0xa750108f, 0x492e, 0x4d51, 0x95,0xf7, 0x64,0x9b,0x23,0xff,0x7a,0xd7)
#endif
#else
typedef struct IBDA_IPSinkInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_IPSinkInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MulticastList)(
        IBDA_IPSinkInfo* This,
        ULONG *pulcbAddresses,
        BYTE **ppbAddressList);

    HRESULT (STDMETHODCALLTYPE *get_AdapterIPAddress)(
        IBDA_IPSinkInfo* This,
        BSTR *pbstrBuffer);

    HRESULT (STDMETHODCALLTYPE *get_AdapterDescription)(
        IBDA_IPSinkInfo* This,
        BSTR *pbstrBuffer);

    END_INTERFACE
} IBDA_IPSinkInfoVtbl;
interface IBDA_IPSinkInfo {
    CONST_VTBL IBDA_IPSinkInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_IPSinkInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_IPSinkInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_IPSinkInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_IPSinkInfo methods ***/
#define IBDA_IPSinkInfo_get_MulticastList(This,pulcbAddresses,ppbAddressList) (This)->lpVtbl->get_MulticastList(This,pulcbAddresses,ppbAddressList)
#define IBDA_IPSinkInfo_get_AdapterIPAddress(This,pbstrBuffer) (This)->lpVtbl->get_AdapterIPAddress(This,pbstrBuffer)
#define IBDA_IPSinkInfo_get_AdapterDescription(This,pbstrBuffer) (This)->lpVtbl->get_AdapterDescription(This,pbstrBuffer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_IPSinkInfo_QueryInterface(IBDA_IPSinkInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_IPSinkInfo_AddRef(IBDA_IPSinkInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_IPSinkInfo_Release(IBDA_IPSinkInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_IPSinkInfo methods ***/
static FORCEINLINE HRESULT IBDA_IPSinkInfo_get_MulticastList(IBDA_IPSinkInfo* This,ULONG *pulcbAddresses,BYTE **ppbAddressList) {
    return This->lpVtbl->get_MulticastList(This,pulcbAddresses,ppbAddressList);
}
static FORCEINLINE HRESULT IBDA_IPSinkInfo_get_AdapterIPAddress(IBDA_IPSinkInfo* This,BSTR *pbstrBuffer) {
    return This->lpVtbl->get_AdapterIPAddress(This,pbstrBuffer);
}
static FORCEINLINE HRESULT IBDA_IPSinkInfo_get_AdapterDescription(IBDA_IPSinkInfo* This,BSTR *pbstrBuffer) {
    return This->lpVtbl->get_AdapterDescription(This,pbstrBuffer);
}
#endif
#endif

#endif


#endif  /* __IBDA_IPSinkInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumPIDMap interface
 */
#ifndef __IEnumPIDMap_INTERFACE_DEFINED__
#define __IEnumPIDMap_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumPIDMap, 0xafb6c2a2, 0x2c41, 0x11d3, 0x8a,0x60, 0x00,0x00,0xf8,0x1e,0x0e,0x4a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("afb6c2a2-2c41-11d3-8a60-0000f81e0e4a")
IEnumPIDMap : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG cRequest,
        PID_MAP *pPIDMap,
        ULONG *pcReceived) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG cRecords) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumPIDMap **ppIEnumPIDMap) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumPIDMap, 0xafb6c2a2, 0x2c41, 0x11d3, 0x8a,0x60, 0x00,0x00,0xf8,0x1e,0x0e,0x4a)
#endif
#else
typedef struct IEnumPIDMapVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumPIDMap methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumPIDMap* This,
        ULONG cRequest,
        PID_MAP *pPIDMap,
        ULONG *pcReceived);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumPIDMap* This,
        ULONG cRecords);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumPIDMap* This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumPIDMap* This,
        IEnumPIDMap **ppIEnumPIDMap);

    END_INTERFACE
} IEnumPIDMapVtbl;
interface IEnumPIDMap {
    CONST_VTBL IEnumPIDMapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumPIDMap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumPIDMap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumPIDMap_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumPIDMap methods ***/
#define IEnumPIDMap_Next(This,cRequest,pPIDMap,pcReceived) (This)->lpVtbl->Next(This,cRequest,pPIDMap,pcReceived)
#define IEnumPIDMap_Skip(This,cRecords) (This)->lpVtbl->Skip(This,cRecords)
#define IEnumPIDMap_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumPIDMap_Clone(This,ppIEnumPIDMap) (This)->lpVtbl->Clone(This,ppIEnumPIDMap)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumPIDMap_QueryInterface(IEnumPIDMap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumPIDMap_AddRef(IEnumPIDMap* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumPIDMap_Release(IEnumPIDMap* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumPIDMap methods ***/
static FORCEINLINE HRESULT IEnumPIDMap_Next(IEnumPIDMap* This,ULONG cRequest,PID_MAP *pPIDMap,ULONG *pcReceived) {
    return This->lpVtbl->Next(This,cRequest,pPIDMap,pcReceived);
}
static FORCEINLINE HRESULT IEnumPIDMap_Skip(IEnumPIDMap* This,ULONG cRecords) {
    return This->lpVtbl->Skip(This,cRecords);
}
static FORCEINLINE HRESULT IEnumPIDMap_Reset(IEnumPIDMap* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumPIDMap_Clone(IEnumPIDMap* This,IEnumPIDMap **ppIEnumPIDMap) {
    return This->lpVtbl->Clone(This,ppIEnumPIDMap);
}
#endif
#endif

#endif


#endif  /* __IEnumPIDMap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMPEG2PIDMap interface
 */
#ifndef __IMPEG2PIDMap_INTERFACE_DEFINED__
#define __IMPEG2PIDMap_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMPEG2PIDMap, 0xafb6c2a1, 0x2c41, 0x11d3, 0x8a,0x60, 0x00,0x00,0xf8,0x1e,0x0e,0x4a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("afb6c2a1-2c41-11d3-8a60-0000f81e0e4a")
IMPEG2PIDMap : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MapPID(
        ULONG culPID,
        ULONG *pulPID,
        MEDIA_SAMPLE_CONTENT MediaSampleContent) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnmapPID(
        ULONG culPID,
        ULONG *pulPID) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumPIDMap(
        IEnumPIDMap **pIEnumPIDMap) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMPEG2PIDMap, 0xafb6c2a1, 0x2c41, 0x11d3, 0x8a,0x60, 0x00,0x00,0xf8,0x1e,0x0e,0x4a)
#endif
#else
typedef struct IMPEG2PIDMapVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMPEG2PIDMap methods ***/
    HRESULT (STDMETHODCALLTYPE *MapPID)(
        IMPEG2PIDMap* This,
        ULONG culPID,
        ULONG *pulPID,
        MEDIA_SAMPLE_CONTENT MediaSampleContent);

    HRESULT (STDMETHODCALLTYPE *UnmapPID)(
        IMPEG2PIDMap* This,
        ULONG culPID,
        ULONG *pulPID);

    HRESULT (STDMETHODCALLTYPE *EnumPIDMap)(
        IMPEG2PIDMap* This,
        IEnumPIDMap **pIEnumPIDMap);

    END_INTERFACE
} IMPEG2PIDMapVtbl;
interface IMPEG2PIDMap {
    CONST_VTBL IMPEG2PIDMapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMPEG2PIDMap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMPEG2PIDMap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMPEG2PIDMap_Release(This) (This)->lpVtbl->Release(This)
/*** IMPEG2PIDMap methods ***/
#define IMPEG2PIDMap_MapPID(This,culPID,pulPID,MediaSampleContent) (This)->lpVtbl->MapPID(This,culPID,pulPID,MediaSampleContent)
#define IMPEG2PIDMap_UnmapPID(This,culPID,pulPID) (This)->lpVtbl->UnmapPID(This,culPID,pulPID)
#define IMPEG2PIDMap_EnumPIDMap(This,pIEnumPIDMap) (This)->lpVtbl->EnumPIDMap(This,pIEnumPIDMap)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMPEG2PIDMap_QueryInterface(IMPEG2PIDMap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMPEG2PIDMap_AddRef(IMPEG2PIDMap* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMPEG2PIDMap_Release(IMPEG2PIDMap* This) {
    return This->lpVtbl->Release(This);
}
/*** IMPEG2PIDMap methods ***/
static FORCEINLINE HRESULT IMPEG2PIDMap_MapPID(IMPEG2PIDMap* This,ULONG culPID,ULONG *pulPID,MEDIA_SAMPLE_CONTENT MediaSampleContent) {
    return This->lpVtbl->MapPID(This,culPID,pulPID,MediaSampleContent);
}
static FORCEINLINE HRESULT IMPEG2PIDMap_UnmapPID(IMPEG2PIDMap* This,ULONG culPID,ULONG *pulPID) {
    return This->lpVtbl->UnmapPID(This,culPID,pulPID);
}
static FORCEINLINE HRESULT IMPEG2PIDMap_EnumPIDMap(IMPEG2PIDMap* This,IEnumPIDMap **pIEnumPIDMap) {
    return This->lpVtbl->EnumPIDMap(This,pIEnumPIDMap);
}
#endif
#endif

#endif


#endif  /* __IMPEG2PIDMap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFrequencyMap interface
 */
#ifndef __IFrequencyMap_INTERFACE_DEFINED__
#define __IFrequencyMap_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFrequencyMap, 0x06fb45c1, 0x693c, 0x4ea7, 0xb7,0x9f, 0x7a,0x6a,0x54,0xd8,0xde,0xf2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("06fb45c1-693c-4ea7-b79f-7a6a54d8def2")
IFrequencyMap : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_FrequencyMapping(
        ULONG *ulCount,
        ULONG **ppulList) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FrequencyMapping(
        ULONG ulCount,
        ULONG pList[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CountryCode(
        ULONG *pulCountryCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CountryCode(
        ULONG ulCountryCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DefaultFrequencyMapping(
        ULONG ulCountryCode,
        ULONG *pulCount,
        ULONG **ppulList) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CountryCodeList(
        ULONG *pulCount,
        ULONG **ppulList) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFrequencyMap, 0x06fb45c1, 0x693c, 0x4ea7, 0xb7,0x9f, 0x7a,0x6a,0x54,0xd8,0xde,0xf2)
#endif
#else
typedef struct IFrequencyMapVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IFrequencyMap methods ***/
    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IFrequencyMap* This,
        ULONG *ulCount,
        ULONG **ppulList);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IFrequencyMap* This,
        ULONG ulCount,
        ULONG pList[]);

    HRESULT (STDMETHODCALLTYPE *get_CountryCode)(
        IFrequencyMap* This,
        ULONG *pulCountryCode);

    HRESULT (STDMETHODCALLTYPE *put_CountryCode)(
        IFrequencyMap* This,
        ULONG ulCountryCode);

    HRESULT (STDMETHODCALLTYPE *get_DefaultFrequencyMapping)(
        IFrequencyMap* This,
        ULONG ulCountryCode,
        ULONG *pulCount,
        ULONG **ppulList);

    HRESULT (STDMETHODCALLTYPE *get_CountryCodeList)(
        IFrequencyMap* This,
        ULONG *pulCount,
        ULONG **ppulList);

    END_INTERFACE
} IFrequencyMapVtbl;
interface IFrequencyMap {
    CONST_VTBL IFrequencyMapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFrequencyMap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFrequencyMap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFrequencyMap_Release(This) (This)->lpVtbl->Release(This)
/*** IFrequencyMap methods ***/
#define IFrequencyMap_get_FrequencyMapping(This,ulCount,ppulList) (This)->lpVtbl->get_FrequencyMapping(This,ulCount,ppulList)
#define IFrequencyMap_put_FrequencyMapping(This,ulCount,pList) (This)->lpVtbl->put_FrequencyMapping(This,ulCount,pList)
#define IFrequencyMap_get_CountryCode(This,pulCountryCode) (This)->lpVtbl->get_CountryCode(This,pulCountryCode)
#define IFrequencyMap_put_CountryCode(This,ulCountryCode) (This)->lpVtbl->put_CountryCode(This,ulCountryCode)
#define IFrequencyMap_get_DefaultFrequencyMapping(This,ulCountryCode,pulCount,ppulList) (This)->lpVtbl->get_DefaultFrequencyMapping(This,ulCountryCode,pulCount,ppulList)
#define IFrequencyMap_get_CountryCodeList(This,pulCount,ppulList) (This)->lpVtbl->get_CountryCodeList(This,pulCount,ppulList)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFrequencyMap_QueryInterface(IFrequencyMap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFrequencyMap_AddRef(IFrequencyMap* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFrequencyMap_Release(IFrequencyMap* This) {
    return This->lpVtbl->Release(This);
}
/*** IFrequencyMap methods ***/
static FORCEINLINE HRESULT IFrequencyMap_get_FrequencyMapping(IFrequencyMap* This,ULONG *ulCount,ULONG **ppulList) {
    return This->lpVtbl->get_FrequencyMapping(This,ulCount,ppulList);
}
static FORCEINLINE HRESULT IFrequencyMap_put_FrequencyMapping(IFrequencyMap* This,ULONG ulCount,ULONG pList[]) {
    return This->lpVtbl->put_FrequencyMapping(This,ulCount,pList);
}
static FORCEINLINE HRESULT IFrequencyMap_get_CountryCode(IFrequencyMap* This,ULONG *pulCountryCode) {
    return This->lpVtbl->get_CountryCode(This,pulCountryCode);
}
static FORCEINLINE HRESULT IFrequencyMap_put_CountryCode(IFrequencyMap* This,ULONG ulCountryCode) {
    return This->lpVtbl->put_CountryCode(This,ulCountryCode);
}
static FORCEINLINE HRESULT IFrequencyMap_get_DefaultFrequencyMapping(IFrequencyMap* This,ULONG ulCountryCode,ULONG *pulCount,ULONG **ppulList) {
    return This->lpVtbl->get_DefaultFrequencyMapping(This,ulCountryCode,pulCount,ppulList);
}
static FORCEINLINE HRESULT IFrequencyMap_get_CountryCodeList(IFrequencyMap* This,ULONG *pulCount,ULONG **ppulList) {
    return This->lpVtbl->get_CountryCodeList(This,pulCount,ppulList);
}
#endif
#endif

#endif


#endif  /* __IFrequencyMap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_EasMessage interface
 */
#ifndef __IBDA_EasMessage_INTERFACE_DEFINED__
#define __IBDA_EasMessage_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_EasMessage, 0xd806973d, 0x3ebe, 0x46de, 0x8f,0xbb, 0x63,0x58,0xfe,0x78,0x42,0x08);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d806973d-3ebe-46de-8fbb-6358fe784208")
IBDA_EasMessage : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_EasMessage(
        ULONG ulEventID,
        IUnknown **ppEASObject) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_EasMessage, 0xd806973d, 0x3ebe, 0x46de, 0x8f,0xbb, 0x63,0x58,0xfe,0x78,0x42,0x08)
#endif
#else
typedef struct IBDA_EasMessageVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_EasMessage methods ***/
    HRESULT (STDMETHODCALLTYPE *get_EasMessage)(
        IBDA_EasMessage* This,
        ULONG ulEventID,
        IUnknown **ppEASObject);

    END_INTERFACE
} IBDA_EasMessageVtbl;
interface IBDA_EasMessage {
    CONST_VTBL IBDA_EasMessageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_EasMessage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_EasMessage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_EasMessage_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_EasMessage methods ***/
#define IBDA_EasMessage_get_EasMessage(This,ulEventID,ppEASObject) (This)->lpVtbl->get_EasMessage(This,ulEventID,ppEASObject)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_EasMessage_QueryInterface(IBDA_EasMessage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_EasMessage_AddRef(IBDA_EasMessage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_EasMessage_Release(IBDA_EasMessage* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_EasMessage methods ***/
static FORCEINLINE HRESULT IBDA_EasMessage_get_EasMessage(IBDA_EasMessage* This,ULONG ulEventID,IUnknown **ppEASObject) {
    return This->lpVtbl->get_EasMessage(This,ulEventID,ppEASObject);
}
#endif
#endif

#endif


#endif  /* __IBDA_EasMessage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_TransportStreamInfo interface
 */
#ifndef __IBDA_TransportStreamInfo_INTERFACE_DEFINED__
#define __IBDA_TransportStreamInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_TransportStreamInfo, 0x8e882535, 0x5f86, 0x47ab, 0x86,0xcf, 0xc2,0x81,0xa7,0x2a,0x05,0x49);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8e882535-5f86-47ab-86cf-c281a72a0549")
IBDA_TransportStreamInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_PatTableTickCount(
        ULONG *pPatTickCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_TransportStreamInfo, 0x8e882535, 0x5f86, 0x47ab, 0x86,0xcf, 0xc2,0x81,0xa7,0x2a,0x05,0x49)
#endif
#else
typedef struct IBDA_TransportStreamInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_TransportStreamInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PatTableTickCount)(
        IBDA_TransportStreamInfo* This,
        ULONG *pPatTickCount);

    END_INTERFACE
} IBDA_TransportStreamInfoVtbl;
interface IBDA_TransportStreamInfo {
    CONST_VTBL IBDA_TransportStreamInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_TransportStreamInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_TransportStreamInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_TransportStreamInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_TransportStreamInfo methods ***/
#define IBDA_TransportStreamInfo_get_PatTableTickCount(This,pPatTickCount) (This)->lpVtbl->get_PatTableTickCount(This,pPatTickCount)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_TransportStreamInfo_QueryInterface(IBDA_TransportStreamInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_TransportStreamInfo_AddRef(IBDA_TransportStreamInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_TransportStreamInfo_Release(IBDA_TransportStreamInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_TransportStreamInfo methods ***/
static FORCEINLINE HRESULT IBDA_TransportStreamInfo_get_PatTableTickCount(IBDA_TransportStreamInfo* This,ULONG *pPatTickCount) {
    return This->lpVtbl->get_PatTableTickCount(This,pPatTickCount);
}
#endif
#endif

#endif


#endif  /* __IBDA_TransportStreamInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_ConditionalAccess interface
 */
#ifndef __IBDA_ConditionalAccess_INTERFACE_DEFINED__
#define __IBDA_ConditionalAccess_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_ConditionalAccess, 0xcd51f1e0, 0x7be9, 0x4123, 0x84,0x82, 0xa2,0xa7,0x96,0xc0,0xa6,0xb0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cd51f1e0-7be9-4123-8482-a2a796c0a6b0")
IBDA_ConditionalAccess : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_SmartCardStatus(
        SmartCardStatusType *pCardStatus,
        SmartCardAssociationType *pCardAssociation,
        BSTR *pbstrCardError,
        VARIANT_BOOL *pfOOBLocked) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SmartCardInfo(
        BSTR *pbstrCardName,
        BSTR *pbstrCardManufacturer,
        VARIANT_BOOL *pfDaylightSavings,
        BYTE *pbyRatingRegion,
        LONG *plTimeZoneOffsetMinutes,
        BSTR *pbstrLanguage,
        EALocationCodeType *pEALocationCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SmartCardApplications(
        ULONG *pulcApplications,
        ULONG ulcApplicationsMax,
        SmartCardApplication rgApplications[]) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Entitlement(
        USHORT usVirtualChannel,
        EntitlementType *pEntitlement) = 0;

    virtual HRESULT STDMETHODCALLTYPE TuneByChannel(
        USHORT usVirtualChannel) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProgram(
        USHORT usProgramNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddProgram(
        USHORT usProgramNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveProgram(
        USHORT usProgramNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetModuleUI(
        BYTE byDialogNumber,
        BSTR *pbstrURL) = 0;

    virtual HRESULT STDMETHODCALLTYPE InformUIClosed(
        BYTE byDialogNumber,
        UICloseReasonType CloseReason) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_ConditionalAccess, 0xcd51f1e0, 0x7be9, 0x4123, 0x84,0x82, 0xa2,0xa7,0x96,0xc0,0xa6,0xb0)
#endif
#else
typedef struct IBDA_ConditionalAccessVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_ConditionalAccess methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SmartCardStatus)(
        IBDA_ConditionalAccess* This,
        SmartCardStatusType *pCardStatus,
        SmartCardAssociationType *pCardAssociation,
        BSTR *pbstrCardError,
        VARIANT_BOOL *pfOOBLocked);

    HRESULT (STDMETHODCALLTYPE *get_SmartCardInfo)(
        IBDA_ConditionalAccess* This,
        BSTR *pbstrCardName,
        BSTR *pbstrCardManufacturer,
        VARIANT_BOOL *pfDaylightSavings,
        BYTE *pbyRatingRegion,
        LONG *plTimeZoneOffsetMinutes,
        BSTR *pbstrLanguage,
        EALocationCodeType *pEALocationCode);

    HRESULT (STDMETHODCALLTYPE *get_SmartCardApplications)(
        IBDA_ConditionalAccess* This,
        ULONG *pulcApplications,
        ULONG ulcApplicationsMax,
        SmartCardApplication rgApplications[]);

    HRESULT (STDMETHODCALLTYPE *get_Entitlement)(
        IBDA_ConditionalAccess* This,
        USHORT usVirtualChannel,
        EntitlementType *pEntitlement);

    HRESULT (STDMETHODCALLTYPE *TuneByChannel)(
        IBDA_ConditionalAccess* This,
        USHORT usVirtualChannel);

    HRESULT (STDMETHODCALLTYPE *SetProgram)(
        IBDA_ConditionalAccess* This,
        USHORT usProgramNumber);

    HRESULT (STDMETHODCALLTYPE *AddProgram)(
        IBDA_ConditionalAccess* This,
        USHORT usProgramNumber);

    HRESULT (STDMETHODCALLTYPE *RemoveProgram)(
        IBDA_ConditionalAccess* This,
        USHORT usProgramNumber);

    HRESULT (STDMETHODCALLTYPE *GetModuleUI)(
        IBDA_ConditionalAccess* This,
        BYTE byDialogNumber,
        BSTR *pbstrURL);

    HRESULT (STDMETHODCALLTYPE *InformUIClosed)(
        IBDA_ConditionalAccess* This,
        BYTE byDialogNumber,
        UICloseReasonType CloseReason);

    END_INTERFACE
} IBDA_ConditionalAccessVtbl;
interface IBDA_ConditionalAccess {
    CONST_VTBL IBDA_ConditionalAccessVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_ConditionalAccess_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_ConditionalAccess_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_ConditionalAccess_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_ConditionalAccess methods ***/
#define IBDA_ConditionalAccess_get_SmartCardStatus(This,pCardStatus,pCardAssociation,pbstrCardError,pfOOBLocked) (This)->lpVtbl->get_SmartCardStatus(This,pCardStatus,pCardAssociation,pbstrCardError,pfOOBLocked)
#define IBDA_ConditionalAccess_get_SmartCardInfo(This,pbstrCardName,pbstrCardManufacturer,pfDaylightSavings,pbyRatingRegion,plTimeZoneOffsetMinutes,pbstrLanguage,pEALocationCode) (This)->lpVtbl->get_SmartCardInfo(This,pbstrCardName,pbstrCardManufacturer,pfDaylightSavings,pbyRatingRegion,plTimeZoneOffsetMinutes,pbstrLanguage,pEALocationCode)
#define IBDA_ConditionalAccess_get_SmartCardApplications(This,pulcApplications,ulcApplicationsMax,rgApplications) (This)->lpVtbl->get_SmartCardApplications(This,pulcApplications,ulcApplicationsMax,rgApplications)
#define IBDA_ConditionalAccess_get_Entitlement(This,usVirtualChannel,pEntitlement) (This)->lpVtbl->get_Entitlement(This,usVirtualChannel,pEntitlement)
#define IBDA_ConditionalAccess_TuneByChannel(This,usVirtualChannel) (This)->lpVtbl->TuneByChannel(This,usVirtualChannel)
#define IBDA_ConditionalAccess_SetProgram(This,usProgramNumber) (This)->lpVtbl->SetProgram(This,usProgramNumber)
#define IBDA_ConditionalAccess_AddProgram(This,usProgramNumber) (This)->lpVtbl->AddProgram(This,usProgramNumber)
#define IBDA_ConditionalAccess_RemoveProgram(This,usProgramNumber) (This)->lpVtbl->RemoveProgram(This,usProgramNumber)
#define IBDA_ConditionalAccess_GetModuleUI(This,byDialogNumber,pbstrURL) (This)->lpVtbl->GetModuleUI(This,byDialogNumber,pbstrURL)
#define IBDA_ConditionalAccess_InformUIClosed(This,byDialogNumber,CloseReason) (This)->lpVtbl->InformUIClosed(This,byDialogNumber,CloseReason)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_ConditionalAccess_QueryInterface(IBDA_ConditionalAccess* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_ConditionalAccess_AddRef(IBDA_ConditionalAccess* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_ConditionalAccess_Release(IBDA_ConditionalAccess* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_ConditionalAccess methods ***/
static FORCEINLINE HRESULT IBDA_ConditionalAccess_get_SmartCardStatus(IBDA_ConditionalAccess* This,SmartCardStatusType *pCardStatus,SmartCardAssociationType *pCardAssociation,BSTR *pbstrCardError,VARIANT_BOOL *pfOOBLocked) {
    return This->lpVtbl->get_SmartCardStatus(This,pCardStatus,pCardAssociation,pbstrCardError,pfOOBLocked);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccess_get_SmartCardInfo(IBDA_ConditionalAccess* This,BSTR *pbstrCardName,BSTR *pbstrCardManufacturer,VARIANT_BOOL *pfDaylightSavings,BYTE *pbyRatingRegion,LONG *plTimeZoneOffsetMinutes,BSTR *pbstrLanguage,EALocationCodeType *pEALocationCode) {
    return This->lpVtbl->get_SmartCardInfo(This,pbstrCardName,pbstrCardManufacturer,pfDaylightSavings,pbyRatingRegion,plTimeZoneOffsetMinutes,pbstrLanguage,pEALocationCode);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccess_get_SmartCardApplications(IBDA_ConditionalAccess* This,ULONG *pulcApplications,ULONG ulcApplicationsMax,SmartCardApplication rgApplications[]) {
    return This->lpVtbl->get_SmartCardApplications(This,pulcApplications,ulcApplicationsMax,rgApplications);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccess_get_Entitlement(IBDA_ConditionalAccess* This,USHORT usVirtualChannel,EntitlementType *pEntitlement) {
    return This->lpVtbl->get_Entitlement(This,usVirtualChannel,pEntitlement);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccess_TuneByChannel(IBDA_ConditionalAccess* This,USHORT usVirtualChannel) {
    return This->lpVtbl->TuneByChannel(This,usVirtualChannel);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccess_SetProgram(IBDA_ConditionalAccess* This,USHORT usProgramNumber) {
    return This->lpVtbl->SetProgram(This,usProgramNumber);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccess_AddProgram(IBDA_ConditionalAccess* This,USHORT usProgramNumber) {
    return This->lpVtbl->AddProgram(This,usProgramNumber);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccess_RemoveProgram(IBDA_ConditionalAccess* This,USHORT usProgramNumber) {
    return This->lpVtbl->RemoveProgram(This,usProgramNumber);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccess_GetModuleUI(IBDA_ConditionalAccess* This,BYTE byDialogNumber,BSTR *pbstrURL) {
    return This->lpVtbl->GetModuleUI(This,byDialogNumber,pbstrURL);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccess_InformUIClosed(IBDA_ConditionalAccess* This,BYTE byDialogNumber,UICloseReasonType CloseReason) {
    return This->lpVtbl->InformUIClosed(This,byDialogNumber,CloseReason);
}
#endif
#endif

#endif


#endif  /* __IBDA_ConditionalAccess_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_DiagnosticProperties interface
 */
#ifndef __IBDA_DiagnosticProperties_INTERFACE_DEFINED__
#define __IBDA_DiagnosticProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_DiagnosticProperties, 0x20e80cb5, 0xc543, 0x4c1b, 0x8e,0xb3, 0x49,0xe7,0x19,0xee,0xe7,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("20e80cb5-c543-4c1b-8eb3-49e719eee7d4")
IBDA_DiagnosticProperties : public IPropertyBag
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_DiagnosticProperties, 0x20e80cb5, 0xc543, 0x4c1b, 0x8e,0xb3, 0x49,0xe7,0x19,0xee,0xe7,0xd4)
#endif
#else
typedef struct IBDA_DiagnosticPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IPropertyBag methods ***/
    HRESULT (STDMETHODCALLTYPE *Read)(
        IBDA_DiagnosticProperties* This,
        LPCOLESTR pszPropName,
        VARIANT *pVar,
        IErrorLog *pErrorLog);

    HRESULT (STDMETHODCALLTYPE *Write)(
        IBDA_DiagnosticProperties* This,
        LPCOLESTR pszPropName,
        VARIANT *pVar);

    END_INTERFACE
} IBDA_DiagnosticPropertiesVtbl;
interface IBDA_DiagnosticProperties {
    CONST_VTBL IBDA_DiagnosticPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_DiagnosticProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_DiagnosticProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_DiagnosticProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IPropertyBag methods ***/
#define IBDA_DiagnosticProperties_Read(This,pszPropName,pVar,pErrorLog) (This)->lpVtbl->Read(This,pszPropName,pVar,pErrorLog)
#define IBDA_DiagnosticProperties_Write(This,pszPropName,pVar) (This)->lpVtbl->Write(This,pszPropName,pVar)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_DiagnosticProperties_QueryInterface(IBDA_DiagnosticProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_DiagnosticProperties_AddRef(IBDA_DiagnosticProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_DiagnosticProperties_Release(IBDA_DiagnosticProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IPropertyBag methods ***/
static FORCEINLINE HRESULT IBDA_DiagnosticProperties_Read(IBDA_DiagnosticProperties* This,LPCOLESTR pszPropName,VARIANT *pVar,IErrorLog *pErrorLog) {
    return This->lpVtbl->Read(This,pszPropName,pVar,pErrorLog);
}
static FORCEINLINE HRESULT IBDA_DiagnosticProperties_Write(IBDA_DiagnosticProperties* This,LPCOLESTR pszPropName,VARIANT *pVar) {
    return This->lpVtbl->Write(This,pszPropName,pVar);
}
#endif
#endif

#endif


#endif  /* __IBDA_DiagnosticProperties_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_DRM interface
 */
#ifndef __IBDA_DRM_INTERFACE_DEFINED__
#define __IBDA_DRM_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_DRM, 0xf98d88b0, 0x1992, 0x4cd6, 0xa6,0xd9, 0xb9,0xaf,0xab,0x99,0x33,0x0d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f98d88b0-1992-4cd6-a6d9-b9afab99330d")
IBDA_DRM : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDRMPairingStatus(
        DWORD *pdwStatus,
        HRESULT *phError) = 0;

    virtual HRESULT STDMETHODCALLTYPE PerformDRMPairing(
        WINBOOL fSync) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_DRM, 0xf98d88b0, 0x1992, 0x4cd6, 0xa6,0xd9, 0xb9,0xaf,0xab,0x99,0x33,0x0d)
#endif
#else
typedef struct IBDA_DRMVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_DRM methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDRMPairingStatus)(
        IBDA_DRM* This,
        DWORD *pdwStatus,
        HRESULT *phError);

    HRESULT (STDMETHODCALLTYPE *PerformDRMPairing)(
        IBDA_DRM* This,
        WINBOOL fSync);

    END_INTERFACE
} IBDA_DRMVtbl;
interface IBDA_DRM {
    CONST_VTBL IBDA_DRMVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_DRM_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_DRM_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_DRM_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_DRM methods ***/
#define IBDA_DRM_GetDRMPairingStatus(This,pdwStatus,phError) (This)->lpVtbl->GetDRMPairingStatus(This,pdwStatus,phError)
#define IBDA_DRM_PerformDRMPairing(This,fSync) (This)->lpVtbl->PerformDRMPairing(This,fSync)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_DRM_QueryInterface(IBDA_DRM* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_DRM_AddRef(IBDA_DRM* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_DRM_Release(IBDA_DRM* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_DRM methods ***/
static FORCEINLINE HRESULT IBDA_DRM_GetDRMPairingStatus(IBDA_DRM* This,DWORD *pdwStatus,HRESULT *phError) {
    return This->lpVtbl->GetDRMPairingStatus(This,pdwStatus,phError);
}
static FORCEINLINE HRESULT IBDA_DRM_PerformDRMPairing(IBDA_DRM* This,WINBOOL fSync) {
    return This->lpVtbl->PerformDRMPairing(This,fSync);
}
#endif
#endif

#endif


#endif  /* __IBDA_DRM_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_NameValueService interface
 */
#ifndef __IBDA_NameValueService_INTERFACE_DEFINED__
#define __IBDA_NameValueService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_NameValueService, 0x7f0b3150, 0x7b81, 0x4ad4, 0x98,0xe3, 0x7e,0x90,0x97,0x09,0x43,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7f0b3150-7b81-4ad4-98e3-7e9097094301")
IBDA_NameValueService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetValueNameByIndex(
        ULONG ulIndex,
        BSTR *pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetValue(
        BSTR bstrName,
        BSTR bstrLanguage,
        BSTR *pbstrValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetValue(
        ULONG ulDialogRequest,
        BSTR bstrLanguage,
        BSTR bstrName,
        BSTR bstrValue,
        ULONG ulReserved) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_NameValueService, 0x7f0b3150, 0x7b81, 0x4ad4, 0x98,0xe3, 0x7e,0x90,0x97,0x09,0x43,0x01)
#endif
#else
typedef struct IBDA_NameValueServiceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_NameValueService methods ***/
    HRESULT (STDMETHODCALLTYPE *GetValueNameByIndex)(
        IBDA_NameValueService* This,
        ULONG ulIndex,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetValue)(
        IBDA_NameValueService* This,
        BSTR bstrName,
        BSTR bstrLanguage,
        BSTR *pbstrValue);

    HRESULT (STDMETHODCALLTYPE *SetValue)(
        IBDA_NameValueService* This,
        ULONG ulDialogRequest,
        BSTR bstrLanguage,
        BSTR bstrName,
        BSTR bstrValue,
        ULONG ulReserved);

    END_INTERFACE
} IBDA_NameValueServiceVtbl;
interface IBDA_NameValueService {
    CONST_VTBL IBDA_NameValueServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_NameValueService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_NameValueService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_NameValueService_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_NameValueService methods ***/
#define IBDA_NameValueService_GetValueNameByIndex(This,ulIndex,pbstrName) (This)->lpVtbl->GetValueNameByIndex(This,ulIndex,pbstrName)
#define IBDA_NameValueService_GetValue(This,bstrName,bstrLanguage,pbstrValue) (This)->lpVtbl->GetValue(This,bstrName,bstrLanguage,pbstrValue)
#define IBDA_NameValueService_SetValue(This,ulDialogRequest,bstrLanguage,bstrName,bstrValue,ulReserved) (This)->lpVtbl->SetValue(This,ulDialogRequest,bstrLanguage,bstrName,bstrValue,ulReserved)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_NameValueService_QueryInterface(IBDA_NameValueService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_NameValueService_AddRef(IBDA_NameValueService* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_NameValueService_Release(IBDA_NameValueService* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_NameValueService methods ***/
static FORCEINLINE HRESULT IBDA_NameValueService_GetValueNameByIndex(IBDA_NameValueService* This,ULONG ulIndex,BSTR *pbstrName) {
    return This->lpVtbl->GetValueNameByIndex(This,ulIndex,pbstrName);
}
static FORCEINLINE HRESULT IBDA_NameValueService_GetValue(IBDA_NameValueService* This,BSTR bstrName,BSTR bstrLanguage,BSTR *pbstrValue) {
    return This->lpVtbl->GetValue(This,bstrName,bstrLanguage,pbstrValue);
}
static FORCEINLINE HRESULT IBDA_NameValueService_SetValue(IBDA_NameValueService* This,ULONG ulDialogRequest,BSTR bstrLanguage,BSTR bstrName,BSTR bstrValue,ULONG ulReserved) {
    return This->lpVtbl->SetValue(This,ulDialogRequest,bstrLanguage,bstrName,bstrValue,ulReserved);
}
#endif
#endif

#endif


#endif  /* __IBDA_NameValueService_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_ConditionalAccessEx interface
 */
#ifndef __IBDA_ConditionalAccessEx_INTERFACE_DEFINED__
#define __IBDA_ConditionalAccessEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_ConditionalAccessEx, 0x497c3418, 0x23cb, 0x44ba, 0xbb,0x62, 0x76,0x9f,0x50,0x6f,0xce,0xa7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("497c3418-23cb-44ba-bb62-769f506fcea7")
IBDA_ConditionalAccessEx : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CheckEntitlementToken(
        ULONG ulDialogRequest,
        BSTR bstrLanguage,
        BDA_CONDITIONALACCESS_REQUESTTYPE RequestType,
        ULONG ulcbEntitlementTokenLen,
        BYTE *pbEntitlementToken,
        ULONG *pulDescrambleStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCaptureToken(
        ULONG ulcbCaptureTokenLen,
        BYTE *pbCaptureToken) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenBroadcastMmi(
        ULONG ulDialogRequest,
        BSTR bstrLanguage,
        ULONG EventId) = 0;

    virtual HRESULT STDMETHODCALLTYPE CloseMmiDialog(
        ULONG ulDialogRequest,
        BSTR bstrLanguage,
        ULONG ulDialogNumber,
        BDA_CONDITIONALACCESS_MMICLOSEREASON ReasonCode,
        ULONG *pulSessionResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDialogRequestNumber(
        ULONG *pulDialogRequestNumber) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_ConditionalAccessEx, 0x497c3418, 0x23cb, 0x44ba, 0xbb,0x62, 0x76,0x9f,0x50,0x6f,0xce,0xa7)
#endif
#else
typedef struct IBDA_ConditionalAccessExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_ConditionalAccessEx methods ***/
    HRESULT (STDMETHODCALLTYPE *CheckEntitlementToken)(
        IBDA_ConditionalAccessEx* This,
        ULONG ulDialogRequest,
        BSTR bstrLanguage,
        BDA_CONDITIONALACCESS_REQUESTTYPE RequestType,
        ULONG ulcbEntitlementTokenLen,
        BYTE *pbEntitlementToken,
        ULONG *pulDescrambleStatus);

    HRESULT (STDMETHODCALLTYPE *SetCaptureToken)(
        IBDA_ConditionalAccessEx* This,
        ULONG ulcbCaptureTokenLen,
        BYTE *pbCaptureToken);

    HRESULT (STDMETHODCALLTYPE *OpenBroadcastMmi)(
        IBDA_ConditionalAccessEx* This,
        ULONG ulDialogRequest,
        BSTR bstrLanguage,
        ULONG EventId);

    HRESULT (STDMETHODCALLTYPE *CloseMmiDialog)(
        IBDA_ConditionalAccessEx* This,
        ULONG ulDialogRequest,
        BSTR bstrLanguage,
        ULONG ulDialogNumber,
        BDA_CONDITIONALACCESS_MMICLOSEREASON ReasonCode,
        ULONG *pulSessionResult);

    HRESULT (STDMETHODCALLTYPE *CreateDialogRequestNumber)(
        IBDA_ConditionalAccessEx* This,
        ULONG *pulDialogRequestNumber);

    END_INTERFACE
} IBDA_ConditionalAccessExVtbl;
interface IBDA_ConditionalAccessEx {
    CONST_VTBL IBDA_ConditionalAccessExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_ConditionalAccessEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_ConditionalAccessEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_ConditionalAccessEx_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_ConditionalAccessEx methods ***/
#define IBDA_ConditionalAccessEx_CheckEntitlementToken(This,ulDialogRequest,bstrLanguage,RequestType,ulcbEntitlementTokenLen,pbEntitlementToken,pulDescrambleStatus) (This)->lpVtbl->CheckEntitlementToken(This,ulDialogRequest,bstrLanguage,RequestType,ulcbEntitlementTokenLen,pbEntitlementToken,pulDescrambleStatus)
#define IBDA_ConditionalAccessEx_SetCaptureToken(This,ulcbCaptureTokenLen,pbCaptureToken) (This)->lpVtbl->SetCaptureToken(This,ulcbCaptureTokenLen,pbCaptureToken)
#define IBDA_ConditionalAccessEx_OpenBroadcastMmi(This,ulDialogRequest,bstrLanguage,EventId) (This)->lpVtbl->OpenBroadcastMmi(This,ulDialogRequest,bstrLanguage,EventId)
#define IBDA_ConditionalAccessEx_CloseMmiDialog(This,ulDialogRequest,bstrLanguage,ulDialogNumber,ReasonCode,pulSessionResult) (This)->lpVtbl->CloseMmiDialog(This,ulDialogRequest,bstrLanguage,ulDialogNumber,ReasonCode,pulSessionResult)
#define IBDA_ConditionalAccessEx_CreateDialogRequestNumber(This,pulDialogRequestNumber) (This)->lpVtbl->CreateDialogRequestNumber(This,pulDialogRequestNumber)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_ConditionalAccessEx_QueryInterface(IBDA_ConditionalAccessEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_ConditionalAccessEx_AddRef(IBDA_ConditionalAccessEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_ConditionalAccessEx_Release(IBDA_ConditionalAccessEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_ConditionalAccessEx methods ***/
static FORCEINLINE HRESULT IBDA_ConditionalAccessEx_CheckEntitlementToken(IBDA_ConditionalAccessEx* This,ULONG ulDialogRequest,BSTR bstrLanguage,BDA_CONDITIONALACCESS_REQUESTTYPE RequestType,ULONG ulcbEntitlementTokenLen,BYTE *pbEntitlementToken,ULONG *pulDescrambleStatus) {
    return This->lpVtbl->CheckEntitlementToken(This,ulDialogRequest,bstrLanguage,RequestType,ulcbEntitlementTokenLen,pbEntitlementToken,pulDescrambleStatus);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccessEx_SetCaptureToken(IBDA_ConditionalAccessEx* This,ULONG ulcbCaptureTokenLen,BYTE *pbCaptureToken) {
    return This->lpVtbl->SetCaptureToken(This,ulcbCaptureTokenLen,pbCaptureToken);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccessEx_OpenBroadcastMmi(IBDA_ConditionalAccessEx* This,ULONG ulDialogRequest,BSTR bstrLanguage,ULONG EventId) {
    return This->lpVtbl->OpenBroadcastMmi(This,ulDialogRequest,bstrLanguage,EventId);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccessEx_CloseMmiDialog(IBDA_ConditionalAccessEx* This,ULONG ulDialogRequest,BSTR bstrLanguage,ULONG ulDialogNumber,BDA_CONDITIONALACCESS_MMICLOSEREASON ReasonCode,ULONG *pulSessionResult) {
    return This->lpVtbl->CloseMmiDialog(This,ulDialogRequest,bstrLanguage,ulDialogNumber,ReasonCode,pulSessionResult);
}
static FORCEINLINE HRESULT IBDA_ConditionalAccessEx_CreateDialogRequestNumber(IBDA_ConditionalAccessEx* This,ULONG *pulDialogRequestNumber) {
    return This->lpVtbl->CreateDialogRequestNumber(This,pulDialogRequestNumber);
}
#endif
#endif

#endif


#endif  /* __IBDA_ConditionalAccessEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_ISDBConditionalAccess interface
 */
#ifndef __IBDA_ISDBConditionalAccess_INTERFACE_DEFINED__
#define __IBDA_ISDBConditionalAccess_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_ISDBConditionalAccess, 0x5e68c627, 0x16c2, 0x4e6c, 0xb1,0xe2, 0xd0,0x01,0x70,0xcd,0xaa,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5e68c627-16c2-4e6c-b1e2-d00170cdaa0f")
IBDA_ISDBConditionalAccess : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetIsdbCasRequest(
        ULONG ulRequestId,
        ULONG ulcbRequestBufferLen,
        BYTE *pbRequestBuffer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_ISDBConditionalAccess, 0x5e68c627, 0x16c2, 0x4e6c, 0xb1,0xe2, 0xd0,0x01,0x70,0xcd,0xaa,0x0f)
#endif
#else
typedef struct IBDA_ISDBConditionalAccessVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_ISDBConditionalAccess methods ***/
    HRESULT (STDMETHODCALLTYPE *SetIsdbCasRequest)(
        IBDA_ISDBConditionalAccess* This,
        ULONG ulRequestId,
        ULONG ulcbRequestBufferLen,
        BYTE *pbRequestBuffer);

    END_INTERFACE
} IBDA_ISDBConditionalAccessVtbl;
interface IBDA_ISDBConditionalAccess {
    CONST_VTBL IBDA_ISDBConditionalAccessVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_ISDBConditionalAccess_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_ISDBConditionalAccess_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_ISDBConditionalAccess_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_ISDBConditionalAccess methods ***/
#define IBDA_ISDBConditionalAccess_SetIsdbCasRequest(This,ulRequestId,ulcbRequestBufferLen,pbRequestBuffer) (This)->lpVtbl->SetIsdbCasRequest(This,ulRequestId,ulcbRequestBufferLen,pbRequestBuffer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_ISDBConditionalAccess_QueryInterface(IBDA_ISDBConditionalAccess* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_ISDBConditionalAccess_AddRef(IBDA_ISDBConditionalAccess* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_ISDBConditionalAccess_Release(IBDA_ISDBConditionalAccess* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_ISDBConditionalAccess methods ***/
static FORCEINLINE HRESULT IBDA_ISDBConditionalAccess_SetIsdbCasRequest(IBDA_ISDBConditionalAccess* This,ULONG ulRequestId,ULONG ulcbRequestBufferLen,BYTE *pbRequestBuffer) {
    return This->lpVtbl->SetIsdbCasRequest(This,ulRequestId,ulcbRequestBufferLen,pbRequestBuffer);
}
#endif
#endif

#endif


#endif  /* __IBDA_ISDBConditionalAccess_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_EventingService interface
 */
#ifndef __IBDA_EventingService_INTERFACE_DEFINED__
#define __IBDA_EventingService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_EventingService, 0x207c413f, 0x00dc, 0x4c61, 0xba,0xd6, 0x6f,0xee,0x1f,0xf0,0x70,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("207c413f-00dc-4c61-bad6-6fee1ff07064")
IBDA_EventingService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CompleteEvent(
        ULONG ulEventID,
        ULONG ulEventResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_EventingService, 0x207c413f, 0x00dc, 0x4c61, 0xba,0xd6, 0x6f,0xee,0x1f,0xf0,0x70,0x64)
#endif
#else
typedef struct IBDA_EventingServiceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_EventingService methods ***/
    HRESULT (STDMETHODCALLTYPE *CompleteEvent)(
        IBDA_EventingService* This,
        ULONG ulEventID,
        ULONG ulEventResult);

    END_INTERFACE
} IBDA_EventingServiceVtbl;
interface IBDA_EventingService {
    CONST_VTBL IBDA_EventingServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_EventingService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_EventingService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_EventingService_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_EventingService methods ***/
#define IBDA_EventingService_CompleteEvent(This,ulEventID,ulEventResult) (This)->lpVtbl->CompleteEvent(This,ulEventID,ulEventResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_EventingService_QueryInterface(IBDA_EventingService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_EventingService_AddRef(IBDA_EventingService* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_EventingService_Release(IBDA_EventingService* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_EventingService methods ***/
static FORCEINLINE HRESULT IBDA_EventingService_CompleteEvent(IBDA_EventingService* This,ULONG ulEventID,ULONG ulEventResult) {
    return This->lpVtbl->CompleteEvent(This,ulEventID,ulEventResult);
}
#endif
#endif

#endif


#endif  /* __IBDA_EventingService_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_AUX interface
 */
#ifndef __IBDA_AUX_INTERFACE_DEFINED__
#define __IBDA_AUX_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_AUX, 0x7def4c09, 0x6e66, 0x4567, 0xa8,0x19, 0xf0,0xe1,0x7f,0x4a,0x81,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7def4c09-6e66-4567-a819-f0e17f4a81ab")
IBDA_AUX : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryCapabilities(
        DWORD *pdwNumAuxInputsBSTR) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumCapability(
        DWORD dwIndex,
        DWORD *dwInputID,
        GUID *pConnectorType,
        DWORD *ConnTypeNum,
        DWORD *NumVideoStds,
        ULONGLONG *AnalogStds) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_AUX, 0x7def4c09, 0x6e66, 0x4567, 0xa8,0x19, 0xf0,0xe1,0x7f,0x4a,0x81,0xab)
#endif
#else
typedef struct IBDA_AUXVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_AUX methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryCapabilities)(
        IBDA_AUX* This,
        DWORD *pdwNumAuxInputsBSTR);

    HRESULT (STDMETHODCALLTYPE *EnumCapability)(
        IBDA_AUX* This,
        DWORD dwIndex,
        DWORD *dwInputID,
        GUID *pConnectorType,
        DWORD *ConnTypeNum,
        DWORD *NumVideoStds,
        ULONGLONG *AnalogStds);

    END_INTERFACE
} IBDA_AUXVtbl;
interface IBDA_AUX {
    CONST_VTBL IBDA_AUXVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_AUX_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_AUX_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_AUX_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_AUX methods ***/
#define IBDA_AUX_QueryCapabilities(This,pdwNumAuxInputsBSTR) (This)->lpVtbl->QueryCapabilities(This,pdwNumAuxInputsBSTR)
#define IBDA_AUX_EnumCapability(This,dwIndex,dwInputID,pConnectorType,ConnTypeNum,NumVideoStds,AnalogStds) (This)->lpVtbl->EnumCapability(This,dwIndex,dwInputID,pConnectorType,ConnTypeNum,NumVideoStds,AnalogStds)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_AUX_QueryInterface(IBDA_AUX* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_AUX_AddRef(IBDA_AUX* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_AUX_Release(IBDA_AUX* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_AUX methods ***/
static FORCEINLINE HRESULT IBDA_AUX_QueryCapabilities(IBDA_AUX* This,DWORD *pdwNumAuxInputsBSTR) {
    return This->lpVtbl->QueryCapabilities(This,pdwNumAuxInputsBSTR);
}
static FORCEINLINE HRESULT IBDA_AUX_EnumCapability(IBDA_AUX* This,DWORD dwIndex,DWORD *dwInputID,GUID *pConnectorType,DWORD *ConnTypeNum,DWORD *NumVideoStds,ULONGLONG *AnalogStds) {
    return This->lpVtbl->EnumCapability(This,dwIndex,dwInputID,pConnectorType,ConnTypeNum,NumVideoStds,AnalogStds);
}
#endif
#endif

#endif


#endif  /* __IBDA_AUX_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_Encoder interface
 */
#ifndef __IBDA_Encoder_INTERFACE_DEFINED__
#define __IBDA_Encoder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_Encoder, 0x3a8bad59, 0x59fe, 0x4559, 0xa0,0xba, 0x39,0x6c,0xfa,0xa9,0x8a,0xe3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3a8bad59-59fe-4559-a0ba-396cfaa98ae3")
IBDA_Encoder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryCapabilities(
        DWORD *NumAudioFmts,
        DWORD *NumVideoFmts) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumAudioCapability(
        DWORD FmtIndex,
        DWORD *MethodID,
        DWORD *AlgorithmType,
        DWORD *SamplingRate,
        DWORD *BitDepth,
        DWORD *NumChannels) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumVideoCapability(
        DWORD FmtIndex,
        DWORD *MethodID,
        DWORD *AlgorithmType,
        DWORD *VerticalSize,
        DWORD *HorizontalSize,
        DWORD *AspectRatio,
        DWORD *FrameRateCode,
        DWORD *ProgressiveSequence) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetParameters(
        DWORD AudioBitrateMode,
        DWORD AudioBitrate,
        DWORD AudioMethodID,
        DWORD AudioProgram,
        DWORD VideoBitrateMode,
        DWORD VideoBitrate,
        DWORD VideoMethodID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetState(
        DWORD *AudioBitrateMax,
        DWORD *AudioBitrateMin,
        DWORD *AudioBitrateMode,
        DWORD *AudioBitrateStepping,
        DWORD *AudioBitrate,
        DWORD *AudioMethodID,
        DWORD *AvailableAudioPrograms,
        DWORD *AudioProgram,
        DWORD *VideoBitrateMax,
        DWORD *VideoBitrateMin,
        DWORD *VideoBitrateMode,
        DWORD *VideoBitrate,
        DWORD *VideoBitrateStepping,
        DWORD *VideoMethodID,
        DWORD *SignalSourceID,
        ULONGLONG *SignalFormat,
        WINBOOL *SignalLock,
        LONG *SignalLevel,
        DWORD *SignalToNoiseRatio) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_Encoder, 0x3a8bad59, 0x59fe, 0x4559, 0xa0,0xba, 0x39,0x6c,0xfa,0xa9,0x8a,0xe3)
#endif
#else
typedef struct IBDA_EncoderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_Encoder methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryCapabilities)(
        IBDA_Encoder* This,
        DWORD *NumAudioFmts,
        DWORD *NumVideoFmts);

    HRESULT (STDMETHODCALLTYPE *EnumAudioCapability)(
        IBDA_Encoder* This,
        DWORD FmtIndex,
        DWORD *MethodID,
        DWORD *AlgorithmType,
        DWORD *SamplingRate,
        DWORD *BitDepth,
        DWORD *NumChannels);

    HRESULT (STDMETHODCALLTYPE *EnumVideoCapability)(
        IBDA_Encoder* This,
        DWORD FmtIndex,
        DWORD *MethodID,
        DWORD *AlgorithmType,
        DWORD *VerticalSize,
        DWORD *HorizontalSize,
        DWORD *AspectRatio,
        DWORD *FrameRateCode,
        DWORD *ProgressiveSequence);

    HRESULT (STDMETHODCALLTYPE *SetParameters)(
        IBDA_Encoder* This,
        DWORD AudioBitrateMode,
        DWORD AudioBitrate,
        DWORD AudioMethodID,
        DWORD AudioProgram,
        DWORD VideoBitrateMode,
        DWORD VideoBitrate,
        DWORD VideoMethodID);

    HRESULT (STDMETHODCALLTYPE *GetState)(
        IBDA_Encoder* This,
        DWORD *AudioBitrateMax,
        DWORD *AudioBitrateMin,
        DWORD *AudioBitrateMode,
        DWORD *AudioBitrateStepping,
        DWORD *AudioBitrate,
        DWORD *AudioMethodID,
        DWORD *AvailableAudioPrograms,
        DWORD *AudioProgram,
        DWORD *VideoBitrateMax,
        DWORD *VideoBitrateMin,
        DWORD *VideoBitrateMode,
        DWORD *VideoBitrate,
        DWORD *VideoBitrateStepping,
        DWORD *VideoMethodID,
        DWORD *SignalSourceID,
        ULONGLONG *SignalFormat,
        WINBOOL *SignalLock,
        LONG *SignalLevel,
        DWORD *SignalToNoiseRatio);

    END_INTERFACE
} IBDA_EncoderVtbl;
interface IBDA_Encoder {
    CONST_VTBL IBDA_EncoderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_Encoder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_Encoder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_Encoder_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_Encoder methods ***/
#define IBDA_Encoder_QueryCapabilities(This,NumAudioFmts,NumVideoFmts) (This)->lpVtbl->QueryCapabilities(This,NumAudioFmts,NumVideoFmts)
#define IBDA_Encoder_EnumAudioCapability(This,FmtIndex,MethodID,AlgorithmType,SamplingRate,BitDepth,NumChannels) (This)->lpVtbl->EnumAudioCapability(This,FmtIndex,MethodID,AlgorithmType,SamplingRate,BitDepth,NumChannels)
#define IBDA_Encoder_EnumVideoCapability(This,FmtIndex,MethodID,AlgorithmType,VerticalSize,HorizontalSize,AspectRatio,FrameRateCode,ProgressiveSequence) (This)->lpVtbl->EnumVideoCapability(This,FmtIndex,MethodID,AlgorithmType,VerticalSize,HorizontalSize,AspectRatio,FrameRateCode,ProgressiveSequence)
#define IBDA_Encoder_SetParameters(This,AudioBitrateMode,AudioBitrate,AudioMethodID,AudioProgram,VideoBitrateMode,VideoBitrate,VideoMethodID) (This)->lpVtbl->SetParameters(This,AudioBitrateMode,AudioBitrate,AudioMethodID,AudioProgram,VideoBitrateMode,VideoBitrate,VideoMethodID)
#define IBDA_Encoder_GetState(This,AudioBitrateMax,AudioBitrateMin,AudioBitrateMode,AudioBitrateStepping,AudioBitrate,AudioMethodID,AvailableAudioPrograms,AudioProgram,VideoBitrateMax,VideoBitrateMin,VideoBitrateMode,VideoBitrate,VideoBitrateStepping,VideoMethodID,SignalSourceID,SignalFormat,SignalLock,SignalLevel,SignalToNoiseRatio) (This)->lpVtbl->GetState(This,AudioBitrateMax,AudioBitrateMin,AudioBitrateMode,AudioBitrateStepping,AudioBitrate,AudioMethodID,AvailableAudioPrograms,AudioProgram,VideoBitrateMax,VideoBitrateMin,VideoBitrateMode,VideoBitrate,VideoBitrateStepping,VideoMethodID,SignalSourceID,SignalFormat,SignalLock,SignalLevel,SignalToNoiseRatio)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_Encoder_QueryInterface(IBDA_Encoder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_Encoder_AddRef(IBDA_Encoder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_Encoder_Release(IBDA_Encoder* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_Encoder methods ***/
static FORCEINLINE HRESULT IBDA_Encoder_QueryCapabilities(IBDA_Encoder* This,DWORD *NumAudioFmts,DWORD *NumVideoFmts) {
    return This->lpVtbl->QueryCapabilities(This,NumAudioFmts,NumVideoFmts);
}
static FORCEINLINE HRESULT IBDA_Encoder_EnumAudioCapability(IBDA_Encoder* This,DWORD FmtIndex,DWORD *MethodID,DWORD *AlgorithmType,DWORD *SamplingRate,DWORD *BitDepth,DWORD *NumChannels) {
    return This->lpVtbl->EnumAudioCapability(This,FmtIndex,MethodID,AlgorithmType,SamplingRate,BitDepth,NumChannels);
}
static FORCEINLINE HRESULT IBDA_Encoder_EnumVideoCapability(IBDA_Encoder* This,DWORD FmtIndex,DWORD *MethodID,DWORD *AlgorithmType,DWORD *VerticalSize,DWORD *HorizontalSize,DWORD *AspectRatio,DWORD *FrameRateCode,DWORD *ProgressiveSequence) {
    return This->lpVtbl->EnumVideoCapability(This,FmtIndex,MethodID,AlgorithmType,VerticalSize,HorizontalSize,AspectRatio,FrameRateCode,ProgressiveSequence);
}
static FORCEINLINE HRESULT IBDA_Encoder_SetParameters(IBDA_Encoder* This,DWORD AudioBitrateMode,DWORD AudioBitrate,DWORD AudioMethodID,DWORD AudioProgram,DWORD VideoBitrateMode,DWORD VideoBitrate,DWORD VideoMethodID) {
    return This->lpVtbl->SetParameters(This,AudioBitrateMode,AudioBitrate,AudioMethodID,AudioProgram,VideoBitrateMode,VideoBitrate,VideoMethodID);
}
static FORCEINLINE HRESULT IBDA_Encoder_GetState(IBDA_Encoder* This,DWORD *AudioBitrateMax,DWORD *AudioBitrateMin,DWORD *AudioBitrateMode,DWORD *AudioBitrateStepping,DWORD *AudioBitrate,DWORD *AudioMethodID,DWORD *AvailableAudioPrograms,DWORD *AudioProgram,DWORD *VideoBitrateMax,DWORD *VideoBitrateMin,DWORD *VideoBitrateMode,DWORD *VideoBitrate,DWORD *VideoBitrateStepping,DWORD *VideoMethodID,DWORD *SignalSourceID,ULONGLONG *SignalFormat,WINBOOL *SignalLock,LONG *SignalLevel,DWORD *SignalToNoiseRatio) {
    return This->lpVtbl->GetState(This,AudioBitrateMax,AudioBitrateMin,AudioBitrateMode,AudioBitrateStepping,AudioBitrate,AudioMethodID,AvailableAudioPrograms,AudioProgram,VideoBitrateMax,VideoBitrateMin,VideoBitrateMode,VideoBitrate,VideoBitrateStepping,VideoMethodID,SignalSourceID,SignalFormat,SignalLock,SignalLevel,SignalToNoiseRatio);
}
#endif
#endif

#endif


#endif  /* __IBDA_Encoder_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_FDC interface
 */
#ifndef __IBDA_FDC_INTERFACE_DEFINED__
#define __IBDA_FDC_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_FDC, 0x138adc7e, 0x58ae, 0x437f, 0xb0,0xb4, 0xc9,0xfe,0x19,0xd5,0xb4,0xac);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("138adc7e-58ae-437f-b0b4-c9fe19d5b4ac")
IBDA_FDC : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        DWORD *CurrentBitrate,
        WINBOOL *CarrierLock,
        DWORD *CurrentFrequency,
        WINBOOL *CurrentSpectrumInversion,
        BSTR *CurrentPIDList,
        BSTR *CurrentTIDList,
        WINBOOL *Overflow) = 0;

    virtual HRESULT STDMETHODCALLTYPE RequestTables(
        BSTR TableIDs) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPid(
        BSTR PidsToAdd,
        DWORD *RemainingFilterEntries) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemovePid(
        BSTR PidsToRemove) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddTid(
        BSTR TidsToAdd,
        BSTR *CurrentTidList) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveTid(
        BSTR TidsToRemove) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTableSection(
        DWORD *Pid,
        DWORD MaxBufferSize,
        DWORD *ActualSize,
        BYTE *SecBuffer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_FDC, 0x138adc7e, 0x58ae, 0x437f, 0xb0,0xb4, 0xc9,0xfe,0x19,0xd5,0xb4,0xac)
#endif
#else
typedef struct IBDA_FDCVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_FDC methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IBDA_FDC* This,
        DWORD *CurrentBitrate,
        WINBOOL *CarrierLock,
        DWORD *CurrentFrequency,
        WINBOOL *CurrentSpectrumInversion,
        BSTR *CurrentPIDList,
        BSTR *CurrentTIDList,
        WINBOOL *Overflow);

    HRESULT (STDMETHODCALLTYPE *RequestTables)(
        IBDA_FDC* This,
        BSTR TableIDs);

    HRESULT (STDMETHODCALLTYPE *AddPid)(
        IBDA_FDC* This,
        BSTR PidsToAdd,
        DWORD *RemainingFilterEntries);

    HRESULT (STDMETHODCALLTYPE *RemovePid)(
        IBDA_FDC* This,
        BSTR PidsToRemove);

    HRESULT (STDMETHODCALLTYPE *AddTid)(
        IBDA_FDC* This,
        BSTR TidsToAdd,
        BSTR *CurrentTidList);

    HRESULT (STDMETHODCALLTYPE *RemoveTid)(
        IBDA_FDC* This,
        BSTR TidsToRemove);

    HRESULT (STDMETHODCALLTYPE *GetTableSection)(
        IBDA_FDC* This,
        DWORD *Pid,
        DWORD MaxBufferSize,
        DWORD *ActualSize,
        BYTE *SecBuffer);

    END_INTERFACE
} IBDA_FDCVtbl;
interface IBDA_FDC {
    CONST_VTBL IBDA_FDCVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_FDC_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_FDC_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_FDC_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_FDC methods ***/
#define IBDA_FDC_GetStatus(This,CurrentBitrate,CarrierLock,CurrentFrequency,CurrentSpectrumInversion,CurrentPIDList,CurrentTIDList,Overflow) (This)->lpVtbl->GetStatus(This,CurrentBitrate,CarrierLock,CurrentFrequency,CurrentSpectrumInversion,CurrentPIDList,CurrentTIDList,Overflow)
#define IBDA_FDC_RequestTables(This,TableIDs) (This)->lpVtbl->RequestTables(This,TableIDs)
#define IBDA_FDC_AddPid(This,PidsToAdd,RemainingFilterEntries) (This)->lpVtbl->AddPid(This,PidsToAdd,RemainingFilterEntries)
#define IBDA_FDC_RemovePid(This,PidsToRemove) (This)->lpVtbl->RemovePid(This,PidsToRemove)
#define IBDA_FDC_AddTid(This,TidsToAdd,CurrentTidList) (This)->lpVtbl->AddTid(This,TidsToAdd,CurrentTidList)
#define IBDA_FDC_RemoveTid(This,TidsToRemove) (This)->lpVtbl->RemoveTid(This,TidsToRemove)
#define IBDA_FDC_GetTableSection(This,Pid,MaxBufferSize,ActualSize,SecBuffer) (This)->lpVtbl->GetTableSection(This,Pid,MaxBufferSize,ActualSize,SecBuffer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_FDC_QueryInterface(IBDA_FDC* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_FDC_AddRef(IBDA_FDC* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_FDC_Release(IBDA_FDC* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_FDC methods ***/
static FORCEINLINE HRESULT IBDA_FDC_GetStatus(IBDA_FDC* This,DWORD *CurrentBitrate,WINBOOL *CarrierLock,DWORD *CurrentFrequency,WINBOOL *CurrentSpectrumInversion,BSTR *CurrentPIDList,BSTR *CurrentTIDList,WINBOOL *Overflow) {
    return This->lpVtbl->GetStatus(This,CurrentBitrate,CarrierLock,CurrentFrequency,CurrentSpectrumInversion,CurrentPIDList,CurrentTIDList,Overflow);
}
static FORCEINLINE HRESULT IBDA_FDC_RequestTables(IBDA_FDC* This,BSTR TableIDs) {
    return This->lpVtbl->RequestTables(This,TableIDs);
}
static FORCEINLINE HRESULT IBDA_FDC_AddPid(IBDA_FDC* This,BSTR PidsToAdd,DWORD *RemainingFilterEntries) {
    return This->lpVtbl->AddPid(This,PidsToAdd,RemainingFilterEntries);
}
static FORCEINLINE HRESULT IBDA_FDC_RemovePid(IBDA_FDC* This,BSTR PidsToRemove) {
    return This->lpVtbl->RemovePid(This,PidsToRemove);
}
static FORCEINLINE HRESULT IBDA_FDC_AddTid(IBDA_FDC* This,BSTR TidsToAdd,BSTR *CurrentTidList) {
    return This->lpVtbl->AddTid(This,TidsToAdd,CurrentTidList);
}
static FORCEINLINE HRESULT IBDA_FDC_RemoveTid(IBDA_FDC* This,BSTR TidsToRemove) {
    return This->lpVtbl->RemoveTid(This,TidsToRemove);
}
static FORCEINLINE HRESULT IBDA_FDC_GetTableSection(IBDA_FDC* This,DWORD *Pid,DWORD MaxBufferSize,DWORD *ActualSize,BYTE *SecBuffer) {
    return This->lpVtbl->GetTableSection(This,Pid,MaxBufferSize,ActualSize,SecBuffer);
}
#endif
#endif

#endif


#endif  /* __IBDA_FDC_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_GuideDataDeliveryService interface
 */
#ifndef __IBDA_GuideDataDeliveryService_INTERFACE_DEFINED__
#define __IBDA_GuideDataDeliveryService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_GuideDataDeliveryService, 0xc0afcb73, 0x23e7, 0x4bc6, 0xba,0xfa, 0xfd,0xc1,0x67,0xb4,0x71,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0afcb73-23e7-4bc6-bafa-fdc167b4719f")
IBDA_GuideDataDeliveryService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetGuideDataType(
        GUID *pguidDataType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGuideData(
        ULONG *pulcbBufferLen,
        BYTE *pbBuffer,
        ULONG *pulGuideDataPercentageProgress) = 0;

    virtual HRESULT STDMETHODCALLTYPE RequestGuideDataUpdate(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTuneXmlFromServiceIdx(
        ULONG64 ul64ServiceIdx,
        BSTR *pbstrTuneXml) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetServices(
        ULONG *pulcbBufferLen,
        BYTE *pbBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetServiceInfoFromTuneXml(
        BSTR bstrTuneXml,
        BSTR *pbstrServiceDescription) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_GuideDataDeliveryService, 0xc0afcb73, 0x23e7, 0x4bc6, 0xba,0xfa, 0xfd,0xc1,0x67,0xb4,0x71,0x9f)
#endif
#else
typedef struct IBDA_GuideDataDeliveryServiceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_GuideDataDeliveryService methods ***/
    HRESULT (STDMETHODCALLTYPE *GetGuideDataType)(
        IBDA_GuideDataDeliveryService* This,
        GUID *pguidDataType);

    HRESULT (STDMETHODCALLTYPE *GetGuideData)(
        IBDA_GuideDataDeliveryService* This,
        ULONG *pulcbBufferLen,
        BYTE *pbBuffer,
        ULONG *pulGuideDataPercentageProgress);

    HRESULT (STDMETHODCALLTYPE *RequestGuideDataUpdate)(
        IBDA_GuideDataDeliveryService* This);

    HRESULT (STDMETHODCALLTYPE *GetTuneXmlFromServiceIdx)(
        IBDA_GuideDataDeliveryService* This,
        ULONG64 ul64ServiceIdx,
        BSTR *pbstrTuneXml);

    HRESULT (STDMETHODCALLTYPE *GetServices)(
        IBDA_GuideDataDeliveryService* This,
        ULONG *pulcbBufferLen,
        BYTE *pbBuffer);

    HRESULT (STDMETHODCALLTYPE *GetServiceInfoFromTuneXml)(
        IBDA_GuideDataDeliveryService* This,
        BSTR bstrTuneXml,
        BSTR *pbstrServiceDescription);

    END_INTERFACE
} IBDA_GuideDataDeliveryServiceVtbl;
interface IBDA_GuideDataDeliveryService {
    CONST_VTBL IBDA_GuideDataDeliveryServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_GuideDataDeliveryService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_GuideDataDeliveryService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_GuideDataDeliveryService_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_GuideDataDeliveryService methods ***/
#define IBDA_GuideDataDeliveryService_GetGuideDataType(This,pguidDataType) (This)->lpVtbl->GetGuideDataType(This,pguidDataType)
#define IBDA_GuideDataDeliveryService_GetGuideData(This,pulcbBufferLen,pbBuffer,pulGuideDataPercentageProgress) (This)->lpVtbl->GetGuideData(This,pulcbBufferLen,pbBuffer,pulGuideDataPercentageProgress)
#define IBDA_GuideDataDeliveryService_RequestGuideDataUpdate(This) (This)->lpVtbl->RequestGuideDataUpdate(This)
#define IBDA_GuideDataDeliveryService_GetTuneXmlFromServiceIdx(This,ul64ServiceIdx,pbstrTuneXml) (This)->lpVtbl->GetTuneXmlFromServiceIdx(This,ul64ServiceIdx,pbstrTuneXml)
#define IBDA_GuideDataDeliveryService_GetServices(This,pulcbBufferLen,pbBuffer) (This)->lpVtbl->GetServices(This,pulcbBufferLen,pbBuffer)
#define IBDA_GuideDataDeliveryService_GetServiceInfoFromTuneXml(This,bstrTuneXml,pbstrServiceDescription) (This)->lpVtbl->GetServiceInfoFromTuneXml(This,bstrTuneXml,pbstrServiceDescription)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_GuideDataDeliveryService_QueryInterface(IBDA_GuideDataDeliveryService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_GuideDataDeliveryService_AddRef(IBDA_GuideDataDeliveryService* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_GuideDataDeliveryService_Release(IBDA_GuideDataDeliveryService* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_GuideDataDeliveryService methods ***/
static FORCEINLINE HRESULT IBDA_GuideDataDeliveryService_GetGuideDataType(IBDA_GuideDataDeliveryService* This,GUID *pguidDataType) {
    return This->lpVtbl->GetGuideDataType(This,pguidDataType);
}
static FORCEINLINE HRESULT IBDA_GuideDataDeliveryService_GetGuideData(IBDA_GuideDataDeliveryService* This,ULONG *pulcbBufferLen,BYTE *pbBuffer,ULONG *pulGuideDataPercentageProgress) {
    return This->lpVtbl->GetGuideData(This,pulcbBufferLen,pbBuffer,pulGuideDataPercentageProgress);
}
static FORCEINLINE HRESULT IBDA_GuideDataDeliveryService_RequestGuideDataUpdate(IBDA_GuideDataDeliveryService* This) {
    return This->lpVtbl->RequestGuideDataUpdate(This);
}
static FORCEINLINE HRESULT IBDA_GuideDataDeliveryService_GetTuneXmlFromServiceIdx(IBDA_GuideDataDeliveryService* This,ULONG64 ul64ServiceIdx,BSTR *pbstrTuneXml) {
    return This->lpVtbl->GetTuneXmlFromServiceIdx(This,ul64ServiceIdx,pbstrTuneXml);
}
static FORCEINLINE HRESULT IBDA_GuideDataDeliveryService_GetServices(IBDA_GuideDataDeliveryService* This,ULONG *pulcbBufferLen,BYTE *pbBuffer) {
    return This->lpVtbl->GetServices(This,pulcbBufferLen,pbBuffer);
}
static FORCEINLINE HRESULT IBDA_GuideDataDeliveryService_GetServiceInfoFromTuneXml(IBDA_GuideDataDeliveryService* This,BSTR bstrTuneXml,BSTR *pbstrServiceDescription) {
    return This->lpVtbl->GetServiceInfoFromTuneXml(This,bstrTuneXml,pbstrServiceDescription);
}
#endif
#endif

#endif


#endif  /* __IBDA_GuideDataDeliveryService_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_DRMService interface
 */
#ifndef __IBDA_DRMService_INTERFACE_DEFINED__
#define __IBDA_DRMService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_DRMService, 0xbff6b5bb, 0xb0ae, 0x484c, 0x9d,0xca, 0x73,0x52,0x8f,0xb0,0xb4,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bff6b5bb-b0ae-484c-9dca-73528fb0b46e")
IBDA_DRMService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetDRM(
        GUID *puuidNewDrm) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDRMStatus(
        BSTR *pbstrDrmUuidList,
        GUID *DrmUuid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_DRMService, 0xbff6b5bb, 0xb0ae, 0x484c, 0x9d,0xca, 0x73,0x52,0x8f,0xb0,0xb4,0x6e)
#endif
#else
typedef struct IBDA_DRMServiceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_DRMService methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDRM)(
        IBDA_DRMService* This,
        GUID *puuidNewDrm);

    HRESULT (STDMETHODCALLTYPE *GetDRMStatus)(
        IBDA_DRMService* This,
        BSTR *pbstrDrmUuidList,
        GUID *DrmUuid);

    END_INTERFACE
} IBDA_DRMServiceVtbl;
interface IBDA_DRMService {
    CONST_VTBL IBDA_DRMServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_DRMService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_DRMService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_DRMService_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_DRMService methods ***/
#define IBDA_DRMService_SetDRM(This,puuidNewDrm) (This)->lpVtbl->SetDRM(This,puuidNewDrm)
#define IBDA_DRMService_GetDRMStatus(This,pbstrDrmUuidList,DrmUuid) (This)->lpVtbl->GetDRMStatus(This,pbstrDrmUuidList,DrmUuid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_DRMService_QueryInterface(IBDA_DRMService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_DRMService_AddRef(IBDA_DRMService* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_DRMService_Release(IBDA_DRMService* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_DRMService methods ***/
static FORCEINLINE HRESULT IBDA_DRMService_SetDRM(IBDA_DRMService* This,GUID *puuidNewDrm) {
    return This->lpVtbl->SetDRM(This,puuidNewDrm);
}
static FORCEINLINE HRESULT IBDA_DRMService_GetDRMStatus(IBDA_DRMService* This,BSTR *pbstrDrmUuidList,GUID *DrmUuid) {
    return This->lpVtbl->GetDRMStatus(This,pbstrDrmUuidList,DrmUuid);
}
#endif
#endif

#endif


#endif  /* __IBDA_DRMService_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_WMDRMSession interface
 */
#ifndef __IBDA_WMDRMSession_INTERFACE_DEFINED__
#define __IBDA_WMDRMSession_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_WMDRMSession, 0x4be6fa3d, 0x07cd, 0x4139, 0x8b,0x80, 0x8c,0x18,0xba,0x3a,0xec,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4be6fa3d-07cd-4139-8b80-8c18ba3aec88")
IBDA_WMDRMSession : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        ULONG *MaxCaptureToken,
        ULONG *MaxStreamingPid,
        ULONG *MaxLicense,
        ULONG *MinSecurityLevel,
        ULONG *RevInfoSequenceNumber,
        ULONGLONG *RevInfoIssuedTime,
        ULONG *RevInfoTTL,
        ULONG *RevListVersion,
        ULONG *ulState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRevInfo(
        ULONG ulRevInfoLen,
        BYTE *pbRevInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCrl(
        ULONG ulCrlLen,
        BYTE *pbCrlLen) = 0;

    virtual HRESULT STDMETHODCALLTYPE TransactMessage(
        ULONG ulcbRequest,
        BYTE *pbRequest,
        ULONG *pulcbResponse,
        BYTE *pbResponse) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLicense(
        GUID *uuidKey,
        ULONG *pulPackageLen,
        BYTE *pbPackage) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReissueLicense(
        GUID *uuidKey) = 0;

    virtual HRESULT STDMETHODCALLTYPE RenewLicense(
        ULONG ulInXmrLicenseLen,
        BYTE *pbInXmrLicense,
        ULONG ulEntitlementTokenLen,
        BYTE *pbEntitlementToken,
        ULONG *pulDescrambleStatus,
        ULONG *pulOutXmrLicenseLen,
        BYTE *pbOutXmrLicense) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetKeyInfo(
        ULONG *pulKeyInfoLen,
        BYTE *pbKeyInfo) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_WMDRMSession, 0x4be6fa3d, 0x07cd, 0x4139, 0x8b,0x80, 0x8c,0x18,0xba,0x3a,0xec,0x88)
#endif
#else
typedef struct IBDA_WMDRMSessionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_WMDRMSession methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IBDA_WMDRMSession* This,
        ULONG *MaxCaptureToken,
        ULONG *MaxStreamingPid,
        ULONG *MaxLicense,
        ULONG *MinSecurityLevel,
        ULONG *RevInfoSequenceNumber,
        ULONGLONG *RevInfoIssuedTime,
        ULONG *RevInfoTTL,
        ULONG *RevListVersion,
        ULONG *ulState);

    HRESULT (STDMETHODCALLTYPE *SetRevInfo)(
        IBDA_WMDRMSession* This,
        ULONG ulRevInfoLen,
        BYTE *pbRevInfo);

    HRESULT (STDMETHODCALLTYPE *SetCrl)(
        IBDA_WMDRMSession* This,
        ULONG ulCrlLen,
        BYTE *pbCrlLen);

    HRESULT (STDMETHODCALLTYPE *TransactMessage)(
        IBDA_WMDRMSession* This,
        ULONG ulcbRequest,
        BYTE *pbRequest,
        ULONG *pulcbResponse,
        BYTE *pbResponse);

    HRESULT (STDMETHODCALLTYPE *GetLicense)(
        IBDA_WMDRMSession* This,
        GUID *uuidKey,
        ULONG *pulPackageLen,
        BYTE *pbPackage);

    HRESULT (STDMETHODCALLTYPE *ReissueLicense)(
        IBDA_WMDRMSession* This,
        GUID *uuidKey);

    HRESULT (STDMETHODCALLTYPE *RenewLicense)(
        IBDA_WMDRMSession* This,
        ULONG ulInXmrLicenseLen,
        BYTE *pbInXmrLicense,
        ULONG ulEntitlementTokenLen,
        BYTE *pbEntitlementToken,
        ULONG *pulDescrambleStatus,
        ULONG *pulOutXmrLicenseLen,
        BYTE *pbOutXmrLicense);

    HRESULT (STDMETHODCALLTYPE *GetKeyInfo)(
        IBDA_WMDRMSession* This,
        ULONG *pulKeyInfoLen,
        BYTE *pbKeyInfo);

    END_INTERFACE
} IBDA_WMDRMSessionVtbl;
interface IBDA_WMDRMSession {
    CONST_VTBL IBDA_WMDRMSessionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_WMDRMSession_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_WMDRMSession_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_WMDRMSession_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_WMDRMSession methods ***/
#define IBDA_WMDRMSession_GetStatus(This,MaxCaptureToken,MaxStreamingPid,MaxLicense,MinSecurityLevel,RevInfoSequenceNumber,RevInfoIssuedTime,RevInfoTTL,RevListVersion,ulState) (This)->lpVtbl->GetStatus(This,MaxCaptureToken,MaxStreamingPid,MaxLicense,MinSecurityLevel,RevInfoSequenceNumber,RevInfoIssuedTime,RevInfoTTL,RevListVersion,ulState)
#define IBDA_WMDRMSession_SetRevInfo(This,ulRevInfoLen,pbRevInfo) (This)->lpVtbl->SetRevInfo(This,ulRevInfoLen,pbRevInfo)
#define IBDA_WMDRMSession_SetCrl(This,ulCrlLen,pbCrlLen) (This)->lpVtbl->SetCrl(This,ulCrlLen,pbCrlLen)
#define IBDA_WMDRMSession_TransactMessage(This,ulcbRequest,pbRequest,pulcbResponse,pbResponse) (This)->lpVtbl->TransactMessage(This,ulcbRequest,pbRequest,pulcbResponse,pbResponse)
#define IBDA_WMDRMSession_GetLicense(This,uuidKey,pulPackageLen,pbPackage) (This)->lpVtbl->GetLicense(This,uuidKey,pulPackageLen,pbPackage)
#define IBDA_WMDRMSession_ReissueLicense(This,uuidKey) (This)->lpVtbl->ReissueLicense(This,uuidKey)
#define IBDA_WMDRMSession_RenewLicense(This,ulInXmrLicenseLen,pbInXmrLicense,ulEntitlementTokenLen,pbEntitlementToken,pulDescrambleStatus,pulOutXmrLicenseLen,pbOutXmrLicense) (This)->lpVtbl->RenewLicense(This,ulInXmrLicenseLen,pbInXmrLicense,ulEntitlementTokenLen,pbEntitlementToken,pulDescrambleStatus,pulOutXmrLicenseLen,pbOutXmrLicense)
#define IBDA_WMDRMSession_GetKeyInfo(This,pulKeyInfoLen,pbKeyInfo) (This)->lpVtbl->GetKeyInfo(This,pulKeyInfoLen,pbKeyInfo)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_WMDRMSession_QueryInterface(IBDA_WMDRMSession* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_WMDRMSession_AddRef(IBDA_WMDRMSession* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_WMDRMSession_Release(IBDA_WMDRMSession* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_WMDRMSession methods ***/
static FORCEINLINE HRESULT IBDA_WMDRMSession_GetStatus(IBDA_WMDRMSession* This,ULONG *MaxCaptureToken,ULONG *MaxStreamingPid,ULONG *MaxLicense,ULONG *MinSecurityLevel,ULONG *RevInfoSequenceNumber,ULONGLONG *RevInfoIssuedTime,ULONG *RevInfoTTL,ULONG *RevListVersion,ULONG *ulState) {
    return This->lpVtbl->GetStatus(This,MaxCaptureToken,MaxStreamingPid,MaxLicense,MinSecurityLevel,RevInfoSequenceNumber,RevInfoIssuedTime,RevInfoTTL,RevListVersion,ulState);
}
static FORCEINLINE HRESULT IBDA_WMDRMSession_SetRevInfo(IBDA_WMDRMSession* This,ULONG ulRevInfoLen,BYTE *pbRevInfo) {
    return This->lpVtbl->SetRevInfo(This,ulRevInfoLen,pbRevInfo);
}
static FORCEINLINE HRESULT IBDA_WMDRMSession_SetCrl(IBDA_WMDRMSession* This,ULONG ulCrlLen,BYTE *pbCrlLen) {
    return This->lpVtbl->SetCrl(This,ulCrlLen,pbCrlLen);
}
static FORCEINLINE HRESULT IBDA_WMDRMSession_TransactMessage(IBDA_WMDRMSession* This,ULONG ulcbRequest,BYTE *pbRequest,ULONG *pulcbResponse,BYTE *pbResponse) {
    return This->lpVtbl->TransactMessage(This,ulcbRequest,pbRequest,pulcbResponse,pbResponse);
}
static FORCEINLINE HRESULT IBDA_WMDRMSession_GetLicense(IBDA_WMDRMSession* This,GUID *uuidKey,ULONG *pulPackageLen,BYTE *pbPackage) {
    return This->lpVtbl->GetLicense(This,uuidKey,pulPackageLen,pbPackage);
}
static FORCEINLINE HRESULT IBDA_WMDRMSession_ReissueLicense(IBDA_WMDRMSession* This,GUID *uuidKey) {
    return This->lpVtbl->ReissueLicense(This,uuidKey);
}
static FORCEINLINE HRESULT IBDA_WMDRMSession_RenewLicense(IBDA_WMDRMSession* This,ULONG ulInXmrLicenseLen,BYTE *pbInXmrLicense,ULONG ulEntitlementTokenLen,BYTE *pbEntitlementToken,ULONG *pulDescrambleStatus,ULONG *pulOutXmrLicenseLen,BYTE *pbOutXmrLicense) {
    return This->lpVtbl->RenewLicense(This,ulInXmrLicenseLen,pbInXmrLicense,ulEntitlementTokenLen,pbEntitlementToken,pulDescrambleStatus,pulOutXmrLicenseLen,pbOutXmrLicense);
}
static FORCEINLINE HRESULT IBDA_WMDRMSession_GetKeyInfo(IBDA_WMDRMSession* This,ULONG *pulKeyInfoLen,BYTE *pbKeyInfo) {
    return This->lpVtbl->GetKeyInfo(This,pulKeyInfoLen,pbKeyInfo);
}
#endif
#endif

#endif


#endif  /* __IBDA_WMDRMSession_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_WMDRMTuner interface
 */
#ifndef __IBDA_WMDRMTuner_INTERFACE_DEFINED__
#define __IBDA_WMDRMTuner_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_WMDRMTuner, 0x86d979cf, 0xa8a7, 0x4f94, 0xb5,0xfb, 0x14,0xc0,0xac,0xa6,0x8f,0xe6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("86d979cf-a8a7-4f94-b5fb-14c0aca68fe6")
IBDA_WMDRMTuner : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE PurchaseEntitlement(
        ULONG ulDialogRequest,
        BSTR bstrLanguage,
        ULONG ulPurchaseTokenLen,
        BYTE *pbPurchaseToken,
        ULONG *pulDescrambleStatus,
        ULONG *pulCaptureTokenLen,
        BYTE *pbCaptureToken) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelCaptureToken(
        ULONG ulCaptureTokenLen,
        BYTE *pbCaptureToken) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPidProtection(
        ULONG ulPid,
        GUID *uuidKey) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPidProtection(
        ULONG pulPid,
        GUID *uuidKey) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSyncValue(
        ULONG ulSyncValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStartCodeProfile(
        ULONG *pulStartCodeProfileLen,
        BYTE *pbStartCodeProfile) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_WMDRMTuner, 0x86d979cf, 0xa8a7, 0x4f94, 0xb5,0xfb, 0x14,0xc0,0xac,0xa6,0x8f,0xe6)
#endif
#else
typedef struct IBDA_WMDRMTunerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_WMDRMTuner methods ***/
    HRESULT (STDMETHODCALLTYPE *PurchaseEntitlement)(
        IBDA_WMDRMTuner* This,
        ULONG ulDialogRequest,
        BSTR bstrLanguage,
        ULONG ulPurchaseTokenLen,
        BYTE *pbPurchaseToken,
        ULONG *pulDescrambleStatus,
        ULONG *pulCaptureTokenLen,
        BYTE *pbCaptureToken);

    HRESULT (STDMETHODCALLTYPE *CancelCaptureToken)(
        IBDA_WMDRMTuner* This,
        ULONG ulCaptureTokenLen,
        BYTE *pbCaptureToken);

    HRESULT (STDMETHODCALLTYPE *SetPidProtection)(
        IBDA_WMDRMTuner* This,
        ULONG ulPid,
        GUID *uuidKey);

    HRESULT (STDMETHODCALLTYPE *GetPidProtection)(
        IBDA_WMDRMTuner* This,
        ULONG pulPid,
        GUID *uuidKey);

    HRESULT (STDMETHODCALLTYPE *SetSyncValue)(
        IBDA_WMDRMTuner* This,
        ULONG ulSyncValue);

    HRESULT (STDMETHODCALLTYPE *GetStartCodeProfile)(
        IBDA_WMDRMTuner* This,
        ULONG *pulStartCodeProfileLen,
        BYTE *pbStartCodeProfile);

    END_INTERFACE
} IBDA_WMDRMTunerVtbl;
interface IBDA_WMDRMTuner {
    CONST_VTBL IBDA_WMDRMTunerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_WMDRMTuner_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_WMDRMTuner_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_WMDRMTuner_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_WMDRMTuner methods ***/
#define IBDA_WMDRMTuner_PurchaseEntitlement(This,ulDialogRequest,bstrLanguage,ulPurchaseTokenLen,pbPurchaseToken,pulDescrambleStatus,pulCaptureTokenLen,pbCaptureToken) (This)->lpVtbl->PurchaseEntitlement(This,ulDialogRequest,bstrLanguage,ulPurchaseTokenLen,pbPurchaseToken,pulDescrambleStatus,pulCaptureTokenLen,pbCaptureToken)
#define IBDA_WMDRMTuner_CancelCaptureToken(This,ulCaptureTokenLen,pbCaptureToken) (This)->lpVtbl->CancelCaptureToken(This,ulCaptureTokenLen,pbCaptureToken)
#define IBDA_WMDRMTuner_SetPidProtection(This,ulPid,uuidKey) (This)->lpVtbl->SetPidProtection(This,ulPid,uuidKey)
#define IBDA_WMDRMTuner_GetPidProtection(This,pulPid,uuidKey) (This)->lpVtbl->GetPidProtection(This,pulPid,uuidKey)
#define IBDA_WMDRMTuner_SetSyncValue(This,ulSyncValue) (This)->lpVtbl->SetSyncValue(This,ulSyncValue)
#define IBDA_WMDRMTuner_GetStartCodeProfile(This,pulStartCodeProfileLen,pbStartCodeProfile) (This)->lpVtbl->GetStartCodeProfile(This,pulStartCodeProfileLen,pbStartCodeProfile)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_WMDRMTuner_QueryInterface(IBDA_WMDRMTuner* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_WMDRMTuner_AddRef(IBDA_WMDRMTuner* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_WMDRMTuner_Release(IBDA_WMDRMTuner* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_WMDRMTuner methods ***/
static FORCEINLINE HRESULT IBDA_WMDRMTuner_PurchaseEntitlement(IBDA_WMDRMTuner* This,ULONG ulDialogRequest,BSTR bstrLanguage,ULONG ulPurchaseTokenLen,BYTE *pbPurchaseToken,ULONG *pulDescrambleStatus,ULONG *pulCaptureTokenLen,BYTE *pbCaptureToken) {
    return This->lpVtbl->PurchaseEntitlement(This,ulDialogRequest,bstrLanguage,ulPurchaseTokenLen,pbPurchaseToken,pulDescrambleStatus,pulCaptureTokenLen,pbCaptureToken);
}
static FORCEINLINE HRESULT IBDA_WMDRMTuner_CancelCaptureToken(IBDA_WMDRMTuner* This,ULONG ulCaptureTokenLen,BYTE *pbCaptureToken) {
    return This->lpVtbl->CancelCaptureToken(This,ulCaptureTokenLen,pbCaptureToken);
}
static FORCEINLINE HRESULT IBDA_WMDRMTuner_SetPidProtection(IBDA_WMDRMTuner* This,ULONG ulPid,GUID *uuidKey) {
    return This->lpVtbl->SetPidProtection(This,ulPid,uuidKey);
}
static FORCEINLINE HRESULT IBDA_WMDRMTuner_GetPidProtection(IBDA_WMDRMTuner* This,ULONG pulPid,GUID *uuidKey) {
    return This->lpVtbl->GetPidProtection(This,pulPid,uuidKey);
}
static FORCEINLINE HRESULT IBDA_WMDRMTuner_SetSyncValue(IBDA_WMDRMTuner* This,ULONG ulSyncValue) {
    return This->lpVtbl->SetSyncValue(This,ulSyncValue);
}
static FORCEINLINE HRESULT IBDA_WMDRMTuner_GetStartCodeProfile(IBDA_WMDRMTuner* This,ULONG *pulStartCodeProfileLen,BYTE *pbStartCodeProfile) {
    return This->lpVtbl->GetStartCodeProfile(This,pulStartCodeProfileLen,pbStartCodeProfile);
}
#endif
#endif

#endif


#endif  /* __IBDA_WMDRMTuner_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_DRIDRMService interface
 */
#ifndef __IBDA_DRIDRMService_INTERFACE_DEFINED__
#define __IBDA_DRIDRMService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_DRIDRMService, 0x1f9bc2a5, 0x44a3, 0x4c52, 0xaa,0xb1, 0x0b,0xbc,0xe5,0xa1,0x38,0x1d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1f9bc2a5-44a3-4c52-aab1-0bbce5a1381d")
IBDA_DRIDRMService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetDRM(
        BSTR bstrNewDrm) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDRMStatus(
        BSTR *pbstrDrmUuidList,
        GUID *DrmUuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPairingStatus(
        BDA_DrmPairingError *penumPairingStatus) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_DRIDRMService, 0x1f9bc2a5, 0x44a3, 0x4c52, 0xaa,0xb1, 0x0b,0xbc,0xe5,0xa1,0x38,0x1d)
#endif
#else
typedef struct IBDA_DRIDRMServiceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_DRIDRMService methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDRM)(
        IBDA_DRIDRMService* This,
        BSTR bstrNewDrm);

    HRESULT (STDMETHODCALLTYPE *GetDRMStatus)(
        IBDA_DRIDRMService* This,
        BSTR *pbstrDrmUuidList,
        GUID *DrmUuid);

    HRESULT (STDMETHODCALLTYPE *GetPairingStatus)(
        IBDA_DRIDRMService* This,
        BDA_DrmPairingError *penumPairingStatus);

    END_INTERFACE
} IBDA_DRIDRMServiceVtbl;
interface IBDA_DRIDRMService {
    CONST_VTBL IBDA_DRIDRMServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_DRIDRMService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_DRIDRMService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_DRIDRMService_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_DRIDRMService methods ***/
#define IBDA_DRIDRMService_SetDRM(This,bstrNewDrm) (This)->lpVtbl->SetDRM(This,bstrNewDrm)
#define IBDA_DRIDRMService_GetDRMStatus(This,pbstrDrmUuidList,DrmUuid) (This)->lpVtbl->GetDRMStatus(This,pbstrDrmUuidList,DrmUuid)
#define IBDA_DRIDRMService_GetPairingStatus(This,penumPairingStatus) (This)->lpVtbl->GetPairingStatus(This,penumPairingStatus)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_DRIDRMService_QueryInterface(IBDA_DRIDRMService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_DRIDRMService_AddRef(IBDA_DRIDRMService* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_DRIDRMService_Release(IBDA_DRIDRMService* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_DRIDRMService methods ***/
static FORCEINLINE HRESULT IBDA_DRIDRMService_SetDRM(IBDA_DRIDRMService* This,BSTR bstrNewDrm) {
    return This->lpVtbl->SetDRM(This,bstrNewDrm);
}
static FORCEINLINE HRESULT IBDA_DRIDRMService_GetDRMStatus(IBDA_DRIDRMService* This,BSTR *pbstrDrmUuidList,GUID *DrmUuid) {
    return This->lpVtbl->GetDRMStatus(This,pbstrDrmUuidList,DrmUuid);
}
static FORCEINLINE HRESULT IBDA_DRIDRMService_GetPairingStatus(IBDA_DRIDRMService* This,BDA_DrmPairingError *penumPairingStatus) {
    return This->lpVtbl->GetPairingStatus(This,penumPairingStatus);
}
#endif
#endif

#endif


#endif  /* __IBDA_DRIDRMService_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_DRIWMDRMSession interface
 */
#ifndef __IBDA_DRIWMDRMSession_INTERFACE_DEFINED__
#define __IBDA_DRIWMDRMSession_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_DRIWMDRMSession, 0x05c690f8, 0x56db, 0x4bb2, 0xb0,0x53, 0x79,0xc1,0x20,0x98,0xbb,0x26);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("05c690f8-56db-4bb2-b053-79c12098bb26")
IBDA_DRIWMDRMSession : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AcknowledgeLicense(
        HRESULT hrLicenseAck) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProcessLicenseChallenge(
        DWORD dwcbLicenseMessage,
        BYTE *pbLicenseMessage,
        DWORD *pdwcbLicenseResponse,
        BYTE **ppbLicenseResponse) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProcessRegistrationChallenge(
        DWORD dwcbRegistrationMessage,
        BYTE *pbRegistrationMessage,
        DWORD *pdwcbRegistrationResponse,
        BYTE **ppbRegistrationResponse) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRevInfo(
        DWORD dwRevInfoLen,
        BYTE *pbRevInfo,
        DWORD *pdwResponse) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCrl(
        DWORD dwCrlLen,
        BYTE *pbCrlLen,
        DWORD *pdwResponse) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHMSAssociationData(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLastCardeaError(
        DWORD *pdwError) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_DRIWMDRMSession, 0x05c690f8, 0x56db, 0x4bb2, 0xb0,0x53, 0x79,0xc1,0x20,0x98,0xbb,0x26)
#endif
#else
typedef struct IBDA_DRIWMDRMSessionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_DRIWMDRMSession methods ***/
    HRESULT (STDMETHODCALLTYPE *AcknowledgeLicense)(
        IBDA_DRIWMDRMSession* This,
        HRESULT hrLicenseAck);

    HRESULT (STDMETHODCALLTYPE *ProcessLicenseChallenge)(
        IBDA_DRIWMDRMSession* This,
        DWORD dwcbLicenseMessage,
        BYTE *pbLicenseMessage,
        DWORD *pdwcbLicenseResponse,
        BYTE **ppbLicenseResponse);

    HRESULT (STDMETHODCALLTYPE *ProcessRegistrationChallenge)(
        IBDA_DRIWMDRMSession* This,
        DWORD dwcbRegistrationMessage,
        BYTE *pbRegistrationMessage,
        DWORD *pdwcbRegistrationResponse,
        BYTE **ppbRegistrationResponse);

    HRESULT (STDMETHODCALLTYPE *SetRevInfo)(
        IBDA_DRIWMDRMSession* This,
        DWORD dwRevInfoLen,
        BYTE *pbRevInfo,
        DWORD *pdwResponse);

    HRESULT (STDMETHODCALLTYPE *SetCrl)(
        IBDA_DRIWMDRMSession* This,
        DWORD dwCrlLen,
        BYTE *pbCrlLen,
        DWORD *pdwResponse);

    HRESULT (STDMETHODCALLTYPE *GetHMSAssociationData)(
        IBDA_DRIWMDRMSession* This);

    HRESULT (STDMETHODCALLTYPE *GetLastCardeaError)(
        IBDA_DRIWMDRMSession* This,
        DWORD *pdwError);

    END_INTERFACE
} IBDA_DRIWMDRMSessionVtbl;
interface IBDA_DRIWMDRMSession {
    CONST_VTBL IBDA_DRIWMDRMSessionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_DRIWMDRMSession_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_DRIWMDRMSession_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_DRIWMDRMSession_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_DRIWMDRMSession methods ***/
#define IBDA_DRIWMDRMSession_AcknowledgeLicense(This,hrLicenseAck) (This)->lpVtbl->AcknowledgeLicense(This,hrLicenseAck)
#define IBDA_DRIWMDRMSession_ProcessLicenseChallenge(This,dwcbLicenseMessage,pbLicenseMessage,pdwcbLicenseResponse,ppbLicenseResponse) (This)->lpVtbl->ProcessLicenseChallenge(This,dwcbLicenseMessage,pbLicenseMessage,pdwcbLicenseResponse,ppbLicenseResponse)
#define IBDA_DRIWMDRMSession_ProcessRegistrationChallenge(This,dwcbRegistrationMessage,pbRegistrationMessage,pdwcbRegistrationResponse,ppbRegistrationResponse) (This)->lpVtbl->ProcessRegistrationChallenge(This,dwcbRegistrationMessage,pbRegistrationMessage,pdwcbRegistrationResponse,ppbRegistrationResponse)
#define IBDA_DRIWMDRMSession_SetRevInfo(This,dwRevInfoLen,pbRevInfo,pdwResponse) (This)->lpVtbl->SetRevInfo(This,dwRevInfoLen,pbRevInfo,pdwResponse)
#define IBDA_DRIWMDRMSession_SetCrl(This,dwCrlLen,pbCrlLen,pdwResponse) (This)->lpVtbl->SetCrl(This,dwCrlLen,pbCrlLen,pdwResponse)
#define IBDA_DRIWMDRMSession_GetHMSAssociationData(This) (This)->lpVtbl->GetHMSAssociationData(This)
#define IBDA_DRIWMDRMSession_GetLastCardeaError(This,pdwError) (This)->lpVtbl->GetLastCardeaError(This,pdwError)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_DRIWMDRMSession_QueryInterface(IBDA_DRIWMDRMSession* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_DRIWMDRMSession_AddRef(IBDA_DRIWMDRMSession* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_DRIWMDRMSession_Release(IBDA_DRIWMDRMSession* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_DRIWMDRMSession methods ***/
static FORCEINLINE HRESULT IBDA_DRIWMDRMSession_AcknowledgeLicense(IBDA_DRIWMDRMSession* This,HRESULT hrLicenseAck) {
    return This->lpVtbl->AcknowledgeLicense(This,hrLicenseAck);
}
static FORCEINLINE HRESULT IBDA_DRIWMDRMSession_ProcessLicenseChallenge(IBDA_DRIWMDRMSession* This,DWORD dwcbLicenseMessage,BYTE *pbLicenseMessage,DWORD *pdwcbLicenseResponse,BYTE **ppbLicenseResponse) {
    return This->lpVtbl->ProcessLicenseChallenge(This,dwcbLicenseMessage,pbLicenseMessage,pdwcbLicenseResponse,ppbLicenseResponse);
}
static FORCEINLINE HRESULT IBDA_DRIWMDRMSession_ProcessRegistrationChallenge(IBDA_DRIWMDRMSession* This,DWORD dwcbRegistrationMessage,BYTE *pbRegistrationMessage,DWORD *pdwcbRegistrationResponse,BYTE **ppbRegistrationResponse) {
    return This->lpVtbl->ProcessRegistrationChallenge(This,dwcbRegistrationMessage,pbRegistrationMessage,pdwcbRegistrationResponse,ppbRegistrationResponse);
}
static FORCEINLINE HRESULT IBDA_DRIWMDRMSession_SetRevInfo(IBDA_DRIWMDRMSession* This,DWORD dwRevInfoLen,BYTE *pbRevInfo,DWORD *pdwResponse) {
    return This->lpVtbl->SetRevInfo(This,dwRevInfoLen,pbRevInfo,pdwResponse);
}
static FORCEINLINE HRESULT IBDA_DRIWMDRMSession_SetCrl(IBDA_DRIWMDRMSession* This,DWORD dwCrlLen,BYTE *pbCrlLen,DWORD *pdwResponse) {
    return This->lpVtbl->SetCrl(This,dwCrlLen,pbCrlLen,pdwResponse);
}
static FORCEINLINE HRESULT IBDA_DRIWMDRMSession_GetHMSAssociationData(IBDA_DRIWMDRMSession* This) {
    return This->lpVtbl->GetHMSAssociationData(This);
}
static FORCEINLINE HRESULT IBDA_DRIWMDRMSession_GetLastCardeaError(IBDA_DRIWMDRMSession* This,DWORD *pdwError) {
    return This->lpVtbl->GetLastCardeaError(This,pdwError);
}
#endif
#endif

#endif


#endif  /* __IBDA_DRIWMDRMSession_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_MUX interface
 */
#ifndef __IBDA_MUX_INTERFACE_DEFINED__
#define __IBDA_MUX_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_MUX, 0x942aafec, 0x4c05, 0x4c74, 0xb8,0xeb, 0x87,0x06,0xc2,0xa4,0x94,0x3f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("942aafec-4c05-4c74-b8eb-8706c2a4943f")
IBDA_MUX : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetPidList(
        ULONG ulPidListCount,
        BDA_MUX_PIDLISTITEM *pbPidListBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPidList(
        ULONG *pulPidListCount,
        BDA_MUX_PIDLISTITEM *pbPidListBuffer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_MUX, 0x942aafec, 0x4c05, 0x4c74, 0xb8,0xeb, 0x87,0x06,0xc2,0xa4,0x94,0x3f)
#endif
#else
typedef struct IBDA_MUXVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_MUX methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPidList)(
        IBDA_MUX* This,
        ULONG ulPidListCount,
        BDA_MUX_PIDLISTITEM *pbPidListBuffer);

    HRESULT (STDMETHODCALLTYPE *GetPidList)(
        IBDA_MUX* This,
        ULONG *pulPidListCount,
        BDA_MUX_PIDLISTITEM *pbPidListBuffer);

    END_INTERFACE
} IBDA_MUXVtbl;
interface IBDA_MUX {
    CONST_VTBL IBDA_MUXVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_MUX_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_MUX_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_MUX_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_MUX methods ***/
#define IBDA_MUX_SetPidList(This,ulPidListCount,pbPidListBuffer) (This)->lpVtbl->SetPidList(This,ulPidListCount,pbPidListBuffer)
#define IBDA_MUX_GetPidList(This,pulPidListCount,pbPidListBuffer) (This)->lpVtbl->GetPidList(This,pulPidListCount,pbPidListBuffer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_MUX_QueryInterface(IBDA_MUX* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_MUX_AddRef(IBDA_MUX* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_MUX_Release(IBDA_MUX* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_MUX methods ***/
static FORCEINLINE HRESULT IBDA_MUX_SetPidList(IBDA_MUX* This,ULONG ulPidListCount,BDA_MUX_PIDLISTITEM *pbPidListBuffer) {
    return This->lpVtbl->SetPidList(This,ulPidListCount,pbPidListBuffer);
}
static FORCEINLINE HRESULT IBDA_MUX_GetPidList(IBDA_MUX* This,ULONG *pulPidListCount,BDA_MUX_PIDLISTITEM *pbPidListBuffer) {
    return This->lpVtbl->GetPidList(This,pulPidListCount,pbPidListBuffer);
}
#endif
#endif

#endif


#endif  /* __IBDA_MUX_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_TransportStreamSelector interface
 */
#ifndef __IBDA_TransportStreamSelector_INTERFACE_DEFINED__
#define __IBDA_TransportStreamSelector_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_TransportStreamSelector, 0x1dcfafe9, 0xb45e, 0x41b3, 0xbb,0x2a, 0x56,0x1e,0xb1,0x29,0xae,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1dcfafe9-b45e-41b3-bb2a-561eb129ae98")
IBDA_TransportStreamSelector : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetTSID(
        USHORT usTSID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTSInformation(
        ULONG *pulTSInformationBufferLen,
        BYTE *pbTSInformationBuffer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_TransportStreamSelector, 0x1dcfafe9, 0xb45e, 0x41b3, 0xbb,0x2a, 0x56,0x1e,0xb1,0x29,0xae,0x98)
#endif
#else
typedef struct IBDA_TransportStreamSelectorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_TransportStreamSelector methods ***/
    HRESULT (STDMETHODCALLTYPE *SetTSID)(
        IBDA_TransportStreamSelector* This,
        USHORT usTSID);

    HRESULT (STDMETHODCALLTYPE *GetTSInformation)(
        IBDA_TransportStreamSelector* This,
        ULONG *pulTSInformationBufferLen,
        BYTE *pbTSInformationBuffer);

    END_INTERFACE
} IBDA_TransportStreamSelectorVtbl;
interface IBDA_TransportStreamSelector {
    CONST_VTBL IBDA_TransportStreamSelectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_TransportStreamSelector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_TransportStreamSelector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_TransportStreamSelector_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_TransportStreamSelector methods ***/
#define IBDA_TransportStreamSelector_SetTSID(This,usTSID) (This)->lpVtbl->SetTSID(This,usTSID)
#define IBDA_TransportStreamSelector_GetTSInformation(This,pulTSInformationBufferLen,pbTSInformationBuffer) (This)->lpVtbl->GetTSInformation(This,pulTSInformationBufferLen,pbTSInformationBuffer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_TransportStreamSelector_QueryInterface(IBDA_TransportStreamSelector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_TransportStreamSelector_AddRef(IBDA_TransportStreamSelector* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_TransportStreamSelector_Release(IBDA_TransportStreamSelector* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_TransportStreamSelector methods ***/
static FORCEINLINE HRESULT IBDA_TransportStreamSelector_SetTSID(IBDA_TransportStreamSelector* This,USHORT usTSID) {
    return This->lpVtbl->SetTSID(This,usTSID);
}
static FORCEINLINE HRESULT IBDA_TransportStreamSelector_GetTSInformation(IBDA_TransportStreamSelector* This,ULONG *pulTSInformationBufferLen,BYTE *pbTSInformationBuffer) {
    return This->lpVtbl->GetTSInformation(This,pulTSInformationBufferLen,pbTSInformationBuffer);
}
#endif
#endif

#endif


#endif  /* __IBDA_TransportStreamSelector_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDA_UserActivityService interface
 */
#ifndef __IBDA_UserActivityService_INTERFACE_DEFINED__
#define __IBDA_UserActivityService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDA_UserActivityService, 0x53b14189, 0xe478, 0x4b7a, 0xa1,0xff, 0x50,0x6d,0xb4,0xb9,0x9d,0xfe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("53b14189-e478-4b7a-a1ff-506db4b99dfe")
IBDA_UserActivityService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetCurrentTunerUseReason(
        DWORD dwUseReason) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUserActivityInterval(
        DWORD *pdwActivityInterval) = 0;

    virtual HRESULT STDMETHODCALLTYPE UserActivityDetected(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDA_UserActivityService, 0x53b14189, 0xe478, 0x4b7a, 0xa1,0xff, 0x50,0x6d,0xb4,0xb9,0x9d,0xfe)
#endif
#else
typedef struct IBDA_UserActivityServiceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDA_UserActivityService methods ***/
    HRESULT (STDMETHODCALLTYPE *SetCurrentTunerUseReason)(
        IBDA_UserActivityService* This,
        DWORD dwUseReason);

    HRESULT (STDMETHODCALLTYPE *GetUserActivityInterval)(
        IBDA_UserActivityService* This,
        DWORD *pdwActivityInterval);

    HRESULT (STDMETHODCALLTYPE *UserActivityDetected)(
        IBDA_UserActivityService* This);

    END_INTERFACE
} IBDA_UserActivityServiceVtbl;
interface IBDA_UserActivityService {
    CONST_VTBL IBDA_UserActivityServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDA_UserActivityService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDA_UserActivityService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDA_UserActivityService_Release(This) (This)->lpVtbl->Release(This)
/*** IBDA_UserActivityService methods ***/
#define IBDA_UserActivityService_SetCurrentTunerUseReason(This,dwUseReason) (This)->lpVtbl->SetCurrentTunerUseReason(This,dwUseReason)
#define IBDA_UserActivityService_GetUserActivityInterval(This,pdwActivityInterval) (This)->lpVtbl->GetUserActivityInterval(This,pdwActivityInterval)
#define IBDA_UserActivityService_UserActivityDetected(This) (This)->lpVtbl->UserActivityDetected(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDA_UserActivityService_QueryInterface(IBDA_UserActivityService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDA_UserActivityService_AddRef(IBDA_UserActivityService* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDA_UserActivityService_Release(IBDA_UserActivityService* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDA_UserActivityService methods ***/
static FORCEINLINE HRESULT IBDA_UserActivityService_SetCurrentTunerUseReason(IBDA_UserActivityService* This,DWORD dwUseReason) {
    return This->lpVtbl->SetCurrentTunerUseReason(This,dwUseReason);
}
static FORCEINLINE HRESULT IBDA_UserActivityService_GetUserActivityInterval(IBDA_UserActivityService* This,DWORD *pdwActivityInterval) {
    return This->lpVtbl->GetUserActivityInterval(This,pdwActivityInterval);
}
static FORCEINLINE HRESULT IBDA_UserActivityService_UserActivityDetected(IBDA_UserActivityService* This) {
    return This->lpVtbl->UserActivityDetected(This);
}
#endif
#endif

#endif


#endif  /* __IBDA_UserActivityService_INTERFACE_DEFINED__ */

#define SID_BDA_EasMessage __uuidof (IBDA_EasMessage)
#define SID_BDA_TransportStreamInfo __uuidof (IBDA_TransportStreamInfo)
#define SID_BDA_ConditionalAccess __uuidof (IBDA_ConditionalAccess)
#define SID_BDA_DiagnosticProperties __uuidof (IBDA_DiagnosticProperties)
#define SID_BDA_DRM __uuidof (IBDA_DRM)
#define SID_BDA_NameValueService __uuidof (IBDA_NameValueService)
#define SID_BDA_ConditionalAccessEx __uuidof (IBDA_ConditionalAccessEx)
#define SID_BDA_ISDBConditionalAccess __uuidof (IBDA_ISDBConditionalAccess)
#define SID_BDA_EventingService __uuidof (IBDA_EventingService)
#define SID_BDA_AUX __uuidof (IBDA_AUX)
#define SID_BDA_Encoder __uuidof (IBDA_Encoder)
#define SID_BDA_FDC __uuidof (IBDA_FDC
#define SID_BDA_GuideDataDeliveryService  __uuidof (IBDA_GuideDataDeliveryService)
#define SID_BDA_DRMService __uuidof (IBDA_DRMService)
#define SID_BDA_WMDRMSession __uuidof (IBDA_WMDRMSession)
#define SID_BDA_WMDRMTuner __uuidof (IBDA_WMDRMTuner)
#define SID_BDA_DRIDRMService __uuidof (IBDA_DRIDRMService)
#define SID_BDA_DRIWMDRMSession __uuidof (IBDA_DRIWMDRMSession)
#define SID_BDA_MUX __uuidof (IBDA_MUX)
#define SID_BDA_TransportStreamSelector __uuidof (IBDA_TransportStreamSelector)
#define SID_BDA_UserActivityService __uuidof (IBDA_UserActivityService)

DEFINE_GUID(CLSID_PBDA_Encoder_DATA_TYPE, 0x728fd6bc, 0x5546, 0x4716, 0xb1, 0x03, 0xf8, 0x99, 0xf5, 0xa1, 0xfa, 0x68);
DEFINE_GUID(CLSID_PBDA_FDC_DATA_TYPE, 0xe7dbf9a0, 0x22ab, 0x4047, 0x8e, 0x67, 0xef, 0x9a, 0xd5, 0x4, 0xe7, 0x29);
DEFINE_GUID(CLSID_PBDA_GDDS_DATA_TYPE, 0xC80C0DF3, 0x6052, 0x4c16, 0x9F, 0x56, 0xC4, 0x4C, 0x21, 0xF7, 0x3C, 0x45);
DEFINE_GUID(PBDA_AUX_CONNECTOR_TYPE_SVideo, 0xa0e905f4,0x24c9,0x4a54, 0xb7, 0x61, 0x21, 0x33, 0x55, 0xef, 0xc1, 0x3A);
DEFINE_GUID(PBDA_AUX_CONNECTOR_TYPE_Composite, 0xf6298b4c,0xc725,0x4d42, 0x84, 0x9b, 0x41, 0x0b, 0xbb, 0x14, 0xea, 0x62);
DEFINE_GUID(CLSID_PBDA_AUX_DATA_TYPE, 0xfd456373, 0x3323, 0x4090, 0xad, 0xca, 0x8e, 0xd4, 0x5f, 0x55, 0xcf, 0x10);
#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __bdaiface_h__ */
