windows-nt/Source/XPSP1/NT/public/sdk/inc/mspcall.h
2020-09-26 16:20:57 +08:00

259 lines
6.3 KiB
C++

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