1 /** 2 * This file has no copyright assigned and is placed in the Public Domain. 3 * This file is part of the mingw-w64 runtime package. 4 * No warranty is given; refer to the file DISCLAIMER.PD within this package. 5 */ 6 #ifndef __MSPCALL_H_ 7 #define __MSPCALL_H_ 8 9 class ATL_NO_VTABLE CMSPCallBase : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITStreamControl,&IID_ITStreamControl,&LIBID_TAPI3Lib> { 10 public: 11 DECLARE_POLY_AGGREGATABLE(CMSPCallBase) 12 BEGIN_COM_MAP(CMSPCallBase) 13 COM_INTERFACE_ENTRY(IDispatch) 14 COM_INTERFACE_ENTRY(ITStreamControl) 15 END_COM_MAP() 16 DECLARE_GET_CONTROLLING_UNKNOWN() 17 DECLARE_VQI() 18 CMSPCallBase(); 19 virtual ~CMSPCallBase(); 20 virtual ULONG MSPCallAddRef (void) = 0; 21 virtual ULONG MSPCallRelease (void) = 0; 22 STDMETHOD (CreateStream) (__LONG32 lMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream); 23 STDMETHOD (EnumerateStreams) (IEnumStream **ppEnumStream); 24 STDMETHOD (RemoveStream) (ITStream *pStream) = 0; 25 STDMETHOD (get_Streams) (VARIANT *pStreams); 26 virtual HRESULT Init(CMSPAddress *pMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType) = 0; 27 virtual HRESULT ShutDown() = 0; 28 virtual HRESULT ReceiveTSPCallData(PBYTE pBuffer,DWORD dwSize); 29 HRESULT HandleStreamEvent(MSPEVENTITEM *EventItem) const; 30 protected: 31 virtual HRESULT InternalCreateStream(DWORD dwMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream) = 0; 32 virtual HRESULT CreateStreamObject(DWORD dwMediaType,TERMINAL_DIRECTION Direction,IMediaEvent *pGraph,ITStream **ppStream) = 0; 33 protected: 34 CMSPAddress *m_pMSPAddress; 35 MSP_HANDLE m_htCall; 36 DWORD m_dwMediaType; 37 CMSPArray <ITStream *> m_Streams; 38 CMSPCritSection m_lock; 39 }; 40 41 class ATL_NO_VTABLE CMSPCallMultiGraph : public CMSPCallBase { 42 public: 43 typedef struct { 44 CMSPCallMultiGraph *pMSPCall; 45 ITStream *pITStream; 46 IMediaEvent *pIMediaEvent; 47 } MSPSTREAMCONTEXT,*PMSPSTREAMCONTEXT; 48 typedef struct _THREADPOOLWAITBLOCK { 49 HANDLE hWaitHandle; 50 MSPSTREAMCONTEXT *pContext; 51 WINBOOL operator ==(struct _THREADPOOLWAITBLOCK &t) { return ((hWaitHandle==t.hWaitHandle) && (pContext==t.pContext)); } 52 } THREADPOOLWAITBLOCK,*PTHREADPOOLWAITBLOCK; 53 public: 54 CMSPCallMultiGraph(); 55 virtual ~CMSPCallMultiGraph(); 56 STDMETHOD (RemoveStream) (ITStream *ppStream); 57 HRESULT Init(CMSPAddress *pMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType); 58 HRESULT ShutDown(); 59 static VOID NTAPI DispatchGraphEvent(VOID *pContext,BOOLEAN bFlag); 60 virtual VOID HandleGraphEvent(MSPSTREAMCONTEXT *pContext); 61 virtual HRESULT ProcessGraphEvent(ITStream *pITStream,__LONG32 lEventCode,LONG_PTR lParam1,LONG_PTR lParam2); 62 protected: 63 HRESULT RegisterWaitEvent(IMediaEvent *pIMediaEvent,ITStream *pITStream); 64 HRESULT UnregisterWaitEvent(int index); 65 virtual HRESULT InternalCreateStream(DWORD dwMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream); 66 protected: 67 CMSPArray <THREADPOOLWAITBLOCK> m_ThreadPoolWaitBlocks; 68 }; 69 70 struct MULTI_GRAPH_EVENT_DATA { 71 CMSPCallMultiGraph *pCall; 72 ITStream *pITStream; 73 __LONG32 lEventCode; 74 LONG_PTR lParam1; 75 LONG_PTR lParam2; 76 IMediaEvent *pIMediaEvent; 77 MULTI_GRAPH_EVENT_DATA() : pIMediaEvent(NULL),pITStream(NULL),lEventCode(0),lParam1(0),lParam2(0) { } 78 }; 79 80 DWORD WINAPI AsyncMultiGraphEvent(LPVOID pVoid); 81 #endif 82