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; | ||
|  | } | ||
|  | 
 |