84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | |
| // 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;
 | |
| }
 | |
| 
 |