| /** |
| * 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 |