2 * IReferenceClock Implementation
4 * Copyright (C) 2003-2004 Rok Mandeljc
6 * This program 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 program 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 program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "dmusic_private.h"
23 WINE_DEFAULT_DEBUG_CHANNEL(dmusic
);
25 static inline IReferenceClockImpl
*impl_from_IReferenceClock(IReferenceClock
*iface
)
27 return CONTAINING_RECORD(iface
, IReferenceClockImpl
, IReferenceClock_iface
);
30 /* IReferenceClockImpl IUnknown part: */
31 static HRESULT WINAPI
IReferenceClockImpl_QueryInterface(IReferenceClock
*iface
, REFIID riid
, LPVOID
*ppobj
)
33 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
34 TRACE("(%p, %s, %p)\n", This
, debugstr_dmguid(riid
), ppobj
);
36 if (IsEqualIID (riid
, &IID_IUnknown
) ||
37 IsEqualIID (riid
, &IID_IReferenceClock
)) {
38 IUnknown_AddRef(iface
);
42 WARN("(%p, %s, %p): not found\n", This
, debugstr_dmguid(riid
), ppobj
);
46 static ULONG WINAPI
IReferenceClockImpl_AddRef(IReferenceClock
*iface
)
48 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
49 ULONG ref
= InterlockedIncrement(&This
->ref
);
51 TRACE("(%p)->(): new ref = %u\n", This
, ref
);
58 static ULONG WINAPI
IReferenceClockImpl_Release(IReferenceClock
*iface
)
60 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
61 ULONG ref
= InterlockedDecrement(&This
->ref
);
63 TRACE("(%p)->(): new ref = %u\n", This
, ref
);
66 HeapFree(GetProcessHeap(), 0, This
);
68 DMUSIC_UnlockModule();
73 /* IReferenceClockImpl IReferenceClock part: */
74 static HRESULT WINAPI
IReferenceClockImpl_GetTime(IReferenceClock
*iface
, REFERENCE_TIME
* pTime
)
76 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
78 TRACE("(%p)->(%p)\n", This
, pTime
);
80 *pTime
= This
->rtTime
;
85 static HRESULT WINAPI
IReferenceClockImpl_AdviseTime(IReferenceClock
*iface
, REFERENCE_TIME baseTime
, REFERENCE_TIME streamTime
, HANDLE hEvent
, DWORD
* pdwAdviseCookie
)
87 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
89 FIXME("(%p)->(0x%s, 0x%s, %p, %p): stub\n", This
, wine_dbgstr_longlong(baseTime
), wine_dbgstr_longlong(streamTime
), hEvent
, pdwAdviseCookie
);
94 static HRESULT WINAPI
IReferenceClockImpl_AdvisePeriodic(IReferenceClock
*iface
, REFERENCE_TIME startTime
, REFERENCE_TIME periodTime
, HANDLE hSemaphore
, DWORD
* pdwAdviseCookie
)
96 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
98 FIXME("(%p)->(0x%s, 0x%s, %p, %p): stub\n", This
, wine_dbgstr_longlong(startTime
), wine_dbgstr_longlong(periodTime
), hSemaphore
, pdwAdviseCookie
);
103 static HRESULT WINAPI
IReferenceClockImpl_Unadvise(IReferenceClock
*iface
, DWORD dwAdviseCookie
)
105 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
107 FIXME("(%p)->(%d): stub\n", This
, dwAdviseCookie
);
112 static const IReferenceClockVtbl ReferenceClock_Vtbl
= {
113 IReferenceClockImpl_QueryInterface
,
114 IReferenceClockImpl_AddRef
,
115 IReferenceClockImpl_Release
,
116 IReferenceClockImpl_GetTime
,
117 IReferenceClockImpl_AdviseTime
,
118 IReferenceClockImpl_AdvisePeriodic
,
119 IReferenceClockImpl_Unadvise
122 /* for ClassFactory */
123 HRESULT
DMUSIC_CreateReferenceClockImpl(LPCGUID riid
, LPVOID
* ret_iface
, LPUNKNOWN unkouter
)
125 IReferenceClockImpl
* clock
;
127 TRACE("(%p,%p,%p)\n", riid
, ret_iface
, unkouter
);
129 clock
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IReferenceClockImpl
));
132 return E_OUTOFMEMORY
;
135 clock
->IReferenceClock_iface
.lpVtbl
= &ReferenceClock_Vtbl
;
136 clock
->ref
= 0; /* Will be inited by QueryInterface */
138 clock
->pClockInfo
.dwSize
= sizeof (DMUS_CLOCKINFO
);
140 return IReferenceClockImpl_QueryInterface((IReferenceClock
*)clock
, riid
, ret_iface
);