94 lines
3.1 KiB
C
94 lines
3.1 KiB
C
|
#ifndef _MSPSTRM_H_
|
||
|
#define _MSPSTRM_H_
|
||
|
|
||
|
#define STRM_INITIAL 0x00000000
|
||
|
#define STRM_TERMINALSELECTED 0x00000001
|
||
|
#define STRM_CONFIGURED 0x00000002
|
||
|
#define STRM_RUNNING 0x00000004
|
||
|
#define STRM_PAUSED 0x00000008
|
||
|
#define STRM_STOPPED 0x00000010
|
||
|
|
||
|
class CMSPStream;
|
||
|
|
||
|
class ATL_NO_VTABLE CPTEventSink : public CComObjectRootEx<CComMultiThreadModel>,public ITPluggableTerminalEventSink {
|
||
|
public:
|
||
|
CPTEventSink();
|
||
|
~CPTEventSink();
|
||
|
BEGIN_COM_MAP(CPTEventSink)
|
||
|
COM_INTERFACE_ENTRY(ITPluggableTerminalEventSink)
|
||
|
END_COM_MAP()
|
||
|
public:
|
||
|
STDMETHOD(FireEvent)(const MSP_EVENT_INFO *pMspEventInfo);
|
||
|
public:
|
||
|
HRESULT SetSinkStream(CMSPStream *pStream);
|
||
|
private:
|
||
|
struct AsyncEventStruct {
|
||
|
CMSPStream *pMSPStream;
|
||
|
MSPEVENTITEM *pEventItem;
|
||
|
AsyncEventStruct() : pMSPStream(NULL),pEventItem(NULL) {
|
||
|
LOG((MSP_TRACE,"AsyncEventStruct::AsyncEventStruct[%p]",this));
|
||
|
}
|
||
|
~AsyncEventStruct() {
|
||
|
pMSPStream = NULL;
|
||
|
pEventItem = NULL;
|
||
|
LOG((MSP_TRACE,"AsyncEventStruct::~AsyncEventStruct[%p]",this));
|
||
|
}
|
||
|
};
|
||
|
static DWORD WINAPI FireEventCallBack(LPVOID pEventStructure);
|
||
|
private:
|
||
|
CMSPStream *m_pMSPStream;
|
||
|
};
|
||
|
|
||
|
class ATL_NO_VTABLE CMSPStream : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITStream,&IID_ITStream,&LIBID_TAPI3Lib> {
|
||
|
public:
|
||
|
BEGIN_COM_MAP(CMSPStream)
|
||
|
COM_INTERFACE_ENTRY(IDispatch)
|
||
|
COM_INTERFACE_ENTRY(ITStream)
|
||
|
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
|
||
|
END_COM_MAP()
|
||
|
DECLARE_GET_CONTROLLING_UNKNOWN()
|
||
|
CMSPStream();
|
||
|
~CMSPStream();
|
||
|
virtual void FinalRelease();
|
||
|
STDMETHOD (get_MediaType) (long *plMediaType);
|
||
|
STDMETHOD (get_Direction) (TERMINAL_DIRECTION *pTerminalDirection);
|
||
|
STDMETHOD (get_Name) (BSTR *ppName) = 0;
|
||
|
STDMETHOD (SelectTerminal) (ITTerminal *pTerminal);
|
||
|
STDMETHOD (UnselectTerminal) (ITTerminal *pTerminal);
|
||
|
STDMETHOD (EnumerateTerminals) (IEnumTerminal **ppEnumTerminal);
|
||
|
STDMETHOD (get_Terminals) (VARIANT *pTerminals);
|
||
|
STDMETHOD (StartStream) ();
|
||
|
STDMETHOD (PauseStream) ();
|
||
|
STDMETHOD (StopStream) ();
|
||
|
virtual HRESULT Init(HANDLE hAddress,CMSPCallBase *pMSPCall,IMediaEvent *pGraph,DWORD dwMediaType,TERMINAL_DIRECTION Direction);
|
||
|
virtual HRESULT ShutDown();
|
||
|
virtual HRESULT GetState(DWORD *pdwStatus) { return E_NOTIMPL; }
|
||
|
virtual HRESULT HandleTSPData(BYTE *pData,DWORD dwSize);
|
||
|
virtual HRESULT ProcessGraphEvent(long lEventCode,LONG_PTR lParam1,LONG_PTR lParam2);
|
||
|
protected:
|
||
|
HRESULT RegisterPluggableTerminalEventSink(ITTerminal *pTerminal);
|
||
|
HRESULT UnregisterPluggableTerminalEventSink(ITTerminal *pTerminal);
|
||
|
HRESULT ReleaseSink();
|
||
|
ULONG InternalAddRef();
|
||
|
ULONG InternalRelease();
|
||
|
public:
|
||
|
HRESULT HandleSinkEvent(MSPEVENTITEM *pEventItem);
|
||
|
protected:
|
||
|
IUnknown *m_pFTM;
|
||
|
DWORD m_dwState;
|
||
|
DWORD m_dwMediaType;
|
||
|
TERMINAL_DIRECTION m_Direction;
|
||
|
HANDLE m_hAddress;
|
||
|
CMSPCallBase *m_pMSPCall;
|
||
|
IGraphBuilder *m_pIGraphBuilder;
|
||
|
IMediaControl *m_pIMediaControl;
|
||
|
CMSPArray <ITTerminal *> m_Terminals;
|
||
|
CMSPCritSection m_lock;
|
||
|
CMSPCritSection m_lockRefCount;
|
||
|
ITPluggableTerminalEventSink *m_pPTEventSink;
|
||
|
long m_lMyPersonalRefcount;
|
||
|
WINBOOL m_bFirstAddRef;
|
||
|
};
|
||
|
|
||
|
#endif
|