|
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
MSPCall.h
Abstract:
Definitions for CMSPCall class.
--*/
#ifndef __MSPCALL_H_ #define __MSPCALL_H_
/*++
Class Description:
Represents a active call that has media streams.
--*/
class ATL_NO_VTABLE CMSPCallBase : public CComObjectRootEx<CComMultiThreadModelNoCS>, public IDispatchImpl<ITStreamControl, &IID_ITStreamControl, &LIBID_TAPI3Lib> { public:
// No need for free thread marshaling, because the MSP call object is // always aggregated by the TAPI3 call object.
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();
// // Private addref and release for the MSP call. See Platform SDK documentation. // virtual ULONG MSPCallAddRef (void) = 0; virtual ULONG MSPCallRelease (void) = 0;
// ITStreamControl methods, called by the app. STDMETHOD (CreateStream) ( IN long lMediaType, IN TERMINAL_DIRECTION Direction, IN OUT ITStream ** ppStream );
STDMETHOD (EnumerateStreams) ( OUT IEnumStream ** ppEnumStream );
STDMETHOD (RemoveStream) ( IN ITStream * pStream ) = 0;
STDMETHOD (get_Streams) ( OUT VARIANT * pStreams );
// methods called by the MSPAddress object. virtual HRESULT Init( IN CMSPAddress * pMSPAddress, IN MSP_HANDLE htCall, IN DWORD dwReserved, IN DWORD dwMediaType ) = 0;
virtual HRESULT ShutDown( ) = 0;
virtual HRESULT ReceiveTSPCallData( IN PBYTE pBuffer, IN DWORD dwSize );
// methods called by the MSPstream object. HRESULT HandleStreamEvent( IN MSPEVENTITEM * EventItem ) const;
protected: virtual HRESULT InternalCreateStream( IN DWORD dwMediaType, IN TERMINAL_DIRECTION Direction, IN OUT ITStream ** ppStream ) = 0;
virtual HRESULT CreateStreamObject( IN DWORD dwMediaType, IN TERMINAL_DIRECTION Direction, IN IMediaEvent * pGraph, IN ITStream ** ppStream ) = 0;
protected:
// The pointer to the address object. It is used to post events to TAPI3. // It also carries a refcount so that the address will not go away while // the call is still alive. CMSPAddress* m_pMSPAddress;
// The handle to the call in TAPI3. Used in firing call events. MSP_HANDLE m_htCall;
// The media type of this call. It is a bitmask of media types. DWORD m_dwMediaType;
// The list of stream objects in the call. CMSPArray <ITStream *> m_Streams;
// The lock that protects the stream lists. CMSPCritSection m_lock; };
/*++
Class Description:
Represents a call that uses one DirectShow filter graph for each stream.
--*/
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;
BOOL operator ==(struct _THREADPOOLWAITBLOCK &t) { return ((hWaitHandle == t.hWaitHandle) && (pContext == t.pContext)); }
} THREADPOOLWAITBLOCK, *PTHREADPOOLWAITBLOCK;
public: CMSPCallMultiGraph();
virtual ~CMSPCallMultiGraph();
// ITStreamControl methods (overriden)
STDMETHOD (RemoveStream) ( IN ITStream * ppStream );
// methods called by the MSPAddress object. (overriden) HRESULT Init( IN CMSPAddress * pMSPAddress, IN MSP_HANDLE htCall, IN DWORD dwReserved, IN DWORD dwMediaType );
HRESULT ShutDown( );
// methods called by the thread pool static VOID NTAPI DispatchGraphEvent( IN VOID * pContext, IN BOOLEAN bFlag );
virtual VOID HandleGraphEvent( IN MSPSTREAMCONTEXT * pContext );
virtual HRESULT ProcessGraphEvent( IN ITStream * pITStream, IN long lEventCode, IN LONG_PTR lParam1, IN LONG_PTR lParam2 );
protected: // helper function: HRESULT RegisterWaitEvent( IN IMediaEvent * pIMediaEvent, IN ITStream * pITStream );
HRESULT UnregisterWaitEvent( IN int index );
virtual HRESULT InternalCreateStream( IN DWORD dwMediaType, IN TERMINAL_DIRECTION Direction, IN OUT ITStream ** ppStream );
protected:
// The wait blocks store the information about the wait registered to // the thread pool. It includes the wait handles returned by the // RegisterWaitForSingleObject() call and a pointer to the context // structure. Each block in the array is for a graph in one of the // stream objects. The offset of a block in this array is the same // as the offset of the stream that owns the graph. CMSPArray <THREADPOOLWAITBLOCK> m_ThreadPoolWaitBlocks;
};
// // Event handling definitions. //
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 // __MSPCALL_H_
|