2 * Filter Seeking and Control Interfaces
4 * Copyright 2003 Robert Shearman
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 /* FIXME: critical sections */
22 #include "quartz_private.h"
23 #include "control_private.h"
26 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(quartz
);
32 HRESULT
MediaSeekingImpl_Init(LPVOID pUserData
, CHANGEPROC fnChangeStop
, CHANGEPROC fnChangeStart
, CHANGEPROC fnChangeRate
, MediaSeekingImpl
* pSeeking
)
34 assert(fnChangeStop
&& fnChangeStart
&& fnChangeRate
);
36 pSeeking
->refCount
= 1;
37 pSeeking
->pUserData
= pUserData
;
38 pSeeking
->fnChangeRate
= fnChangeRate
;
39 pSeeking
->fnChangeStop
= fnChangeStop
;
40 pSeeking
->fnChangeStart
= fnChangeStart
;
41 pSeeking
->dwCapabilities
= AM_SEEKING_CanSeekForwards
|
42 AM_SEEKING_CanSeekBackwards
|
43 AM_SEEKING_CanSeekAbsolute
|
44 AM_SEEKING_CanGetStopPos
|
45 AM_SEEKING_CanGetDuration
;
46 pSeeking
->llStart
= 0;
47 pSeeking
->llStop
= ((ULONGLONG
)0x80000000) << 32;
48 pSeeking
->llDuration
= pSeeking
->llStop
- pSeeking
->llStart
;
49 pSeeking
->dRate
= 1.0;
55 HRESULT WINAPI
MediaSeekingImpl_GetCapabilities(IMediaSeeking
* iface
, DWORD
* pCapabilities
)
57 MediaSeekingImpl
*This
= (MediaSeekingImpl
*)iface
;
59 TRACE("(%p)\n", pCapabilities
);
61 *pCapabilities
= This
->dwCapabilities
;
66 HRESULT WINAPI
MediaSeekingImpl_CheckCapabilities(IMediaSeeking
* iface
, DWORD
* pCapabilities
)
68 MediaSeekingImpl
*This
= (MediaSeekingImpl
*)iface
;
72 TRACE("(%p)\n", pCapabilities
);
74 dwCommonCaps
= *pCapabilities
& This
->dwCapabilities
;
79 hr
= (*pCapabilities
== dwCommonCaps
) ? S_OK
: S_FALSE
;
80 *pCapabilities
= dwCommonCaps
;
85 HRESULT WINAPI
MediaSeekingImpl_IsFormatSupported(IMediaSeeking
* iface
, const GUID
* pFormat
)
87 TRACE("(%s)\n", qzdebugstr_guid(pFormat
));
89 return (IsEqualIID(pFormat
, &TIME_FORMAT_MEDIA_TIME
) ? S_OK
: S_FALSE
);
92 HRESULT WINAPI
MediaSeekingImpl_QueryPreferredFormat(IMediaSeeking
* iface
, GUID
* pFormat
)
94 TRACE("(%s)\n", qzdebugstr_guid(pFormat
));
96 *pFormat
= TIME_FORMAT_MEDIA_TIME
;
100 HRESULT WINAPI
MediaSeekingImpl_GetTimeFormat(IMediaSeeking
* iface
, GUID
* pFormat
)
102 TRACE("(%s)\n", qzdebugstr_guid(pFormat
));
104 *pFormat
= TIME_FORMAT_MEDIA_TIME
;
108 HRESULT WINAPI
MediaSeekingImpl_IsUsingTimeFormat(IMediaSeeking
* iface
, const GUID
* pFormat
)
110 TRACE("(%s)\n", qzdebugstr_guid(pFormat
));
112 return (IsEqualIID(pFormat
, &TIME_FORMAT_MEDIA_TIME
) ? S_OK
: S_FALSE
);
115 HRESULT WINAPI
MediaSeekingImpl_SetTimeFormat(IMediaSeeking
* iface
, const GUID
* pFormat
)
117 TRACE("(%s)\n", qzdebugstr_guid(pFormat
));
119 return (IsEqualIID(pFormat
, &TIME_FORMAT_MEDIA_TIME
) ? S_OK
: S_FALSE
);
122 HRESULT WINAPI
MediaSeekingImpl_GetDuration(IMediaSeeking
* iface
, LONGLONG
* pDuration
)
124 MediaSeekingImpl
*This
= (MediaSeekingImpl
*)iface
;
126 TRACE("(%p)\n", pDuration
);
128 *pDuration
= This
->llDuration
;
133 HRESULT WINAPI
MediaSeekingImpl_GetStopPosition(IMediaSeeking
* iface
, LONGLONG
* pStop
)
135 MediaSeekingImpl
*This
= (MediaSeekingImpl
*)iface
;
137 TRACE("(%p)\n", pStop
);
139 *pStop
= This
->llStop
;
144 HRESULT WINAPI
MediaSeekingImpl_GetCurrentPosition(IMediaSeeking
* iface
, LONGLONG
* pCurrent
)
146 MediaSeekingImpl
*This
= (MediaSeekingImpl
*)iface
;
148 TRACE("(%p)\n", pCurrent
);
150 *pCurrent
= This
->llStart
;
155 HRESULT WINAPI
MediaSeekingImpl_ConvertTimeFormat(IMediaSeeking
* iface
, LONGLONG
* pTarget
, const GUID
* pTargetFormat
, LONGLONG Source
, const GUID
* pSourceFormat
)
157 if (IsEqualIID(pTargetFormat
, &TIME_FORMAT_MEDIA_TIME
) && IsEqualIID(pSourceFormat
, &TIME_FORMAT_MEDIA_TIME
))
162 /* FIXME: clear pTarget? */
166 static inline LONGLONG
Adjust(LONGLONG value
, LONGLONG
* pModifier
, DWORD dwFlags
)
168 switch (dwFlags
& AM_SEEKING_PositioningBitsMask
)
170 case AM_SEEKING_NoPositioning
:
172 case AM_SEEKING_AbsolutePositioning
:
174 case AM_SEEKING_RelativePositioning
:
175 case AM_SEEKING_IncrementalPositioning
:
176 return value
+ *pModifier
;
183 HRESULT WINAPI
MediaSeekingImpl_SetPositions(IMediaSeeking
* iface
, LONGLONG
* pCurrent
, DWORD dwCurrentFlags
, LONGLONG
* pStop
, DWORD dwStopFlags
)
185 MediaSeekingImpl
*This
= (MediaSeekingImpl
*)iface
;
186 BOOL bChangeStart
= FALSE
, bChangeStop
= FALSE
;
187 LONGLONG llNewStart
, llNewStop
;
189 TRACE("(%p, %x, %p, %x)\n", pCurrent
, dwCurrentFlags
, pStop
, dwStopFlags
);
191 llNewStart
= Adjust(This
->llStart
, pCurrent
, dwCurrentFlags
);
192 llNewStop
= Adjust(This
->llStop
, pStop
, dwStopFlags
);
194 if (llNewStart
!= This
->llStart
)
196 if (llNewStop
!= This
->llStop
)
199 This
->llStart
= llNewStart
;
200 This
->llStop
= llNewStop
;
202 if (dwCurrentFlags
& AM_SEEKING_ReturnTime
)
203 *pCurrent
= llNewStart
;
204 if (dwStopFlags
& AM_SEEKING_ReturnTime
)
208 This
->fnChangeStart(This
->pUserData
);
210 This
->fnChangeStop(This
->pUserData
);
215 HRESULT WINAPI
MediaSeekingImpl_GetPositions(IMediaSeeking
* iface
, LONGLONG
* pCurrent
, LONGLONG
* pStop
)
217 MediaSeekingImpl
*This
= (MediaSeekingImpl
*)iface
;
219 TRACE("(%p, %p)\n", pCurrent
, pStop
);
221 *pCurrent
= This
->llStart
;
222 *pStop
= This
->llStop
;
227 HRESULT WINAPI
MediaSeekingImpl_GetAvailable(IMediaSeeking
* iface
, LONGLONG
* pEarliest
, LONGLONG
* pLatest
)
229 MediaSeekingImpl
*This
= (MediaSeekingImpl
*)iface
;
231 TRACE("(%p, %p)\n", pEarliest
, pLatest
);
234 *pLatest
= This
->llDuration
;
239 HRESULT WINAPI
MediaSeekingImpl_SetRate(IMediaSeeking
* iface
, double dRate
)
241 MediaSeekingImpl
*This
= (MediaSeekingImpl
*)iface
;
242 BOOL bChangeRate
= (dRate
!= This
->dRate
);
244 TRACE("(%e)\n", dRate
);
249 return This
->fnChangeRate(This
->pUserData
);
254 HRESULT WINAPI
MediaSeekingImpl_GetRate(IMediaSeeking
* iface
, double * dRate
)
256 MediaSeekingImpl
*This
= (MediaSeekingImpl
*)iface
;
258 TRACE("(%p)\n", dRate
);
260 *dRate
= This
->dRate
;
265 HRESULT WINAPI
MediaSeekingImpl_GetPreroll(IMediaSeeking
* iface
, LONGLONG
* pPreroll
)
267 TRACE("(%p)\n", pPreroll
);