356 lines
9 KiB
C++
356 lines
9 KiB
C++
//
|
|
// FPTerm.h
|
|
//
|
|
|
|
#ifndef __FPTERMINAL__
|
|
#define __FPTERMINAL__
|
|
|
|
#include "MultiTrackTerminal.h"
|
|
|
|
#include "..\terminals\Storage\FPUnit.h"
|
|
#include "fpbridge.h"
|
|
|
|
extern const CLSID CLSID_FilePlaybackTerminalCOMClass;
|
|
|
|
typedef enum
|
|
{
|
|
TCS_NONE = 0,
|
|
TCS_TOBECREATED,
|
|
TCS_CREATED
|
|
} TRACK_CREATIONSTATE;
|
|
|
|
typedef struct
|
|
{
|
|
TRACK_CREATIONSTATE CreationState;
|
|
AM_MEDIA_TYPE* pMediaType;
|
|
} TRACK_INFO;
|
|
|
|
typedef enum
|
|
{
|
|
TRACK_AUDIO = 0,
|
|
TRACK_VIDEO
|
|
} TRACK_MEDIATYPE;
|
|
|
|
//
|
|
// FilePlayback Terminal
|
|
// This is the class that implements the multitrack termnal
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// Intermediate classes used for DISPID encoding
|
|
template <class T>
|
|
class ITMediaPlaybackVtbl : public ITMediaPlayback
|
|
{
|
|
};
|
|
|
|
template <class T>
|
|
class ITTerminalVtbl : public ITTerminal
|
|
{
|
|
};
|
|
|
|
template <class T>
|
|
class ITMediaControlVtbl : public ITMediaControl
|
|
{
|
|
};
|
|
|
|
|
|
//
|
|
// FilePlayback Terminal
|
|
// This is the class that implements the multitrack termnal
|
|
//
|
|
|
|
class CFPTerminal :
|
|
public CComCoClass<CFPTerminal, &CLSID_FilePlaybackTerminal>,
|
|
public IDispatchImpl<ITMediaPlaybackVtbl<CFPTerminal>, &IID_ITMediaPlayback, &LIBID_TAPI3Lib>,
|
|
public IDispatchImpl<ITTerminalVtbl<CFPTerminal>, &IID_ITTerminal, &LIBID_TAPI3Lib>,
|
|
public ITPluggableTerminalInitialization,
|
|
public ITPluggableTerminalEventSinkRegistration,
|
|
public IFPBridge,
|
|
public IDispatchImpl<ITMediaControlVtbl<CFPTerminal>, &IID_ITMediaControl, &LIBID_TAPI3Lib>,
|
|
public CMSPObjectSafetyImpl,
|
|
public CMultiTrackTerminal
|
|
{
|
|
public:
|
|
//
|
|
// Constructor / Destructor
|
|
//
|
|
CFPTerminal();
|
|
~CFPTerminal();
|
|
|
|
DECLARE_NOT_AGGREGATABLE(CFPTerminal)
|
|
DECLARE_GET_CONTROLLING_UNKNOWN()
|
|
|
|
virtual HRESULT FinalConstruct(void);
|
|
|
|
public:
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_FILE_PLAYBACK)
|
|
|
|
BEGIN_COM_MAP(CFPTerminal)
|
|
COM_INTERFACE_ENTRY2(IDispatch, ITTerminal)
|
|
COM_INTERFACE_ENTRY(ITMediaPlayback)
|
|
COM_INTERFACE_ENTRY(ITTerminal)
|
|
COM_INTERFACE_ENTRY(ITPluggableTerminalInitialization)
|
|
COM_INTERFACE_ENTRY(IObjectSafety)
|
|
COM_INTERFACE_ENTRY(ITMediaControl)
|
|
COM_INTERFACE_ENTRY(ITPluggableTerminalEventSinkRegistration)
|
|
COM_INTERFACE_ENTRY(IFPBridge)
|
|
COM_INTERFACE_ENTRY_CHAIN(CMultiTrackTerminal)
|
|
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pFTM)
|
|
END_COM_MAP()
|
|
|
|
// --- ITTeminal ---
|
|
|
|
STDMETHOD(get_TerminalClass)(
|
|
OUT BSTR *pVal);
|
|
|
|
STDMETHOD(get_TerminalType)(
|
|
OUT TERMINAL_TYPE *pVal);
|
|
|
|
STDMETHOD(get_State)(
|
|
OUT TERMINAL_STATE *pVal);
|
|
|
|
STDMETHOD(get_Name)(
|
|
OUT BSTR *pVal);
|
|
|
|
STDMETHOD(get_MediaType)(
|
|
OUT long * plMediaType);
|
|
|
|
STDMETHOD(get_Direction)(
|
|
OUT TERMINAL_DIRECTION *pDirection);
|
|
|
|
// --- ITMediaPlayback ---
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE put_PlayList(
|
|
IN VARIANTARG PlayListVariant
|
|
);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE get_PlayList(
|
|
OUT VARIANTARG* pPlayListVariant
|
|
);
|
|
|
|
// --- ITPluggableTerminalInitialization ---
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE InitializeDynamic (
|
|
IN IID iidTerminalClass,
|
|
IN DWORD dwMediaType,
|
|
IN TERMINAL_DIRECTION Direction,
|
|
IN MSP_HANDLE htAddress);
|
|
|
|
// --- ITMediaControl ---
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Start( void);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Stop( void);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Pause( void);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE get_MediaState(
|
|
OUT TERMINAL_MEDIA_STATE *pTerminalMediaState);
|
|
|
|
// --- CMultiTrackTerminal ---
|
|
virtual HRESULT STDMETHODCALLTYPE CreateTrackTerminal(
|
|
IN long MediaType,
|
|
IN TERMINAL_DIRECTION TerminalDirection,
|
|
OUT ITTerminal **ppTerminal
|
|
);
|
|
|
|
// this function is not accessible on the playback terminal
|
|
// so override it to retutn E_NOTSUPPORTED
|
|
virtual HRESULT STDMETHODCALLTYPE RemoveTrackTerminal(
|
|
IN ITTerminal * pTrackTerminalToRemove
|
|
);
|
|
|
|
|
|
// --- ITPluggableTerminalEventSinkRegistration ---
|
|
STDMETHOD(RegisterSink)(
|
|
IN ITPluggableTerminalEventSink *pSink
|
|
);
|
|
|
|
STDMETHOD(UnregisterSink)();
|
|
|
|
// --- IFPBridge ---
|
|
STDMETHOD(Deliver)(
|
|
IN long nMediaType,
|
|
IN IMediaSample* pSample
|
|
);
|
|
|
|
//
|
|
// IDispatch methods
|
|
//
|
|
|
|
STDMETHOD(GetIDsOfNames)(REFIID riid,
|
|
LPOLESTR* rgszNames,
|
|
UINT cNames,
|
|
LCID lcid,
|
|
DISPID* rgdispid
|
|
);
|
|
|
|
STDMETHOD(Invoke)(DISPID dispidMember,
|
|
REFIID riid,
|
|
LCID lcid,
|
|
WORD wFlags,
|
|
DISPPARAMS* pdispparams,
|
|
VARIANT* pvarResult,
|
|
EXCEPINFO* pexcepinfo,
|
|
UINT* puArgErr
|
|
);
|
|
|
|
|
|
public:
|
|
|
|
//
|
|
// overriding IObjectSafety methods. we are only safe if properly
|
|
// initialized by terminal manager, so these methods will fail if this
|
|
// is not the case.
|
|
//
|
|
|
|
STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid,
|
|
DWORD dwOptionSetMask,
|
|
DWORD dwEnabledOptions);
|
|
|
|
STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid,
|
|
DWORD *pdwSupportedOptions,
|
|
DWORD *pdwEnabledOptions);
|
|
|
|
|
|
private:
|
|
// --- Memebers --
|
|
TERMINAL_MEDIA_STATE m_State; // Terminal current state
|
|
CMSPCritSection m_Lock; // Critical section
|
|
ITPluggableTerminalEventSink* m_pEventSink; // Fire events to client
|
|
|
|
// --- Terminal attributes ---
|
|
MSP_HANDLE m_htAddress; // MSP address handle
|
|
IID m_TerminalClassID; // TerminalClass
|
|
TERMINAL_DIRECTION m_Direction; // Direction
|
|
TERMINAL_STATE m_TerminalState; // Terminal State
|
|
DWORD m_dwMediaTypes; // Media types supported
|
|
TCHAR m_szName[MAX_PATH+1]; // Terminal friendly name
|
|
|
|
int m_nPlayIndex; // Index of playing storage
|
|
VARIANT m_varPlayList; // The playlist
|
|
|
|
IUnknown* m_pFTM; // pointer to the free threaded marshaler
|
|
|
|
CPlaybackUnit* m_pPlaybackUnit; // The playback graph
|
|
|
|
|
|
HRESULT ValidatePlayList(
|
|
IN VARIANTARG varPlayList,
|
|
OUT long* pnLeftBound,
|
|
OUT long* pnRightBound
|
|
);
|
|
|
|
HRESULT RollbackTrackInfo();
|
|
|
|
//
|
|
// uninitialize all tracks and remove them from the list of managed tracks
|
|
//
|
|
|
|
HRESULT ShutdownTracks();
|
|
|
|
|
|
//
|
|
// uninitialize a given track and remove it from the list of managed tracks
|
|
//
|
|
|
|
HRESULT InternalRemoveTrackTerminal(
|
|
IN ITTerminal *pTrackTerminalToRemove
|
|
);
|
|
|
|
|
|
//
|
|
// a helper method that fires events on one of the tracks
|
|
//
|
|
|
|
HRESULT FireEvent(
|
|
TERMINAL_MEDIA_STATE tmsState,
|
|
FT_STATE_EVENT_CAUSE ftecEventCause,
|
|
HRESULT hrErrorCode
|
|
);
|
|
|
|
|
|
//
|
|
// a helper method that attempts to stop all tracks
|
|
//
|
|
|
|
HRESULT StopAllTracks();
|
|
|
|
BSTR GetFileNameFromPlayList(
|
|
IN VARIANTARG varPlayList,
|
|
IN long nIndex
|
|
);
|
|
|
|
//
|
|
// Create the playback graph
|
|
//
|
|
HRESULT CreatePlaybackUnit(
|
|
IN BSTR bstrFileName
|
|
);
|
|
|
|
//
|
|
// Play a file from the list
|
|
//
|
|
HRESULT ConfigurePlaybackUnit(
|
|
IN BSTR bstrFileName
|
|
);
|
|
|
|
//
|
|
// Helper method that causes a state transition
|
|
//
|
|
|
|
HRESULT DoStateTransition(
|
|
IN TERMINAL_MEDIA_STATE tmsDesiredState
|
|
);
|
|
|
|
//
|
|
// Create a track for a specific media
|
|
//
|
|
|
|
HRESULT CreateMediaTracks(
|
|
IN long nMediaType
|
|
);
|
|
|
|
HRESULT NextPlayIndex(
|
|
);
|
|
|
|
public:
|
|
|
|
//
|
|
// Returns a track for a media type
|
|
//
|
|
int TracksCreated(
|
|
IN long lMediaType
|
|
);
|
|
|
|
//
|
|
// a helper method called by tracks when they decide to make a state change.
|
|
//
|
|
|
|
HRESULT TrackStateChange(TERMINAL_MEDIA_STATE tmsState,
|
|
FT_STATE_EVENT_CAUSE ftecEventCause,
|
|
HRESULT hrErrorCode);
|
|
|
|
HRESULT PlayItem(
|
|
IN int nItem
|
|
);
|
|
|
|
private:
|
|
|
|
//
|
|
// this terminal should only be instantiated in the context of terminal
|
|
// manager. the object will only be safe for scripting if it has been
|
|
// InitializeDynamic'ed.
|
|
//
|
|
// this flag will be set when InitializeDynamic succeeds
|
|
//
|
|
|
|
BOOL m_bKnownSafeContext;
|
|
|
|
};
|
|
|
|
|
|
#endif
|
|
|
|
//eof
|