| /** | |
| * 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<CComMultiThreadModelNoCS>,public IDispatchImpl<ITStreamControl,&IID_ITStreamControl,&LIBID_TAPI3Lib> { | |
| 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 <ITStream *> 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 <THREADPOOLWAITBLOCK> 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 |