You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
6.5 KiB
258 lines
6.5 KiB
/*++
|
|
|
|
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_
|