//------------------------------------------------------------------------------ // File: SeekPT.cpp // // Desc: DirectShow base classes. // // Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ #include #include "seekpt.h" //================================================================== // CreateInstance // This goes in the factory template table to create new instances // If there is already a mapper instance - return that, else make one // and save it in a static variable so that forever after we can return that. //================================================================== CUnknown * CSeekingPassThru::CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr) { return new CSeekingPassThru(NAME("Seeking PassThru"),pUnk, phr); } STDMETHODIMP CSeekingPassThru::NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv) { if (riid == IID_ISeekingPassThru) { return GetInterface((ISeekingPassThru *) this, ppv); } else { if (m_pPosPassThru && (riid == IID_IMediaSeeking || riid == IID_IMediaPosition)) { return m_pPosPassThru->NonDelegatingQueryInterface(riid,ppv); } else { return CUnknown::NonDelegatingQueryInterface(riid, ppv); } } } CSeekingPassThru::CSeekingPassThru( __in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr ) : CUnknown(pName, pUnk, phr), m_pPosPassThru(NULL) { } CSeekingPassThru::~CSeekingPassThru() { delete m_pPosPassThru; } STDMETHODIMP CSeekingPassThru::Init(BOOL bRendererSeeking, IPin *pPin) { HRESULT hr = NOERROR; if (m_pPosPassThru) { hr = E_FAIL; } else { m_pPosPassThru = bRendererSeeking ? new CRendererPosPassThru( NAME("Render Seeking COM object"), (IUnknown *)this, &hr, pPin) : new CPosPassThru( NAME("Render Seeking COM object"), (IUnknown *)this, &hr, pPin); if (!m_pPosPassThru) { hr = E_OUTOFMEMORY; } else { if (FAILED(hr)) { delete m_pPosPassThru; m_pPosPassThru = NULL; } } } return hr; }