/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error This stub requires an updated version of <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif

#ifndef __ipmsp_h__
#define __ipmsp_h__

#ifndef __ITParticipant_FWD_DEFINED__
#define __ITParticipant_FWD_DEFINED__
typedef struct ITParticipant ITParticipant;
#endif

#ifndef __ITFormatControl_FWD_DEFINED__
#define __ITFormatControl_FWD_DEFINED__
typedef struct ITFormatControl ITFormatControl;
#endif

#ifndef __ITStreamQualityControl_FWD_DEFINED__
#define __ITStreamQualityControl_FWD_DEFINED__
typedef struct ITStreamQualityControl ITStreamQualityControl;
#endif

#ifndef __ITCallQualityControl_FWD_DEFINED__
#define __ITCallQualityControl_FWD_DEFINED__
typedef struct ITCallQualityControl ITCallQualityControl;
#endif

#ifndef __ITAudioDeviceControl_FWD_DEFINED__
#define __ITAudioDeviceControl_FWD_DEFINED__
typedef struct ITAudioDeviceControl ITAudioDeviceControl;
#endif

#ifndef __ITAudioSettings_FWD_DEFINED__
#define __ITAudioSettings_FWD_DEFINED__
typedef struct ITAudioSettings ITAudioSettings;
#endif

#ifndef __ITQOSApplicationID_FWD_DEFINED__
#define __ITQOSApplicationID_FWD_DEFINED__
typedef struct ITQOSApplicationID ITQOSApplicationID;
#endif

#include "tapi3if.h"

#ifdef __cplusplus
extern "C"{
#endif

#ifndef __MIDL_user_allocate_free_DEFINED__
#define __MIDL_user_allocate_free_DEFINED__
  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);
#endif

#define MAX_PARTICIPANT_TYPED_INFO_LENGTH (256)

#define MAX_QOS_ID_LEN (128)

  typedef enum PARTICIPANT_TYPED_INFO {
    PTI_CANONICALNAME = 0,PTI_NAME = PTI_CANONICALNAME + 1,PTI_EMAILADDRESS = PTI_NAME + 1,PTI_PHONENUMBER = PTI_EMAILADDRESS + 1,
    PTI_LOCATION = PTI_PHONENUMBER + 1,PTI_TOOL = PTI_LOCATION + 1,PTI_NOTES = PTI_TOOL + 1,PTI_PRIVATE = PTI_NOTES + 1
  } PARTICIPANT_TYPED_INFO;

  typedef enum PARTICIPANT_EVENT {
    PE_NEW_PARTICIPANT = 0,PE_INFO_CHANGE = PE_NEW_PARTICIPANT + 1,PE_PARTICIPANT_LEAVE = PE_INFO_CHANGE + 1,
    PE_NEW_SUBSTREAM = PE_PARTICIPANT_LEAVE + 1,PE_SUBSTREAM_REMOVED = PE_NEW_SUBSTREAM + 1,PE_SUBSTREAM_MAPPED = PE_SUBSTREAM_REMOVED + 1,
    PE_SUBSTREAM_UNMAPPED = PE_SUBSTREAM_MAPPED + 1,PE_PARTICIPANT_TIMEOUT = PE_SUBSTREAM_UNMAPPED + 1,
    PE_PARTICIPANT_RECOVERED = PE_PARTICIPANT_TIMEOUT + 1,PE_PARTICIPANT_ACTIVE = PE_PARTICIPANT_RECOVERED + 1,
    PE_PARTICIPANT_INACTIVE = PE_PARTICIPANT_ACTIVE + 1,PE_LOCAL_TALKING = PE_PARTICIPANT_INACTIVE + 1,PE_LOCAL_SILENT = PE_LOCAL_TALKING + 1
  } PARTICIPANT_EVENT;

  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0000_v0_0_s_ifspec;

#ifndef __ITParticipant_INTERFACE_DEFINED__
#define __ITParticipant_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITParticipant;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITParticipant : public IDispatch {
  public:
    virtual HRESULT WINAPI get_ParticipantTypedInfo(PARTICIPANT_TYPED_INFO InfoType,BSTR *ppInfo) = 0;
    virtual HRESULT WINAPI get_MediaTypes(long *plMediaType) = 0;
    virtual HRESULT WINAPI put_Status(ITStream *pITStream,VARIANT_BOOL fEnable) = 0;
    virtual HRESULT WINAPI get_Status(ITStream *pITStream,VARIANT_BOOL *pStatus) = 0;
    virtual HRESULT WINAPI get_Streams(VARIANT *pVariant) = 0;
    virtual HRESULT WINAPI EnumerateStreams(IEnumStream **ppEnumStream) = 0;
  };
#else
  typedef struct ITParticipantVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITParticipant *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITParticipant *This);
      ULONG (WINAPI *Release)(ITParticipant *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ITParticipant *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ITParticipant *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ITParticipant *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ITParticipant *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_ParticipantTypedInfo)(ITParticipant *This,PARTICIPANT_TYPED_INFO InfoType,BSTR *ppInfo);
      HRESULT (WINAPI *get_MediaTypes)(ITParticipant *This,long *plMediaType);
      HRESULT (WINAPI *put_Status)(ITParticipant *This,ITStream *pITStream,VARIANT_BOOL fEnable);
      HRESULT (WINAPI *get_Status)(ITParticipant *This,ITStream *pITStream,VARIANT_BOOL *pStatus);
      HRESULT (WINAPI *get_Streams)(ITParticipant *This,VARIANT *pVariant);
      HRESULT (WINAPI *EnumerateStreams)(ITParticipant *This,IEnumStream **ppEnumStream);
    END_INTERFACE
  } ITParticipantVtbl;
  struct ITParticipant {
    CONST_VTBL struct ITParticipantVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITParticipant_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITParticipant_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITParticipant_Release(This) (This)->lpVtbl->Release(This)
#define ITParticipant_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITParticipant_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITParticipant_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITParticipant_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ITParticipant_get_ParticipantTypedInfo(This,InfoType,ppInfo) (This)->lpVtbl->get_ParticipantTypedInfo(This,InfoType,ppInfo)
#define ITParticipant_get_MediaTypes(This,plMediaType) (This)->lpVtbl->get_MediaTypes(This,plMediaType)
#define ITParticipant_put_Status(This,pITStream,fEnable) (This)->lpVtbl->put_Status(This,pITStream,fEnable)
#define ITParticipant_get_Status(This,pITStream,pStatus) (This)->lpVtbl->get_Status(This,pITStream,pStatus)
#define ITParticipant_get_Streams(This,pVariant) (This)->lpVtbl->get_Streams(This,pVariant)
#define ITParticipant_EnumerateStreams(This,ppEnumStream) (This)->lpVtbl->EnumerateStreams(This,ppEnumStream)
#endif
#endif
  HRESULT WINAPI ITParticipant_get_ParticipantTypedInfo_Proxy(ITParticipant *This,PARTICIPANT_TYPED_INFO InfoType,BSTR *ppInfo);
  void __RPC_STUB ITParticipant_get_ParticipantTypedInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITParticipant_get_MediaTypes_Proxy(ITParticipant *This,long *plMediaType);
  void __RPC_STUB ITParticipant_get_MediaTypes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITParticipant_put_Status_Proxy(ITParticipant *This,ITStream *pITStream,VARIANT_BOOL fEnable);
  void __RPC_STUB ITParticipant_put_Status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITParticipant_get_Status_Proxy(ITParticipant *This,ITStream *pITStream,VARIANT_BOOL *pStatus);
  void __RPC_STUB ITParticipant_get_Status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITParticipant_get_Streams_Proxy(ITParticipant *This,VARIANT *pVariant);
  void __RPC_STUB ITParticipant_get_Streams_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITParticipant_EnumerateStreams_Proxy(ITParticipant *This,IEnumStream **ppEnumStream);
  void __RPC_STUB ITParticipant_EnumerateStreams_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef STREAM_INTERFACES_DEFINED
#define STREAM_INTERFACES_DEFINED
#define MAX_DESCRIPTION_LEN (256)
  typedef struct _TAPI_AUDIO_STREAM_CONFIG_CAPS {
    WCHAR Description[256 ];
    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;

  typedef struct _TAPI_AUDIO_STREAM_CONFIG_CAPS *PTAPI_AUDIO_STREAM_CONFIG_CAPS;

  typedef struct _TAPI_VIDEO_STREAM_CONFIG_CAPS {
    WCHAR Description[256 ];
    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;

  typedef struct _TAPI_VIDEO_STREAM_CONFIG_CAPS *PTAPI_VIDEO_STREAM_CONFIG_CAPS;

  typedef enum tagStreamConfigCapsType {
    AudioStreamConfigCaps = 0,VideoStreamConfigCaps = AudioStreamConfigCaps + 1
  } 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;

  typedef struct tagTAPI_STREAM_CONFIG_CAPS *PTAPI_STREAM_CONFIG_CAPS;

  typedef enum tagTAPIControlFlags {
    TAPIControl_Flags_None = 0,TAPIControl_Flags_Auto = 0x1,TAPIControl_Flags_Manual = 0x2
  } TAPIControlFlags;

  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0502_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0502_v0_0_s_ifspec;

#ifndef __ITFormatControl_INTERFACE_DEFINED__
#define __ITFormatControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITFormatControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITFormatControl : public IUnknown {
  public:
    virtual HRESULT WINAPI GetCurrentFormat(AM_MEDIA_TYPE **ppMediaType) = 0;
    virtual HRESULT WINAPI ReleaseFormat(AM_MEDIA_TYPE *pMediaType) = 0;
    virtual HRESULT WINAPI GetNumberOfCapabilities(DWORD *pdwCount) = 0;
    virtual HRESULT WINAPI GetStreamCaps(DWORD dwIndex,AM_MEDIA_TYPE **ppMediaType,TAPI_STREAM_CONFIG_CAPS *pStreamConfigCaps,WINBOOL *pfEnabled) = 0;
    virtual HRESULT WINAPI ReOrderCapabilities(DWORD *pdwIndices,WINBOOL *pfEnabled,WINBOOL *pfPublicize,DWORD dwNumIndices) = 0;
  };
#else
  typedef struct ITFormatControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITFormatControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITFormatControl *This);
      ULONG (WINAPI *Release)(ITFormatControl *This);
      HRESULT (WINAPI *GetCurrentFormat)(ITFormatControl *This,AM_MEDIA_TYPE **ppMediaType);
      HRESULT (WINAPI *ReleaseFormat)(ITFormatControl *This,AM_MEDIA_TYPE *pMediaType);
      HRESULT (WINAPI *GetNumberOfCapabilities)(ITFormatControl *This,DWORD *pdwCount);
      HRESULT (WINAPI *GetStreamCaps)(ITFormatControl *This,DWORD dwIndex,AM_MEDIA_TYPE **ppMediaType,TAPI_STREAM_CONFIG_CAPS *pStreamConfigCaps,WINBOOL *pfEnabled);
      HRESULT (WINAPI *ReOrderCapabilities)(ITFormatControl *This,DWORD *pdwIndices,WINBOOL *pfEnabled,WINBOOL *pfPublicize,DWORD dwNumIndices);
    END_INTERFACE
  } ITFormatControlVtbl;
  struct ITFormatControl {
    CONST_VTBL struct ITFormatControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITFormatControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITFormatControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITFormatControl_Release(This) (This)->lpVtbl->Release(This)
#define ITFormatControl_GetCurrentFormat(This,ppMediaType) (This)->lpVtbl->GetCurrentFormat(This,ppMediaType)
#define ITFormatControl_ReleaseFormat(This,pMediaType) (This)->lpVtbl->ReleaseFormat(This,pMediaType)
#define ITFormatControl_GetNumberOfCapabilities(This,pdwCount) (This)->lpVtbl->GetNumberOfCapabilities(This,pdwCount)
#define ITFormatControl_GetStreamCaps(This,dwIndex,ppMediaType,pStreamConfigCaps,pfEnabled) (This)->lpVtbl->GetStreamCaps(This,dwIndex,ppMediaType,pStreamConfigCaps,pfEnabled)
#define ITFormatControl_ReOrderCapabilities(This,pdwIndices,pfEnabled,pfPublicize,dwNumIndices) (This)->lpVtbl->ReOrderCapabilities(This,pdwIndices,pfEnabled,pfPublicize,dwNumIndices)
#endif
#endif
  HRESULT WINAPI ITFormatControl_GetCurrentFormat_Proxy(ITFormatControl *This,AM_MEDIA_TYPE **ppMediaType);
  void __RPC_STUB ITFormatControl_GetCurrentFormat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITFormatControl_ReleaseFormat_Proxy(ITFormatControl *This,AM_MEDIA_TYPE *pMediaType);
  void __RPC_STUB ITFormatControl_ReleaseFormat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITFormatControl_GetNumberOfCapabilities_Proxy(ITFormatControl *This,DWORD *pdwCount);
  void __RPC_STUB ITFormatControl_GetNumberOfCapabilities_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITFormatControl_GetStreamCaps_Proxy(ITFormatControl *This,DWORD dwIndex,AM_MEDIA_TYPE **ppMediaType,TAPI_STREAM_CONFIG_CAPS *pStreamConfigCaps,WINBOOL *pfEnabled);
  void __RPC_STUB ITFormatControl_GetStreamCaps_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITFormatControl_ReOrderCapabilities_Proxy(ITFormatControl *This,DWORD *pdwIndices,WINBOOL *pfEnabled,WINBOOL *pfPublicize,DWORD dwNumIndices);
  void __RPC_STUB ITFormatControl_ReOrderCapabilities_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  typedef enum tagStreamQualityProperty {
    StreamQuality_MaxBitrate = 0,StreamQuality_CurrBitrate = StreamQuality_MaxBitrate + 1,StreamQuality_MinFrameInterval = StreamQuality_CurrBitrate + 1,
    StreamQuality_AvgFrameInterval = StreamQuality_MinFrameInterval + 1
  } StreamQualityProperty;

  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0503_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0503_v0_0_s_ifspec;

#ifndef __ITStreamQualityControl_INTERFACE_DEFINED__
#define __ITStreamQualityControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITStreamQualityControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITStreamQualityControl : public IUnknown {
  public:
    virtual HRESULT WINAPI GetRange(StreamQualityProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags) = 0;
    virtual HRESULT WINAPI Get(StreamQualityProperty Property,long *plValue,TAPIControlFlags *plFlags) = 0;
    virtual HRESULT WINAPI Set(StreamQualityProperty Property,long lValue,TAPIControlFlags lFlags) = 0;
  };
#else
  typedef struct ITStreamQualityControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITStreamQualityControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITStreamQualityControl *This);
      ULONG (WINAPI *Release)(ITStreamQualityControl *This);
      HRESULT (WINAPI *GetRange)(ITStreamQualityControl *This,StreamQualityProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags);
      HRESULT (WINAPI *Get)(ITStreamQualityControl *This,StreamQualityProperty Property,long *plValue,TAPIControlFlags *plFlags);
      HRESULT (WINAPI *Set)(ITStreamQualityControl *This,StreamQualityProperty Property,long lValue,TAPIControlFlags lFlags);
    END_INTERFACE
  } ITStreamQualityControlVtbl;
  struct ITStreamQualityControl {
    CONST_VTBL struct ITStreamQualityControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITStreamQualityControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITStreamQualityControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITStreamQualityControl_Release(This) (This)->lpVtbl->Release(This)
#define ITStreamQualityControl_GetRange(This,Property,plMin,plMax,plSteppingDelta,plDefault,plFlags) (This)->lpVtbl->GetRange(This,Property,plMin,plMax,plSteppingDelta,plDefault,plFlags)
#define ITStreamQualityControl_Get(This,Property,plValue,plFlags) (This)->lpVtbl->Get(This,Property,plValue,plFlags)
#define ITStreamQualityControl_Set(This,Property,lValue,lFlags) (This)->lpVtbl->Set(This,Property,lValue,lFlags)
#endif
#endif
  HRESULT WINAPI ITStreamQualityControl_GetRange_Proxy(ITStreamQualityControl *This,StreamQualityProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags);
  void __RPC_STUB ITStreamQualityControl_GetRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITStreamQualityControl_Get_Proxy(ITStreamQualityControl *This,StreamQualityProperty Property,long *plValue,TAPIControlFlags *plFlags);
  void __RPC_STUB ITStreamQualityControl_Get_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITStreamQualityControl_Set_Proxy(ITStreamQualityControl *This,StreamQualityProperty Property,long lValue,TAPIControlFlags lFlags);
  void __RPC_STUB ITStreamQualityControl_Set_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  typedef enum tagCallQualityProperty {
    CallQuality_ControlInterval = 0,CallQuality_ConfBitrate = CallQuality_ControlInterval + 1,CallQuality_MaxInputBitrate = CallQuality_ConfBitrate + 1,
    CallQuality_CurrInputBitrate = CallQuality_MaxInputBitrate + 1,CallQuality_MaxOutputBitrate = CallQuality_CurrInputBitrate + 1,
    CallQuality_CurrOutputBitrate = CallQuality_MaxOutputBitrate + 1,CallQuality_MaxCPULoad = CallQuality_CurrOutputBitrate + 1,
    CallQuality_CurrCPULoad = CallQuality_MaxCPULoad + 1
  } CallQualityProperty;

  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0504_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0504_v0_0_s_ifspec;

#ifndef __ITCallQualityControl_INTERFACE_DEFINED__
#define __ITCallQualityControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITCallQualityControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITCallQualityControl : public IUnknown {
  public:
    virtual HRESULT WINAPI GetRange(CallQualityProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags) = 0;
    virtual HRESULT WINAPI Get(CallQualityProperty Property,long *plValue,TAPIControlFlags *plFlags) = 0;
    virtual HRESULT WINAPI Set(CallQualityProperty Property,long lValue,TAPIControlFlags lFlags) = 0;
  };
#else
  typedef struct ITCallQualityControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITCallQualityControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITCallQualityControl *This);
      ULONG (WINAPI *Release)(ITCallQualityControl *This);
      HRESULT (WINAPI *GetRange)(ITCallQualityControl *This,CallQualityProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags);
      HRESULT (WINAPI *Get)(ITCallQualityControl *This,CallQualityProperty Property,long *plValue,TAPIControlFlags *plFlags);
      HRESULT (WINAPI *Set)(ITCallQualityControl *This,CallQualityProperty Property,long lValue,TAPIControlFlags lFlags);
    END_INTERFACE
  } ITCallQualityControlVtbl;
  struct ITCallQualityControl {
    CONST_VTBL struct ITCallQualityControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITCallQualityControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITCallQualityControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITCallQualityControl_Release(This) (This)->lpVtbl->Release(This)
#define ITCallQualityControl_GetRange(This,Property,plMin,plMax,plSteppingDelta,plDefault,plFlags) (This)->lpVtbl->GetRange(This,Property,plMin,plMax,plSteppingDelta,plDefault,plFlags)
#define ITCallQualityControl_Get(This,Property,plValue,plFlags) (This)->lpVtbl->Get(This,Property,plValue,plFlags)
#define ITCallQualityControl_Set(This,Property,lValue,lFlags) (This)->lpVtbl->Set(This,Property,lValue,lFlags)
#endif
#endif
  HRESULT WINAPI ITCallQualityControl_GetRange_Proxy(ITCallQualityControl *This,CallQualityProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags);
  void __RPC_STUB ITCallQualityControl_GetRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITCallQualityControl_Get_Proxy(ITCallQualityControl *This,CallQualityProperty Property,long *plValue,TAPIControlFlags *plFlags);
  void __RPC_STUB ITCallQualityControl_Get_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITCallQualityControl_Set_Proxy(ITCallQualityControl *This,CallQualityProperty Property,long lValue,TAPIControlFlags lFlags);
  void __RPC_STUB ITCallQualityControl_Set_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  typedef enum tagAudioDeviceProperty {
    AudioDevice_DuplexMode = 0,AudioDevice_AutomaticGainControl = AudioDevice_DuplexMode + 1,
    AudioDevice_AcousticEchoCancellation = AudioDevice_AutomaticGainControl + 1
  } AudioDeviceProperty;

  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0505_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0505_v0_0_s_ifspec;

#ifndef __ITAudioDeviceControl_INTERFACE_DEFINED__
#define __ITAudioDeviceControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITAudioDeviceControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITAudioDeviceControl : public IUnknown {
  public:
    virtual HRESULT WINAPI GetRange(AudioDeviceProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags) = 0;
    virtual HRESULT WINAPI Get(AudioDeviceProperty Property,long *plValue,TAPIControlFlags *plFlags) = 0;
    virtual HRESULT WINAPI Set(AudioDeviceProperty Property,long lValue,TAPIControlFlags lFlags) = 0;
  };
#else
  typedef struct ITAudioDeviceControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITAudioDeviceControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITAudioDeviceControl *This);
      ULONG (WINAPI *Release)(ITAudioDeviceControl *This);
      HRESULT (WINAPI *GetRange)(ITAudioDeviceControl *This,AudioDeviceProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags);
      HRESULT (WINAPI *Get)(ITAudioDeviceControl *This,AudioDeviceProperty Property,long *plValue,TAPIControlFlags *plFlags);
      HRESULT (WINAPI *Set)(ITAudioDeviceControl *This,AudioDeviceProperty Property,long lValue,TAPIControlFlags lFlags);
    END_INTERFACE
  } ITAudioDeviceControlVtbl;
  struct ITAudioDeviceControl {
    CONST_VTBL struct ITAudioDeviceControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITAudioDeviceControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITAudioDeviceControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITAudioDeviceControl_Release(This) (This)->lpVtbl->Release(This)
#define ITAudioDeviceControl_GetRange(This,Property,plMin,plMax,plSteppingDelta,plDefault,plFlags) (This)->lpVtbl->GetRange(This,Property,plMin,plMax,plSteppingDelta,plDefault,plFlags)
#define ITAudioDeviceControl_Get(This,Property,plValue,plFlags) (This)->lpVtbl->Get(This,Property,plValue,plFlags)
#define ITAudioDeviceControl_Set(This,Property,lValue,lFlags) (This)->lpVtbl->Set(This,Property,lValue,lFlags)
#endif
#endif
  HRESULT WINAPI ITAudioDeviceControl_GetRange_Proxy(ITAudioDeviceControl *This,AudioDeviceProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags);
  void __RPC_STUB ITAudioDeviceControl_GetRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITAudioDeviceControl_Get_Proxy(ITAudioDeviceControl *This,AudioDeviceProperty Property,long *plValue,TAPIControlFlags *plFlags);
  void __RPC_STUB ITAudioDeviceControl_Get_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITAudioDeviceControl_Set_Proxy(ITAudioDeviceControl *This,AudioDeviceProperty Property,long lValue,TAPIControlFlags lFlags);
  void __RPC_STUB ITAudioDeviceControl_Set_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  typedef enum tagAudioSettingsProperty {
    AudioSettings_SignalLevel = 0,AudioSettings_SilenceThreshold = AudioSettings_SignalLevel + 1,
    AudioSettings_Volume = AudioSettings_SilenceThreshold + 1,AudioSettings_Balance = AudioSettings_Volume + 1,
    AudioSettings_Loudness = AudioSettings_Balance + 1,AudioSettings_Treble = AudioSettings_Loudness + 1,AudioSettings_Bass = AudioSettings_Treble + 1,
    AudioSettings_Mono = AudioSettings_Bass + 1
  } AudioSettingsProperty;

  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0506_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0506_v0_0_s_ifspec;

#ifndef __ITAudioSettings_INTERFACE_DEFINED__
#define __ITAudioSettings_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITAudioSettings;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITAudioSettings : public IUnknown {
  public:
    virtual HRESULT WINAPI GetRange(AudioSettingsProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags) = 0;
    virtual HRESULT WINAPI Get(AudioSettingsProperty Property,long *plValue,TAPIControlFlags *plFlags) = 0;
    virtual HRESULT WINAPI Set(AudioSettingsProperty Property,long lValue,TAPIControlFlags lFlags) = 0;
  };
#else
  typedef struct ITAudioSettingsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITAudioSettings *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITAudioSettings *This);
      ULONG (WINAPI *Release)(ITAudioSettings *This);
      HRESULT (WINAPI *GetRange)(ITAudioSettings *This,AudioSettingsProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags);
      HRESULT (WINAPI *Get)(ITAudioSettings *This,AudioSettingsProperty Property,long *plValue,TAPIControlFlags *plFlags);
      HRESULT (WINAPI *Set)(ITAudioSettings *This,AudioSettingsProperty Property,long lValue,TAPIControlFlags lFlags);
    END_INTERFACE
  } ITAudioSettingsVtbl;
  struct ITAudioSettings {
    CONST_VTBL struct ITAudioSettingsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITAudioSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITAudioSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITAudioSettings_Release(This) (This)->lpVtbl->Release(This)
#define ITAudioSettings_GetRange(This,Property,plMin,plMax,plSteppingDelta,plDefault,plFlags) (This)->lpVtbl->GetRange(This,Property,plMin,plMax,plSteppingDelta,plDefault,plFlags)
#define ITAudioSettings_Get(This,Property,plValue,plFlags) (This)->lpVtbl->Get(This,Property,plValue,plFlags)
#define ITAudioSettings_Set(This,Property,lValue,lFlags) (This)->lpVtbl->Set(This,Property,lValue,lFlags)
#endif
#endif
  HRESULT WINAPI ITAudioSettings_GetRange_Proxy(ITAudioSettings *This,AudioSettingsProperty Property,long *plMin,long *plMax,long *plSteppingDelta,long *plDefault,TAPIControlFlags *plFlags);
  void __RPC_STUB ITAudioSettings_GetRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITAudioSettings_Get_Proxy(ITAudioSettings *This,AudioSettingsProperty Property,long *plValue,TAPIControlFlags *plFlags);
  void __RPC_STUB ITAudioSettings_Get_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITAudioSettings_Set_Proxy(ITAudioSettings *This,AudioSettingsProperty Property,long lValue,TAPIControlFlags lFlags);
  void __RPC_STUB ITAudioSettings_Set_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ITQOSApplicationID_INTERFACE_DEFINED__
#define __ITQOSApplicationID_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITQOSApplicationID;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITQOSApplicationID : public IDispatch {
  public:
    virtual HRESULT WINAPI SetQOSApplicationID(BSTR pApplicationID,BSTR pApplicationGUID,BSTR pSubIDs) = 0;
  };
#else
  typedef struct ITQOSApplicationIDVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITQOSApplicationID *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITQOSApplicationID *This);
      ULONG (WINAPI *Release)(ITQOSApplicationID *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ITQOSApplicationID *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ITQOSApplicationID *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ITQOSApplicationID *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ITQOSApplicationID *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *SetQOSApplicationID)(ITQOSApplicationID *This,BSTR pApplicationID,BSTR pApplicationGUID,BSTR pSubIDs);
    END_INTERFACE
  } ITQOSApplicationIDVtbl;
  struct ITQOSApplicationID {
    CONST_VTBL struct ITQOSApplicationIDVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITQOSApplicationID_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITQOSApplicationID_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITQOSApplicationID_Release(This) (This)->lpVtbl->Release(This)
#define ITQOSApplicationID_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITQOSApplicationID_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITQOSApplicationID_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITQOSApplicationID_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ITQOSApplicationID_SetQOSApplicationID(This,pApplicationID,pApplicationGUID,pSubIDs) (This)->lpVtbl->SetQOSApplicationID(This,pApplicationID,pApplicationGUID,pSubIDs)
#endif
#endif
  HRESULT WINAPI ITQOSApplicationID_SetQOSApplicationID_Proxy(ITQOSApplicationID *This,BSTR pApplicationID,BSTR pApplicationGUID,BSTR pSubIDs);
  void __RPC_STUB ITQOSApplicationID_SetQOSApplicationID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
#endif

#ifndef RTP_MEDIATYPE_DEFINED
#define RTP_MEDIATYPE_DEFINED
  struct MEDIATYPE_RTP_Single_Stream;
#endif
  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0508_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_ipmsp_0508_v0_0_s_ifspec;

  unsigned long __RPC_API BSTR_UserSize(unsigned long *,unsigned long,BSTR *);
  unsigned char *__RPC_API BSTR_UserMarshal(unsigned long *,unsigned char *,BSTR *);
  unsigned char *__RPC_API BSTR_UserUnmarshal(unsigned long *,unsigned char *,BSTR *);
  void __RPC_API BSTR_UserFree(unsigned long *,BSTR *);
  unsigned long __RPC_API VARIANT_UserSize(unsigned long *,unsigned long,VARIANT *);
  unsigned char *__RPC_API VARIANT_UserMarshal(unsigned long *,unsigned char *,VARIANT *);
  unsigned char *__RPC_API VARIANT_UserUnmarshal(unsigned long *,unsigned char *,VARIANT *);
  void __RPC_API VARIANT_UserFree(unsigned long *,VARIANT *);

#ifdef __cplusplus
}
#endif
#endif
