2 * Implementation of IMediaSeeking for FilterGraph.
5 * FIXME - this interface should be allocated as a plug-in(?)
7 * Copyright (C) Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(quartz);
38 #include "quartz_private.h"
44 IMediaSeeking_fnQueryInterface(IMediaSeeking* iface,REFIID riid,void** ppobj)
46 CFilterGraph_THIS(iface,mediaseeking);
48 TRACE("(%p)->()\n",This);
50 return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
54 IMediaSeeking_fnAddRef(IMediaSeeking* iface)
56 CFilterGraph_THIS(iface,mediaseeking);
58 TRACE("(%p)->()\n",This);
60 return IUnknown_AddRef(This->unk.punkControl);
64 IMediaSeeking_fnRelease(IMediaSeeking* iface)
66 CFilterGraph_THIS(iface,mediaseeking);
68 TRACE("(%p)->()\n",This);
70 return IUnknown_Release(This->unk.punkControl);
75 IMediaSeeking_fnGetCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
77 CFilterGraph_THIS(iface,mediaseeking);
78 HRESULT hr = E_NOTIMPL;
82 TRACE("(%p)->()\n",This);
84 EnterCriticalSection( &This->m_csFilters );
86 for ( n = 0; n < This->m_cActiveFilters; n++ )
88 if ( This->m_pActiveFilters[n].pSeeking != NULL )
90 hrFilter = IMediaSeeking_GetCapabilities( This->m_pActiveFilters[n].pSeeking, pdwCaps );
91 if ( hr == E_NOTIMPL )
96 if ( hrFilter != E_NOTIMPL )
104 LeaveCriticalSection( &This->m_csFilters );
109 static HRESULT WINAPI
110 IMediaSeeking_fnCheckCapabilities(IMediaSeeking* iface,DWORD* pdwCaps)
112 CFilterGraph_THIS(iface,mediaseeking);
113 HRESULT hr = E_NOTIMPL;
117 TRACE("(%p)->()\n",This);
119 EnterCriticalSection( &This->m_csFilters );
121 for ( n = 0; n < This->m_cActiveFilters; n++ )
123 if ( This->m_pActiveFilters[n].pSeeking != NULL )
125 hrFilter = IMediaSeeking_CheckCapabilities( This->m_pActiveFilters[n].pSeeking, pdwCaps );
126 if ( hr == E_NOTIMPL )
131 if ( hrFilter != E_NOTIMPL )
139 LeaveCriticalSection( &This->m_csFilters );
144 static HRESULT WINAPI
145 IMediaSeeking_fnIsFormatSupported(IMediaSeeking* iface,const GUID* pidFormat)
147 CFilterGraph_THIS(iface,mediaseeking);
148 HRESULT hr = E_NOTIMPL;
152 TRACE("(%p)->()\n",This);
154 EnterCriticalSection( &This->m_csFilters );
156 for ( n = 0; n < This->m_cActiveFilters; n++ )
158 if ( This->m_pActiveFilters[n].pSeeking != NULL )
160 hrFilter = IMediaSeeking_IsFormatSupported( This->m_pActiveFilters[n].pSeeking, pidFormat );
161 if ( hr == E_NOTIMPL )
166 if ( hrFilter != E_NOTIMPL )
174 LeaveCriticalSection( &This->m_csFilters );
179 static HRESULT WINAPI
180 IMediaSeeking_fnQueryPreferredFormat(IMediaSeeking* iface,GUID* pidFormat)
182 CFilterGraph_THIS(iface,mediaseeking);
183 HRESULT hr = E_NOTIMPL;
187 TRACE("(%p)->()\n",This);
189 EnterCriticalSection( &This->m_csFilters );
191 for ( n = 0; n < This->m_cActiveFilters; n++ )
193 if ( This->m_pActiveFilters[n].pSeeking != NULL )
195 hrFilter = IMediaSeeking_QueryPreferredFormat( This->m_pActiveFilters[n].pSeeking, pidFormat );
196 if ( hr == E_NOTIMPL )
201 if ( hrFilter != E_NOTIMPL )
209 LeaveCriticalSection( &This->m_csFilters );
214 static HRESULT WINAPI
215 IMediaSeeking_fnGetTimeFormat(IMediaSeeking* iface,GUID* pidFormat)
217 CFilterGraph_THIS(iface,mediaseeking);
218 HRESULT hr = E_NOTIMPL;
222 TRACE("(%p)->()\n",This);
224 EnterCriticalSection( &This->m_csFilters );
226 for ( n = 0; n < This->m_cActiveFilters; n++ )
228 if ( This->m_pActiveFilters[n].pSeeking != NULL )
230 hrFilter = IMediaSeeking_GetTimeFormat( This->m_pActiveFilters[n].pSeeking, pidFormat );
231 if ( hr == E_NOTIMPL )
236 if ( hrFilter != E_NOTIMPL )
244 LeaveCriticalSection( &This->m_csFilters );
249 static HRESULT WINAPI
250 IMediaSeeking_fnIsUsingTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
252 CFilterGraph_THIS(iface,mediaseeking);
253 HRESULT hr = E_NOTIMPL;
257 TRACE("(%p)->()\n",This);
259 EnterCriticalSection( &This->m_csFilters );
261 for ( n = 0; n < This->m_cActiveFilters; n++ )
263 if ( This->m_pActiveFilters[n].pSeeking != NULL )
265 hrFilter = IMediaSeeking_IsUsingTimeFormat( This->m_pActiveFilters[n].pSeeking, pidFormat );
266 if ( hr == E_NOTIMPL )
271 if ( hrFilter != E_NOTIMPL )
279 LeaveCriticalSection( &This->m_csFilters );
284 static HRESULT WINAPI
285 IMediaSeeking_fnSetTimeFormat(IMediaSeeking* iface,const GUID* pidFormat)
287 CFilterGraph_THIS(iface,mediaseeking);
288 HRESULT hr = E_NOTIMPL;
292 TRACE("(%p)->()\n",This);
294 EnterCriticalSection( &This->m_csFilters );
296 for ( n = 0; n < This->m_cActiveFilters; n++ )
298 if ( This->m_pActiveFilters[n].pSeeking != NULL )
300 hrFilter = IMediaSeeking_SetTimeFormat( This->m_pActiveFilters[n].pSeeking, pidFormat );
301 if ( hr == E_NOTIMPL )
306 if ( hrFilter != E_NOTIMPL )
314 LeaveCriticalSection( &This->m_csFilters );
319 static HRESULT WINAPI
320 IMediaSeeking_fnGetDuration(IMediaSeeking* iface,LONGLONG* pllDuration)
322 CFilterGraph_THIS(iface,mediaseeking);
323 HRESULT hr = E_NOTIMPL;
327 TRACE("(%p)->()\n",This);
329 EnterCriticalSection( &This->m_csFilters );
331 for ( n = 0; n < This->m_cActiveFilters; n++ )
333 if ( This->m_pActiveFilters[n].pSeeking != NULL )
335 hrFilter = IMediaSeeking_GetDuration( This->m_pActiveFilters[n].pSeeking, pllDuration );
336 if ( hr == E_NOTIMPL )
341 if ( hrFilter != E_NOTIMPL )
349 LeaveCriticalSection( &This->m_csFilters );
354 static HRESULT WINAPI
355 IMediaSeeking_fnGetStopPosition(IMediaSeeking* iface,LONGLONG* pllPos)
357 CFilterGraph_THIS(iface,mediaseeking);
358 HRESULT hr = E_NOTIMPL;
362 TRACE("(%p)->()\n",This);
364 EnterCriticalSection( &This->m_csFilters );
366 for ( n = 0; n < This->m_cActiveFilters; n++ )
368 if ( This->m_pActiveFilters[n].pSeeking != NULL )
370 hrFilter = IMediaSeeking_GetStopPosition( This->m_pActiveFilters[n].pSeeking, pllPos );
371 if ( hr == E_NOTIMPL )
376 if ( hrFilter != E_NOTIMPL )
384 LeaveCriticalSection( &This->m_csFilters );
389 static HRESULT WINAPI
390 IMediaSeeking_fnGetCurrentPosition(IMediaSeeking* iface,LONGLONG* pllPos)
392 CFilterGraph_THIS(iface,mediaseeking);
393 HRESULT hr = E_NOTIMPL;
397 TRACE("(%p)->()\n",This);
399 EnterCriticalSection( &This->m_csFilters );
401 for ( n = 0; n < This->m_cActiveFilters; n++ )
403 if ( This->m_pActiveFilters[n].pSeeking != NULL )
405 hrFilter = IMediaSeeking_GetCurrentPosition( This->m_pActiveFilters[n].pSeeking, pllPos );
406 if ( hr == E_NOTIMPL )
411 if ( hrFilter != E_NOTIMPL )
419 LeaveCriticalSection( &This->m_csFilters );
424 static HRESULT WINAPI
425 IMediaSeeking_fnConvertTimeFormat(IMediaSeeking* iface,LONGLONG* pllOut,const GUID* pidFmtOut,LONGLONG llIn,const GUID* pidFmtIn)
427 CFilterGraph_THIS(iface,mediaseeking);
428 HRESULT hr = E_NOTIMPL;
432 TRACE("(%p)->()\n",This);
434 EnterCriticalSection( &This->m_csFilters );
436 for ( n = 0; n < This->m_cActiveFilters; n++ )
438 if ( This->m_pActiveFilters[n].pSeeking != NULL )
440 hrFilter = IMediaSeeking_ConvertTimeFormat( This->m_pActiveFilters[n].pSeeking, pllOut, pidFmtOut, llIn, pidFmtIn );
441 if ( hr == E_NOTIMPL )
446 if ( hrFilter != E_NOTIMPL )
454 LeaveCriticalSection( &This->m_csFilters );
459 static HRESULT WINAPI
460 IMediaSeeking_fnSetPositions(IMediaSeeking* iface,LONGLONG* pllCur,DWORD dwCurFlags,LONGLONG* pllStop,DWORD dwStopFlags)
462 CFilterGraph_THIS(iface,mediaseeking);
463 HRESULT hr = E_NOTIMPL;
467 TRACE("(%p)->()\n",This);
469 EnterCriticalSection( &This->m_csFilters );
471 for ( n = 0; n < This->m_cActiveFilters; n++ )
473 if ( This->m_pActiveFilters[n].pSeeking != NULL )
475 hrFilter = IMediaSeeking_SetPositions( This->m_pActiveFilters[n].pSeeking, pllCur, dwCurFlags, pllStop, dwStopFlags );
476 if ( hr == E_NOTIMPL )
481 if ( hrFilter != E_NOTIMPL )
489 LeaveCriticalSection( &This->m_csFilters );
494 static HRESULT WINAPI
495 IMediaSeeking_fnGetPositions(IMediaSeeking* iface,LONGLONG* pllCur,LONGLONG* pllStop)
497 CFilterGraph_THIS(iface,mediaseeking);
498 HRESULT hr = E_NOTIMPL;
502 TRACE("(%p)->()\n",This);
504 EnterCriticalSection( &This->m_csFilters );
506 for ( n = 0; n < This->m_cActiveFilters; n++ )
508 if ( This->m_pActiveFilters[n].pSeeking != NULL )
510 hrFilter = IMediaSeeking_GetPositions( This->m_pActiveFilters[n].pSeeking, pllCur, pllStop );
511 if ( hr == E_NOTIMPL )
516 if ( hrFilter != E_NOTIMPL )
524 LeaveCriticalSection( &This->m_csFilters );
529 static HRESULT WINAPI
530 IMediaSeeking_fnGetAvailable(IMediaSeeking* iface,LONGLONG* pllFirst,LONGLONG* pllLast)
532 CFilterGraph_THIS(iface,mediaseeking);
533 HRESULT hr = E_NOTIMPL;
537 TRACE("(%p)->()\n",This);
539 EnterCriticalSection( &This->m_csFilters );
541 for ( n = 0; n < This->m_cActiveFilters; n++ )
543 if ( This->m_pActiveFilters[n].pSeeking != NULL )
545 hrFilter = IMediaSeeking_GetAvailable( This->m_pActiveFilters[n].pSeeking, pllFirst, pllLast );
546 if ( hr == E_NOTIMPL )
551 if ( hrFilter != E_NOTIMPL )
559 LeaveCriticalSection( &This->m_csFilters );
564 static HRESULT WINAPI
565 IMediaSeeking_fnSetRate(IMediaSeeking* iface,double dblRate)
567 CFilterGraph_THIS(iface,mediaseeking);
568 HRESULT hr = E_NOTIMPL;
572 TRACE("(%p)->()\n",This);
574 EnterCriticalSection( &This->m_csFilters );
576 for ( n = 0; n < This->m_cActiveFilters; n++ )
578 if ( This->m_pActiveFilters[n].pSeeking != NULL )
580 hrFilter = IMediaSeeking_SetRate( This->m_pActiveFilters[n].pSeeking, dblRate );
581 if ( hr == E_NOTIMPL )
586 if ( hrFilter != E_NOTIMPL )
594 LeaveCriticalSection( &This->m_csFilters );
599 static HRESULT WINAPI
600 IMediaSeeking_fnGetRate(IMediaSeeking* iface,double* pdblRate)
602 CFilterGraph_THIS(iface,mediaseeking);
603 HRESULT hr = E_NOTIMPL;
607 TRACE("(%p)->()\n",This);
609 EnterCriticalSection( &This->m_csFilters );
611 for ( n = 0; n < This->m_cActiveFilters; n++ )
613 if ( This->m_pActiveFilters[n].pSeeking != NULL )
615 hrFilter = IMediaSeeking_GetRate( This->m_pActiveFilters[n].pSeeking, pdblRate );
616 if ( hr == E_NOTIMPL )
621 if ( hrFilter != E_NOTIMPL )
629 LeaveCriticalSection( &This->m_csFilters );
634 static HRESULT WINAPI
635 IMediaSeeking_fnGetPreroll(IMediaSeeking* iface,LONGLONG* pllPreroll)
637 CFilterGraph_THIS(iface,mediaseeking);
638 HRESULT hr = E_NOTIMPL;
642 TRACE("(%p)->()\n",This);
644 EnterCriticalSection( &This->m_csFilters );
646 for ( n = 0; n < This->m_cActiveFilters; n++ )
648 if ( This->m_pActiveFilters[n].pSeeking != NULL )
650 hrFilter = IMediaSeeking_GetPreroll( This->m_pActiveFilters[n].pSeeking, pllPreroll );
651 if ( hr == E_NOTIMPL )
656 if ( hrFilter != E_NOTIMPL )
664 LeaveCriticalSection( &This->m_csFilters );
672 static ICOM_VTABLE(IMediaSeeking) imediaseeking =
674 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
675 /* IUnknown fields */
676 IMediaSeeking_fnQueryInterface,
677 IMediaSeeking_fnAddRef,
678 IMediaSeeking_fnRelease,
679 /* IMediaSeeking fields */
680 IMediaSeeking_fnGetCapabilities,
681 IMediaSeeking_fnCheckCapabilities,
682 IMediaSeeking_fnIsFormatSupported,
683 IMediaSeeking_fnQueryPreferredFormat,
684 IMediaSeeking_fnGetTimeFormat,
685 IMediaSeeking_fnIsUsingTimeFormat,
686 IMediaSeeking_fnSetTimeFormat,
687 IMediaSeeking_fnGetDuration,
688 IMediaSeeking_fnGetStopPosition,
689 IMediaSeeking_fnGetCurrentPosition,
690 IMediaSeeking_fnConvertTimeFormat,
691 IMediaSeeking_fnSetPositions,
692 IMediaSeeking_fnGetPositions,
693 IMediaSeeking_fnGetAvailable,
694 IMediaSeeking_fnSetRate,
695 IMediaSeeking_fnGetRate,
696 IMediaSeeking_fnGetPreroll,
699 HRESULT CFilterGraph_InitIMediaSeeking( CFilterGraph* pfg )
702 ICOM_VTBL(&pfg->mediaseeking) = &imediaseeking;
707 void CFilterGraph_UninitIMediaSeeking( CFilterGraph* pfg )