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 static inline IReferenceClockImpl
*impl_from_IReferenceClock(IReferenceClock
*iface
)
25 return CONTAINING_RECORD(iface
, IReferenceClockImpl
, IReferenceClock_iface
);
28 /* IReferenceClockImpl IUnknown part: */
29 static HRESULT WINAPI
IReferenceClockImpl_QueryInterface(IReferenceClock
*iface
, REFIID riid
, LPVOID
*ppobj
)
31 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
32 TRACE("(%p, %s, %p)\n", This
, debugstr_dmguid(riid
), ppobj
);
34 if (IsEqualIID (riid
, &IID_IUnknown
) ||
35 IsEqualIID (riid
, &IID_IReferenceClock
)) {
36 IUnknown_AddRef(iface
);
40 WARN("(%p, %s, %p): not found\n", This
, debugstr_dmguid(riid
), ppobj
);
44 static ULONG WINAPI
IReferenceClockImpl_AddRef(IReferenceClock
*iface
)
46 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
47 ULONG ref
= InterlockedIncrement(&This
->ref
);
49 TRACE("(%p)->(): new ref = %u\n", This
, ref
);
54 static ULONG WINAPI
IReferenceClockImpl_Release(IReferenceClock
*iface
)
56 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
57 ULONG ref
= InterlockedDecrement(&This
->ref
);
59 TRACE("(%p)->(): new ref = %u\n", This
, ref
);
62 HeapFree(GetProcessHeap(), 0, This
);
63 DMUSIC_UnlockModule();
69 /* IReferenceClockImpl IReferenceClock part: */
70 static HRESULT WINAPI
IReferenceClockImpl_GetTime(IReferenceClock
*iface
, REFERENCE_TIME
* pTime
)
72 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
74 TRACE("(%p)->(%p)\n", This
, pTime
);
76 *pTime
= This
->rtTime
;
81 static HRESULT WINAPI
IReferenceClockImpl_AdviseTime(IReferenceClock
*iface
, REFERENCE_TIME baseTime
, REFERENCE_TIME streamTime
, HANDLE hEvent
, DWORD
* pdwAdviseCookie
)
83 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
85 FIXME("(%p)->(0x%s, 0x%s, %p, %p): stub\n", This
, wine_dbgstr_longlong(baseTime
), wine_dbgstr_longlong(streamTime
), hEvent
, pdwAdviseCookie
);
90 static HRESULT WINAPI
IReferenceClockImpl_AdvisePeriodic(IReferenceClock
*iface
, REFERENCE_TIME startTime
, REFERENCE_TIME periodTime
, HANDLE hSemaphore
, DWORD
* pdwAdviseCookie
)
92 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
94 FIXME("(%p)->(0x%s, 0x%s, %p, %p): stub\n", This
, wine_dbgstr_longlong(startTime
), wine_dbgstr_longlong(periodTime
), hSemaphore
, pdwAdviseCookie
);
99 static HRESULT WINAPI
IReferenceClockImpl_Unadvise(IReferenceClock
*iface
, DWORD dwAdviseCookie
)
101 IReferenceClockImpl
*This
= impl_from_IReferenceClock(iface
);
103 FIXME("(%p)->(%d): stub\n", This
, dwAdviseCookie
);
108 static const IReferenceClockVtbl ReferenceClock_Vtbl
= {
109 IReferenceClockImpl_QueryInterface
,
110 IReferenceClockImpl_AddRef
,
111 IReferenceClockImpl_Release
,
112 IReferenceClockImpl_GetTime
,
113 IReferenceClockImpl_AdviseTime
,
114 IReferenceClockImpl_AdvisePeriodic
,
115 IReferenceClockImpl_Unadvise
118 /* for ClassFactory */
119 HRESULT
DMUSIC_CreateReferenceClockImpl(LPCGUID riid
, LPVOID
* ret_iface
, LPUNKNOWN unkouter
)
121 IReferenceClockImpl
* clock
;
124 TRACE("(%s, %p, %p)\n", debugstr_guid(riid
), ret_iface
, unkouter
);
126 clock
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IReferenceClockImpl
));
129 return E_OUTOFMEMORY
;
132 clock
->IReferenceClock_iface
.lpVtbl
= &ReferenceClock_Vtbl
;
135 clock
->pClockInfo
.dwSize
= sizeof (DMUS_CLOCKINFO
);
138 hr
= IReferenceClockImpl_QueryInterface(&clock
->IReferenceClock_iface
, riid
, ret_iface
);
139 IReferenceClock_Release(&clock
->IReferenceClock_iface
);