/*
 * Copyright 2013 André Hentschel
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef DO_NO_IMPORTS
import "unknwn.idl";
import "strmif.idl";
import "bdatypes.h";
#endif

#include "bdaiface_enums.h"


[
    object,
    uuid(fd501041-8ebe-11ce-8183-00aa00577da2),
    pointer_default(unique)
]
interface IBDA_NetworkProvider : IUnknown
{
    HRESULT PutSignalSource([in] ULONG ulSignalSource);
    HRESULT GetSignalSource([in, out] ULONG *pulSignalSource);
    HRESULT GetNetworkType([in, out] GUID *pguidNetworkType);
    HRESULT PutTuningSpace([in] REFGUID guidTuningSpace);
    HRESULT GetTuningSpace([in, out] GUID *pguidTuingSpace);
    HRESULT RegisterDeviceFilter([in] IUnknown *pUnkFilterControl, [in, out] ULONG *ppvRegisitrationContext);
    HRESULT UnRegisterDeviceFilter([in] ULONG pvRegistrationContext);
}

[
    object,
    uuid(71985F43-1CA1-11d3-9CC8-00C04F7971E0),
    pointer_default(unique)
]
interface IBDA_EthernetFilter : IUnknown
{
    HRESULT GetMulticastListSize([in, out] ULONG *pulcbAddresses);
    HRESULT PutMulticastList([in] ULONG ulcbAddresses, [in, size_is(ulcbAddresses)] BYTE pAddressList []);
    HRESULT GetMulticastList([in, out] ULONG *pulcbAddresses, [in, out, size_is(*pulcbAddresses)] BYTE pAddressList[]);
    HRESULT PutMulticastMode([in] ULONG ulModeMask);
    HRESULT GetMulticastMode([out] ULONG *pulModeMask);
}

[
    object,
    uuid(71985F44-1CA1-11d3-9CC8-00C04F7971E0),
    pointer_default(unique)
]
interface IBDA_IPV4Filter : IUnknown
{
    HRESULT GetMulticastListSize([in, out] ULONG *pulcbAddresses);
    HRESULT PutMulticastList([in] ULONG ulcbAddresses, [in, size_is(ulcbAddresses)] BYTE pAddressList[]);
    HRESULT GetMulticastList([in, out] ULONG *pulcbAddresses,[out, size_is(*pulcbAddresses)] BYTE pAddressList[]);
    HRESULT PutMulticastMode([in] ULONG ulModeMask);
    HRESULT GetMulticastMode([out] ULONG* pulModeMask);
}

[
    object,
    uuid(E1785A74-2A23-4fb3-9245-A8F88017EF33),
    pointer_default(unique)
]
interface IBDA_IPV6Filter : IUnknown
{
    HRESULT GetMulticastListSize([in, out] ULONG *pulcbAddresses);
    HRESULT PutMulticastList([in] ULONG ulcbAddresses, [in, size_is(ulcbAddresses)] BYTE pAddressList[]);
    HRESULT GetMulticastList([in, out] ULONG *pulcbAddresses,[out, size_is(*pulcbAddresses)] BYTE pAddressList[]);
    HRESULT PutMulticastMode([in] ULONG ulModeMask);
    HRESULT GetMulticastMode([out] ULONG* pulModeMask);
}

[
    object,
    uuid(FD0A5AF3-B41D-11d2-9C95-00C04F7971E0),
    pointer_default(unique)
]
interface IBDA_DeviceControl : IUnknown
{
    HRESULT StartChanges(void);
    HRESULT CheckChanges(void);
    HRESULT CommitChanges(void);
    HRESULT GetChangeState([in, out] ULONG *pState);
}

[
    object,
    uuid(0DED49D5-A8B7-4d5d-97A1-12B0C195874D),
    pointer_default(unique)
]
interface IBDA_PinControl : IUnknown
{
    HRESULT GetPinID([in, out] ULONG *pulPinID);
    HRESULT GetPinType([in, out] ULONG *pulPinType);
    HRESULT RegistrationContext([in, out] ULONG *pulRegistrationCtx);
}

[
    object,
    uuid(D2F1644B-B409-11d2-BC69-00A0C9EE9E16),
    pointer_default(unique)
]
interface IBDA_SignalProperties : IUnknown
{
    HRESULT PutNetworkType([in] REFGUID guidNetworkType);
    HRESULT GetNetworkType([in, out] GUID *pguidNetworkType);
    HRESULT PutSignalSource([in] ULONG ulSignalSource);
    HRESULT GetSignalSource([in, out] ULONG *pulSignalSource);
    HRESULT PutTuningSpace([in] REFGUID guidTuningSpace);
    HRESULT GetTuningSpace([in, out] GUID *pguidTuingSpace);
}

[
    object,
    uuid(1347D106-CF3A-428a-A5CB-AC0D9A2A4338),
    pointer_default(unique)
]
interface IBDA_SignalStatistics : IUnknown
{
    HRESULT put_SignalStrength ([in] LONG lDbStrength);
    HRESULT get_SignalStrength ([in, out] LONG *plDbStrength);
    HRESULT put_SignalQuality ([in] LONG lPercentQuality);
    HRESULT get_SignalQuality ([in, out] LONG *plPercentQuality);
    HRESULT put_SignalPresent ([in] BOOLEAN fPresent);
    HRESULT get_SignalPresent ([in, out] BOOLEAN *pfPresent);
    HRESULT put_SignalLocked ([in] BOOLEAN fLocked);
    HRESULT get_SignalLocked ([in, out] BOOLEAN *pfLocked);
    HRESULT put_SampleTime ([in] LONG lmsSampleTime);
    HRESULT get_SampleTime ([in, out] LONG *plmsSampleTime);
}

[
    object,
    uuid(79B56888-7FEA-4690-B45D-38FD3C7849BE),
    pointer_default(unique)
]
interface IBDA_Topology : IUnknown
{
    HRESULT GetNodeTypes([in, out] ULONG *pulcNodeTypes,
                         [in] ULONG ulcNodeTypesMax,
                         [in, out, size_is (ulcNodeTypesMax)] ULONG rgulNodeTypes[]);
    HRESULT GetNodeDescriptors([in, out] ULONG *ulcNodeDescriptors,
                               [in] ULONG ulcNodeDescriptorsMax,
                               [in, out, size_is(ulcNodeDescriptorsMax)] BDANODE_DESCRIPTOR rgNodeDescriptors[]);
    HRESULT GetNodeInterfaces([in] ULONG ulNodeType,
                              [in, out] ULONG *pulcInterfaces,
                              [in] ULONG ulcInterfacesMax,
                              [in, out, size_is (ulcInterfacesMax)] GUID rgguidInterfaces[]);
    HRESULT GetPinTypes([in, out] ULONG *pulcPinTypes,
                        [in] ULONG ulcPinTypesMax,
                        [in, out, size_is (ulcPinTypesMax)] ULONG rgulPinTypes[]);
    HRESULT GetTemplateConnections([in, out] ULONG *pulcConnections,
                                   [in] ULONG ulcConnectionsMax,
                                   [in, out, size_is (ulcConnectionsMax)] BDA_TEMPLATE_CONNECTION rgConnections[]);
    HRESULT CreatePin([in] ULONG ulPinType, [in, out] ULONG *pulPinId);
    HRESULT DeletePin([in] ULONG ulPinId);
    HRESULT SetMediaType([in] ULONG ulPinId, [in] AM_MEDIA_TYPE *pMediaType);
    HRESULT SetMedium([in] ULONG ulPinId, [in] REGPINMEDIUM *pMedium);
    HRESULT CreateTopology([in] ULONG ulInputPinId, [in] ULONG ulOutputPinId);
    HRESULT GetControlNode([in] ULONG ulInputPinId,
                           [in] ULONG ulOutputPinId,
                           [in] ULONG ulNodeType,
                           [in, out] IUnknown **ppControlNode);
}

[
    object,
    uuid(71985F46-1CA1-11d3-9CC8-00C04F7971E0),
    pointer_default(unique)
]
interface IBDA_VoidTransform : IUnknown
{
    HRESULT Start(void);
    HRESULT Stop(void);
}

[
    object,
    uuid(DDF15B0D-BD25-11d2-9CA0-00C04F7971E0),
    pointer_default(unique)
]
interface IBDA_NullTransform : IUnknown
{
    HRESULT Start(void);
    HRESULT Stop(void);
}

[
    object,
    uuid(71985F47-1CA1-11d3-9CC8-00C04F7971E0),
    pointer_default(unique)
]
interface IBDA_FrequencyFilter : IUnknown
{
    HRESULT put_Autotune([in] ULONG ulTransponder);
    HRESULT get_Autotune([in, out] ULONG *pulTransponder);
    HRESULT put_Frequency([in] ULONG ulFrequency);
    HRESULT get_Frequency([in, out] ULONG *pulFrequency);
    HRESULT put_Polarity([in] Polarisation Polarity);
    HRESULT get_Polarity([in, out] Polarisation *pPolarity);
    HRESULT put_Range([in] ULONG ulRange);
    HRESULT get_Range([in, out] ULONG *pulRange);
    HRESULT put_Bandwidth([in] ULONG ulBandwidth);
    HRESULT get_Bandwidth([in, out] ULONG *pulBandwidth);
    HRESULT put_FrequencyMultiplier([in] ULONG ulMultiplier);
    HRESULT get_FrequencyMultiplier([in, out] ULONG *pulMultiplier);
}

[
    object,
    uuid(992CF102-49F9-4719-A664-C4F23E2408F4),
    pointer_default(unique)
]
interface IBDA_LNBInfo : IUnknown
{
    HRESULT put_LocalOscilatorFrequencyLowBand([in] ULONG ulLOFLow);
    HRESULT get_LocalOscilatorFrequencyLowBand([in, out] ULONG *pulLOFLow);
    HRESULT put_LocalOscilatorFrequencyHighBand([in] ULONG ulLOFHigh);
    HRESULT get_LocalOscilatorFrequencyHighBand([in, out] ULONG *pulLOFHigh);
    HRESULT put_HighLowSwitchFrequency([in] ULONG ulSwitchFrequency);
    HRESULT get_HighLowSwitchFrequency([in, out] ULONG *pulSwitchFrequency);
}

[
    object,
    uuid(F84E2AB0-3C6B-45e3-A0FC-8669D4B81F11),
    pointer_default(unique)
]
interface IBDA_DiseqCommand : IUnknown
{
    HRESULT put_EnableDiseqCommands([in] BOOLEAN bEnable);
    HRESULT put_DiseqLNBSource([in] ULONG ulLNBSource);
    HRESULT put_DiseqUseToneBurst([in] BOOLEAN bUseToneBurst);
    HRESULT put_DiseqRepeats([in] ULONG ulRepeats);
    HRESULT put_DiseqSendCommand([in] ULONG ulRequestId,
                                 [in] ULONG ulcbCommandLen,
                                 [in, size_is(ulcbCommandLen)] BYTE *pbCommand);
    HRESULT get_DiseqResponse([in] ULONG ulRequestId,
                              [in, out] ULONG *pulcbResponseLen,
                              [in, out, size_is(*pulcbResponseLen)] BYTE pbResponse[]);
}

[
    object,
    uuid(DDF15B12-BD25-11d2-9CA0-00C04F7971E0),
    pointer_default(unique)
]
interface IBDA_AutoDemodulate : IUnknown
{
    HRESULT put_AutoDemodulate(void);
}

[
    object,
    uuid(34518D13-1182-48e6-B28F-B24987787326),
    pointer_default(unique)
]
interface IBDA_AutoDemodulateEx : IBDA_AutoDemodulate
{
    HRESULT get_SupportedDeviceNodeTypes([in] ULONG ulcDeviceNodeTypesMax,
                                         [out] ULONG *pulcDeviceNodeTypes,
                                         [in, out] GUID *pguidDeviceNodeTypes);
    HRESULT get_SupportedVideoFormats([out] ULONG *pulAMTunerModeType,
                                      [out] ULONG *pulAnalogVideoStandard);
    HRESULT get_AuxInputCount([in, out] ULONG *pulCompositeCount,
                              [in, out] ULONG *pulSvideoCount);
}

[
    object,
    uuid(EF30F379-985B-4d10-B640-A79D5E04E1E0),
    pointer_default(unique)
]
interface IBDA_DigitalDemodulator : IUnknown
{
    HRESULT put_ModulationType([in] ModulationType *pModulationType);
    HRESULT get_ModulationType([in, out] ModulationType *pModulationType);
    HRESULT put_InnerFECMethod([in] FECMethod *pFECMethod);
    HRESULT get_InnerFECMethod([in, out] FECMethod *pFECMethod);
    HRESULT put_InnerFECRate([in] BinaryConvolutionCodeRate *pFECRate);
    HRESULT get_InnerFECRate([in, out] BinaryConvolutionCodeRate *pFECRate);
    HRESULT put_OuterFECMethod([in] FECMethod *pFECMethod);
    HRESULT get_OuterFECMethod([in, out] FECMethod *pFECMethod);
    HRESULT put_OuterFECRate([in] BinaryConvolutionCodeRate *pFECRate);
    HRESULT get_OuterFECRate([in, out] BinaryConvolutionCodeRate *pFECRate);
    HRESULT put_SymbolRate([in] ULONG *pSymbolRate);
    HRESULT get_SymbolRate([in, out] ULONG *pSymbolRate);
    HRESULT put_SpectralInversion([in] SpectralInversion *pSpectralInversion);
    HRESULT get_SpectralInversion([in, out] SpectralInversion *pSpectralInversion);
}

[
    object,
    uuid(525ED3EE-5CF3-4e1e-9A06-5368A84F9A6E),
    pointer_default(unique)
]
interface IBDA_DigitalDemodulator2 : IBDA_DigitalDemodulator
{
    HRESULT put_GuardInterval([in] GuardInterval *pGuardInterval);
    HRESULT get_GuardInterval([in, out] GuardInterval *pGuardInterval);
    HRESULT put_TransmissionMode([in] TransmissionMode *pTransmissionMode);
    HRESULT get_TransmissionMode([in, out] TransmissionMode *pTransmissionMode);
    HRESULT put_RollOff([in] RollOff *pRollOff);
    HRESULT get_RollOff([in, out] RollOff *pRollOff);
    HRESULT put_Pilot([in] Pilot *pPilot);
    HRESULT get_Pilot([in, out] Pilot *pPilot);
}

[
    object,
    uuid(13F19604-7D32-4359-93A2-A05205D90AC9),
    pointer_default(unique)
]
interface IBDA_DigitalDemodulator3 : IBDA_DigitalDemodulator2
{
    HRESULT put_SignalTimeouts([in] BDA_SIGNAL_TIMEOUTS *pSignalTimeouts);
    HRESULT get_SignalTimeouts([in, out] BDA_SIGNAL_TIMEOUTS *pSignalTimeouts);
    HRESULT put_PLPNumber([in] ULONG *pPLPNumber);
    HRESULT get_PLPNumber([in, out] ULONG *pPLPNumber);
}

[
    object,
    uuid(4B2BD7EA-8347-467b-8DBF-62F784929CC3),
    helpstring("ICCSubStreamFiltering Interface"),
    pointer_default(unique)
]
interface ICCSubStreamFiltering : IUnknown
{
    [propget, helpstring("property SubstreamTypes")] HRESULT SubstreamTypes([out, retval] long *pTypes);
    [propput, helpstring("property SubstreamTypes")] HRESULT SubstreamTypes([in] long Types);
}

[
    object,
    uuid(3F4DC8E2-4050-11d3-8F4B-00C04F7971E2),
    pointer_default(unique),
    helpstring("Not supported - Use IBDA_IPSinkInfo instead")
]
interface IBDA_IPSinkControl : IUnknown
{
    HRESULT GetMulticastList([in, out] unsigned long *pulcbSize, [in, out] BYTE **pbBuffer);
    HRESULT GetAdapterIPAddress ([in,out] unsigned long *pulcbSize, [in,out] BYTE **pbBuffer);
}

[
    object,
    uuid(A750108F-492E-4d51-95F7-649B23FF7AD7),
    pointer_default(unique)
]
interface IBDA_IPSinkInfo : IUnknown
{
    HRESULT get_MulticastList([in, out] ULONG *pulcbAddresses,
                              [out, size_is(*pulcbAddresses)] BYTE **ppbAddressList);
    HRESULT get_AdapterIPAddress([out] BSTR *pbstrBuffer);
    HRESULT get_AdapterDescription([out] BSTR *pbstrBuffer);
}

[
    object,
    uuid (afb6c2a2-2c41-11d3-8a60-0000f81e0e4a),
    pointer_default(unique)
]
interface IEnumPIDMap : IUnknown
{
    HRESULT Next([in] ULONG cRequest,
                 [in, out, size_is (cRequest)] PID_MAP *pPIDMap,
                 [out] ULONG *pcReceived);
    HRESULT Skip([in] ULONG cRecords);
    HRESULT Reset(void);
    HRESULT Clone([out] IEnumPIDMap **ppIEnumPIDMap);
}

[
    object,
    uuid (afb6c2a1-2c41-11d3-8a60-0000f81e0e4a),
    pointer_default(unique)
]
interface IMPEG2PIDMap : IUnknown
{
    HRESULT MapPID([in] ULONG culPID,
                   [in] ULONG *pulPID,
                   [in] MEDIA_SAMPLE_CONTENT MediaSampleContent);
    HRESULT UnmapPID([in] ULONG culPID, [in] ULONG *pulPID);
    HRESULT EnumPIDMap([out] IEnumPIDMap **pIEnumPIDMap);
}

[
    object,
    uuid(06FB45C1-693C-4ea7-B79F-7A6A54D8DEF2),
    helpstring("IFrequencyMap Interface"),
    pointer_default(unique),
    hidden, restricted
]
interface IFrequencyMap : IUnknown
{
    HRESULT get_FrequencyMapping([out] ULONG *ulCount, [out, size_is(1, *ulCount)] ULONG **ppulList);
    HRESULT put_FrequencyMapping([in] ULONG ulCount, [in, size_is(ulCount)] ULONG pList[]);
    HRESULT get_CountryCode([out] ULONG *pulCountryCode);
    HRESULT put_CountryCode([in] ULONG ulCountryCode);
    HRESULT get_DefaultFrequencyMapping([in] ULONG ulCountryCode,
                                        [out] ULONG *pulCount,
                                        [out, size_is(1, *pulCount)] ULONG **ppulList);
    HRESULT get_CountryCodeList([out] ULONG* pulCount, [out, size_is(1, *pulCount)] ULONG **ppulList);
}

[
    object,
    uuid(D806973D-3EBE-46de-8FBB-6358FE784208),
    helpstring("IBDA_EasMessage Interface"),
    pointer_default(unique),
    hidden, restricted
]
interface IBDA_EasMessage : IUnknown
{
    HRESULT get_EasMessage([in] ULONG ulEventID, [in, out] IUnknown **ppEASObject);
}

[
    object,
    uuid(8E882535-5F86-47AB-86CF-C281A72A0549),
    helpstring("IBDA_TransportStreamInfo Interface"),
    pointer_default(unique),
    hidden, restricted
]
interface IBDA_TransportStreamInfo : IUnknown
{
    HRESULT get_PatTableTickCount([out] ULONG *pPatTickCount);
}

[
    object,
    uuid(CD51F1E0-7BE9-4123-8482-A2A796C0A6B0),
    helpstring("IBDA_ConditionalAccess Interface"),
    pointer_default(unique)
]

interface IBDA_ConditionalAccess : IUnknown
{
    HRESULT get_SmartCardStatus([out] SmartCardStatusType *pCardStatus,
                                [out] SmartCardAssociationType *pCardAssociation,
                                [out] BSTR *pbstrCardError,
                                [out] VARIANT_BOOL *pfOOBLocked);
    HRESULT get_SmartCardInfo([out] BSTR *pbstrCardName,
                              [out] BSTR *pbstrCardManufacturer,
                              [out] VARIANT_BOOL *pfDaylightSavings,
                              [out] BYTE *pbyRatingRegion,
                              [out] LONG *plTimeZoneOffsetMinutes,
                              [out] BSTR *pbstrLanguage,
                              [out] EALocationCodeType  *pEALocationCode);
    HRESULT get_SmartCardApplications([in, out] ULONG *pulcApplications,
                                      [in] ULONG ulcApplicationsMax,
                                      [in, out, size_is(ulcApplicationsMax)] SmartCardApplication rgApplications[]);
    HRESULT get_Entitlement([in] USHORT usVirtualChannel, [out] EntitlementType *pEntitlement);
    HRESULT TuneByChannel([in] USHORT usVirtualChannel);
    HRESULT SetProgram([in] USHORT usProgramNumber);
    HRESULT AddProgram([in] USHORT usProgramNumber);
    HRESULT RemoveProgram([in] USHORT usProgramNumber);
    HRESULT GetModuleUI([in] BYTE byDialogNumber, [out] BSTR *pbstrURL);
    HRESULT InformUIClosed([in] BYTE byDialogNumber, [in] UICloseReasonType CloseReason);
}

[
    object,
    uuid(20e80cb5-c543-4c1b-8eb3-49e719eee7d4),
    helpstring("IBDA_DiagnosticProperties Interface"),
    pointer_default(unique),
]
interface IBDA_DiagnosticProperties : IPropertyBag
{
}

[
    object,
    uuid(F98D88B0-1992-4cd6-A6D9-B9AFAB99330D),
    helpstring("IBDA_DRM Interface"),
    pointer_default(unique),
]
interface IBDA_DRM : IUnknown
{
    HRESULT GetDRMPairingStatus([out] DWORD *pdwStatus, [out] HRESULT *phError);
    HRESULT PerformDRMPairing(BOOL fSync);
}

[
    object,
    uuid(7F0B3150-7B81-4ad4-98E3-7E9097094301),
    helpstring("IBDA_NameValueService Interface"),
    pointer_default(unique)
]
interface IBDA_NameValueService : IUnknown
{
    HRESULT GetValueNameByIndex([in] ULONG ulIndex, [out] BSTR *pbstrName);
    HRESULT GetValue([in]  BSTR bstrName, [in]  BSTR bstrLanguage, [out] BSTR *pbstrValue);
    HRESULT SetValue([in] ULONG ulDialogRequest, [in] BSTR bstrLanguage,
                     [in] BSTR bstrName, [in] BSTR bstrValue, [in] ULONG ulReserved);
}

[
    object,
    uuid(497C3418-23CB-44ba-BB62-769F506FCEA7),
    helpstring("IBDA_ConditionalAccessEx Interface"),
    pointer_default(unique)
]
interface IBDA_ConditionalAccessEx : IUnknown
{
    HRESULT CheckEntitlementToken([in] ULONG ulDialogRequest, [in] BSTR bstrLanguage,
                                  [in] BDA_CONDITIONALACCESS_REQUESTTYPE RequestType,
                                  [in] ULONG ulcbEntitlementTokenLen,
                                  [in, size_is(ulcbEntitlementTokenLen)] BYTE *pbEntitlementToken,
                                  [out] ULONG *pulDescrambleStatus);
    HRESULT SetCaptureToken([in] ULONG ulcbCaptureTokenLen,
                            [in, size_is(ulcbCaptureTokenLen)] BYTE *pbCaptureToken);
    HRESULT OpenBroadcastMmi([in] ULONG ulDialogRequest, [in] BSTR bstrLanguage, [in] ULONG EventId);
    HRESULT CloseMmiDialog([in] ULONG ulDialogRequest, [in] BSTR bstrLanguage,
                           [in] ULONG ulDialogNumber, [in] BDA_CONDITIONALACCESS_MMICLOSEREASON ReasonCode,
                           [out] ULONG *pulSessionResult);
    HRESULT CreateDialogRequestNumber([out] ULONG *pulDialogRequestNumber);
}

[
    object,
    uuid(5E68C627-16C2-4e6c-B1E2-D00170CDAA0F),
    helpstring("IBDA_ISDBConditionalAccess Interface"),
    pointer_default(unique)
]
interface IBDA_ISDBConditionalAccess : IUnknown
{
    HRESULT SetIsdbCasRequest([in] ULONG ulRequestId, [in] ULONG ulcbRequestBufferLen,
                              [in, size_is(ulcbRequestBufferLen)] BYTE *pbRequestBuffer);
}

[
    object,
    uuid(207C413F-00DC-4c61-BAD6-6FEE1FF07064),
    helpstring("IBDA_EventingService Interface"),
    pointer_default(unique)
]
interface IBDA_EventingService : IUnknown
{
    HRESULT CompleteEvent([in] ULONG ulEventID, [in] ULONG ulEventResult);
}

[
    object,
    uuid(7DEf4C09-6E66-4567-A819-F0E17F4A81AB),
    helpstring("IBDA_AUX Interface"),
    pointer_default(unique)
]
interface IBDA_AUX : IUnknown
{
    HRESULT QueryCapabilities([out] DWORD *pdwNumAuxInputsBSTR);
    HRESULT EnumCapability([in] DWORD dwIndex, [out] DWORD *dwInputID, [out] GUID *pConnectorType,
                           [out] DWORD *ConnTypeNum, [out] DWORD *NumVideoStds,
                           [out] ULONGLONG *AnalogStds);
}

[
    object,
    uuid(3a8bad59-59fe-4559-a0ba-396cfaa98ae3),
    helpstring("IBDA_ Encoder Interface"),
    pointer_default(unique)
]
interface IBDA_Encoder : IUnknown
{
    HRESULT QueryCapabilities([out] DWORD *NumAudioFmts, [out] DWORD *NumVideoFmts);
    HRESULT EnumAudioCapability([in] DWORD FmtIndex, [out] DWORD *MethodID,
                                [out] DWORD *AlgorithmType, [out] DWORD *SamplingRate,
                                [out] DWORD *BitDepth, [out] DWORD *NumChannels);
    HRESULT EnumVideoCapability([in] DWORD FmtIndex, [out] DWORD *MethodID,
                                [out] DWORD *AlgorithmType, [out] DWORD *VerticalSize,
                                [out] DWORD *HorizontalSize, [out] DWORD *AspectRatio,
                                [out] DWORD *FrameRateCode, [out] DWORD *ProgressiveSequence);
    HRESULT SetParameters([in] DWORD AudioBitrateMode, [in] DWORD AudioBitrate,
                          [in] DWORD AudioMethodID, [in] DWORD AudioProgram,
                          [in] DWORD VideoBitrateMode, [in] DWORD VideoBitrate,
                          [in] DWORD VideoMethodID);
    HRESULT GetState([out] DWORD *AudioBitrateMax, [out] DWORD *AudioBitrateMin,
                     [out] DWORD *AudioBitrateMode, [out] DWORD *AudioBitrateStepping,
                     [out] DWORD *AudioBitrate, [out] DWORD *AudioMethodID,
                     [out] DWORD *AvailableAudioPrograms, [out] DWORD *AudioProgram,
                     [out] DWORD *VideoBitrateMax, [out] DWORD *VideoBitrateMin,
                     [out] DWORD *VideoBitrateMode, [out] DWORD *VideoBitrate,
                     [out] DWORD *VideoBitrateStepping, [out] DWORD *VideoMethodID,
                     [out] DWORD *SignalSourceID, [out] ULONGLONG *SignalFormat,
                     [out] BOOL *SignalLock, [out] LONG *SignalLevel,
                     [out] DWORD *SignalToNoiseRatio);
}

[
    object,
    uuid(138adc7e-58ae-437f-b0b4-c9fe19d5b4ac),
    helpstring("IBDA_ FDC Interface"),
    pointer_default(unique)
]
interface IBDA_FDC : IUnknown
{
    HRESULT GetStatus([out] DWORD *CurrentBitrate, [out] BOOL *CarrierLock,
                      [out] DWORD *CurrentFrequency, [out] BOOL *CurrentSpectrumInversion,
                      [out] BSTR *CurrentPIDList, [out] BSTR *CurrentTIDList, [out] BOOL *Overflow);
    HRESULT RequestTables([in] BSTR TableIDs);
    HRESULT AddPid([in] BSTR PidsToAdd, [out] DWORD *RemainingFilterEntries);
    HRESULT RemovePid([in] BSTR PidsToRemove);
    HRESULT AddTid([in] BSTR TidsToAdd, [out] BSTR *CurrentTidList);
    HRESULT RemoveTid([in] BSTR TidsToRemove);
    HRESULT GetTableSection([out] DWORD *Pid, [in] DWORD MaxBufferSize,
                            [out] DWORD *ActualSize, [out] BYTE *SecBuffer);
}

[
    object,
    uuid(C0AFCB73-23E7-4bc6-BAFA-FDC167B4719F),
    helpstring("IBDA_ GuideDataDeliveryService Interface"),
    pointer_default(unique)
]
interface IBDA_GuideDataDeliveryService: IUnknown
{
    HRESULT GetGuideDataType([out] GUID *pguidDataType);
    HRESULT GetGuideData([in, out]  ULONG *pulcbBufferLen, [out] BYTE *pbBuffer,
                         [out] ULONG *pulGuideDataPercentageProgress);
    HRESULT RequestGuideDataUpdate(void);
    HRESULT GetTuneXmlFromServiceIdx([in]  ULONG64 ul64ServiceIdx, [out] BSTR *pbstrTuneXml);
    HRESULT GetServices([in, out]  ULONG *pulcbBufferLen, [out] BYTE *pbBuffer);
    HRESULT GetServiceInfoFromTuneXml([in]  BSTR bstrTuneXml, [out] BSTR *pbstrServiceDescription);
}

[
    object,
    uuid(BFF6B5BB-B0AE-484c-9DCA-73528FB0B46E),
    helpstring("IBDA_DRMService Interface"),
    pointer_default(unique)
]
interface IBDA_DRMService: IUnknown
{
    HRESULT SetDRM([in] GUID *puuidNewDrm);
    HRESULT GetDRMStatus([out] BSTR *pbstrDrmUuidList, [out] GUID *DrmUuid);
}

[
    object,
    uuid(4BE6FA3D-07CD-4139-8B80-8C18BA3AEC88),
    helpstring("IBDA_WMDRMSession Interface"),
    pointer_default(unique)
]
interface IBDA_WMDRMSession: IUnknown
{
    HRESULT GetStatus([out] ULONG *MaxCaptureToken, [out] ULONG *MaxStreamingPid,
                      [out] ULONG *MaxLicense, [out] ULONG *MinSecurityLevel,
                      [out] ULONG *RevInfoSequenceNumber, [out] ULONGLONG *RevInfoIssuedTime,
                      [out] ULONG *RevInfoTTL, [out] ULONG *RevListVersion, [out] ULONG *ulState);
    HRESULT SetRevInfo([in] ULONG ulRevInfoLen, [in, size_is(ulRevInfoLen)] BYTE* pbRevInfo);
    HRESULT SetCrl([in] ULONG ulCrlLen, [in, size_is(ulCrlLen)] BYTE *pbCrlLen);
    HRESULT TransactMessage([in] ULONG ulcbRequest, [in, size_is(ulcbRequest)] BYTE *pbRequest,
                            [in, out] ULONG *pulcbResponse, [in, out] BYTE *pbResponse);
    HRESULT GetLicense([in] GUID *uuidKey, [in, out] ULONG *pulPackageLen, [in, out] BYTE *pbPackage);
    HRESULT ReissueLicense([in] GUID *uuidKey);
    HRESULT RenewLicense([in] ULONG ulInXmrLicenseLen,
                         [in, size_is(ulInXmrLicenseLen)] BYTE *pbInXmrLicense,
                         [in] ULONG ulEntitlementTokenLen,
                         [in, size_is(ulEntitlementTokenLen)] BYTE *pbEntitlementToken,
                         [out] ULONG *pulDescrambleStatus, [in, out] ULONG *pulOutXmrLicenseLen,
                         [in, out] BYTE *pbOutXmrLicense);
    HRESULT GetKeyInfo([in, out] ULONG *pulKeyInfoLen, [in, out] BYTE *pbKeyInfo);
}

[
    object,
    uuid(86D979CF-A8A7-4f94-B5FB-14C0ACA68FE6),
    helpstring("IBDA_WMDRMTuner Interface"),
    pointer_default(unique)
]
interface IBDA_WMDRMTuner: IUnknown
{
    HRESULT PurchaseEntitlement([in] ULONG ulDialogRequest, [in] BSTR bstrLanguage,
                                [in] ULONG ulPurchaseTokenLen,
                                [in, size_is(ulPurchaseTokenLen)] BYTE *pbPurchaseToken,
                                [out] ULONG *pulDescrambleStatus,
                                [in, out] ULONG *pulCaptureTokenLen,
                                [in, out] BYTE *pbCaptureToken);
    HRESULT CancelCaptureToken([in] ULONG ulCaptureTokenLen,
                               [in, size_is(ulCaptureTokenLen)] BYTE *pbCaptureToken);
    HRESULT SetPidProtection([in] ULONG ulPid, [in] GUID *uuidKey);
    HRESULT GetPidProtection([in] ULONG pulPid, [out] GUID *uuidKey);
    HRESULT SetSyncValue([in] ULONG ulSyncValue);
    HRESULT GetStartCodeProfile([in, out] ULONG *pulStartCodeProfileLen,
                                [in, out] BYTE *pbStartCodeProfile);
}

[
    object,
    uuid(1F9BC2A5-44A3-4c52-AAB1-0BBCE5A1381D),
    helpstring("IBDA_DRIDRMService Interface"),
    pointer_default(unique)
]
interface IBDA_DRIDRMService: IUnknown
{
    HRESULT SetDRM([in] BSTR bstrNewDrm);
    HRESULT GetDRMStatus([out] BSTR *pbstrDrmUuidList, [out] GUID *DrmUuid);
    HRESULT GetPairingStatus([in, out] BDA_DrmPairingError *penumPairingStatus);
}

[
    object,
    uuid(05C690F8-56DB-4bb2-B053-79C12098BB26),
    helpstring("IBDA_DRIWMDRMSession Interface"),
    pointer_default(unique)
]
interface IBDA_DRIWMDRMSession: IUnknown
{
    HRESULT AcknowledgeLicense([in] HRESULT hrLicenseAck);
    HRESULT ProcessLicenseChallenge([in] DWORD dwcbLicenseMessage,
                                    [in, size_is(dwcbLicenseMessage)] BYTE *pbLicenseMessage,
                                    [in, out] DWORD *pdwcbLicenseResponse,
                                    [in, out, size_is(* pdwcbLicenseResponse)] BYTE **ppbLicenseResponse);
    HRESULT ProcessRegistrationChallenge([in] DWORD dwcbRegistrationMessage,
                                         [in, size_is(dwcbRegistrationMessage)] BYTE *pbRegistrationMessage,
                                         [in, out] DWORD *pdwcbRegistrationResponse,
                                         [in, out] BYTE **ppbRegistrationResponse);
    HRESULT SetRevInfo([in] DWORD dwRevInfoLen, [in, size_is(dwRevInfoLen)] BYTE *pbRevInfo,
                       [in, out] DWORD *pdwResponse);
    HRESULT SetCrl([in] DWORD dwCrlLen, [in, size_is(dwCrlLen)] BYTE *pbCrlLen,
                   [in, out] DWORD *pdwResponse);
    HRESULT GetHMSAssociationData(void);
    HRESULT GetLastCardeaError([in, out] DWORD *pdwError);
}

[
    object,
    uuid(942AAFEC-4C05-4c74-B8EB-8706C2A4943F),
    helpstring("IBDA_MUX Interface"),
    pointer_default(unique)
]
interface IBDA_MUX: IUnknown
{
    HRESULT SetPidList([in] ULONG ulPidListCount,
                       [in, size_is(ulPidListCount)] BDA_MUX_PIDLISTITEM *pbPidListBuffer);
    HRESULT GetPidList([in, out] ULONG *pulPidListCount,
                       [in, out] BDA_MUX_PIDLISTITEM *pbPidListBuffer);
}

[
    object,
    uuid(1DCFAFE9-B45E-41b3-BB2A-561EB129AE98),
    helpstring("IBDA_TransportStreamSelector Interface"),
    pointer_default(unique)
]
interface IBDA_TransportStreamSelector : IUnknown
{
    HRESULT SetTSID([in] USHORT usTSID);
    HRESULT GetTSInformation([in, out] ULONG *pulTSInformationBufferLen,
                             [out, size_is(*pulTSInformationBufferLen)] BYTE *pbTSInformationBuffer);
}

[
    object,
    uuid(53B14189-E478-4b7a-A1FF-506DB4B99DFE),
    helpstring("IBDA_UserActivityService Interface"),
    pointer_default(unique)
]
interface IBDA_UserActivityService: IUnknown
{
    HRESULT SetCurrentTunerUseReason([in] DWORD dwUseReason);
    HRESULT GetUserActivityInterval([out] DWORD *pdwActivityInterval);
    HRESULT UserActivityDetected(void);
}