//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft shared
// source or premium shared source license agreement under which you licensed
// this source code. If you did not accept the terms of the license agreement,
// you are not authorized to use this source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the SOURCE.RTF on your install media or the root of your tools installation.
// THE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
//------------------------------------------------------------------------------
// File: BDAIface.idl
//
// Desc: This file defines the Ring 3 BDA interfaces that are common to
//       all BDA network and device types.
//
//       The interfaces specific to a particular Network Type or filter
//       implementation are defined in a separate include file for that
//       Network Type or filter implementation.
//
//------------------------------------------------------------------------------


//---------------------------------------------------------------------
// IUnknown import idl
//---------------------------------------------------------------------
#ifndef DO_NO_IMPORTS
import "unknwn.idl";
import "strmif.idl";
import "BdaTypes.h";
#endif

typedef struct
{
    CLSID clsMedium;
    DWORD dw1;
    DWORD dw2;
} 	REGPINMEDIUM;

//---------------------------------------------------------------------
//
//  IBDA_NetworkProvider interface
//
//  Implemented by a BDA Network Provider
//
//      Used by a BDA device filter to register itself with
//      a Network Provider and query information about the
//      the current tuning request.
//
//---------------------------------------------------------------------
[
    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
        );

}


//---------------------------------------------------------------------
//
//  IBDA_EthernetFilter interface
//
//  Implemented by a BDA Network Provider
//
//      Used by an Ethernet Network Data Sink filter (eg. IPSink) to
//      request that the Network Provider make its best effort to tune
//      to the stream(s) on which a list of Ethernet multicast addresses
//      may be transmitted.
//
//      Addresses in the address list are byte aligned in Network order.
//      UlcbAddresses will always be an integer multiple of the
//      size of an ethernet address.
//
//---------------------------------------------------------------------
[
    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,
        [out, size_is(*pulcbAddresses)] BYTE    pAddressList []
        );

    HRESULT
    PutMulticastMode (
        [in] ULONG      ulModeMask
        );

    HRESULT
    GetMulticastMode (
        [out] ULONG *   pulModeMask
        );

}



//---------------------------------------------------------------------
//
//  IBDA_IPV4Filter interface
//
//  Implemented by a BDA Network Provider
//
//      Used by an IPv4 Network Data Sink filter to request
//      that the Network Provider make its best effort to tune
//      to the stream(s) on which a list of IPv4 multicast addresses
//      may be transmitted.
//
//      Addresses in the address list are byte aligned in Network order.
//      UlcbAddresses will always be an integer multiple of the
//      size of an IPv4 address.
//
//---------------------------------------------------------------------
[
    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
        );
}



//---------------------------------------------------------------------
//
//  IBDA_IPV6Filter interface
//
//  Implemented by a BDA Network Provider
//
//      Used by an IPv6 Network Data Sink filter to request
//      that the Network Provider make its best effort to tune
//      to the stream(s) on which a list of IPv6 multicast addresses
//      may be transmitted.
//
//      Addresses in the address list are byte aligned in Network order.
//      UlcbAddresses will always be an integer multiple of the
//      size of an IPv6 address.
//
//---------------------------------------------------------------------
[
    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
        );
}



//---------------------------------------------------------------------
//
//  IBDA_DeviceControl interface
//
//  Implemented by a BDA Device Filter
//
//      Used by the Network Provider to commit a series of changes
//      on a BDA device filter.  The device filter validates and
//      accumulates all changes requested after StartChanges().  It
//      effects the accumulated list of changes when CommitChanges() is
//      called.
//
//---------------------------------------------------------------------
[
    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
        );

}



//---------------------------------------------------------------------
//
//  IBDA_PinControl interface
//
//  Implemented by a BDA Device Filter's Pin
//
//      Used by the Network Provider to determine the BDA PinID and
//      PinType on a BDA Filter's Pin
//
//---------------------------------------------------------------------
[
    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
        );
}



//---------------------------------------------------------------------
//
//  IBDA_SignalProperties interface
//
//  Implemented by a BDA Device Filter
//
//      BDA Signal Properties is used by a Network Provider to inform
//      a BDA Device Filter about the current tuning request.  The
//      Network Provider will call the Put functions when the BDA
//      device is first registered with the Network Provider and whenever
//      the current tuning request is modified.
//
//---------------------------------------------------------------------
[
    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
        );
}


//---------------------------------------------------------------------
//
//  IBDA_SignalStatistics interface
//
//  Implemented by a BDA Control Node
//
//      A BDA Control Node may return these properties to describe
//      the condition of a signal that is being received.
//
//
//
//
//---------------------------------------------------------------------
[
    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
        );
}


//---------------------------------------------------------------------
//
//  IBDA_Topology interface
//
//  Implemented by a BDA Device Filter
//
//      Used by the Network Provider to query a BDA Device Filter's
//      possible topologies (template topology) and to configure
//      the device with an appropriate topology for the current
//      tuning request.  It is also used to get an IUnknown to
//      a control node which may be used to set specific tuning
//      information.
//
//---------------------------------------------------------------------
[
    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
        );
}

//---------------------------------------------------------------------
// IBDA_VoidTransform interface
//---------------------------------------------------------------------
[
    object,
    uuid(71985F46-1CA1-11d3-9CC8-00C04F7971E0),
    pointer_default(unique)
]

interface IBDA_VoidTransform : IUnknown
{
    HRESULT
    Start (
        void
        );

    HRESULT
    Stop (
        void
        );

}

//---------------------------------------------------------------------
// IBDA_NullTransform interface
//---------------------------------------------------------------------
[
    object,
    uuid(DDF15B0D-BD25-11d2-9CA0-00C04F7971E0),
    pointer_default(unique)
]

interface IBDA_NullTransform : IUnknown
{
    HRESULT
    Start (
        void
        );

    HRESULT
    Stop (
        void
        );

}


//---------------------------------------------------------------------
// IBDA_FrequencyFilter interface
//---------------------------------------------------------------------
[
    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
        );
}


//---------------------------------------------------------------------
// IBDA_LNBInfo interface
//---------------------------------------------------------------------
[
    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
        );
}


//---------------------------------------------------------------------
// IBDA_AutoDemodulate interface
//---------------------------------------------------------------------
[
    object,
    uuid(DDF15B12-BD25-11d2-9CA0-00C04F7971E0),
    pointer_default(unique)
]

interface IBDA_AutoDemodulate : IUnknown
{
    HRESULT
    put_AutoDemodulate (
        void
        );
}

//---------------------------------------------------------------------
// IBDA_DigitalDemodulator interface
//---------------------------------------------------------------------
[
    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
        );
}

typedef enum
{
    KSPROPERTY_IPSINK_MULTICASTLIST,
    KSPROPERTY_IPSINK_ADAPTER_DESCRIPTION,
    KSPROPERTY_IPSINK_ADAPTER_ADDRESS

} KSPROPERTY_IPSINK;



//---------------------------------------------------------------------
// IBDA_IPSinkControl interface  (mutlimedia\filters.ks\ipsink)
// IBDA_IPSinkInfo    interface
//
//  IBDA_IPSinkControl is no longer being supported for Ring3 clients.
//  Use the BDA_IPSinkInfo interface instead.
//---------------------------------------------------------------------

[
    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 (                                             // returns  N 6-byte 802.3 IP addreses.
                [in, out] ULONG *                       pulcbAddresses,     // 6*N
                [out, size_is(*pulcbAddresses)] BYTE    **ppbAddressList    // Allocated by caller, must deallocate in callee with CoTaskMemFree()
    );

    HRESULT get_AdapterIPAddress (
                [out] BSTR *pbstrBuffer
    );

    HRESULT get_AdapterDescription (
                [out] BSTR *pbstrBuffer
    );
}
//
//  mpeg-2 demultiplexer-specific interfaces follow
//

//---------------------------------------------------------------------
// IEnumPIDMap interface
//---------------------------------------------------------------------

#ifdef REMOVE_THESE
typedef enum {
    MEDIA_TRANSPORT_PACKET,         //  complete TS packet e.g. pass-through mode
    MEDIA_ELEMENTARY_STREAM,        //  PES payloads; audio/video only
    MEDIA_MPEG2_PSI,                //  PAT, PMT, CAT, Private
    MEDIA_TRANSPORT_PAYLOAD         //  gathered TS packet payloads (PES packets, etc...)
} MEDIA_SAMPLE_CONTENT ;

typedef struct {
    ULONG                   ulPID ;
    MEDIA_SAMPLE_CONTENT    MediaSampleContent ;
} PID_MAP ;
#endif // REMOVE_THESE

[
    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 (
        ) ;

    HRESULT
    Clone (
        [out]   IEnumPIDMap **  ppIEnumPIDMap
        ) ;
} ;

//---------------------------------------------------------------------
// IMPEG2PIDMap interface
//---------------------------------------------------------------------

[
    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
        ) ;
} ;

//---------------------------------------------------------------------
// IFrequencyMap interface
// Currently implemented on the TIF. The interface can be QIed on the NP
//---------------------------------------------------------------------


    [
         object,
	 uuid(06FB45C1-693C-4ea7-B79F-7A6A54D8DEF2),
	 helpstring("IFrequencyMap Interface"),
	 pointer_default(unique),
        	 hidden, restricted
    ]

    interface IFrequencyMap : IUnknown
    {
	[helpstring("method get_FrequencyMapping")]
	HRESULT
	get_FrequencyMapping(
			     [out] ULONG* ulCount,
			     [out, size_is(1, *ulCount)] ULONG** ppulList
			     );
	[helpstring("method put_FrequencyMapping")]
	HRESULT
	put_FrequencyMapping(
			     [in] ULONG ulCount,
			     [in, size_is(ulCount)] ULONG pList[]
			     );
	[helpstring("method get_CountryCode")]
	HRESULT
	get_CountryCode(
			[out] ULONG *pulCountryCode
			);
	[helpstring("method put_CountryCode")]
	HRESULT
	put_CountryCode(
			[in] ULONG ulCountryCode
			);

       [helpstring("method get_DefaultFrequencyMapping")]
       HRESULT
       get_DefaultFrequencyMapping(
            [in] ULONG ulCountryCode,
            [out] ULONG* pulCount,
            [out, size_is(1, *pulCount)] ULONG** ppulList
            );


 	[helpstring("method get_CountryCodeList")]
    	HRESULT
    	get_CountryCodeList(
            [out] ULONG* pulCount,
            [out, size_is(1, *pulCount)] ULONG** ppulList
            );


    };



