2 * Implementation of CLSID_SeekingPassThru
4 * FIXME - not tested yet.
6 * hidenori@a2.ctktv.ne.jp
20 #include "debugtools.h"
21 DEFAULT_DEBUG_CHANNEL(quartz);
23 #include "quartz_private.h"
27 /***************************************************************************
29 * CSeekingPassThru::ISeekingPassThru
34 ISeekingPassThru_fnQueryInterface(ISeekingPassThru* iface,REFIID riid,void** ppobj)
36 CSeekingPassThru_THIS(iface,seekpass);
38 TRACE("(%p)->()\n",This);
40 return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
44 ISeekingPassThru_fnAddRef(ISeekingPassThru* iface)
46 CSeekingPassThru_THIS(iface,seekpass);
48 TRACE("(%p)->()\n",This);
50 return IUnknown_AddRef(This->unk.punkControl);
54 ISeekingPassThru_fnRelease(ISeekingPassThru* iface)
56 CSeekingPassThru_THIS(iface,seekpass);
58 TRACE("(%p)->()\n",This);
60 return IUnknown_Release(This->unk.punkControl);
64 ISeekingPassThru_fnInit(ISeekingPassThru* iface,BOOL bRendering,IPin* pPin)
66 CSeekingPassThru_THIS(iface,seekpass);
68 FIXME("(%p)->(%d,%p) not tested!\n",This,bRendering,pPin);
73 /* Why is 'bRendering' given as an argument?? */
74 EnterCriticalSection( &This->cs );
76 if ( This->passthru.pPin != NULL )
77 IPin_Release( This->passthru.pPin );
78 This->passthru.pPin = pPin; IPin_AddRef( pPin );
80 LeaveCriticalSection( &This->cs );
86 static ICOM_VTABLE(ISeekingPassThru) iseekingpassthru =
88 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
90 ISeekingPassThru_fnQueryInterface,
91 ISeekingPassThru_fnAddRef,
92 ISeekingPassThru_fnRelease,
93 /* ISeekingPassThru fields */
94 ISeekingPassThru_fnInit,
98 HRESULT CSeekingPassThru_InitISeekingPassThru(CSeekingPassThru* This)
100 TRACE("(%p)\n",This);
101 ICOM_VTBL(&This->seekpass) = &iseekingpassthru;
102 This->passthru.punk = This->unk.punkControl;
103 This->passthru.pPin = NULL;
104 InitializeCriticalSection( &This->cs );
110 void CSeekingPassThru_UninitISeekingPassThru(CSeekingPassThru* This)
112 TRACE("(%p)\n",This);
113 if ( This->passthru.pPin != NULL )
115 IPin_Release( This->passthru.pPin );
116 This->passthru.pPin = NULL;
118 DeleteCriticalSection( &This->cs );
121 /***************************************************************************
123 * new/delete for CLSID_SeekingPassThru.
127 /* can I use offsetof safely? - FIXME? */
128 static QUARTZ_IFEntry IFEntries[] =
130 { &IID_ISeekingPassThru, offsetof(CSeekingPassThru,seekpass)-offsetof(CSeekingPassThru,unk) },
131 { &IID_IMediaPosition, offsetof(CSeekingPassThru,passthru.mpos)-offsetof(CSeekingPassThru,unk) },
132 { &IID_IMediaSeeking, offsetof(CSeekingPassThru,passthru.mseek)-offsetof(CSeekingPassThru,unk) },
136 static void QUARTZ_DestroySeekingPassThru(IUnknown* punk)
138 CSeekingPassThru_THIS(punk,unk);
140 TRACE("(%p)\n",This);
142 CPassThruImpl_UninitIMediaSeeking( &This->passthru );
143 CPassThruImpl_UninitIMediaPosition( &This->passthru );
144 CSeekingPassThru_UninitISeekingPassThru(This);
147 HRESULT QUARTZ_CreateSeekingPassThru(IUnknown* punkOuter,void** ppobj)
150 CSeekingPassThru* This;
152 TRACE("(%p,%p)\n",punkOuter,ppobj);
154 hr = QUARTZ_CreateSeekingPassThruInternal(punkOuter,&This,FALSE,NULL);
158 ppobj = (void*)(&This->unk);
163 HRESULT QUARTZ_CreateSeekingPassThruInternal(IUnknown* punkOuter,CSeekingPassThru** ppobj,BOOL bRendering,IPin* pPin)
165 CSeekingPassThru* This;
168 TRACE("(%p,%p,%d,%p)\n",punkOuter,ppobj,(int)bRendering,pPin);
170 This = (CSeekingPassThru*)QUARTZ_AllocObj( sizeof(CSeekingPassThru) );
172 return E_OUTOFMEMORY;
174 QUARTZ_IUnkInit( &This->unk, punkOuter );
175 hr = CSeekingPassThru_InitISeekingPassThru(This);
178 hr = CPassThruImpl_InitIMediaPosition( &This->passthru );
181 hr = CPassThruImpl_InitIMediaSeeking( &This->passthru );
184 CPassThruImpl_UninitIMediaPosition( &This->passthru );
189 CSeekingPassThru_UninitISeekingPassThru(This);
195 QUARTZ_FreeObj( This );
199 This->unk.pEntries = IFEntries;
200 This->unk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
201 This->unk.pOnFinalRelease = QUARTZ_DestroySeekingPassThru;
207 hr = ISeekingPassThru_Init((ISeekingPassThru*)(&This->seekpass),bRendering,pPin);
210 IUnknown_Release(This->unk.punkControl);
221 /***************************************************************************
223 * CPassThruImpl Helper methods.
228 HRESULT CPassThruImpl_GetConnected( CPassThruImpl* pImpl, IPin** ppPin )
230 return IPin_ConnectedTo( pImpl->pPin, ppPin );
233 HRESULT CPassThruImpl_QueryPosPass(
234 CPassThruImpl* pImpl, IMediaPosition** ppPosition )
239 hr = CPassThruImpl_GetConnected( pImpl, &pPin );
242 hr = IPin_QueryInterface(pPin,&IID_IMediaPosition,(void**)ppPosition);
248 HRESULT CPassThruImpl_QuerySeekPass(
249 CPassThruImpl* pImpl, IMediaSeeking** ppSeeking )
254 hr = CPassThruImpl_GetConnected( pImpl, &pPin );
257 hr = IPin_QueryInterface(pPin,&IID_IMediaSeeking,(void**)ppSeeking);
263 /***************************************************************************
265 * An implementation for CPassThruImpl::IMediaPosition.
270 #define QUERYPOSPASS \
271 IMediaPosition* pPos = NULL; \
273 hr = CPassThruImpl_QueryPosPass( This, &pPos ); \
274 if ( FAILED(hr) ) return hr;
276 static HRESULT WINAPI
277 IMediaPosition_fnQueryInterface(IMediaPosition* iface,REFIID riid,void** ppobj)
279 CPassThruImpl_THIS(iface,mpos);
281 TRACE("(%p)->()\n",This);
283 return IUnknown_QueryInterface(This->punk,riid,ppobj);
287 IMediaPosition_fnAddRef(IMediaPosition* iface)
289 CPassThruImpl_THIS(iface,mpos);
291 TRACE("(%p)->()\n",This);
293 return IUnknown_AddRef(This->punk);
297 IMediaPosition_fnRelease(IMediaPosition* iface)
299 CPassThruImpl_THIS(iface,mpos);
301 TRACE("(%p)->()\n",This);
303 return IUnknown_Release(This->punk);
306 static HRESULT WINAPI
307 IMediaPosition_fnGetTypeInfoCount(IMediaPosition* iface,UINT* pcTypeInfo)
309 CPassThruImpl_THIS(iface,mpos);
311 FIXME("(%p)->() stub!\n",This);
316 static HRESULT WINAPI
317 IMediaPosition_fnGetTypeInfo(IMediaPosition* iface,UINT iTypeInfo, LCID lcid, ITypeInfo** ppobj)
319 CPassThruImpl_THIS(iface,mpos);
321 FIXME("(%p)->() stub!\n",This);
326 static HRESULT WINAPI
327 IMediaPosition_fnGetIDsOfNames(IMediaPosition* iface,REFIID riid, LPOLESTR* ppwszName, UINT cNames, LCID lcid, DISPID* pDispId)
329 CPassThruImpl_THIS(iface,mpos);
331 FIXME("(%p)->() stub!\n",This);
336 static HRESULT WINAPI
337 IMediaPosition_fnInvoke(IMediaPosition* iface,DISPID DispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarRes, EXCEPINFO* pExcepInfo, UINT* puArgErr)
339 CPassThruImpl_THIS(iface,mpos);
341 FIXME("(%p)->() stub!\n",This);
347 static HRESULT WINAPI
348 IMediaPosition_fnget_Duration(IMediaPosition* iface,REFTIME* prefTime)
350 CPassThruImpl_THIS(iface,mpos);
353 TRACE("(%p)->()\n",This);
355 return IMediaPosition_get_Duration(pPos,prefTime);
358 static HRESULT WINAPI
359 IMediaPosition_fnput_CurrentPosition(IMediaPosition* iface,REFTIME refTime)
361 CPassThruImpl_THIS(iface,mpos);
364 TRACE("(%p)->()\n",This);
366 return IMediaPosition_put_CurrentPosition(pPos,refTime);
369 static HRESULT WINAPI
370 IMediaPosition_fnget_CurrentPosition(IMediaPosition* iface,REFTIME* prefTime)
372 CPassThruImpl_THIS(iface,mpos);
375 TRACE("(%p)->()\n",This);
377 return IMediaPosition_get_CurrentPosition(pPos,prefTime);
380 static HRESULT WINAPI
381 IMediaPosition_fnget_StopTime(IMediaPosition* iface,REFTIME* prefTime)
383 CPassThruImpl_THIS(iface,mpos);
386 TRACE("(%p)->()\n",This);
388 return IMediaPosition_get_StopTime(pPos,prefTime);
391 static HRESULT WINAPI
392 IMediaPosition_fnput_StopTime(IMediaPosition* iface,REFTIME refTime)
394 CPassThruImpl_THIS(iface,mpos);
397 TRACE("(%p)->()\n",This);
399 return IMediaPosition_put_StopTime(pPos,refTime);
402 static HRESULT WINAPI
403 IMediaPosition_fnget_PrerollTime(IMediaPosition* iface,REFTIME* prefTime)
405 CPassThruImpl_THIS(iface,mpos);
408 TRACE("(%p)->()\n",This);
410 return IMediaPosition_get_PrerollTime(pPos,prefTime);
413 static HRESULT WINAPI
414 IMediaPosition_fnput_PrerollTime(IMediaPosition* iface,REFTIME refTime)
416 CPassThruImpl_THIS(iface,mpos);
419 TRACE("(%p)->()\n",This);
421 return IMediaPosition_put_PrerollTime(pPos,refTime);
424 static HRESULT WINAPI
425 IMediaPosition_fnput_Rate(IMediaPosition* iface,double dblRate)
427 CPassThruImpl_THIS(iface,mpos);
430 TRACE("(%p)->()\n",This);
432 return IMediaPosition_put_Rate(pPos,dblRate);
435 static HRESULT WINAPI
436 IMediaPosition_fnget_Rate(IMediaPosition* iface,double* pdblRate)
438 CPassThruImpl_THIS(iface,mpos);
441 TRACE("(%p)->()\n",This);
443 return IMediaPosition_get_Rate(pPos,pdblRate);
446 static HRESULT WINAPI
447 IMediaPosition_fnCanSeekForward(IMediaPosition* iface,LONG* pCanSeek)
449 CPassThruImpl_THIS(iface,mpos);
452 TRACE("(%p)->()\n",This);
454 return IMediaPosition_CanSeekForward(pPos,pCanSeek);
457 static HRESULT WINAPI
458 IMediaPosition_fnCanSeekBackward(IMediaPosition* iface,LONG* pCanSeek)
460 CPassThruImpl_THIS(iface,mpos);
463 TRACE("(%p)->()\n",This);
465 return IMediaPosition_CanSeekBackward(pPos,pCanSeek);
469 static ICOM_VTABLE(IMediaPosition) impos =
471 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
472 /* IUnknown fields */
473 IMediaPosition_fnQueryInterface,
474 IMediaPosition_fnAddRef,
475 IMediaPosition_fnRelease,
476 /* IDispatch fields */
477 IMediaPosition_fnGetTypeInfoCount,
478 IMediaPosition_fnGetTypeInfo,
479 IMediaPosition_fnGetIDsOfNames,
480 IMediaPosition_fnInvoke,
481 /* IMediaPosition fields */
482 IMediaPosition_fnget_Duration,
483 IMediaPosition_fnput_CurrentPosition,
484 IMediaPosition_fnget_CurrentPosition,
485 IMediaPosition_fnget_StopTime,
486 IMediaPosition_fnput_StopTime,
487 IMediaPosition_fnget_PrerollTime,
488 IMediaPosition_fnput_PrerollTime,
489 IMediaPosition_fnput_Rate,
490 IMediaPosition_fnget_Rate,
491 IMediaPosition_fnCanSeekForward,
492 IMediaPosition_fnCanSeekBackward,
496 HRESULT CPassThruImpl_InitIMediaPosition( CPassThruImpl* pImpl )
498 TRACE("(%p)\n",pImpl);
499 ICOM_VTBL(&pImpl->mpos) = &impos;
504 void CPassThruImpl_UninitIMediaPosition( CPassThruImpl* pImpl )
506 TRACE("(%p)\n",pImpl);
512 /***************************************************************************
514 * An implementation for CPassThruImpl::IMediaSeeking.
518 #define QUERYSEEKPASS \
519 IMediaSeeking* pSeek = NULL; \
521 hr = CPassThruImpl_QuerySeekPass( This, &pSeek ); \
522 if ( FAILED(hr) ) return hr;
525 static HRESULT WINAPI
526 IMediaSeeking_fnQueryInterface(IMediaSeeking* iface,REFIID riid,void** ppobj)
528 CPassThruImpl_THIS(iface,mseek);
530 TRACE("(%p)->()\n",This);
532 return IUnknown_QueryInterface(This->punk,riid,ppobj);
536 IMediaSeeking_fnAddRef(IMediaSeeking* iface)
538 CPassThruImpl_THIS(iface,mseek);
540 TRACE("(%p)->()\n",This);
542 return IUnknown_AddRef(This->punk);
546 IMediaSeeking_fnRelease(IMediaSeeking* iface)
548 CPassThruImpl_THIS(iface,mseek);
550 TRACE("(%p)->()\n",This);
552 return IUnknown_Release(This->punk);
556 static HRESULT WINAPI
557 IMediaSeeking_fnGetCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
559 CPassThruImpl_THIS(iface,mseek);
562 TRACE("(%p)->()\n",This);
564 return IMediaSeeking_GetCapabilities(pSeek,pdwCaps);
567 static HRESULT WINAPI
568 IMediaSeeking_fnCheckCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
570 CPassThruImpl_THIS(iface,mseek);
573 TRACE("(%p)->()\n",This);
575 return IMediaSeeking_CheckCapabilities(pSeek,pdwCaps);
578 static HRESULT WINAPI
579 IMediaSeeking_fnIsFormatSupported(IMediaSeeking* iface,const GUID* pidFormat)
581 CPassThruImpl_THIS(iface,mseek);
584 TRACE("(%p)->()\n",This);
586 return IMediaSeeking_IsFormatSupported(pSeek,pidFormat);
589 static HRESULT WINAPI
590 IMediaSeeking_fnQueryPreferredFormat(IMediaSeeking* iface,GUID* pidFormat)
592 CPassThruImpl_THIS(iface,mseek);
595 TRACE("(%p)->()\n",This);
597 return IMediaSeeking_QueryPreferredFormat(pSeek,pidFormat);
600 static HRESULT WINAPI
601 IMediaSeeking_fnGetTimeFormat(IMediaSeeking* iface,GUID* pidFormat)
603 CPassThruImpl_THIS(iface,mseek);
606 TRACE("(%p)->()\n",This);
608 return IMediaSeeking_GetTimeFormat(pSeek,pidFormat);
611 static HRESULT WINAPI
612 IMediaSeeking_fnIsUsingTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
614 CPassThruImpl_THIS(iface,mseek);
617 TRACE("(%p)->()\n",This);
619 return IMediaSeeking_IsUsingTimeFormat(pSeek,pidFormat);
622 static HRESULT WINAPI
623 IMediaSeeking_fnSetTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
625 CPassThruImpl_THIS(iface,mseek);
628 TRACE("(%p)->()\n",This);
630 return IMediaSeeking_SetTimeFormat(pSeek,pidFormat);
633 static HRESULT WINAPI
634 IMediaSeeking_fnGetDuration(IMediaSeeking* iface,LONGLONG* pllDuration)
636 CPassThruImpl_THIS(iface,mseek);
639 TRACE("(%p)->()\n",This);
641 return IMediaSeeking_GetDuration(pSeek,pllDuration);
644 static HRESULT WINAPI
645 IMediaSeeking_fnGetStopPosition(IMediaSeeking* iface,LONGLONG* pllPos)
647 CPassThruImpl_THIS(iface,mseek);
650 TRACE("(%p)->()\n",This);
652 return IMediaSeeking_GetStopPosition(pSeek,pllPos);
655 static HRESULT WINAPI
656 IMediaSeeking_fnGetCurrentPosition(IMediaSeeking* iface,LONGLONG* pllPos)
658 CPassThruImpl_THIS(iface,mseek);
661 TRACE("(%p)->()\n",This);
663 return IMediaSeeking_GetCurrentPosition(pSeek,pllPos);
666 static HRESULT WINAPI
667 IMediaSeeking_fnConvertTimeFormat(IMediaSeeking* iface,LONGLONG* pllOut,const GUID* pidFmtOut,LONGLONG llIn,const GUID* pidFmtIn)
669 CPassThruImpl_THIS(iface,mseek);
672 TRACE("(%p)->()\n",This);
674 return IMediaSeeking_ConvertTimeFormat(pSeek,pllOut,pidFmtOut,llIn,pidFmtIn);
677 static HRESULT WINAPI
678 IMediaSeeking_fnSetPositions(IMediaSeeking* iface,LONGLONG* pllCur,DWORD dwCurFlags,LONGLONG* pllStop,DWORD dwStopFlags)
680 CPassThruImpl_THIS(iface,mseek);
683 TRACE("(%p)->()\n",This);
685 return IMediaSeeking_SetPositions(pSeek,pllCur,dwCurFlags,pllStop,dwStopFlags);
688 static HRESULT WINAPI
689 IMediaSeeking_fnGetPositions(IMediaSeeking* iface,LONGLONG* pllCur,LONGLONG* pllStop)
691 CPassThruImpl_THIS(iface,mseek);
694 TRACE("(%p)->()\n",This);
696 return IMediaSeeking_GetPositions(pSeek,pllCur,pllStop);
699 static HRESULT WINAPI
700 IMediaSeeking_fnGetAvailable(IMediaSeeking* iface,LONGLONG* pllFirst,LONGLONG* pllLast)
702 CPassThruImpl_THIS(iface,mseek);
705 TRACE("(%p)->()\n",This);
707 return IMediaSeeking_GetAvailable(pSeek,pllFirst,pllLast);
710 static HRESULT WINAPI
711 IMediaSeeking_fnSetRate(IMediaSeeking* iface,double dblRate)
713 CPassThruImpl_THIS(iface,mseek);
716 TRACE("(%p)->()\n",This);
718 return IMediaSeeking_SetRate(pSeek,dblRate);
721 static HRESULT WINAPI
722 IMediaSeeking_fnGetRate(IMediaSeeking* iface,double* pdblRate)
724 CPassThruImpl_THIS(iface,mseek);
727 TRACE("(%p)->()\n",This);
729 return IMediaSeeking_GetRate(pSeek,pdblRate);
732 static HRESULT WINAPI
733 IMediaSeeking_fnGetPreroll(IMediaSeeking* iface,LONGLONG* pllPreroll)
735 CPassThruImpl_THIS(iface,mseek);
738 TRACE("(%p)->()\n",This);
740 return IMediaSeeking_GetPreroll(pSeek,pllPreroll);
746 static ICOM_VTABLE(IMediaSeeking) imseek =
748 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
749 /* IUnknown fields */
750 IMediaSeeking_fnQueryInterface,
751 IMediaSeeking_fnAddRef,
752 IMediaSeeking_fnRelease,
753 /* IMediaSeeking fields */
754 IMediaSeeking_fnGetCapabilities,
755 IMediaSeeking_fnCheckCapabilities,
756 IMediaSeeking_fnIsFormatSupported,
757 IMediaSeeking_fnQueryPreferredFormat,
758 IMediaSeeking_fnGetTimeFormat,
759 IMediaSeeking_fnIsUsingTimeFormat,
760 IMediaSeeking_fnSetTimeFormat,
761 IMediaSeeking_fnGetDuration,
762 IMediaSeeking_fnGetStopPosition,
763 IMediaSeeking_fnGetCurrentPosition,
764 IMediaSeeking_fnConvertTimeFormat,
765 IMediaSeeking_fnSetPositions,
766 IMediaSeeking_fnGetPositions,
767 IMediaSeeking_fnGetAvailable,
768 IMediaSeeking_fnSetRate,
769 IMediaSeeking_fnGetRate,
770 IMediaSeeking_fnGetPreroll,
775 HRESULT CPassThruImpl_InitIMediaSeeking( CPassThruImpl* pImpl )
777 TRACE("(%p)\n",pImpl);
778 ICOM_VTBL(&pImpl->mseek) = &imseek;
783 void CPassThruImpl_UninitIMediaSeeking( CPassThruImpl* pImpl )
785 TRACE("(%p)\n",pImpl);