dmstyle: COM cleanup for IDirectMusicTrack8 of DMStyleTrack.
[wine.git] / dlls / dmstyle / styletrack.c
blobcc20430991d522e7c64a5b07db8db436fdf89a5b
1 /* IDirectMusicStyleTrack 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);
23 WINE_DECLARE_DEBUG_CHANNEL(dmfile);
25 static ULONG WINAPI IDirectMusicStyleTrack_IUnknown_AddRef (LPUNKNOWN iface);
26 static ULONG WINAPI IDirectMusicStyleTrack_IPersistStream_AddRef (LPPERSISTSTREAM iface);
28 /*****************************************************************************
29 * IDirectMusicStyleTrack implementation
31 typedef struct IDirectMusicStyleTrack {
32 const IUnknownVtbl *UnknownVtbl;
33 IDirectMusicTrack8 IDirectMusicTrack8_iface;
34 const IPersistStreamVtbl *PersistStreamVtbl;
35 LONG ref;
36 DMUS_OBJECTDESC *pDesc;
37 struct list Items;
38 } IDirectMusicStyleTrack;
40 /* IDirectMusicStyleTrack IUnknown part: */
41 static HRESULT WINAPI IDirectMusicStyleTrack_IUnknown_QueryInterface (LPUNKNOWN iface, REFIID riid, LPVOID *ppobj) {
42 ICOM_THIS_MULTI(IDirectMusicStyleTrack, UnknownVtbl, iface);
43 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
45 if (IsEqualIID (riid, &IID_IUnknown)) {
46 *ppobj = &This->UnknownVtbl;
47 IDirectMusicStyleTrack_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
48 return S_OK;
49 } else if (IsEqualIID (riid, &IID_IDirectMusicTrack)
50 || IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
51 *ppobj = &This->IDirectMusicTrack8_iface;
52 IDirectMusicTrack8_AddRef (&This->IDirectMusicTrack8_iface);
53 return S_OK;
54 } else if (IsEqualIID (riid, &IID_IPersistStream)) {
55 *ppobj = &This->PersistStreamVtbl;
56 IDirectMusicStyleTrack_IPersistStream_AddRef ((LPPERSISTSTREAM)&This->PersistStreamVtbl);
57 return S_OK;
60 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj);
61 return E_NOINTERFACE;
64 static ULONG WINAPI IDirectMusicStyleTrack_IUnknown_AddRef (LPUNKNOWN iface) {
65 ICOM_THIS_MULTI(IDirectMusicStyleTrack, UnknownVtbl, iface);
66 ULONG ref = InterlockedIncrement(&This->ref);
68 TRACE("(%p): AddRef from %d\n", This, ref - 1);
70 DMSTYLE_LockModule();
72 return ref;
75 static ULONG WINAPI IDirectMusicStyleTrack_IUnknown_Release (LPUNKNOWN iface) {
76 ICOM_THIS_MULTI(IDirectMusicStyleTrack, UnknownVtbl, iface);
77 ULONG ref = InterlockedDecrement(&This->ref);
79 TRACE("(%p): ReleaseRef to %d\n", This, ref);
81 if (ref == 0) {
82 HeapFree(GetProcessHeap(), 0, This);
85 DMSTYLE_UnlockModule();
87 return ref;
90 static const IUnknownVtbl DirectMusicStyleTrack_Unknown_Vtbl = {
91 IDirectMusicStyleTrack_IUnknown_QueryInterface,
92 IDirectMusicStyleTrack_IUnknown_AddRef,
93 IDirectMusicStyleTrack_IUnknown_Release
96 /* IDirectMusicStyleTrack IDirectMusicTrack8 part: */
97 static inline IDirectMusicStyleTrack *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface)
99 return CONTAINING_RECORD(iface, IDirectMusicStyleTrack, IDirectMusicTrack8_iface);
102 static HRESULT WINAPI IDirectMusicTrack8Impl_QueryInterface(IDirectMusicTrack8 *iface, REFIID riid,
103 void **ppobj)
105 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
106 return IDirectMusicStyleTrack_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
109 static ULONG WINAPI IDirectMusicTrack8Impl_AddRef(IDirectMusicTrack8 *iface)
111 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
112 return IDirectMusicStyleTrack_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
115 static ULONG WINAPI IDirectMusicTrack8Impl_Release(IDirectMusicTrack8 *iface)
117 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
118 return IDirectMusicStyleTrack_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
121 static HRESULT WINAPI IDirectMusicTrack8Impl_Init(IDirectMusicTrack8 *iface,
122 IDirectMusicSegment *pSegment)
124 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
125 FIXME("(%p, %p): stub\n", This, pSegment);
126 return S_OK;
129 static HRESULT WINAPI IDirectMusicTrack8Impl_InitPlay(IDirectMusicTrack8 *iface,
130 IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance,
131 void **ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
133 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
134 FIXME("(%p, %p, %p, %p, %d, %d): stub\n", This, pSegmentState, pPerformance, ppStateData, dwVirtualTrack8ID, dwFlags);
135 return S_OK;
138 static HRESULT WINAPI IDirectMusicTrack8Impl_EndPlay(IDirectMusicTrack8 *iface, void *pStateData)
140 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
141 FIXME("(%p, %p): stub\n", This, pStateData);
142 return S_OK;
145 static HRESULT WINAPI IDirectMusicTrack8Impl_Play(IDirectMusicTrack8 *iface, void *pStateData,
146 MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD dwFlags,
147 IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID)
149 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
150 FIXME("(%p, %p, %d, %d, %d, %d, %p, %p, %d): stub\n", This, pStateData, mtStart, mtEnd, mtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
151 return S_OK;
154 static HRESULT WINAPI IDirectMusicTrack8Impl_GetParam(IDirectMusicTrack8 *iface, REFGUID rguidType,
155 MUSIC_TIME mtTime, MUSIC_TIME *pmtNext, void *pParam)
157 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
158 FIXME("(%p, %s, %d, %p, %p): stub\n", This, debugstr_dmguid(rguidType), mtTime, pmtNext, pParam);
159 return S_OK;
162 static HRESULT WINAPI IDirectMusicTrack8Impl_SetParam(IDirectMusicTrack8 *iface, REFGUID rguidType,
163 MUSIC_TIME mtTime, void *pParam)
165 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
166 FIXME("(%p, %s, %d, %p): stub\n", This, debugstr_dmguid(rguidType), mtTime, pParam);
167 return S_OK;
170 static HRESULT WINAPI IDirectMusicTrack8Impl_IsParamSupported(IDirectMusicTrack8 *iface,
171 REFGUID rguidType)
173 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
175 TRACE("(%p, %s)\n", This, debugstr_dmguid(rguidType));
177 if (!rguidType)
178 return E_POINTER;
180 if (IsEqualGUID (rguidType, &GUID_DisableTimeSig)
181 || IsEqualGUID (rguidType, &GUID_EnableTimeSig)
182 || IsEqualGUID (rguidType, &GUID_IDirectMusicStyle)
183 || IsEqualGUID (rguidType, &GUID_SeedVariations)
184 || IsEqualGUID (rguidType, &GUID_TimeSignature)) {
185 TRACE("param supported\n");
186 return S_OK;
188 TRACE("param unsupported\n");
189 return DMUS_E_TYPE_UNSUPPORTED;
192 static HRESULT WINAPI IDirectMusicTrack8Impl_AddNotificationType(IDirectMusicTrack8 *iface,
193 REFGUID rguidNotificationType)
195 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
196 FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidNotificationType));
197 return S_OK;
200 static HRESULT WINAPI IDirectMusicTrack8Impl_RemoveNotificationType(IDirectMusicTrack8 *iface,
201 REFGUID rguidNotificationType)
203 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
204 FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidNotificationType));
205 return S_OK;
208 static HRESULT WINAPI IDirectMusicTrack8Impl_Clone(IDirectMusicTrack8 *iface, MUSIC_TIME mtStart,
209 MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
211 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
212 FIXME("(%p, %d, %d, %p): stub\n", This, mtStart, mtEnd, ppTrack);
213 return S_OK;
216 static HRESULT WINAPI IDirectMusicTrack8Impl_PlayEx(IDirectMusicTrack8 *iface, void *pStateData,
217 REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD dwFlags,
218 IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID)
220 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
221 FIXME("(%p, %p, 0x%s, 0x%s, 0x%s, %d, %p, %p, %d): stub\n", This, pStateData, wine_dbgstr_longlong(rtStart),
222 wine_dbgstr_longlong(rtEnd), wine_dbgstr_longlong(rtOffset), dwFlags, pPerf, pSegSt, dwVirtualID);
223 return S_OK;
226 static HRESULT WINAPI IDirectMusicTrack8Impl_GetParamEx(IDirectMusicTrack8 *iface,
227 REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *prtNext, void *pParam,
228 void *pStateData, DWORD dwFlags)
230 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
231 FIXME("(%p, %s, 0x%s, %p, %p, %p, %d): stub\n", This, debugstr_dmguid(rguidType),
232 wine_dbgstr_longlong(rtTime), prtNext, pParam, pStateData, dwFlags);
233 return S_OK;
236 static HRESULT WINAPI IDirectMusicTrack8Impl_SetParamEx(IDirectMusicTrack8 *iface,
237 REFGUID rguidType, REFERENCE_TIME rtTime, void *pParam, void *pStateData, DWORD dwFlags)
239 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
240 FIXME("(%p, %s, 0x%s, %p, %p, %d): stub\n", This, debugstr_dmguid(rguidType),
241 wine_dbgstr_longlong(rtTime), pParam, pStateData, dwFlags);
242 return S_OK;
245 static HRESULT WINAPI IDirectMusicTrack8Impl_Compose(IDirectMusicTrack8 *iface, IUnknown *context,
246 DWORD trackgroup, IDirectMusicTrack **track)
248 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
250 TRACE("(%p, %p, %d, %p): method not implemented\n", This, context, trackgroup, track);
251 return E_NOTIMPL;
254 static HRESULT WINAPI IDirectMusicTrack8Impl_Join(IDirectMusicTrack8 *iface,
255 IDirectMusicTrack *pNewTrack, MUSIC_TIME mtJoin, IUnknown *pContext, DWORD dwTrackGroup,
256 IDirectMusicTrack **ppResultTrack)
258 IDirectMusicStyleTrack *This = impl_from_IDirectMusicTrack8(iface);
259 FIXME("(%p, %p, %d, %p, %d, %p): stub\n", This, pNewTrack, mtJoin, pContext, dwTrackGroup, ppResultTrack);
260 return S_OK;
263 static const IDirectMusicTrack8Vtbl dmtrack8_vtbl = {
264 IDirectMusicTrack8Impl_QueryInterface,
265 IDirectMusicTrack8Impl_AddRef,
266 IDirectMusicTrack8Impl_Release,
267 IDirectMusicTrack8Impl_Init,
268 IDirectMusicTrack8Impl_InitPlay,
269 IDirectMusicTrack8Impl_EndPlay,
270 IDirectMusicTrack8Impl_Play,
271 IDirectMusicTrack8Impl_GetParam,
272 IDirectMusicTrack8Impl_SetParam,
273 IDirectMusicTrack8Impl_IsParamSupported,
274 IDirectMusicTrack8Impl_AddNotificationType,
275 IDirectMusicTrack8Impl_RemoveNotificationType,
276 IDirectMusicTrack8Impl_Clone,
277 IDirectMusicTrack8Impl_PlayEx,
278 IDirectMusicTrack8Impl_GetParamEx,
279 IDirectMusicTrack8Impl_SetParamEx,
280 IDirectMusicTrack8Impl_Compose,
281 IDirectMusicTrack8Impl_Join
284 /* IDirectMusicStyleTrack IPersistStream part: */
285 static HRESULT WINAPI IDirectMusicStyleTrack_IPersistStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj) {
286 ICOM_THIS_MULTI(IDirectMusicStyleTrack, PersistStreamVtbl, iface);
287 return IDirectMusicStyleTrack_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
290 static ULONG WINAPI IDirectMusicStyleTrack_IPersistStream_AddRef (LPPERSISTSTREAM iface) {
291 ICOM_THIS_MULTI(IDirectMusicStyleTrack, PersistStreamVtbl, iface);
292 return IDirectMusicStyleTrack_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
295 static ULONG WINAPI IDirectMusicStyleTrack_IPersistStream_Release (LPPERSISTSTREAM iface) {
296 ICOM_THIS_MULTI(IDirectMusicStyleTrack, PersistStreamVtbl, iface);
297 return IDirectMusicStyleTrack_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
300 static HRESULT WINAPI IDirectMusicStyleTrack_IPersistStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) {
301 ICOM_THIS_MULTI(IDirectMusicStyleTrack, PersistStreamVtbl, iface);
302 TRACE("(%p, %p)\n", This, pClassID);
303 *pClassID = CLSID_DirectMusicStyleTrack;
304 return S_OK;
307 static HRESULT WINAPI IDirectMusicStyleTrack_IPersistStream_IsDirty (LPPERSISTSTREAM iface) {
308 ICOM_THIS_MULTI(IDirectMusicStyleTrack, PersistStreamVtbl, iface);
309 FIXME("(%p): stub, always S_FALSE\n", This);
310 return S_FALSE;
313 static HRESULT parse_style_ref(IDirectMusicStyleTrack *This, DMUS_PRIVATE_CHUNK *pChunk,
314 IStream *pStm)
316 DMUS_PRIVATE_CHUNK Chunk;
317 DWORD ListSize[3], ListCount[3];
318 LARGE_INTEGER liMove; /* used when skipping chunks */
319 HRESULT hr;
321 IDirectMusicObject* pObject = NULL;
322 LPDMUS_PRIVATE_STYLE_ITEM pNewItem = NULL;
324 if (pChunk->fccID != DMUS_FOURCC_STYLE_REF_LIST) {
325 ERR_(dmfile)(": %s chunk should be a STYLE list\n", debugstr_fourcc (pChunk->fccID));
326 return E_FAIL;
329 ListSize[0] = pChunk->dwSize - sizeof(FOURCC);
330 ListCount[0] = 0;
332 do {
333 IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
334 ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize;
335 TRACE_(dmfile)(": %s chunk (size = %d)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
336 switch (Chunk.fccID) {
337 case DMUS_FOURCC_TIME_STAMP_CHUNK: {
338 TRACE_(dmfile)(": Time Stamp chunk\n");
339 pNewItem = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_STYLE_ITEM));
340 if (NULL == pNewItem) {
341 ERR(": no more memory\n");
342 return E_OUTOFMEMORY;
344 IStream_Read (pStm, &pNewItem->dwTimeStamp, sizeof(DWORD), NULL);
345 TRACE_(dmfile)(" - dwTimeStamp: %u\n", pNewItem->dwTimeStamp);
346 list_add_tail (&This->Items, &pNewItem->entry);
347 break;
349 case FOURCC_LIST: {
350 IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL);
351 TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID));
352 ListSize[1] = Chunk.dwSize - sizeof(FOURCC);
353 ListCount[1] = 0;
354 switch (Chunk.fccID) {
356 * should be a DMRF (DirectMusic Reference) list @TODO
358 case DMUS_FOURCC_REF_LIST: {
359 FIXME_(dmfile)(": DMRF (DM References) list, not yet handled\n");
360 hr = IDirectMusicUtils_IPersistStream_ParseReference((IPersistStream*)&This->PersistStreamVtbl,
361 &Chunk, pStm, &pObject);
362 if (FAILED(hr)) {
363 ERR(": could not load Reference\n");
364 return hr;
366 hr = IDirectMusicObject_QueryInterface(pObject, &IID_IDirectMusicStyle8, (LPVOID*)&pNewItem->pObject);
367 if (FAILED(hr)) {
368 ERR(": Reference not an IDirectMusicStyle, exiting\n");
369 exit(-1);
370 return hr;
372 IDirectMusicObject_Release(pObject);
373 break;
375 default: {
376 TRACE_(dmfile)(": unknown (skipping)\n");
377 liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC);
378 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
379 break;
382 break;
384 default: {
385 TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
386 liMove.QuadPart = Chunk.dwSize;
387 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
388 break;
391 TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]);
392 } while (ListCount[0] < ListSize[0]);
394 return S_OK;
397 static HRESULT parse_styletrack_list(IDirectMusicStyleTrack *This, DMUS_PRIVATE_CHUNK *pChunk,
398 IStream *pStm)
400 DMUS_PRIVATE_CHUNK Chunk;
401 DWORD ListSize[3], ListCount[3];
402 LARGE_INTEGER liMove; /* used when skipping chunks */
403 HRESULT hr;
405 if (pChunk->fccID != DMUS_FOURCC_STYLE_TRACK_LIST) {
406 ERR_(dmfile)(": %s chunk should be a STYLETRACK list\n", debugstr_fourcc (pChunk->fccID));
407 return E_FAIL;
410 ListSize[0] = pChunk->dwSize - sizeof(FOURCC);
411 ListCount[0] = 0;
413 do {
414 IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
415 ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize;
416 TRACE_(dmfile)(": %s chunk (size = %d)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
417 switch (Chunk.fccID) {
418 case FOURCC_LIST: {
419 IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL);
420 TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID));
421 ListSize[1] = Chunk.dwSize - sizeof(FOURCC);
422 ListCount[1] = 0;
423 switch (Chunk.fccID) {
424 case DMUS_FOURCC_STYLE_REF_LIST: {
425 TRACE_(dmfile)(": STYLE_REF list\n");
426 hr = parse_style_ref(This, &Chunk, pStm);
427 if (FAILED(hr)) return hr;
428 break;
430 default: {
431 TRACE_(dmfile)(": unknown (skipping)\n");
432 liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC);
433 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
434 break;
437 break;
439 default: {
440 TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
441 liMove.QuadPart = Chunk.dwSize;
442 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
443 break;
446 TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]);
447 } while (ListCount[0] < ListSize[0]);
449 return S_OK;
452 static HRESULT WINAPI IDirectMusicStyleTrack_IPersistStream_Load (LPPERSISTSTREAM iface, IStream* pStm) {
453 ICOM_THIS_MULTI(IDirectMusicStyleTrack, PersistStreamVtbl, iface);
455 DMUS_PRIVATE_CHUNK Chunk;
456 LARGE_INTEGER liMove;
457 HRESULT hr;
459 FIXME("(%p, %p): Loading not fully implemented yet\n", This, pStm);
461 IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
462 TRACE_(dmfile)(": %s chunk (size = %d)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
463 switch (Chunk.fccID) {
464 case FOURCC_LIST: {
465 IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL);
466 TRACE_(dmfile)(": %s chunk (size = %d)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
467 switch (Chunk.fccID) {
468 case DMUS_FOURCC_STYLE_TRACK_LIST: {
469 TRACE_(dmfile)(": Chord track list\n");
470 hr = parse_styletrack_list(This, &Chunk, pStm);
471 if (FAILED(hr)) return hr;
472 break;
474 default: {
475 TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
476 liMove.QuadPart = Chunk.dwSize;
477 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
478 return E_FAIL;
481 TRACE_(dmfile)(": reading finished\n");
482 break;
484 default: {
485 TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
486 liMove.QuadPart = Chunk.dwSize;
487 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
488 return E_FAIL;
492 return S_OK;
495 static HRESULT WINAPI IDirectMusicStyleTrack_IPersistStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty) {
496 ICOM_THIS_MULTI(IDirectMusicStyleTrack, PersistStreamVtbl, iface);
497 FIXME("(%p): Saving not implemented yet\n", This);
498 return E_NOTIMPL;
501 static HRESULT WINAPI IDirectMusicStyleTrack_IPersistStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize) {
502 ICOM_THIS_MULTI(IDirectMusicStyleTrack, PersistStreamVtbl, iface);
503 FIXME("(%p, %p): stub\n", This, pcbSize);
504 return E_NOTIMPL;
507 static const IPersistStreamVtbl DirectMusicStyleTrack_PersistStream_Vtbl = {
508 IDirectMusicStyleTrack_IPersistStream_QueryInterface,
509 IDirectMusicStyleTrack_IPersistStream_AddRef,
510 IDirectMusicStyleTrack_IPersistStream_Release,
511 IDirectMusicStyleTrack_IPersistStream_GetClassID,
512 IDirectMusicStyleTrack_IPersistStream_IsDirty,
513 IDirectMusicStyleTrack_IPersistStream_Load,
514 IDirectMusicStyleTrack_IPersistStream_Save,
515 IDirectMusicStyleTrack_IPersistStream_GetSizeMax
518 /* for ClassFactory */
519 HRESULT WINAPI create_dmstyletrack(REFIID lpcGUID, void **ppobj)
521 IDirectMusicStyleTrack* track;
523 track = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicStyleTrack));
524 if (NULL == track) {
525 *ppobj = NULL;
526 return E_OUTOFMEMORY;
528 track->UnknownVtbl = &DirectMusicStyleTrack_Unknown_Vtbl;
529 track->IDirectMusicTrack8_iface.lpVtbl = &dmtrack8_vtbl;
530 track->PersistStreamVtbl = &DirectMusicStyleTrack_PersistStream_Vtbl;
531 track->pDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_OBJECTDESC));
532 DM_STRUCT_INIT(track->pDesc);
533 track->pDesc->dwValidData |= DMUS_OBJ_CLASS;
534 track->pDesc->guidClass = CLSID_DirectMusicStyleTrack;
535 track->ref = 0; /* will be inited by QueryInterface */
536 list_init (&track->Items);
538 return IDirectMusicStyleTrack_IUnknown_QueryInterface ((LPUNKNOWN)&track->UnknownVtbl, lpcGUID, ppobj);