///////////////////////////////////////////////////////////////////////////
// ipmsp.idl : IDL source for IP specific msp interfaces
/////////////////////////////////////////////////////////////////////////////

#ifndef __IPMSP_IDL__
#define __IPMSP_IDL__

import "tapi3if.idl";
import "strmif.idl";

// The maximum length of the info string is 256 bytes inluding EOS.
const unsigned long MAX_PARTICIPANT_TYPED_INFO_LENGTH		= 256; 

const unsigned long MAX_QOS_ID_LEN = 128; 

typedef enum PARTICIPANT_TYPED_INFO
{
    PTI_CANONICALNAME,
    PTI_NAME,
    PTI_EMAILADDRESS,
    PTI_PHONENUMBER,
    PTI_LOCATION,
    PTI_TOOL,
    PTI_NOTES,
    PTI_PRIVATE

} PARTICIPANT_TYPED_INFO;

typedef enum PARTICIPANT_EVENT
{
    PE_NEW_PARTICIPANT,
    PE_INFO_CHANGE,
    PE_PARTICIPANT_LEAVE,

    PE_NEW_SUBSTREAM,
    PE_SUBSTREAM_REMOVED,

    PE_SUBSTREAM_MAPPED,
    PE_SUBSTREAM_UNMAPPED,

    PE_PARTICIPANT_TIMEOUT,
    PE_PARTICIPANT_RECOVERED,

    PE_PARTICIPANT_ACTIVE,
    PE_PARTICIPANT_INACTIVE,

    PE_LOCAL_TALKING,
    PE_LOCAL_SILENT

} PARTICIPANT_EVENT;

[
    uuid(5899b820-5a34-11d2-95a0-00a0244d2298),
    helpstring("ITParticipant Interface"),
    pointer_default(unique),
    dual
]
interface ITParticipant : IDispatch
{
    [propget, id(1), helpstring("propertry ParticipantTypedInfo")]
    HRESULT ParticipantTypedInfo(
        [in] PARTICIPANT_TYPED_INFO InfoType,
        [out, retval] BSTR * ppInfo
        );

    [propget, id(2), helpstring("the media types of the participant")]
    HRESULT MediaTypes(
        [out, retval] long * plMediaType
        );

    [propput, id(3), helpstring("enable or disable a participant")]
    HRESULT Status(
        [in] ITStream * pITStream,
        [in] VARIANT_BOOL   fEnable
        );

    [propget, id(3), helpstring("the status of the participant")]
    HRESULT Status(
        [in] ITStream * pITStream,
        [out, retval] VARIANT_BOOL * pStatus
        );

    [propget, id(4), helpstring("an ITCollection of streams that have the participant")]
    HRESULT Streams(
        [out, retval] VARIANT * pVariant
        );

    [id(6), hidden]
    HRESULT EnumerateStreams(
        [out, retval] IEnumStream ** ppEnumStream
        );
}


cpp_quote("#ifndef STREAM_INTERFACES_DEFINED")
cpp_quote("#define STREAM_INTERFACES_DEFINED")

const DWORD MAX_DESCRIPTION_LEN = 256;

typedef struct _TAPI_AUDIO_STREAM_CONFIG_CAPS
{
	WCHAR Description[MAX_DESCRIPTION_LEN];
	ULONG MinimumChannels;
	ULONG MaximumChannels;
	ULONG ChannelsGranularity;
	ULONG MinimumBitsPerSample;
	ULONG MaximumBitsPerSample;
	ULONG BitsPerSampleGranularity;
	ULONG MinimumSampleFrequency;
	ULONG MaximumSampleFrequency;
	ULONG SampleFrequencyGranularity;
    ULONG MinimumAvgBytesPerSec;
    ULONG MaximumAvgBytesPerSec;
    ULONG AvgBytesPerSecGranularity;
} TAPI_AUDIO_STREAM_CONFIG_CAPS, *PTAPI_AUDIO_STREAM_CONFIG_CAPS;

typedef struct _TAPI_VIDEO_STREAM_CONFIG_CAPS
{
	WCHAR Description[MAX_DESCRIPTION_LEN];
	ULONG VideoStandard;
	SIZE InputSize;
	SIZE MinCroppingSize;
	SIZE MaxCroppingSize;
	int CropGranularityX;
	int CropGranularityY;
	int CropAlignX;
	int CropAlignY;
	SIZE MinOutputSize;
	SIZE MaxOutputSize;
	int OutputGranularityX;
	int OutputGranularityY;
	int StretchTapsX;
	int StretchTapsY;
	int ShrinkTapsX;
	int ShrinkTapsY;
	LONGLONG MinFrameInterval;
	LONGLONG MaxFrameInterval;
	LONG MinBitsPerSecond;
	LONG MaxBitsPerSecond;
} TAPI_VIDEO_STREAM_CONFIG_CAPS, *PTAPI_VIDEO_STREAM_CONFIG_CAPS;


typedef enum tagStreamConfigCapsType
{
	AudioStreamConfigCaps,
	VideoStreamConfigCaps
} StreamConfigCapsType;

typedef struct tagTAPI_STREAM_CONFIG_CAPS
{
	StreamConfigCapsType CapsType;
	union
	{
		TAPI_VIDEO_STREAM_CONFIG_CAPS VideoCap;
		TAPI_AUDIO_STREAM_CONFIG_CAPS AudioCap;
	};
} TAPI_STREAM_CONFIG_CAPS, *PTAPI_STREAM_CONFIG_CAPS;

typedef enum tagTAPIControlFlags
{
    TAPIControl_Flags_None   = 0x0000,
    TAPIControl_Flags_Auto   = 0x0001,
    TAPIControl_Flags_Manual = 0x0002

} TAPIControlFlags;

[
    object,
    local,
    uuid(6c0ab6c1-21e3-11d3-a577-00c04f8ef6e3),
    pointer_default(unique),
    hidden
]
interface ITFormatControl : IUnknown
{
    HRESULT GetCurrentFormat(
        [out] AM_MEDIA_TYPE **ppMediaType
        );

    HRESULT ReleaseFormat (
        [in] AM_MEDIA_TYPE *pMediaType
        );

    HRESULT GetNumberOfCapabilities(
        [out] DWORD *pdwCount
        );

    HRESULT GetStreamCaps(
        [in] DWORD dwIndex, 
        [out] AM_MEDIA_TYPE **ppMediaType, 
        [out] TAPI_STREAM_CONFIG_CAPS *pStreamConfigCaps, 
        [out] BOOL *pfEnabled
        );

    HRESULT ReOrderCapabilities(
        [in] DWORD *pdwIndices, 
        [in] BOOL *pfEnabled, 
        [in] BOOL *pfPublicize, 
        [in] DWORD dwNumIndices
        );
}

typedef enum tagStreamQualityProperty
{
    StreamQuality_MaxBitrate,
    StreamQuality_CurrBitrate,         // Read-Only
    StreamQuality_MinFrameInterval,
    StreamQuality_AvgFrameInterval, // Read-Only

} StreamQualityProperty;

[
    object,
    local,
    uuid(6c0ab6c2-21e3-11d3-a577-00c04f8ef6e3),
    pointer_default(unique),
    hidden
]
interface ITStreamQualityControl : IUnknown
{
    HRESULT GetRange(
        [in] StreamQualityProperty Property, 
        [out] long *plMin, 
        [out] long *plMax, 
        [out] long *plSteppingDelta, 
        [out] long *plDefault, 
        [out] TAPIControlFlags *plFlags
        );

    HRESULT Get(
        [in] StreamQualityProperty Property, 
        [out] long *plValue, 
        [out] TAPIControlFlags *plFlags
        );

    HRESULT Set(
        [in] StreamQualityProperty Property, 
        [in] long lValue, 
        [in] TAPIControlFlags lFlags
        );
}

typedef enum tagCallQualityProperty
{
    CallQuality_ControlInterval,
    CallQuality_ConfBitrate,            // confmsp and read-only
    CallQuality_MaxInputBitrate,        // read only
    CallQuality_CurrInputBitrate,       // Read-Only
    CallQuality_MaxOutputBitrate,
    CallQuality_CurrOutputBitrate,      // Read-Only
    CallQuality_MaxCPULoad,
    CallQuality_CurrCPULoad             // Read-Only

} CallQualityProperty;

[
    object,
    local,
    uuid(fe1d8ae0-edc4-49b5-8f8c-4de40f9cdfaf),
    pointer_default(unique),
    hidden
]
interface ITCallQualityControl : IUnknown
{
    HRESULT GetRange(
        [in] CallQualityProperty Property, 
        [out] long *plMin, 
        [out] long *plMax, 
        [out] long *plSteppingDelta, 
        [out] long *plDefault, 
        [out] TAPIControlFlags *plFlags
        );

    HRESULT Get(
        [in] CallQualityProperty Property, 
        [out] long *plValue, 
        [out] TAPIControlFlags *plFlags
        );

    HRESULT Set(
        [in] CallQualityProperty Property, 
        [in] long lValue, 
        [in] TAPIControlFlags lFlags
        );
}

typedef enum tagAudioDeviceProperty
{
    AudioDevice_DuplexMode,
    AudioDevice_AutomaticGainControl,
    AudioDevice_AcousticEchoCancellation

} AudioDeviceProperty;

[
    object,
    local,
    uuid(6c0ab6c5-21e3-11d3-a577-00c04f8ef6e3),
    pointer_default(unique),
    hidden
]
interface ITAudioDeviceControl : IUnknown
{
    HRESULT GetRange(
        [in] AudioDeviceProperty Property, 
        [out] long *plMin, 
        [out] long *plMax, 
        [out] long *plSteppingDelta, 
        [out] long *plDefault, 
        [out] TAPIControlFlags *plFlags
        );

    HRESULT Get(
            [in] AudioDeviceProperty Property, 
        [out] long *plValue, 
        [out] TAPIControlFlags *plFlags
        );

    HRESULT Set(
        [in] AudioDeviceProperty Property, 
        [in] long lValue, 
        [in] TAPIControlFlags lFlags
        );
}

typedef enum tagAudioSettingsProperty
{
    AudioSettings_SignalLevel,    // Read-Only
    AudioSettings_SilenceThreshold,
    AudioSettings_Volume,
    AudioSettings_Balance,
    AudioSettings_Loudness,
    AudioSettings_Treble,
    AudioSettings_Bass,
    AudioSettings_Mono

} AudioSettingsProperty;

[
    object,
    local,
    uuid(6c0ab6c6-21e3-11d3-a577-00c04f8ef6e3),
    pointer_default(unique),
    hidden
]
interface ITAudioSettings  : IUnknown
{
    HRESULT GetRange(
        [in] AudioSettingsProperty Property, 
        [out] long *plMin, 
        [out] long *plMax, 
        [out] long *plSteppingDelta, 
        [out] long *plDefault, 
        [out] TAPIControlFlags *plFlags
        );

    HRESULT Get(
        [in] AudioSettingsProperty Property, 
        [out] long *plValue, 
        [out] TAPIControlFlags *plFlags
        );

    HRESULT Set(
        [in] AudioSettingsProperty Property, 
        [in] long lValue, 
        [in] TAPIControlFlags lFlags
        );
}

[
    uuid(e8c89d27-a3bd-47d5-a6fc-d2ae40cdbc6e),
    helpstring("ITQOSApplicationID interface"),
    pointer_default(unique),
    dual
]
interface ITQOSApplicationID : IDispatch
{
    HRESULT SetQOSApplicationID(
        [in] BSTR pApplicationID,
        [in] BSTR pApplicationGUID,
        [in] BSTR pSubIDs
        );
}


cpp_quote("#endif // STREAM_INTERFACES_DEFINED")

cpp_quote("#ifndef RTP_MEDIATYPE_DEFINED")
cpp_quote("#define RTP_MEDIATYPE_DEFINED")
cpp_quote("struct DECLSPEC_UUID(\"14099BC0-787B-11d0-9CD3-00A0C9081C19\") MEDIATYPE_RTP_Single_Stream;")
cpp_quote("#endif //RTP_MEDIATYPE_DEFINED")

#endif // __H323_PRIVATE_IDL__
