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 FIXME("(%p)->(%d,%p) not tested!\n",This,bRendering,pPin);
87 /* Why is 'bRendering' given as an argument?? */
88 EnterCriticalSection( &This->cs );
90 if ( This->passthru.pPin != NULL )
91 IPin_Release( This->passthru.pPin );
92 This->passthru.pPin = pPin; IPin_AddRef( pPin );
94 LeaveCriticalSection( &This->cs );
100 static ICOM_VTABLE(ISeekingPassThru) iseekingpassthru =
102 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
103 /* IUnknown fields */
104 ISeekingPassThru_fnQueryInterface,
105 ISeekingPassThru_fnAddRef,
106 ISeekingPassThru_fnRelease,
107 /* ISeekingPassThru fields */
108 ISeekingPassThru_fnInit,
112 HRESULT CSeekingPassThru_InitISeekingPassThru(CSeekingPassThru* This)
114 TRACE("(%p)\n",This);
115 ICOM_VTBL(&This->seekpass) = &iseekingpassthru;
116 This->passthru.punk = This->unk.punkControl;
117 This->passthru.pPin = NULL;
118 InitializeCriticalSection( &This->cs );
124 void CSeekingPassThru_UninitISeekingPassThru(CSeekingPassThru* This)
126 TRACE("(%p)\n",This);
127 if ( This->passthru.pPin != NULL )
129 IPin_Release( This->passthru.pPin );
130 This->passthru.pPin = NULL;
132 DeleteCriticalSection( &This->cs );
135 /***************************************************************************
137 * new/delete for CLSID_SeekingPassThru.
141 /* can I use offsetof safely? - FIXME? */
142 static QUARTZ_IFEntry IFEntries[] =
144 { &IID_ISeekingPassThru, offsetof(CSeekingPassThru,seekpass)-offsetof(CSeekingPassThru,unk) },
145 { &IID_IMediaPosition, offsetof(CSeekingPassThru,passthru.mpos)-offsetof(CSeekingPassThru,unk) },
146 { &IID_IMediaSeeking, offsetof(CSeekingPassThru,passthru.mseek)-offsetof(CSeekingPassThru,unk) },
150 static void QUARTZ_DestroySeekingPassThru(IUnknown* punk)
152 CSeekingPassThru_THIS(punk,unk);
154 TRACE("(%p)\n",This);
156 CPassThruImpl_UninitIMediaSeeking( &This->passthru );
157 CPassThruImpl_UninitIMediaPosition( &This->passthru );
158 CSeekingPassThru_UninitISeekingPassThru(This);
161 HRESULT QUARTZ_CreateSeekingPassThru(IUnknown* punkOuter,void** ppobj)
164 CSeekingPassThru* This;
166 TRACE("(%p,%p)\n",punkOuter,ppobj);
168 hr = QUARTZ_CreateSeekingPassThruInternal(punkOuter,&This,FALSE,NULL);
172 ppobj = (void*)(&This->unk);
177 HRESULT QUARTZ_CreateSeekingPassThruInternal(IUnknown* punkOuter,CSeekingPassThru** ppobj,BOOL bRendering,IPin* pPin)
179 CSeekingPassThru* This;
182 TRACE("(%p,%p,%d,%p)\n",punkOuter,ppobj,(int)bRendering,pPin);
184 This = (CSeekingPassThru*)QUARTZ_AllocObj( sizeof(CSeekingPassThru) );
186 return E_OUTOFMEMORY;
188 QUARTZ_IUnkInit( &This->unk, punkOuter );
189 hr = CSeekingPassThru_InitISeekingPassThru(This);
192 hr = CPassThruImpl_InitIMediaPosition( &This->passthru );
195 hr = CPassThruImpl_InitIMediaSeeking( &This->passthru );
198 CPassThruImpl_UninitIMediaPosition( &This->passthru );
203 CSeekingPassThru_UninitISeekingPassThru(This);
209 QUARTZ_FreeObj( This );
213 This->unk.pEntries = IFEntries;
214 This->unk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
215 This->unk.pOnFinalRelease = QUARTZ_DestroySeekingPassThru;
221 hr = ISeekingPassThru_Init((ISeekingPassThru*)(&This->seekpass),bRendering,pPin);
224 IUnknown_Release(This->unk.punkControl);
235 /***************************************************************************
237 * CPassThruImpl Helper methods.
242 HRESULT CPassThruImpl_GetConnected( CPassThruImpl* pImpl, IPin** ppPin )
244 return IPin_ConnectedTo( pImpl->pPin, ppPin );
247 HRESULT CPassThruImpl_QueryPosPass(
248 CPassThruImpl* pImpl, IMediaPosition** ppPosition )
253 hr = CPassThruImpl_GetConnected( pImpl, &pPin );
256 hr = IPin_QueryInterface(pPin,&IID_IMediaPosition,(void**)ppPosition);
262 HRESULT CPassThruImpl_QuerySeekPass(
263 CPassThruImpl* pImpl, IMediaSeeking** ppSeeking )
268 hr = CPassThruImpl_GetConnected( pImpl, &pPin );
271 hr = IPin_QueryInterface(pPin,&IID_IMediaSeeking,(void**)ppSeeking);
277 /***************************************************************************
279 * An implementation for CPassThruImpl::IMediaPosition.
284 #define QUERYPOSPASS \
285 IMediaPosition* pPos = NULL; \
287 hr = CPassThruImpl_QueryPosPass( This, &pPos ); \
288 if ( FAILED(hr) ) return hr;
290 static HRESULT WINAPI
291 IMediaPosition_fnQueryInterface(IMediaPosition* iface,REFIID riid,void** ppobj)
293 CPassThruImpl_THIS(iface,mpos);
295 TRACE("(%p)->()\n",This);
297 return IUnknown_QueryInterface(This->punk,riid,ppobj);
301 IMediaPosition_fnAddRef(IMediaPosition* iface)
303 CPassThruImpl_THIS(iface,mpos);
305 TRACE("(%p)->()\n",This);
307 return IUnknown_AddRef(This->punk);
311 IMediaPosition_fnRelease(IMediaPosition* iface)
313 CPassThruImpl_THIS(iface,mpos);
315 TRACE("(%p)->()\n",This);
317 return IUnknown_Release(This->punk);
320 static HRESULT WINAPI
321 IMediaPosition_fnGetTypeInfoCount(IMediaPosition* iface,UINT* pcTypeInfo)
323 CPassThruImpl_THIS(iface,mpos);
325 FIXME("(%p)->() stub!\n",This);
330 static HRESULT WINAPI
331 IMediaPosition_fnGetTypeInfo(IMediaPosition* iface,UINT iTypeInfo, LCID lcid, ITypeInfo** ppobj)
333 CPassThruImpl_THIS(iface,mpos);
335 FIXME("(%p)->() stub!\n",This);
340 static HRESULT WINAPI
341 IMediaPosition_fnGetIDsOfNames(IMediaPosition* iface,REFIID riid, LPOLESTR* ppwszName, UINT cNames, LCID lcid, DISPID* pDispId)
343 CPassThruImpl_THIS(iface,mpos);
345 FIXME("(%p)->() stub!\n",This);
350 static HRESULT WINAPI
351 IMediaPosition_fnInvoke(IMediaPosition* iface,DISPID DispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarRes, EXCEPINFO* pExcepInfo, UINT* puArgErr)
353 CPassThruImpl_THIS(iface,mpos);
355 FIXME("(%p)->() stub!\n",This);
361 static HRESULT WINAPI
362 IMediaPosition_fnget_Duration(IMediaPosition* iface,REFTIME* prefTime)
364 CPassThruImpl_THIS(iface,mpos);
367 TRACE("(%p)->()\n",This);
369 hr = IMediaPosition_get_Duration(pPos,prefTime);
370 IMediaPosition_Release(pPos);
374 static HRESULT WINAPI
375 IMediaPosition_fnput_CurrentPosition(IMediaPosition* iface,REFTIME refTime)
377 CPassThruImpl_THIS(iface,mpos);
380 TRACE("(%p)->()\n",This);
382 hr = IMediaPosition_put_CurrentPosition(pPos,refTime);
383 IMediaPosition_Release(pPos);
387 static HRESULT WINAPI
388 IMediaPosition_fnget_CurrentPosition(IMediaPosition* iface,REFTIME* prefTime)
390 CPassThruImpl_THIS(iface,mpos);
393 TRACE("(%p)->()\n",This);
395 hr = IMediaPosition_get_CurrentPosition(pPos,prefTime);
396 IMediaPosition_Release(pPos);
400 static HRESULT WINAPI
401 IMediaPosition_fnget_StopTime(IMediaPosition* iface,REFTIME* prefTime)
403 CPassThruImpl_THIS(iface,mpos);
406 TRACE("(%p)->()\n",This);
408 hr = IMediaPosition_get_StopTime(pPos,prefTime);
409 IMediaPosition_Release(pPos);
413 static HRESULT WINAPI
414 IMediaPosition_fnput_StopTime(IMediaPosition* iface,REFTIME refTime)
416 CPassThruImpl_THIS(iface,mpos);
419 TRACE("(%p)->()\n",This);
421 hr = IMediaPosition_put_StopTime(pPos,refTime);
422 IMediaPosition_Release(pPos);
426 static HRESULT WINAPI
427 IMediaPosition_fnget_PrerollTime(IMediaPosition* iface,REFTIME* prefTime)
429 CPassThruImpl_THIS(iface,mpos);
432 TRACE("(%p)->()\n",This);
434 hr = IMediaPosition_get_PrerollTime(pPos,prefTime);
435 IMediaPosition_Release(pPos);
439 static HRESULT WINAPI
440 IMediaPosition_fnput_PrerollTime(IMediaPosition* iface,REFTIME refTime)
442 CPassThruImpl_THIS(iface,mpos);
445 TRACE("(%p)->()\n",This);
447 hr = IMediaPosition_put_PrerollTime(pPos,refTime);
448 IMediaPosition_Release(pPos);
452 static HRESULT WINAPI
453 IMediaPosition_fnput_Rate(IMediaPosition* iface,double dblRate)
455 CPassThruImpl_THIS(iface,mpos);
458 TRACE("(%p)->()\n",This);
460 hr = IMediaPosition_put_Rate(pPos,dblRate);
461 IMediaPosition_Release(pPos);
465 static HRESULT WINAPI
466 IMediaPosition_fnget_Rate(IMediaPosition* iface,double* pdblRate)
468 CPassThruImpl_THIS(iface,mpos);
471 TRACE("(%p)->()\n",This);
473 hr = IMediaPosition_get_Rate(pPos,pdblRate);
474 IMediaPosition_Release(pPos);
478 static HRESULT WINAPI
479 IMediaPosition_fnCanSeekForward(IMediaPosition* iface,LONG* pCanSeek)
481 CPassThruImpl_THIS(iface,mpos);
484 TRACE("(%p)->()\n",This);
486 hr = IMediaPosition_CanSeekForward(pPos,pCanSeek);
487 IMediaPosition_Release(pPos);
491 static HRESULT WINAPI
492 IMediaPosition_fnCanSeekBackward(IMediaPosition* iface,LONG* pCanSeek)
494 CPassThruImpl_THIS(iface,mpos);
497 TRACE("(%p)->()\n",This);
499 hr = IMediaPosition_CanSeekBackward(pPos,pCanSeek);
500 IMediaPosition_Release(pPos);
505 static ICOM_VTABLE(IMediaPosition) impos =
507 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
508 /* IUnknown fields */
509 IMediaPosition_fnQueryInterface,
510 IMediaPosition_fnAddRef,
511 IMediaPosition_fnRelease,
512 /* IDispatch fields */
513 IMediaPosition_fnGetTypeInfoCount,
514 IMediaPosition_fnGetTypeInfo,
515 IMediaPosition_fnGetIDsOfNames,
516 IMediaPosition_fnInvoke,
517 /* IMediaPosition fields */
518 IMediaPosition_fnget_Duration,
519 IMediaPosition_fnput_CurrentPosition,
520 IMediaPosition_fnget_CurrentPosition,
521 IMediaPosition_fnget_StopTime,
522 IMediaPosition_fnput_StopTime,
523 IMediaPosition_fnget_PrerollTime,
524 IMediaPosition_fnput_PrerollTime,
525 IMediaPosition_fnput_Rate,
526 IMediaPosition_fnget_Rate,
527 IMediaPosition_fnCanSeekForward,
528 IMediaPosition_fnCanSeekBackward,
532 HRESULT CPassThruImpl_InitIMediaPosition( CPassThruImpl* pImpl )
534 TRACE("(%p)\n",pImpl);
535 ICOM_VTBL(&pImpl->mpos) = &impos;
540 void CPassThruImpl_UninitIMediaPosition( CPassThruImpl* pImpl )
542 TRACE("(%p)\n",pImpl);
548 /***************************************************************************
550 * An implementation for CPassThruImpl::IMediaSeeking.
554 #define QUERYSEEKPASS \
555 IMediaSeeking* pSeek = NULL; \
557 hr = CPassThruImpl_QuerySeekPass( This, &pSeek ); \
558 if ( FAILED(hr) ) return hr;
561 static HRESULT WINAPI
562 IMediaSeeking_fnQueryInterface(IMediaSeeking* iface,REFIID riid,void** ppobj)
564 CPassThruImpl_THIS(iface,mseek);
566 TRACE("(%p)->()\n",This);
568 return IUnknown_QueryInterface(This->punk,riid,ppobj);
572 IMediaSeeking_fnAddRef(IMediaSeeking* iface)
574 CPassThruImpl_THIS(iface,mseek);
576 TRACE("(%p)->()\n",This);
578 return IUnknown_AddRef(This->punk);
582 IMediaSeeking_fnRelease(IMediaSeeking* iface)
584 CPassThruImpl_THIS(iface,mseek);
586 TRACE("(%p)->()\n",This);
588 return IUnknown_Release(This->punk);
592 static HRESULT WINAPI
593 IMediaSeeking_fnGetCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
595 CPassThruImpl_THIS(iface,mseek);
598 TRACE("(%p)->()\n",This);
600 hr = IMediaSeeking_GetCapabilities(pSeek,pdwCaps);
601 IMediaSeeking_Release(pSeek);
605 static HRESULT WINAPI
606 IMediaSeeking_fnCheckCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
608 CPassThruImpl_THIS(iface,mseek);
611 TRACE("(%p)->()\n",This);
613 hr = IMediaSeeking_CheckCapabilities(pSeek,pdwCaps);
614 IMediaSeeking_Release(pSeek);
618 static HRESULT WINAPI
619 IMediaSeeking_fnIsFormatSupported(IMediaSeeking* iface,const GUID* pidFormat)
621 CPassThruImpl_THIS(iface,mseek);
624 TRACE("(%p)->()\n",This);
626 hr = IMediaSeeking_IsFormatSupported(pSeek,pidFormat);
627 IMediaSeeking_Release(pSeek);
631 static HRESULT WINAPI
632 IMediaSeeking_fnQueryPreferredFormat(IMediaSeeking* iface,GUID* pidFormat)
634 CPassThruImpl_THIS(iface,mseek);
637 TRACE("(%p)->()\n",This);
639 hr = IMediaSeeking_QueryPreferredFormat(pSeek,pidFormat);
640 IMediaSeeking_Release(pSeek);
644 static HRESULT WINAPI
645 IMediaSeeking_fnGetTimeFormat(IMediaSeeking* iface,GUID* pidFormat)
647 CPassThruImpl_THIS(iface,mseek);
650 TRACE("(%p)->()\n",This);
652 hr = IMediaSeeking_GetTimeFormat(pSeek,pidFormat);
653 IMediaSeeking_Release(pSeek);
657 static HRESULT WINAPI
658 IMediaSeeking_fnIsUsingTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
660 CPassThruImpl_THIS(iface,mseek);
663 TRACE("(%p)->()\n",This);
665 hr = IMediaSeeking_IsUsingTimeFormat(pSeek,pidFormat);
666 IMediaSeeking_Release(pSeek);
670 static HRESULT WINAPI
671 IMediaSeeking_fnSetTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
673 CPassThruImpl_THIS(iface,mseek);
676 TRACE("(%p)->()\n",This);
678 hr = IMediaSeeking_SetTimeFormat(pSeek,pidFormat);
679 IMediaSeeking_Release(pSeek);
683 static HRESULT WINAPI
684 IMediaSeeking_fnGetDuration(IMediaSeeking* iface,LONGLONG* pllDuration)
686 CPassThruImpl_THIS(iface,mseek);
689 TRACE("(%p)->()\n",This);
691 hr = IMediaSeeking_GetDuration(pSeek,pllDuration);
692 IMediaSeeking_Release(pSeek);
696 static HRESULT WINAPI
697 IMediaSeeking_fnGetStopPosition(IMediaSeeking* iface,LONGLONG* pllPos)
699 CPassThruImpl_THIS(iface,mseek);
702 TRACE("(%p)->()\n",This);
704 hr = IMediaSeeking_GetStopPosition(pSeek,pllPos);
705 IMediaSeeking_Release(pSeek);
709 static HRESULT WINAPI
710 IMediaSeeking_fnGetCurrentPosition(IMediaSeeking* iface,LONGLONG* pllPos)
712 CPassThruImpl_THIS(iface,mseek);
715 TRACE("(%p)->()\n",This);
717 hr = IMediaSeeking_GetCurrentPosition(pSeek,pllPos);
718 IMediaSeeking_Release(pSeek);
722 static HRESULT WINAPI
723 IMediaSeeking_fnConvertTimeFormat(IMediaSeeking* iface,LONGLONG* pllOut,const GUID* pidFmtOut,LONGLONG llIn,const GUID* pidFmtIn)
725 CPassThruImpl_THIS(iface,mseek);
728 TRACE("(%p)->()\n",This);
730 hr = IMediaSeeking_ConvertTimeFormat(pSeek,pllOut,pidFmtOut,llIn,pidFmtIn);
731 IMediaSeeking_Release(pSeek);
735 static HRESULT WINAPI
736 IMediaSeeking_fnSetPositions(IMediaSeeking* iface,LONGLONG* pllCur,DWORD dwCurFlags,LONGLONG* pllStop,DWORD dwStopFlags)
738 CPassThruImpl_THIS(iface,mseek);
741 TRACE("(%p)->()\n",This);
743 hr = IMediaSeeking_SetPositions(pSeek,pllCur,dwCurFlags,pllStop,dwStopFlags);
744 IMediaSeeking_Release(pSeek);
748 static HRESULT WINAPI
749 IMediaSeeking_fnGetPositions(IMediaSeeking* iface,LONGLONG* pllCur,LONGLONG* pllStop)
751 CPassThruImpl_THIS(iface,mseek);
754 TRACE("(%p)->()\n",This);
756 hr = IMediaSeeking_GetPositions(pSeek,pllCur,pllStop);
757 IMediaSeeking_Release(pSeek);
761 static HRESULT WINAPI
762 IMediaSeeking_fnGetAvailable(IMediaSeeking* iface,LONGLONG* pllFirst,LONGLONG* pllLast)
764 CPassThruImpl_THIS(iface,mseek);
767 TRACE("(%p)->()\n",This);
769 hr = IMediaSeeking_GetAvailable(pSeek,pllFirst,pllLast);
770 IMediaSeeking_Release(pSeek);
774 static HRESULT WINAPI
775 IMediaSeeking_fnSetRate(IMediaSeeking* iface,double dblRate)
777 CPassThruImpl_THIS(iface,mseek);
780 TRACE("(%p)->()\n",This);
782 hr = IMediaSeeking_SetRate(pSeek,dblRate);
783 IMediaSeeking_Release(pSeek);
787 static HRESULT WINAPI
788 IMediaSeeking_fnGetRate(IMediaSeeking* iface,double* pdblRate)
790 CPassThruImpl_THIS(iface,mseek);
793 TRACE("(%p)->()\n",This);
795 hr = IMediaSeeking_GetRate(pSeek,pdblRate);
796 IMediaSeeking_Release(pSeek);
800 static HRESULT WINAPI
801 IMediaSeeking_fnGetPreroll(IMediaSeeking* iface,LONGLONG* pllPreroll)
803 CPassThruImpl_THIS(iface,mseek);
806 TRACE("(%p)->()\n",This);
808 hr = IMediaSeeking_GetPreroll(pSeek,pllPreroll);
809 IMediaSeeking_Release(pSeek);
816 static ICOM_VTABLE(IMediaSeeking) imseek =
818 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
819 /* IUnknown fields */
820 IMediaSeeking_fnQueryInterface,
821 IMediaSeeking_fnAddRef,
822 IMediaSeeking_fnRelease,
823 /* IMediaSeeking fields */
824 IMediaSeeking_fnGetCapabilities,
825 IMediaSeeking_fnCheckCapabilities,
826 IMediaSeeking_fnIsFormatSupported,
827 IMediaSeeking_fnQueryPreferredFormat,
828 IMediaSeeking_fnGetTimeFormat,
829 IMediaSeeking_fnIsUsingTimeFormat,
830 IMediaSeeking_fnSetTimeFormat,
831 IMediaSeeking_fnGetDuration,
832 IMediaSeeking_fnGetStopPosition,
833 IMediaSeeking_fnGetCurrentPosition,
834 IMediaSeeking_fnConvertTimeFormat,
835 IMediaSeeking_fnSetPositions,
836 IMediaSeeking_fnGetPositions,
837 IMediaSeeking_fnGetAvailable,
838 IMediaSeeking_fnSetRate,
839 IMediaSeeking_fnGetRate,
840 IMediaSeeking_fnGetPreroll,
845 HRESULT CPassThruImpl_InitIMediaSeeking( CPassThruImpl* pImpl )
847 TRACE("(%p)\n",pImpl);
848 ICOM_VTBL(&pImpl->mseek) = &imseek;
853 void CPassThruImpl_UninitIMediaSeeking( CPassThruImpl* pImpl )
855 TRACE("(%p)\n",pImpl);