/*
 * 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);
}
