| //------------------------------------------------------------------------------ | |
| // File: SeekPT.cpp | |
| // | |
| // Desc: DirectShow base classes. | |
| // | |
| // Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. | |
| //------------------------------------------------------------------------------ | |
| #include <streams.h> | |
| #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; | |
| } | |