2 * Implementation of CLSID_SeekingPassThru
4 * FIXME - not tested yet.
6 * Copyright (C) Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
34 #include "wine/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(quartz);
37 #include "quartz_private.h"
41 /***************************************************************************
43 * CSeekingPassThru::ISeekingPassThru
48 ISeekingPassThru_fnQueryInterface(ISeekingPassThru* iface,REFIID riid,void** ppobj)
50 CSeekingPassThru_THIS(iface,seekpass);
52 TRACE("(%p)->()\n",This);
54 return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
58 ISeekingPassThru_fnAddRef(ISeekingPassThru* iface)
60 CSeekingPassThru_THIS(iface,seekpass);
62 TRACE("(%p)->()\n",This);
64 return IUnknown_AddRef(This->unk.punkControl);
68 ISeekingPassThru_fnRelease(ISeekingPassThru* iface)
70 CSeekingPassThru_THIS(iface,seekpass);
72 TRACE("(%p)->()\n",This);
74 return IUnknown_Release(This->unk.punkControl);
78 ISeekingPassThru_fnInit(ISeekingPassThru* iface,BOOL bRendering,IPin* pPin)
80 CSeekingPassThru_THIS(iface,seekpass);
82 TRACE("(%p)->(%d,%p)\n",This,bRendering,pPin);
88 WARN("bRendering != FALSE\n");
91 /* Why is 'bRendering' given as an argument?? */
92 EnterCriticalSection( &This->cs );
94 if ( This->passthru.pPin != NULL )
95 IPin_Release( This->passthru.pPin );
96 This->passthru.pPin = pPin; IPin_AddRef( pPin );
98 LeaveCriticalSection( &This->cs );
104 static ICOM_VTABLE(ISeekingPassThru) iseekingpassthru =
106 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
107 /* IUnknown fields */
108 ISeekingPassThru_fnQueryInterface,
109 ISeekingPassThru_fnAddRef,
110 ISeekingPassThru_fnRelease,
111 /* ISeekingPassThru fields */
112 ISeekingPassThru_fnInit,
116 HRESULT CSeekingPassThru_InitISeekingPassThru(CSeekingPassThru* This)
118 TRACE("(%p)\n",This);
119 ICOM_VTBL(&This->seekpass) = &iseekingpassthru;
120 This->passthru.punk = This->unk.punkControl;
121 This->passthru.pPin = NULL;
122 InitializeCriticalSection( &This->cs );
128 void CSeekingPassThru_UninitISeekingPassThru(CSeekingPassThru* This)
130 TRACE("(%p)\n",This);
131 if ( This->passthru.pPin != NULL )
133 IPin_Release( This->passthru.pPin );
134 This->passthru.pPin = NULL;
136 DeleteCriticalSection( &This->cs );
139 /***************************************************************************
141 * new/delete for CLSID_SeekingPassThru.
145 /* can I use offsetof safely? - FIXME? */
146 static QUARTZ_IFEntry IFEntries[] =
148 { &IID_ISeekingPassThru, offsetof(CSeekingPassThru,seekpass)-offsetof(CSeekingPassThru,unk) },
149 { &IID_IMediaPosition, offsetof(CSeekingPassThru,passthru.mpos)-offsetof(CSeekingPassThru,unk) },
150 { &IID_IMediaSeeking, offsetof(CSeekingPassThru,passthru.mseek)-offsetof(CSeekingPassThru,unk) },
154 static void QUARTZ_DestroySeekingPassThru(IUnknown* punk)
156 CSeekingPassThru_THIS(punk,unk);
158 TRACE("(%p)\n",This);
160 CPassThruImpl_UninitIMediaSeeking( &This->passthru );
161 CPassThruImpl_UninitIMediaPosition( &This->passthru );
162 CSeekingPassThru_UninitISeekingPassThru(This);
165 HRESULT QUARTZ_CreateSeekingPassThru(IUnknown* punkOuter,void** ppobj)
168 CSeekingPassThru* This;
170 TRACE("(%p,%p)\n",punkOuter,ppobj);
172 hr = QUARTZ_CreateSeekingPassThruInternal(punkOuter,&This,FALSE,NULL);
176 ppobj = (void*)(&This->unk);
181 HRESULT QUARTZ_CreateSeekingPassThruInternal(IUnknown* punkOuter,CSeekingPassThru** ppobj,BOOL bRendering,IPin* pPin)
183 CSeekingPassThru* This;
186 TRACE("(%p,%p,%d,%p)\n",punkOuter,ppobj,(int)bRendering,pPin);
188 This = (CSeekingPassThru*)QUARTZ_AllocObj( sizeof(CSeekingPassThru) );
190 return E_OUTOFMEMORY;
192 QUARTZ_IUnkInit( &This->unk, punkOuter );
193 hr = CSeekingPassThru_InitISeekingPassThru(This);
196 hr = CPassThruImpl_InitIMediaPosition( &This->passthru );
199 hr = CPassThruImpl_InitIMediaSeeking( &This->passthru );
202 CPassThruImpl_UninitIMediaPosition( &This->passthru );
207 CSeekingPassThru_UninitISeekingPassThru(This);
213 QUARTZ_FreeObj( This );
217 This->unk.pEntries = IFEntries;
218 This->unk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
219 This->unk.pOnFinalRelease = QUARTZ_DestroySeekingPassThru;
225 hr = ISeekingPassThru_Init((ISeekingPassThru*)(&This->seekpass),bRendering,pPin);
228 IUnknown_Release(This->unk.punkControl);
239 /***************************************************************************
241 * CPassThruImpl Helper methods.
246 HRESULT CPassThruImpl_GetConnected( CPassThruImpl* pImpl, IPin** ppPin )
248 return IPin_ConnectedTo( pImpl->pPin, ppPin );
251 HRESULT CPassThruImpl_QueryPosPass(
252 CPassThruImpl* pImpl, IMediaPosition** ppPosition )
257 hr = CPassThruImpl_GetConnected( pImpl, &pPin );
260 hr = IPin_QueryInterface(pPin,&IID_IMediaPosition,(void**)ppPosition);
266 HRESULT CPassThruImpl_QuerySeekPass(
267 CPassThruImpl* pImpl, IMediaSeeking** ppSeeking )
272 hr = CPassThruImpl_GetConnected( pImpl, &pPin );
275 hr = IPin_QueryInterface(pPin,&IID_IMediaSeeking,(void**)ppSeeking);
281 /***************************************************************************
283 * An implementation for CPassThruImpl::IMediaPosition.
288 #define QUERYPOSPASS \
289 IMediaPosition* pPos = NULL; \
291 hr = CPassThruImpl_QueryPosPass( This, &pPos ); \
292 if ( FAILED(hr) ) return hr;
294 static HRESULT WINAPI
295 IMediaPosition_fnQueryInterface(IMediaPosition* iface,REFIID riid,void** ppobj)
297 CPassThruImpl_THIS(iface,mpos);
299 TRACE("(%p)->()\n",This);
301 return IUnknown_QueryInterface(This->punk,riid,ppobj);
305 IMediaPosition_fnAddRef(IMediaPosition* iface)
307 CPassThruImpl_THIS(iface,mpos);
309 TRACE("(%p)->()\n",This);
311 return IUnknown_AddRef(This->punk);
315 IMediaPosition_fnRelease(IMediaPosition* iface)
317 CPassThruImpl_THIS(iface,mpos);
319 TRACE("(%p)->()\n",This);
321 return IUnknown_Release(This->punk);
324 static HRESULT WINAPI
325 IMediaPosition_fnGetTypeInfoCount(IMediaPosition* iface,UINT* pcTypeInfo)
327 CPassThruImpl_THIS(iface,mpos);
329 FIXME("(%p)->() stub!\n",This);
334 static HRESULT WINAPI
335 IMediaPosition_fnGetTypeInfo(IMediaPosition* iface,UINT iTypeInfo, LCID lcid, ITypeInfo** ppobj)
337 CPassThruImpl_THIS(iface,mpos);
339 FIXME("(%p)->() stub!\n",This);
344 static HRESULT WINAPI
345 IMediaPosition_fnGetIDsOfNames(IMediaPosition* iface,REFIID riid, LPOLESTR* ppwszName, UINT cNames, LCID lcid, DISPID* pDispId)
347 CPassThruImpl_THIS(iface,mpos);
349 FIXME("(%p)->() stub!\n",This);
354 static HRESULT WINAPI
355 IMediaPosition_fnInvoke(IMediaPosition* iface,DISPID DispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarRes, EXCEPINFO* pExcepInfo, UINT* puArgErr)
357 CPassThruImpl_THIS(iface,mpos);
359 FIXME("(%p)->() stub!\n",This);
365 static HRESULT WINAPI
366 IMediaPosition_fnget_Duration(IMediaPosition* iface,REFTIME* prefTime)
368 CPassThruImpl_THIS(iface,mpos);
371 TRACE("(%p)->()\n",This);
373 hr = IMediaPosition_get_Duration(pPos,prefTime);
374 IMediaPosition_Release(pPos);
378 static HRESULT WINAPI
379 IMediaPosition_fnput_CurrentPosition(IMediaPosition* iface,REFTIME refTime)
381 CPassThruImpl_THIS(iface,mpos);
384 TRACE("(%p)->()\n",This);
386 hr = IMediaPosition_put_CurrentPosition(pPos,refTime);
387 IMediaPosition_Release(pPos);
391 static HRESULT WINAPI
392 IMediaPosition_fnget_CurrentPosition(IMediaPosition* iface,REFTIME* prefTime)
394 CPassThruImpl_THIS(iface,mpos);
397 TRACE("(%p)->()\n",This);
399 hr = IMediaPosition_get_CurrentPosition(pPos,prefTime);
400 IMediaPosition_Release(pPos);
404 static HRESULT WINAPI
405 IMediaPosition_fnget_StopTime(IMediaPosition* iface,REFTIME* prefTime)
407 CPassThruImpl_THIS(iface,mpos);
410 TRACE("(%p)->()\n",This);
412 hr = IMediaPosition_get_StopTime(pPos,prefTime);
413 IMediaPosition_Release(pPos);
417 static HRESULT WINAPI
418 IMediaPosition_fnput_StopTime(IMediaPosition* iface,REFTIME refTime)
420 CPassThruImpl_THIS(iface,mpos);
423 TRACE("(%p)->()\n",This);
425 hr = IMediaPosition_put_StopTime(pPos,refTime);
426 IMediaPosition_Release(pPos);
430 static HRESULT WINAPI
431 IMediaPosition_fnget_PrerollTime(IMediaPosition* iface,REFTIME* prefTime)
433 CPassThruImpl_THIS(iface,mpos);
436 TRACE("(%p)->()\n",This);
438 hr = IMediaPosition_get_PrerollTime(pPos,prefTime);
439 IMediaPosition_Release(pPos);
443 static HRESULT WINAPI
444 IMediaPosition_fnput_PrerollTime(IMediaPosition* iface,REFTIME refTime)
446 CPassThruImpl_THIS(iface,mpos);
449 TRACE("(%p)->()\n",This);
451 hr = IMediaPosition_put_PrerollTime(pPos,refTime);
452 IMediaPosition_Release(pPos);
456 static HRESULT WINAPI
457 IMediaPosition_fnput_Rate(IMediaPosition* iface,double dblRate)
459 CPassThruImpl_THIS(iface,mpos);
462 TRACE("(%p)->()\n",This);
464 hr = IMediaPosition_put_Rate(pPos,dblRate);
465 IMediaPosition_Release(pPos);
469 static HRESULT WINAPI
470 IMediaPosition_fnget_Rate(IMediaPosition* iface,double* pdblRate)
472 CPassThruImpl_THIS(iface,mpos);
475 TRACE("(%p)->()\n",This);
477 hr = IMediaPosition_get_Rate(pPos,pdblRate);
478 IMediaPosition_Release(pPos);
482 static HRESULT WINAPI
483 IMediaPosition_fnCanSeekForward(IMediaPosition* iface,LONG* pCanSeek)
485 CPassThruImpl_THIS(iface,mpos);
488 TRACE("(%p)->()\n",This);
490 hr = IMediaPosition_CanSeekForward(pPos,pCanSeek);
491 IMediaPosition_Release(pPos);
495 static HRESULT WINAPI
496 IMediaPosition_fnCanSeekBackward(IMediaPosition* iface,LONG* pCanSeek)
498 CPassThruImpl_THIS(iface,mpos);
501 TRACE("(%p)->()\n",This);
503 hr = IMediaPosition_CanSeekBackward(pPos,pCanSeek);
504 IMediaPosition_Release(pPos);
509 static ICOM_VTABLE(IMediaPosition) impos =
511 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
512 /* IUnknown fields */
513 IMediaPosition_fnQueryInterface,
514 IMediaPosition_fnAddRef,
515 IMediaPosition_fnRelease,
516 /* IDispatch fields */
517 IMediaPosition_fnGetTypeInfoCount,
518 IMediaPosition_fnGetTypeInfo,
519 IMediaPosition_fnGetIDsOfNames,
520 IMediaPosition_fnInvoke,
521 /* IMediaPosition fields */
522 IMediaPosition_fnget_Duration,
523 IMediaPosition_fnput_CurrentPosition,
524 IMediaPosition_fnget_CurrentPosition,
525 IMediaPosition_fnget_StopTime,
526 IMediaPosition_fnput_StopTime,
527 IMediaPosition_fnget_PrerollTime,
528 IMediaPosition_fnput_PrerollTime,
529 IMediaPosition_fnput_Rate,
530 IMediaPosition_fnget_Rate,
531 IMediaPosition_fnCanSeekForward,
532 IMediaPosition_fnCanSeekBackward,
536 HRESULT CPassThruImpl_InitIMediaPosition( CPassThruImpl* pImpl )
538 TRACE("(%p)\n",pImpl);
539 ICOM_VTBL(&pImpl->mpos) = &impos;
544 void CPassThruImpl_UninitIMediaPosition( CPassThruImpl* pImpl )
546 TRACE("(%p)\n",pImpl);
552 /***************************************************************************
554 * An implementation for CPassThruImpl::IMediaSeeking.
558 #define QUERYSEEKPASS \
559 IMediaSeeking* pSeek = NULL; \
561 hr = CPassThruImpl_QuerySeekPass( This, &pSeek ); \
562 if ( FAILED(hr) ) return hr;
565 static HRESULT WINAPI
566 IMediaSeeking_fnQueryInterface(IMediaSeeking* iface,REFIID riid,void** ppobj)
568 CPassThruImpl_THIS(iface,mseek);
570 TRACE("(%p)->()\n",This);
572 return IUnknown_QueryInterface(This->punk,riid,ppobj);
576 IMediaSeeking_fnAddRef(IMediaSeeking* iface)
578 CPassThruImpl_THIS(iface,mseek);
580 TRACE("(%p)->()\n",This);
582 return IUnknown_AddRef(This->punk);
586 IMediaSeeking_fnRelease(IMediaSeeking* iface)
588 CPassThruImpl_THIS(iface,mseek);
590 TRACE("(%p)->()\n",This);
592 return IUnknown_Release(This->punk);
596 static HRESULT WINAPI
597 IMediaSeeking_fnGetCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
599 CPassThruImpl_THIS(iface,mseek);
602 TRACE("(%p)->()\n",This);
604 hr = IMediaSeeking_GetCapabilities(pSeek,pdwCaps);
605 IMediaSeeking_Release(pSeek);
609 static HRESULT WINAPI
610 IMediaSeeking_fnCheckCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
612 CPassThruImpl_THIS(iface,mseek);
615 TRACE("(%p)->()\n",This);
617 hr = IMediaSeeking_CheckCapabilities(pSeek,pdwCaps);
618 IMediaSeeking_Release(pSeek);
622 static HRESULT WINAPI
623 IMediaSeeking_fnIsFormatSupported(IMediaSeeking* iface,const GUID* pidFormat)
625 CPassThruImpl_THIS(iface,mseek);
628 TRACE("(%p)->()\n",This);
630 hr = IMediaSeeking_IsFormatSupported(pSeek,pidFormat);
631 IMediaSeeking_Release(pSeek);
635 static HRESULT WINAPI
636 IMediaSeeking_fnQueryPreferredFormat(IMediaSeeking* iface,GUID* pidFormat)
638 CPassThruImpl_THIS(iface,mseek);
641 TRACE("(%p)->()\n",This);
643 hr = IMediaSeeking_QueryPreferredFormat(pSeek,pidFormat);
644 IMediaSeeking_Release(pSeek);
648 static HRESULT WINAPI
649 IMediaSeeking_fnGetTimeFormat(IMediaSeeking* iface,GUID* pidFormat)
651 CPassThruImpl_THIS(iface,mseek);
654 TRACE("(%p)->()\n",This);
656 hr = IMediaSeeking_GetTimeFormat(pSeek,pidFormat);
657 IMediaSeeking_Release(pSeek);
661 static HRESULT WINAPI
662 IMediaSeeking_fnIsUsingTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
664 CPassThruImpl_THIS(iface,mseek);
667 TRACE("(%p)->()\n",This);
669 hr = IMediaSeeking_IsUsingTimeFormat(pSeek,pidFormat);
670 IMediaSeeking_Release(pSeek);
674 static HRESULT WINAPI
675 IMediaSeeking_fnSetTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
677 CPassThruImpl_THIS(iface,mseek);
680 TRACE("(%p)->()\n",This);
682 hr = IMediaSeeking_SetTimeFormat(pSeek,pidFormat);
683 IMediaSeeking_Release(pSeek);
687 static HRESULT WINAPI
688 IMediaSeeking_fnGetDuration(IMediaSeeking* iface,LONGLONG* pllDuration)
690 CPassThruImpl_THIS(iface,mseek);
693 TRACE("(%p)->()\n",This);
695 hr = IMediaSeeking_GetDuration(pSeek,pllDuration);
696 IMediaSeeking_Release(pSeek);
700 static HRESULT WINAPI
701 IMediaSeeking_fnGetStopPosition(IMediaSeeking* iface,LONGLONG* pllPos)
703 CPassThruImpl_THIS(iface,mseek);
706 TRACE("(%p)->()\n",This);
708 hr = IMediaSeeking_GetStopPosition(pSeek,pllPos);
709 IMediaSeeking_Release(pSeek);
713 static HRESULT WINAPI
714 IMediaSeeking_fnGetCurrentPosition(IMediaSeeking* iface,LONGLONG* pllPos)
716 CPassThruImpl_THIS(iface,mseek);
719 TRACE("(%p)->()\n",This);
721 hr = IMediaSeeking_GetCurrentPosition(pSeek,pllPos);
722 IMediaSeeking_Release(pSeek);
726 static HRESULT WINAPI
727 IMediaSeeking_fnConvertTimeFormat(IMediaSeeking* iface,LONGLONG* pllOut,const GUID* pidFmtOut,LONGLONG llIn,const GUID* pidFmtIn)
729 CPassThruImpl_THIS(iface,mseek);
732 TRACE("(%p)->()\n",This);
734 hr = IMediaSeeking_ConvertTimeFormat(pSeek,pllOut,pidFmtOut,llIn,pidFmtIn);
735 IMediaSeeking_Release(pSeek);
739 static HRESULT WINAPI
740 IMediaSeeking_fnSetPositions(IMediaSeeking* iface,LONGLONG* pllCur,DWORD dwCurFlags,LONGLONG* pllStop,DWORD dwStopFlags)
742 CPassThruImpl_THIS(iface,mseek);
745 TRACE("(%p)->()\n",This);
747 hr = IMediaSeeking_SetPositions(pSeek,pllCur,dwCurFlags,pllStop,dwStopFlags);
748 IMediaSeeking_Release(pSeek);
752 static HRESULT WINAPI
753 IMediaSeeking_fnGetPositions(IMediaSeeking* iface,LONGLONG* pllCur,LONGLONG* pllStop)
755 CPassThruImpl_THIS(iface,mseek);
758 TRACE("(%p)->()\n",This);
760 hr = IMediaSeeking_GetPositions(pSeek,pllCur,pllStop);
761 IMediaSeeking_Release(pSeek);
765 static HRESULT WINAPI
766 IMediaSeeking_fnGetAvailable(IMediaSeeking* iface,LONGLONG* pllFirst,LONGLONG* pllLast)
768 CPassThruImpl_THIS(iface,mseek);
771 TRACE("(%p)->()\n",This);
773 hr = IMediaSeeking_GetAvailable(pSeek,pllFirst,pllLast);
774 IMediaSeeking_Release(pSeek);
778 static HRESULT WINAPI
779 IMediaSeeking_fnSetRate(IMediaSeeking* iface,double dblRate)
781 CPassThruImpl_THIS(iface,mseek);
784 TRACE("(%p)->()\n",This);
786 hr = IMediaSeeking_SetRate(pSeek,dblRate);
787 IMediaSeeking_Release(pSeek);
791 static HRESULT WINAPI
792 IMediaSeeking_fnGetRate(IMediaSeeking* iface,double* pdblRate)
794 CPassThruImpl_THIS(iface,mseek);
797 TRACE("(%p)->()\n",This);
799 hr = IMediaSeeking_GetRate(pSeek,pdblRate);
800 IMediaSeeking_Release(pSeek);
804 static HRESULT WINAPI
805 IMediaSeeking_fnGetPreroll(IMediaSeeking* iface,LONGLONG* pllPreroll)
807 CPassThruImpl_THIS(iface,mseek);
810 TRACE("(%p)->()\n",This);
812 hr = IMediaSeeking_GetPreroll(pSeek,pllPreroll);
813 IMediaSeeking_Release(pSeek);
820 static ICOM_VTABLE(IMediaSeeking) imseek =
822 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
823 /* IUnknown fields */
824 IMediaSeeking_fnQueryInterface,
825 IMediaSeeking_fnAddRef,
826 IMediaSeeking_fnRelease,
827 /* IMediaSeeking fields */
828 IMediaSeeking_fnGetCapabilities,
829 IMediaSeeking_fnCheckCapabilities,
830 IMediaSeeking_fnIsFormatSupported,
831 IMediaSeeking_fnQueryPreferredFormat,
832 IMediaSeeking_fnGetTimeFormat,
833 IMediaSeeking_fnIsUsingTimeFormat,
834 IMediaSeeking_fnSetTimeFormat,
835 IMediaSeeking_fnGetDuration,
836 IMediaSeeking_fnGetStopPosition,
837 IMediaSeeking_fnGetCurrentPosition,
838 IMediaSeeking_fnConvertTimeFormat,
839 IMediaSeeking_fnSetPositions,
840 IMediaSeeking_fnGetPositions,
841 IMediaSeeking_fnGetAvailable,
842 IMediaSeeking_fnSetRate,
843 IMediaSeeking_fnGetRate,
844 IMediaSeeking_fnGetPreroll,
849 HRESULT CPassThruImpl_InitIMediaSeeking( CPassThruImpl* pImpl )
851 TRACE("(%p)\n",pImpl);
852 ICOM_VTBL(&pImpl->mseek) = &imseek;
857 void CPassThruImpl_UninitIMediaSeeking( CPassThruImpl* pImpl )
859 TRACE("(%p)\n",pImpl);