/** * This file has no copyright assigned and is placed in the Public Domain. * This file is part of the mingw-w64 runtime package. * No warranty is given; refer to the file DISCLAIMER.PD within this package. */ #ifndef __MSPCALL_H_ #define __MSPCALL_H_ class ATL_NO_VTABLE CMSPCallBase : public CComObjectRootEx,public IDispatchImpl { public: DECLARE_POLY_AGGREGATABLE(CMSPCallBase) BEGIN_COM_MAP(CMSPCallBase) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ITStreamControl) END_COM_MAP() DECLARE_GET_CONTROLLING_UNKNOWN() DECLARE_VQI() CMSPCallBase(); virtual ~CMSPCallBase(); virtual ULONG MSPCallAddRef (void) = 0; virtual ULONG MSPCallRelease (void) = 0; STDMETHOD (CreateStream) (__LONG32 lMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream); STDMETHOD (EnumerateStreams) (IEnumStream **ppEnumStream); STDMETHOD (RemoveStream) (ITStream *pStream) = 0; STDMETHOD (get_Streams) (VARIANT *pStreams); virtual HRESULT Init(CMSPAddress *pMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType) = 0; virtual HRESULT ShutDown() = 0; virtual HRESULT ReceiveTSPCallData(PBYTE pBuffer,DWORD dwSize); HRESULT HandleStreamEvent(MSPEVENTITEM *EventItem) const; protected: virtual HRESULT InternalCreateStream(DWORD dwMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream) = 0; virtual HRESULT CreateStreamObject(DWORD dwMediaType,TERMINAL_DIRECTION Direction,IMediaEvent *pGraph,ITStream **ppStream) = 0; protected: CMSPAddress *m_pMSPAddress; MSP_HANDLE m_htCall; DWORD m_dwMediaType; CMSPArray m_Streams; CMSPCritSection m_lock; }; class ATL_NO_VTABLE CMSPCallMultiGraph : public CMSPCallBase { public: typedef struct { CMSPCallMultiGraph *pMSPCall; ITStream *pITStream; IMediaEvent *pIMediaEvent; } MSPSTREAMCONTEXT,*PMSPSTREAMCONTEXT; typedef struct _THREADPOOLWAITBLOCK { HANDLE hWaitHandle; MSPSTREAMCONTEXT *pContext; WINBOOL operator ==(struct _THREADPOOLWAITBLOCK &t) { return ((hWaitHandle==t.hWaitHandle) && (pContext==t.pContext)); } } THREADPOOLWAITBLOCK,*PTHREADPOOLWAITBLOCK; public: CMSPCallMultiGraph(); virtual ~CMSPCallMultiGraph(); STDMETHOD (RemoveStream) (ITStream *ppStream); HRESULT Init(CMSPAddress *pMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType); HRESULT ShutDown(); static VOID NTAPI DispatchGraphEvent(VOID *pContext,BOOLEAN bFlag); virtual VOID HandleGraphEvent(MSPSTREAMCONTEXT *pContext); virtual HRESULT ProcessGraphEvent(ITStream *pITStream,__LONG32 lEventCode,LONG_PTR lParam1,LONG_PTR lParam2); protected: HRESULT RegisterWaitEvent(IMediaEvent *pIMediaEvent,ITStream *pITStream); HRESULT UnregisterWaitEvent(int index); virtual HRESULT InternalCreateStream(DWORD dwMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream); protected: CMSPArray m_ThreadPoolWaitBlocks; }; struct MULTI_GRAPH_EVENT_DATA { CMSPCallMultiGraph *pCall; ITStream *pITStream; __LONG32 lEventCode; LONG_PTR lParam1; LONG_PTR lParam2; IMediaEvent *pIMediaEvent; MULTI_GRAPH_EVENT_DATA() : pIMediaEvent(NULL),pITStream(NULL),lEventCode(0),lParam1(0),lParam2(0) { } }; DWORD WINAPI AsyncMultiGraphEvent(LPVOID pVoid); #endif