00001
00002
00003
00004
00005
00006 #include <streams.h>
00007 #include "seekpt.h"
00008
00009 CUnknown * CSeekingPassThru::CreateInstance(LPUNKNOWN pUnk, HRESULT *phr)
00010 {
00011 return new CSeekingPassThru(NAME("Silly Seeking Thing"),pUnk, phr);
00012 }
00013
00014 STDMETHODIMP CSeekingPassThru::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
00015 {
00016 if (riid == IID_ISeekingPassThru) {
00017 return GetInterface((ISeekingPassThru *) this, ppv);
00018 } else {
00019 if (m_pPosPassThru &&
00020 (riid == IID_IMediaSeeking ||
00021 riid == IID_IMediaPosition)) {
00022 return m_pPosPassThru->NonDelegatingQueryInterface(riid,ppv);
00023 } else {
00024 return CUnknown::NonDelegatingQueryInterface(riid, ppv);
00025 }
00026 }
00027 }
00028
00029 CSeekingPassThru::CSeekingPassThru( TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr )
00030 : CUnknown(pName, pUnk, phr),
00031 m_pPosPassThru(NULL)
00032 {
00033 }
00034
00035 CSeekingPassThru::~CSeekingPassThru()
00036 {
00037 delete m_pPosPassThru;
00038 }
00039
00040 STDMETHODIMP CSeekingPassThru::Init(BOOL bRendererSeeking, IPin *pPin)
00041 {
00042 HRESULT hr = NOERROR;
00043 if (m_pPosPassThru) {
00044 hr = E_FAIL;
00045 } else {
00046 m_pPosPassThru =
00047 bRendererSeeking ?
00048 new CRendererPosPassThru(
00049 NAME("Render Seeking COM object"),
00050 (IUnknown *)this,
00051 &hr,
00052 pPin) :
00053 new CPosPassThru(
00054 NAME("Render Seeking COM object"),
00055 (IUnknown *)this,
00056 &hr,
00057 pPin);
00058 if (!m_pPosPassThru) {
00059 hr = E_OUTOFMEMORY;
00060 } else {
00061 if (FAILED(hr)) {
00062 delete m_pPosPassThru;
00063 m_pPosPassThru = NULL;
00064 }
00065 }
00066 }
00067 return hr;
00068 }
00069