// // Copyright (c) Microsoft Corporation. All rights reserved. cpp_quote("/* Copyright (c) Microsoft Corporation. All rights reserved.*/") /////////////////////////////////////////////////////////////////////////// // msp.idl : IDL source for Media Service Provider interface ///////////////////////////////////////////////////////////////////////////// #ifndef __MEDIA_STREAM_PROVIDER_IDL__ #define __MEDIA_STREAM_PROVIDER_IDL__ import "tapi3if.idl"; ///////////////////////////////////////////////////////////////////////////// // Forward declarations ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Type definitions ///////////////////////////////////////////////////////////////////////////// typedef long * MSP_HANDLE; typedef enum { ADDRESS_TERMINAL_AVAILABLE, // new terminal arrived via PNP // ITTerminal * ADDRESS_TERMINAL_UNAVAILABLE, // terminal gone via PNP // ITTerminal * } MSP_ADDRESS_EVENT; typedef enum { // In each case the MSP fills in as much as much info as it can. Terminals // or error codes may not be available, in which case the MSP fills in zero. // The bare-bones info needed is indicated here. CALL_NEW_STREAM, // - a new stream is created by the call. The app can // choose to select a terminal or delete the stream from the call. // ITStream * CALL_STREAM_FAIL, // - setup of the stream failed or the stream fails to start. // ITStream * // Error code CALL_TERMINAL_FAIL, // - The terminal failed to connect. // ITTerminal * // Error code CALL_STREAM_NOT_USED, // - The stream is not used in the call (the remote // party rejected it). // ITStream * CALL_STREAM_ACTIVE, // - The app needs this event to decide when a // stream can be used to send and receive data. // It is fired when the streams enter running state // (the timing of which is determined by the TSP). // ITStream * CALL_STREAM_INACTIVE // - No more data can be sent to or received from // this stream. This happens when a send stream // has sent all its data, or when a receive stream // stops receiving data. // ITStream * } MSP_CALL_EVENT; typedef enum { CALL_CAUSE_UNKNOWN, CALL_CAUSE_BAD_DEVICE, // a bad device caused failure, for either STREAM_FAIL or TERMINAL_FAIL. CALL_CAUSE_CONNECT_FAIL, // either connecting the stream failed or connecting the terminal failed. // Note, if a terminal can not be connected to a stream, the app will get // a TERMINAL_FAIL event with CMC_CONNECT_FAIL. If this stream failed // because the terminal is the only one to use, the app will also get a // STREAM_FAIL event with CMC_CONNECT_FAIL. CALL_CAUSE_LOCAL_REQUEST, // the event is the result of the app’s calling a method on the stream. CALL_CAUSE_REMOTE_REQUEST, // the event is the result of the remote endpoint’s request. CALL_CAUSE_MEDIA_TIMEOUT, // the media that carries the stream is temporarily not available. CALL_CAUSE_MEDIA_RECOVERED, // the media goes back to normal from a temporary deny of service. CALL_CAUSE_QUALITY_OF_SERVICE // the event is because qos does/doesn't allow the media to send. } MSP_CALL_EVENT_CAUSE; typedef enum { ME_ADDRESS_EVENT, ME_CALL_EVENT, ME_TSP_DATA, ME_PRIVATE_EVENT, ME_ASR_TERMINAL_EVENT, ME_TTS_TERMINAL_EVENT, ME_FILE_TERMINAL_EVENT, ME_TONE_TERMINAL_EVENT } MSP_EVENT; typedef struct { DWORD dwSize; // total size MSP_EVENT Event; // event type MSP_HANDLE hCall; // may be NULL [switch_type(MSP_EVENT), switch_is((MSP_EVENT)Event)] union { [case(ME_ADDRESS_EVENT)] struct { MSP_ADDRESS_EVENT Type; ITTerminal * pTerminal; } MSP_ADDRESS_EVENT_INFO; [case(ME_CALL_EVENT)] struct { MSP_CALL_EVENT Type; MSP_CALL_EVENT_CAUSE Cause; ITStream * pStream; ITTerminal * pTerminal; HRESULT hrError; } MSP_CALL_EVENT_INFO; [case(ME_TSP_DATA)] struct { DWORD dwBufferSize; BYTE pBuffer[1]; } MSP_TSP_DATA; [case(ME_PRIVATE_EVENT)] struct { IDispatch * pEvent; long lEventCode; } MSP_PRIVATE_EVENT_INFO; [case(ME_FILE_TERMINAL_EVENT)] struct { ITTerminal * pParentFileTerminal; ITFileTrack * pFileTrack; TERMINAL_MEDIA_STATE TerminalMediaState; FT_STATE_EVENT_CAUSE ftecEventCause; HRESULT hrErrorCode; } MSP_FILE_TERMINAL_EVENT_INFO; [case(ME_ASR_TERMINAL_EVENT)] struct { ITTerminal * pASRTerminal; HRESULT hrErrorCode; } MSP_ASR_TERMINAL_EVENT_INFO; [case(ME_TTS_TERMINAL_EVENT)] struct { ITTerminal * pTTSTerminal; HRESULT hrErrorCode; } MSP_TTS_TERMINAL_EVENT_INFO; [case(ME_TONE_TERMINAL_EVENT)] struct { ITTerminal * pToneTerminal; HRESULT hrErrorCode; } MSP_TONE_TERMINAL_EVENT_INFO; }; } MSP_EVENT_INFO; ///////////////////////////////////////////////////////////////////////////// // Interface definitions ///////////////////////////////////////////////////////////////////////////// [ uuid(6E0887BE-BA1A-492e-BD10-4020EC5E33E0), helpstring("ITPluggableTerminalEventSink"), pointer_default(unique) ] interface ITPluggableTerminalEventSink : IUnknown { HRESULT FireEvent( [in] const MSP_EVENT_INFO *pMspEventInfo ); } [ uuid(F7115709-A216-4957-A759-060AB32A90D1), helpstring("ITPluggableTerminalEventSinkRegistration"), pointer_default(unique) ] interface ITPluggableTerminalEventSinkRegistration : IUnknown { HRESULT RegisterSink( [in] ITPluggableTerminalEventSink* pEventSink ); HRESULT UnregisterSink( ); } [ uuid(EE3BD600-3868-11D2-A045-00C04FB6809F), helpstring("ITMSPAddress Interface"), pointer_default(unique) ] interface ITMSPAddress : IUnknown { HRESULT Initialize( [in] MSP_HANDLE hEvent ); HRESULT Shutdown(); HRESULT CreateMSPCall( [in] MSP_HANDLE hCall, [in] DWORD dwReserved, [in] DWORD dwMediaType, [in] IUnknown * pOuterUnknown, [out] IUnknown ** ppStreamControl ); HRESULT ShutdownMSPCall( [in] IUnknown * pStreamControl ); HRESULT ReceiveTSPData( [in] IUnknown * pMSPCall, [in, size_is(dwSize)] BYTE * pBuffer, [in] DWORD dwSize ); HRESULT GetEvent( [in,out] DWORD * pdwSize, [in, out, size_is(*pdwSize)] byte * pEventBuffer ); } #endif // __MEDIA_STREAM_PROVIDER_IDL__