2 * Implementation of IMediaPosition for FilterGraph.
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"
42 IMediaPosition_fnQueryInterface(IMediaPosition* iface,REFIID riid,void** ppobj)
44 CFilterGraph_THIS(iface,mediaposition);
46 TRACE("(%p)->()\n",This);
48 return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
52 IMediaPosition_fnAddRef(IMediaPosition* iface)
54 CFilterGraph_THIS(iface,mediaposition);
56 TRACE("(%p)->()\n",This);
58 return IUnknown_AddRef(This->unk.punkControl);
62 IMediaPosition_fnRelease(IMediaPosition* iface)
64 CFilterGraph_THIS(iface,mediaposition);
66 TRACE("(%p)->()\n",This);
68 return IUnknown_Release(This->unk.punkControl);
72 IMediaPosition_fnGetTypeInfoCount(IMediaPosition* iface,UINT* pcTypeInfo)
74 CFilterGraph_THIS(iface,mediaposition);
76 TRACE("(%p)->()\n",This);
78 return IDispatch_GetTypeInfoCount(
79 CFilterGraph_IDispatch(This),pcTypeInfo);
83 IMediaPosition_fnGetTypeInfo(IMediaPosition* iface,UINT iTypeInfo, LCID lcid, ITypeInfo** ppobj)
85 CFilterGraph_THIS(iface,mediaposition);
87 TRACE("(%p)->()\n",This);
89 return IDispatch_GetTypeInfo(
90 CFilterGraph_IDispatch(This),iTypeInfo,lcid,ppobj);
94 IMediaPosition_fnGetIDsOfNames(IMediaPosition* iface,REFIID riid, LPOLESTR* ppwszName, UINT cNames, LCID lcid, DISPID* pDispId)
96 CFilterGraph_THIS(iface,mediaposition);
98 TRACE("(%p)->()\n",This);
100 return IDispatch_GetIDsOfNames(
101 CFilterGraph_IDispatch(This),riid,ppwszName,cNames,lcid,pDispId);
104 static HRESULT WINAPI
105 IMediaPosition_fnInvoke(IMediaPosition* iface,DISPID DispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarRes, EXCEPINFO* pExcepInfo, UINT* puArgErr)
107 CFilterGraph_THIS(iface,mediaposition);
109 TRACE("(%p)->()\n",This);
111 return IDispatch_Invoke(
112 CFilterGraph_IDispatch(This),
113 DispId,riid,lcid,wFlags,pDispParams,pVarRes,pExcepInfo,puArgErr);
117 static HRESULT WINAPI
118 IMediaPosition_fnget_Duration(IMediaPosition* iface,REFTIME* prefTime)
120 CFilterGraph_THIS(iface,mediaposition);
121 HRESULT hr = E_NOTIMPL;
125 TRACE("(%p)->(%p)\n",This,prefTime);
127 EnterCriticalSection( &This->m_csFilters );
129 for ( n = 0; n < This->m_cActiveFilters; n++ )
131 if ( This->m_pActiveFilters[n].pPosition != NULL )
133 hrFilter = IMediaPosition_get_Duration( This->m_pActiveFilters[n].pPosition, prefTime );
134 if ( hr == E_NOTIMPL )
139 if ( hrFilter != E_NOTIMPL )
147 LeaveCriticalSection( &This->m_csFilters );
152 static HRESULT WINAPI
153 IMediaPosition_fnput_CurrentPosition(IMediaPosition* iface,REFTIME refTime)
155 CFilterGraph_THIS(iface,mediaposition);
156 HRESULT hr = E_NOTIMPL;
160 TRACE("(%p)->()\n",This);
162 EnterCriticalSection( &This->m_csFilters );
164 for ( n = 0; n < This->m_cActiveFilters; n++ )
166 if ( This->m_pActiveFilters[n].pPosition != NULL )
168 hrFilter = IMediaPosition_put_CurrentPosition( This->m_pActiveFilters[n].pPosition, refTime );
169 if ( hr == E_NOTIMPL )
174 if ( hrFilter != E_NOTIMPL )
182 LeaveCriticalSection( &This->m_csFilters );
187 static HRESULT WINAPI
188 IMediaPosition_fnget_CurrentPosition(IMediaPosition* iface,REFTIME* prefTime)
190 CFilterGraph_THIS(iface,mediaposition);
191 HRESULT hr = E_NOTIMPL;
195 TRACE("(%p)->()\n",This);
197 EnterCriticalSection( &This->m_csFilters );
199 for ( n = 0; n < This->m_cActiveFilters; n++ )
201 if ( This->m_pActiveFilters[n].pPosition != NULL )
203 hrFilter = IMediaPosition_get_CurrentPosition( This->m_pActiveFilters[n].pPosition, prefTime );
204 if ( hr == E_NOTIMPL )
209 if ( hrFilter != E_NOTIMPL )
217 LeaveCriticalSection( &This->m_csFilters );
222 static HRESULT WINAPI
223 IMediaPosition_fnget_StopTime(IMediaPosition* iface,REFTIME* prefTime)
225 CFilterGraph_THIS(iface,mediaposition);
226 HRESULT hr = E_NOTIMPL;
230 TRACE("(%p)->()\n",This);
232 EnterCriticalSection( &This->m_csFilters );
234 for ( n = 0; n < This->m_cActiveFilters; n++ )
236 if ( This->m_pActiveFilters[n].pPosition != NULL )
238 hrFilter = IMediaPosition_get_StopTime( This->m_pActiveFilters[n].pPosition, prefTime );
239 if ( hr == E_NOTIMPL )
244 if ( hrFilter != E_NOTIMPL )
252 LeaveCriticalSection( &This->m_csFilters );
257 static HRESULT WINAPI
258 IMediaPosition_fnput_StopTime(IMediaPosition* iface,REFTIME refTime)
260 CFilterGraph_THIS(iface,mediaposition);
261 HRESULT hr = E_NOTIMPL;
265 TRACE("(%p)->()\n",This);
267 EnterCriticalSection( &This->m_csFilters );
269 for ( n = 0; n < This->m_cActiveFilters; n++ )
271 if ( This->m_pActiveFilters[n].pPosition != NULL )
273 hrFilter = IMediaPosition_put_StopTime( This->m_pActiveFilters[n].pPosition, refTime );
274 if ( hr == E_NOTIMPL )
279 if ( hrFilter != E_NOTIMPL )
287 LeaveCriticalSection( &This->m_csFilters );
292 static HRESULT WINAPI
293 IMediaPosition_fnget_PrerollTime(IMediaPosition* iface,REFTIME* prefTime)
295 CFilterGraph_THIS(iface,mediaposition);
296 HRESULT hr = E_NOTIMPL;
300 TRACE("(%p)->()\n",This);
302 EnterCriticalSection( &This->m_csFilters );
304 for ( n = 0; n < This->m_cActiveFilters; n++ )
306 if ( This->m_pActiveFilters[n].pPosition != NULL )
308 hrFilter = IMediaPosition_get_PrerollTime( This->m_pActiveFilters[n].pPosition, prefTime );
309 if ( hr == E_NOTIMPL )
314 if ( hrFilter != E_NOTIMPL )
322 LeaveCriticalSection( &This->m_csFilters );
327 static HRESULT WINAPI
328 IMediaPosition_fnput_PrerollTime(IMediaPosition* iface,REFTIME refTime)
330 CFilterGraph_THIS(iface,mediaposition);
331 HRESULT hr = E_NOTIMPL;
335 TRACE("(%p)->()\n",This);
337 EnterCriticalSection( &This->m_csFilters );
339 for ( n = 0; n < This->m_cActiveFilters; n++ )
341 if ( This->m_pActiveFilters[n].pPosition != NULL )
343 hrFilter = IMediaPosition_put_PrerollTime( This->m_pActiveFilters[n].pPosition, refTime );
344 if ( hr == E_NOTIMPL )
349 if ( hrFilter != E_NOTIMPL )
357 LeaveCriticalSection( &This->m_csFilters );
362 static HRESULT WINAPI
363 IMediaPosition_fnput_Rate(IMediaPosition* iface,double dblRate)
365 CFilterGraph_THIS(iface,mediaposition);
366 HRESULT hr = E_NOTIMPL;
370 TRACE("(%p)->()\n",This);
372 EnterCriticalSection( &This->m_csFilters );
374 for ( n = 0; n < This->m_cActiveFilters; n++ )
376 if ( This->m_pActiveFilters[n].pPosition != NULL )
378 hrFilter = IMediaPosition_put_Rate( This->m_pActiveFilters[n].pPosition, dblRate );
379 if ( hr == E_NOTIMPL )
384 if ( hrFilter != E_NOTIMPL )
392 LeaveCriticalSection( &This->m_csFilters );
397 static HRESULT WINAPI
398 IMediaPosition_fnget_Rate(IMediaPosition* iface,double* pdblRate)
400 CFilterGraph_THIS(iface,mediaposition);
401 HRESULT hr = E_NOTIMPL;
405 TRACE("(%p)->()\n",This);
407 EnterCriticalSection( &This->m_csFilters );
409 for ( n = 0; n < This->m_cActiveFilters; n++ )
411 if ( This->m_pActiveFilters[n].pPosition != NULL )
413 hrFilter = IMediaPosition_get_Rate( This->m_pActiveFilters[n].pPosition, pdblRate );
414 if ( hr == E_NOTIMPL )
419 if ( hrFilter != E_NOTIMPL )
427 LeaveCriticalSection( &This->m_csFilters );
432 static HRESULT WINAPI
433 IMediaPosition_fnCanSeekForward(IMediaPosition* iface,LONG* pCanSeek)
435 CFilterGraph_THIS(iface,mediaposition);
436 HRESULT hr = E_NOTIMPL;
440 TRACE("(%p)->()\n",This);
442 EnterCriticalSection( &This->m_csFilters );
444 for ( n = 0; n < This->m_cActiveFilters; n++ )
446 if ( This->m_pActiveFilters[n].pPosition != NULL )
448 hrFilter = IMediaPosition_CanSeekForward( This->m_pActiveFilters[n].pPosition, pCanSeek );
449 if ( hr == E_NOTIMPL )
454 if ( hrFilter != E_NOTIMPL )
462 LeaveCriticalSection( &This->m_csFilters );
467 static HRESULT WINAPI
468 IMediaPosition_fnCanSeekBackward(IMediaPosition* iface,LONG* pCanSeek)
470 CFilterGraph_THIS(iface,mediaposition);
471 HRESULT hr = E_NOTIMPL;
475 TRACE("(%p)->()\n",This);
477 EnterCriticalSection( &This->m_csFilters );
479 for ( n = 0; n < This->m_cActiveFilters; n++ )
481 if ( This->m_pActiveFilters[n].pPosition != NULL )
483 hrFilter = IMediaPosition_CanSeekBackward( This->m_pActiveFilters[n].pPosition, pCanSeek );
484 if ( hr == E_NOTIMPL )
489 if ( hrFilter != E_NOTIMPL )
497 LeaveCriticalSection( &This->m_csFilters );
503 static ICOM_VTABLE(IMediaPosition) imediaposition =
505 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
506 /* IUnknown fields */
507 IMediaPosition_fnQueryInterface,
508 IMediaPosition_fnAddRef,
509 IMediaPosition_fnRelease,
510 /* IDispatch fields */
511 IMediaPosition_fnGetTypeInfoCount,
512 IMediaPosition_fnGetTypeInfo,
513 IMediaPosition_fnGetIDsOfNames,
514 IMediaPosition_fnInvoke,
515 /* IMediaPosition fields */
516 IMediaPosition_fnget_Duration,
517 IMediaPosition_fnput_CurrentPosition,
518 IMediaPosition_fnget_CurrentPosition,
519 IMediaPosition_fnget_StopTime,
520 IMediaPosition_fnput_StopTime,
521 IMediaPosition_fnget_PrerollTime,
522 IMediaPosition_fnput_PrerollTime,
523 IMediaPosition_fnput_Rate,
524 IMediaPosition_fnget_Rate,
525 IMediaPosition_fnCanSeekForward,
526 IMediaPosition_fnCanSeekBackward,
530 HRESULT CFilterGraph_InitIMediaPosition( CFilterGraph* pfg )
533 ICOM_VTBL(&pfg->mediaposition) = &imediaposition;
538 void CFilterGraph_UninitIMediaPosition( CFilterGraph* pfg )