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

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

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

#ifndef __bdaiface_h__
#define __bdaiface_h__

/* Forward declarations */

#ifndef __IBDA_NetworkProvider_FWD_DEFINED__
#define __IBDA_NetworkProvider_FWD_DEFINED__
typedef interface IBDA_NetworkProvider IBDA_NetworkProvider;
#ifdef __cplusplus
interface IBDA_NetworkProvider;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_EthernetFilter_FWD_DEFINED__
#define __IBDA_EthernetFilter_FWD_DEFINED__
typedef interface IBDA_EthernetFilter IBDA_EthernetFilter;
#ifdef __cplusplus
interface IBDA_EthernetFilter;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_IPV4Filter_FWD_DEFINED__
#define __IBDA_IPV4Filter_FWD_DEFINED__
typedef interface IBDA_IPV4Filter IBDA_IPV4Filter;
#ifdef __cplusplus
interface IBDA_IPV4Filter;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_IPV6Filter_FWD_DEFINED__
#define __IBDA_IPV6Filter_FWD_DEFINED__
typedef interface IBDA_IPV6Filter IBDA_IPV6Filter;
#ifdef __cplusplus
interface IBDA_IPV6Filter;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_DeviceControl_FWD_DEFINED__
#define __IBDA_DeviceControl_FWD_DEFINED__
typedef interface IBDA_DeviceControl IBDA_DeviceControl;
#ifdef __cplusplus
interface IBDA_DeviceControl;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_PinControl_FWD_DEFINED__
#define __IBDA_PinControl_FWD_DEFINED__
typedef interface IBDA_PinControl IBDA_PinControl;
#ifdef __cplusplus
interface IBDA_PinControl;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_SignalProperties_FWD_DEFINED__
#define __IBDA_SignalProperties_FWD_DEFINED__
typedef interface IBDA_SignalProperties IBDA_SignalProperties;
#ifdef __cplusplus
interface IBDA_SignalProperties;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_SignalStatistics_FWD_DEFINED__
#define __IBDA_SignalStatistics_FWD_DEFINED__
typedef interface IBDA_SignalStatistics IBDA_SignalStatistics;
#ifdef __cplusplus
interface IBDA_SignalStatistics;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_Topology_FWD_DEFINED__
#define __IBDA_Topology_FWD_DEFINED__
typedef interface IBDA_Topology IBDA_Topology;
#ifdef __cplusplus
interface IBDA_Topology;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_VoidTransform_FWD_DEFINED__
#define __IBDA_VoidTransform_FWD_DEFINED__
typedef interface IBDA_VoidTransform IBDA_VoidTransform;
#ifdef __cplusplus
interface IBDA_VoidTransform;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_NullTransform_FWD_DEFINED__
#define __IBDA_NullTransform_FWD_DEFINED__
typedef interface IBDA_NullTransform IBDA_NullTransform;
#ifdef __cplusplus
interface IBDA_NullTransform;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_FrequencyFilter_FWD_DEFINED__
#define __IBDA_FrequencyFilter_FWD_DEFINED__
typedef interface IBDA_FrequencyFilter IBDA_FrequencyFilter;
#ifdef __cplusplus
interface IBDA_FrequencyFilter;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_LNBInfo_FWD_DEFINED__
#define __IBDA_LNBInfo_FWD_DEFINED__
typedef interface IBDA_LNBInfo IBDA_LNBInfo;
#ifdef __cplusplus
interface IBDA_LNBInfo;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_DiseqCommand_FWD_DEFINED__
#define __IBDA_DiseqCommand_FWD_DEFINED__
typedef interface IBDA_DiseqCommand IBDA_DiseqCommand;
#ifdef __cplusplus
interface IBDA_DiseqCommand;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_AutoDemodulate_FWD_DEFINED__
#define __IBDA_AutoDemodulate_FWD_DEFINED__
typedef interface IBDA_AutoDemodulate IBDA_AutoDemodulate;
#ifdef __cplusplus
interface IBDA_AutoDemodulate;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_AutoDemodulateEx_FWD_DEFINED__
#define __IBDA_AutoDemodulateEx_FWD_DEFINED__
typedef interface IBDA_AutoDemodulateEx IBDA_AutoDemodulateEx;
#ifdef __cplusplus
interface IBDA_AutoDemodulateEx;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_DigitalDemodulator_FWD_DEFINED__
#define __IBDA_DigitalDemodulator_FWD_DEFINED__
typedef interface IBDA_DigitalDemodulator IBDA_DigitalDemodulator;
#ifdef __cplusplus
interface IBDA_DigitalDemodulator;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_DigitalDemodulator2_FWD_DEFINED__
#define __IBDA_DigitalDemodulator2_FWD_DEFINED__
typedef interface IBDA_DigitalDemodulator2 IBDA_DigitalDemodulator2;
#ifdef __cplusplus
interface IBDA_DigitalDemodulator2;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_DigitalDemodulator3_FWD_DEFINED__
#define __IBDA_DigitalDemodulator3_FWD_DEFINED__
typedef interface IBDA_DigitalDemodulator3 IBDA_DigitalDemodulator3;
#ifdef __cplusplus
interface IBDA_DigitalDemodulator3;
#endif /* __cplusplus */
#endif

#ifndef __ICCSubStreamFiltering_FWD_DEFINED__
#define __ICCSubStreamFiltering_FWD_DEFINED__
typedef interface ICCSubStreamFiltering ICCSubStreamFiltering;
#ifdef __cplusplus
interface ICCSubStreamFiltering;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_IPSinkControl_FWD_DEFINED__
#define __IBDA_IPSinkControl_FWD_DEFINED__
typedef interface IBDA_IPSinkControl IBDA_IPSinkControl;
#ifdef __cplusplus
interface IBDA_IPSinkControl;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_IPSinkInfo_FWD_DEFINED__
#define __IBDA_IPSinkInfo_FWD_DEFINED__
typedef interface IBDA_IPSinkInfo IBDA_IPSinkInfo;
#ifdef __cplusplus
interface IBDA_IPSinkInfo;
#endif /* __cplusplus */
#endif

#ifndef __IEnumPIDMap_FWD_DEFINED__
#define __IEnumPIDMap_FWD_DEFINED__
typedef interface IEnumPIDMap IEnumPIDMap;
#ifdef __cplusplus
interface IEnumPIDMap;
#endif /* __cplusplus */
#endif

#ifndef __IMPEG2PIDMap_FWD_DEFINED__
#define __IMPEG2PIDMap_FWD_DEFINED__
typedef interface IMPEG2PIDMap IMPEG2PIDMap;
#ifdef __cplusplus
interface IMPEG2PIDMap;
#endif /* __cplusplus */
#endif

#ifndef __IFrequencyMap_FWD_DEFINED__
#define __IFrequencyMap_FWD_DEFINED__
typedef interface IFrequencyMap IFrequencyMap;
#ifdef __cplusplus
interface IFrequencyMap;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_EasMessage_FWD_DEFINED__
#define __IBDA_EasMessage_FWD_DEFINED__
typedef interface IBDA_EasMessage IBDA_EasMessage;
#ifdef __cplusplus
interface IBDA_EasMessage;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_TransportStreamInfo_FWD_DEFINED__
#define __IBDA_TransportStreamInfo_FWD_DEFINED__
typedef interface IBDA_TransportStreamInfo IBDA_TransportStreamInfo;
#ifdef __cplusplus
interface IBDA_TransportStreamInfo;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_ConditionalAccess_FWD_DEFINED__
#define __IBDA_ConditionalAccess_FWD_DEFINED__
typedef interface IBDA_ConditionalAccess IBDA_ConditionalAccess;
#ifdef __cplusplus
interface IBDA_ConditionalAccess;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_DiagnosticProperties_FWD_DEFINED__
#define __IBDA_DiagnosticProperties_FWD_DEFINED__
typedef interface IBDA_DiagnosticProperties IBDA_DiagnosticProperties;
#ifdef __cplusplus
interface IBDA_DiagnosticProperties;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_DRM_FWD_DEFINED__
#define __IBDA_DRM_FWD_DEFINED__
typedef interface IBDA_DRM IBDA_DRM;
#ifdef __cplusplus
interface IBDA_DRM;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_NameValueService_FWD_DEFINED__
#define __IBDA_NameValueService_FWD_DEFINED__
typedef interface IBDA_NameValueService IBDA_NameValueService;
#ifdef __cplusplus
interface IBDA_NameValueService;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_ConditionalAccessEx_FWD_DEFINED__
#define __IBDA_ConditionalAccessEx_FWD_DEFINED__
typedef interface IBDA_ConditionalAccessEx IBDA_ConditionalAccessEx;
#ifdef __cplusplus
interface IBDA_ConditionalAccessEx;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_ISDBConditionalAccess_FWD_DEFINED__
#define __IBDA_ISDBConditionalAccess_FWD_DEFINED__
typedef interface IBDA_ISDBConditionalAccess IBDA_ISDBConditionalAccess;
#ifdef __cplusplus
interface IBDA_ISDBConditionalAccess;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_EventingService_FWD_DEFINED__
#define __IBDA_EventingService_FWD_DEFINED__
typedef interface IBDA_EventingService IBDA_EventingService;
#ifdef __cplusplus
interface IBDA_EventingService;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_AUX_FWD_DEFINED__
#define __IBDA_AUX_FWD_DEFINED__
typedef interface IBDA_AUX IBDA_AUX;
#ifdef __cplusplus
interface IBDA_AUX;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_Encoder_FWD_DEFINED__
#define __IBDA_Encoder_FWD_DEFINED__
typedef interface IBDA_Encoder IBDA_Encoder;
#ifdef __cplusplus
interface IBDA_Encoder;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_FDC_FWD_DEFINED__
#define __IBDA_FDC_FWD_DEFINED__
typedef interface IBDA_FDC IBDA_FDC;
#ifdef __cplusplus
interface IBDA_FDC;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_GuideDataDeliveryService_FWD_DEFINED__
#define __IBDA_GuideDataDeliveryService_FWD_DEFINED__
typedef interface IBDA_GuideDataDeliveryService IBDA_GuideDataDeliveryService;
#ifdef __cplusplus
interface IBDA_GuideDataDeliveryService;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_DRMService_FWD_DEFINED__
#define __IBDA_DRMService_FWD_DEFINED__
typedef interface IBDA_DRMService IBDA_DRMService;
#ifdef __cplusplus
interface IBDA_DRMService;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_WMDRMSession_FWD_DEFINED__
#define __IBDA_WMDRMSession_FWD_DEFINED__
typedef interface IBDA_WMDRMSession IBDA_WMDRMSession;
#ifdef __cplusplus
interface IBDA_WMDRMSession;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_WMDRMTuner_FWD_DEFINED__
#define __IBDA_WMDRMTuner_FWD_DEFINED__
typedef interface IBDA_WMDRMTuner IBDA_WMDRMTuner;
#ifdef __cplusplus
interface IBDA_WMDRMTuner;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_DRIDRMService_FWD_DEFINED__
#define __IBDA_DRIDRMService_FWD_DEFINED__
typedef interface IBDA_DRIDRMService IBDA_DRIDRMService;
#ifdef __cplusplus
interface IBDA_DRIDRMService;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_DRIWMDRMSession_FWD_DEFINED__
#define __IBDA_DRIWMDRMSession_FWD_DEFINED__
typedef interface IBDA_DRIWMDRMSession IBDA_DRIWMDRMSession;
#ifdef __cplusplus
interface IBDA_DRIWMDRMSession;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_MUX_FWD_DEFINED__
#define __IBDA_MUX_FWD_DEFINED__
typedef interface IBDA_MUX IBDA_MUX;
#ifdef __cplusplus
interface IBDA_MUX;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_TransportStreamSelector_FWD_DEFINED__
#define __IBDA_TransportStreamSelector_FWD_DEFINED__
typedef interface IBDA_TransportStreamSelector IBDA_TransportStreamSelector;
#ifdef __cplusplus
interface IBDA_TransportStreamSelector;
#endif /* __cplusplus */
#endif

#ifndef __IBDA_UserActivityService_FWD_DEFINED__
#define __IBDA_UserActivityService_FWD_DEFINED__
typedef interface IBDA_UserActivityService IBDA_UserActivityService;
#ifdef __cplusplus
interface IBDA_UserActivityService;
#endif /* __cplusplus */
#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_00000017 {
    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__ */
