mspcall.h 3.2 KB

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