dmstyle: COM cleanup for IDirectMusicTrack8 of DMMotifTrack.
[wine.git] / dlls / dmstyle / motiftrack.c
blob3a8c6f1b011839e1bb2afb86d7d170942d7fc05e
1 /* IDirectMusicMotifTrack Implementation
3 * Copyright (C) 2003-2004 Rok Mandeljc
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #include "dmstyle_private.h"
22 WINE_DEFAULT_DEBUG_CHANNEL(dmstyle);
24 static ULONG WINAPI IDirectMusicMotifTrack_IUnknown_AddRef (LPUNKNOWN iface);
25 static ULONG WINAPI IDirectMusicMotifTrack_IPersistStream_AddRef (LPPERSISTSTREAM iface);
27 /*****************************************************************************
28 * IDirectMusicMotifTrack implementation
30 typedef struct IDirectMusicMotifTrack {
31 const IUnknownVtbl *UnknownVtbl;
32 IDirectMusicTrack8 IDirectMusicTrack8_iface;
33 const IPersistStreamVtbl *PersistStreamVtbl;
34 LONG ref;
35 DMUS_OBJECTDESC *pDesc;
36 } IDirectMusicMotifTrack;
38 /* IDirectMusicMotifTrack IUnknown part: */
39 static HRESULT WINAPI IDirectMusicMotifTrack_IUnknown_QueryInterface (LPUNKNOWN iface, REFIID riid, LPVOID *ppobj) {
40 ICOM_THIS_MULTI(IDirectMusicMotifTrack, UnknownVtbl, iface);
41 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
43 if (IsEqualIID (riid, &IID_IUnknown)) {
44 *ppobj = &This->UnknownVtbl;
45 IDirectMusicMotifTrack_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
46 return S_OK;
47 } else if (IsEqualIID (riid, &IID_IDirectMusicTrack)
48 || IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
49 *ppobj = &This->IDirectMusicTrack8_iface;
50 IDirectMusicTrack8_AddRef(&This->IDirectMusicTrack8_iface);
51 return S_OK;
52 } else if (IsEqualIID (riid, &IID_IPersistStream)) {
53 *ppobj = &This->PersistStreamVtbl;
54 IDirectMusicMotifTrack_IPersistStream_AddRef ((LPPERSISTSTREAM)&This->PersistStreamVtbl);
55 return S_OK;
58 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj);
59 return E_NOINTERFACE;
62 static ULONG WINAPI IDirectMusicMotifTrack_IUnknown_AddRef (LPUNKNOWN iface) {
63 ICOM_THIS_MULTI(IDirectMusicMotifTrack, UnknownVtbl, iface);
64 ULONG ref = InterlockedIncrement(&This->ref);
66 TRACE("(%p): AddRef from %d\n", This, ref - 1);
68 DMSTYLE_LockModule();
70 return ref;
73 static ULONG WINAPI IDirectMusicMotifTrack_IUnknown_Release (LPUNKNOWN iface) {
74 ICOM_THIS_MULTI(IDirectMusicMotifTrack, UnknownVtbl, iface);
75 ULONG ref = InterlockedDecrement(&This->ref);
77 TRACE("(%p): ReleaseRef to %d\n", This, ref);
79 if (ref == 0) {
80 HeapFree(GetProcessHeap(), 0, This);
83 DMSTYLE_UnlockModule();
85 return ref;
88 static const IUnknownVtbl DirectMusicMotifTrack_Unknown_Vtbl = {
89 IDirectMusicMotifTrack_IUnknown_QueryInterface,
90 IDirectMusicMotifTrack_IUnknown_AddRef,
91 IDirectMusicMotifTrack_IUnknown_Release
94 /* IDirectMusicMotifTrack IDirectMusicTrack8 part: */
95 static inline IDirectMusicMotifTrack *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface)
97 return CONTAINING_RECORD(iface, IDirectMusicMotifTrack, IDirectMusicTrack8_iface);
100 static HRESULT WINAPI IDirectMusicTrack8Impl_QueryInterface(IDirectMusicTrack8 *iface, REFIID riid,
101 void **ppobj)
103 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
104 return IDirectMusicMotifTrack_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
107 static ULONG WINAPI IDirectMusicTrack8Impl_AddRef(IDirectMusicTrack8 *iface)
109 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
110 return IDirectMusicMotifTrack_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
113 static ULONG WINAPI IDirectMusicTrack8Impl_Release(IDirectMusicTrack8 *iface)
115 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
116 return IDirectMusicMotifTrack_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
119 static HRESULT WINAPI IDirectMusicTrack8Impl_Init(IDirectMusicTrack8 *iface,
120 IDirectMusicSegment *pSegment)
122 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
123 FIXME("(%p, %p): stub\n", This, pSegment);
124 return S_OK;
127 static HRESULT WINAPI IDirectMusicTrack8Impl_InitPlay(IDirectMusicTrack8 *iface,
128 IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance,
129 void **ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
131 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
132 FIXME("(%p, %p, %p, %p, %d, %d): stub\n", This, pSegmentState, pPerformance, ppStateData, dwVirtualTrack8ID, dwFlags);
133 return S_OK;
136 static HRESULT WINAPI IDirectMusicTrack8Impl_EndPlay(IDirectMusicTrack8 *iface, void *pStateData)
138 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
139 FIXME("(%p, %p): stub\n", This, pStateData);
140 return S_OK;
143 static HRESULT WINAPI IDirectMusicTrack8Impl_Play(IDirectMusicTrack8 *iface, void *pStateData,
144 MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD dwFlags,
145 IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID)
147 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
148 FIXME("(%p, %p, %d, %d, %d, %d, %p, %p, %d): stub\n", This, pStateData, mtStart, mtEnd, mtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
149 return S_OK;
152 static HRESULT WINAPI IDirectMusicTrack8Impl_GetParam(IDirectMusicTrack8 *iface, REFGUID rguidType,
153 MUSIC_TIME mtTime, MUSIC_TIME *pmtNext, void *pParam)
155 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
156 FIXME("(%p, %s, %d, %p, %p): stub\n", This, debugstr_dmguid(rguidType), mtTime, pmtNext, pParam);
157 return S_OK;
160 static HRESULT WINAPI IDirectMusicTrack8Impl_SetParam(IDirectMusicTrack8 *iface, REFGUID rguidType,
161 MUSIC_TIME mtTime, void *pParam)
163 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
164 FIXME("(%p, %s, %d, %p): stub\n", This, debugstr_dmguid(rguidType), mtTime, pParam);
165 return S_OK;
168 static HRESULT WINAPI IDirectMusicTrack8Impl_IsParamSupported(IDirectMusicTrack8 *iface,
169 REFGUID rguidType)
171 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
173 TRACE("(%p, %s)\n", This, debugstr_dmguid(rguidType));
175 if (!rguidType)
176 return E_POINTER;
178 if (IsEqualGUID (rguidType, &GUID_DisableTimeSig)
179 || IsEqualGUID (rguidType, &GUID_EnableTimeSig)
180 || IsEqualGUID (rguidType, &GUID_SeedVariations)
181 || IsEqualGUID (rguidType, &GUID_Valid_Start_Time)) {
182 TRACE("param supported\n");
183 return S_OK;
185 TRACE("param unsupported\n");
186 return DMUS_E_TYPE_UNSUPPORTED;
189 static HRESULT WINAPI IDirectMusicTrack8Impl_AddNotificationType(IDirectMusicTrack8 *iface,
190 REFGUID rguidNotificationType)
192 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
193 FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidNotificationType));
194 return S_OK;
197 static HRESULT WINAPI IDirectMusicTrack8Impl_RemoveNotificationType(IDirectMusicTrack8 *iface,
198 REFGUID rguidNotificationType)
200 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
201 FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidNotificationType));
202 return S_OK;
205 static HRESULT WINAPI IDirectMusicTrack8Impl_Clone(IDirectMusicTrack8 *iface, MUSIC_TIME mtStart,
206 MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
208 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
209 FIXME("(%p, %d, %d, %p): stub\n", This, mtStart, mtEnd, ppTrack);
210 return S_OK;
213 static HRESULT WINAPI IDirectMusicTrack8Impl_PlayEx(IDirectMusicTrack8 *iface, void *pStateData,
214 REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD dwFlags,
215 IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID)
217 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
218 FIXME("(%p, %p, 0x%s, 0x%s, 0x%s, %d, %p, %p, %d): stub\n", This, pStateData, wine_dbgstr_longlong(rtStart),
219 wine_dbgstr_longlong(rtEnd), wine_dbgstr_longlong(rtOffset), dwFlags, pPerf, pSegSt, dwVirtualID);
220 return S_OK;
223 static HRESULT WINAPI IDirectMusicTrack8Impl_GetParamEx(IDirectMusicTrack8 *iface,
224 REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *prtNext, void *pParam,
225 void *pStateData, DWORD dwFlags)
227 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
228 FIXME("(%p, %s, 0x%s, %p, %p, %p, %d): stub\n", This, debugstr_dmguid(rguidType),
229 wine_dbgstr_longlong(rtTime), prtNext, pParam, pStateData, dwFlags);
230 return S_OK;
233 static HRESULT WINAPI IDirectMusicTrack8Impl_SetParamEx(IDirectMusicTrack8 *iface,
234 REFGUID rguidType, REFERENCE_TIME rtTime, void *pParam, void *pStateData, DWORD dwFlags)
236 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
237 FIXME("(%p, %s, 0x%s, %p, %p, %d): stub\n", This, debugstr_dmguid(rguidType),
238 wine_dbgstr_longlong(rtTime), pParam, pStateData, dwFlags);
239 return S_OK;
242 static HRESULT WINAPI IDirectMusicTrack8Impl_Compose(IDirectMusicTrack8 *iface, IUnknown *context,
243 DWORD trackgroup, IDirectMusicTrack **track)
245 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
247 TRACE("(%p, %p, %d, %p): method not implemented\n", This, context, trackgroup, track);
248 return E_NOTIMPL;
251 static HRESULT WINAPI IDirectMusicTrack8Impl_Join(IDirectMusicTrack8 *iface,
252 IDirectMusicTrack *newtrack, MUSIC_TIME join, IUnknown *context, DWORD trackgroup,
253 IDirectMusicTrack **resulttrack)
255 IDirectMusicMotifTrack *This = impl_from_IDirectMusicTrack8(iface);
256 TRACE("(%p, %p, %d, %p, %d, %p): stub\n", This, newtrack, join, context, trackgroup,
257 resulttrack);
258 return E_NOTIMPL;
261 static const IDirectMusicTrack8Vtbl dmtrack8_vtbl = {
262 IDirectMusicTrack8Impl_QueryInterface,
263 IDirectMusicTrack8Impl_AddRef,
264 IDirectMusicTrack8Impl_Release,
265 IDirectMusicTrack8Impl_Init,
266 IDirectMusicTrack8Impl_InitPlay,
267 IDirectMusicTrack8Impl_EndPlay,
268 IDirectMusicTrack8Impl_Play,
269 IDirectMusicTrack8Impl_GetParam,
270 IDirectMusicTrack8Impl_SetParam,
271 IDirectMusicTrack8Impl_IsParamSupported,
272 IDirectMusicTrack8Impl_AddNotificationType,
273 IDirectMusicTrack8Impl_RemoveNotificationType,
274 IDirectMusicTrack8Impl_Clone,
275 IDirectMusicTrack8Impl_PlayEx,
276 IDirectMusicTrack8Impl_GetParamEx,
277 IDirectMusicTrack8Impl_SetParamEx,
278 IDirectMusicTrack8Impl_Compose,
279 IDirectMusicTrack8Impl_Join
282 /* IDirectMusicMotifTrack IPersistStream part: */
283 static HRESULT WINAPI IDirectMusicMotifTrack_IPersistStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj) {
284 ICOM_THIS_MULTI(IDirectMusicMotifTrack, PersistStreamVtbl, iface);
285 return IDirectMusicMotifTrack_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
288 static ULONG WINAPI IDirectMusicMotifTrack_IPersistStream_AddRef (LPPERSISTSTREAM iface) {
289 ICOM_THIS_MULTI(IDirectMusicMotifTrack, PersistStreamVtbl, iface);
290 return IDirectMusicMotifTrack_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
293 static ULONG WINAPI IDirectMusicMotifTrack_IPersistStream_Release (LPPERSISTSTREAM iface) {
294 ICOM_THIS_MULTI(IDirectMusicMotifTrack, PersistStreamVtbl, iface);
295 return IDirectMusicMotifTrack_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
298 static HRESULT WINAPI IDirectMusicMotifTrack_IPersistStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) {
299 return E_NOTIMPL;
302 static HRESULT WINAPI IDirectMusicMotifTrack_IPersistStream_IsDirty (LPPERSISTSTREAM iface) {
303 return E_NOTIMPL;
306 static HRESULT WINAPI IDirectMusicMotifTrack_IPersistStream_Load (LPPERSISTSTREAM iface, IStream* pStm) {
307 FIXME(": Loading not implemented yet\n");
308 return S_OK;
311 static HRESULT WINAPI IDirectMusicMotifTrack_IPersistStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty) {
312 return E_NOTIMPL;
315 static HRESULT WINAPI IDirectMusicMotifTrack_IPersistStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize) {
316 return E_NOTIMPL;
319 static const IPersistStreamVtbl DirectMusicMotifTrack_PersistStream_Vtbl = {
320 IDirectMusicMotifTrack_IPersistStream_QueryInterface,
321 IDirectMusicMotifTrack_IPersistStream_AddRef,
322 IDirectMusicMotifTrack_IPersistStream_Release,
323 IDirectMusicMotifTrack_IPersistStream_GetClassID,
324 IDirectMusicMotifTrack_IPersistStream_IsDirty,
325 IDirectMusicMotifTrack_IPersistStream_Load,
326 IDirectMusicMotifTrack_IPersistStream_Save,
327 IDirectMusicMotifTrack_IPersistStream_GetSizeMax
330 /* for ClassFactory */
331 HRESULT WINAPI create_dmmotiftrack(REFIID lpcGUID, void **ppobj)
333 IDirectMusicMotifTrack* track;
335 track = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicMotifTrack));
336 if (NULL == track) {
337 *ppobj = NULL;
338 return E_OUTOFMEMORY;
340 track->UnknownVtbl = &DirectMusicMotifTrack_Unknown_Vtbl;
341 track->IDirectMusicTrack8_iface.lpVtbl = &dmtrack8_vtbl;
342 track->PersistStreamVtbl = &DirectMusicMotifTrack_PersistStream_Vtbl;
343 track->pDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_OBJECTDESC));
344 DM_STRUCT_INIT(track->pDesc);
345 track->pDesc->dwValidData |= DMUS_OBJ_CLASS;
346 track->pDesc->guidClass = CLSID_DirectMusicMotifTrack;
347 track->ref = 0; /* will be inited by QueryInterface */
349 return IDirectMusicMotifTrack_IUnknown_QueryInterface ((LPUNKNOWN)&track->UnknownVtbl, lpcGUID, ppobj);