diff fuhtark_test/include/winapi/mspcall.h @ 1500:91c8c3b7cbf0

add: futhark tests for generating vulkan api
author sam <sam@basx.dev>
date Wed, 26 Nov 2025 21:36:48 +0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fuhtark_test/include/winapi/mspcall.h	Wed Nov 26 21:36:48 2025 +0700
@@ -0,0 +1,76 @@
+#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) (long 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,long 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;
+  long 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