1 /* IDirectMusicSegTriggerTrack Implementation
3 * Copyright (C) 2003-2004 Rok Mandeljc
4 * Copyright (C) 2003-2004 Raphael Junqueira
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (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
14 * GNU Library General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #include "dmime_private.h"
23 WINE_DEFAULT_DEBUG_CHANNEL(dmime
);
24 WINE_DECLARE_DEBUG_CHANNEL(dmfile
);
26 /*****************************************************************************
27 * IDirectMusicSegTriggerTrack implementation
29 /* IDirectMusicSegTriggerTrack IUnknown part: */
30 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IUnknown_QueryInterface (LPUNKNOWN iface
, REFIID riid
, LPVOID
*ppobj
) {
31 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, UnknownVtbl
, iface
);
32 TRACE("(%p, %s, %p)\n", This
, debugstr_dmguid(riid
), ppobj
);
34 if (IsEqualIID (riid
, &IID_IUnknown
)) {
35 *ppobj
= (LPUNKNOWN
)&This
->UnknownVtbl
;
36 IDirectMusicSegTriggerTrack_IUnknown_AddRef ((LPUNKNOWN
)&This
->UnknownVtbl
);
38 } else if (IsEqualIID (riid
, &IID_IDirectMusicTrack
)
39 || IsEqualIID (riid
, &IID_IDirectMusicTrack8
)) {
40 *ppobj
= (LPDIRECTMUSICTRACK8
)&This
->TrackVtbl
;
41 IDirectMusicSegTriggerTrack_IDirectMusicTrack_AddRef ((LPDIRECTMUSICTRACK8
)&This
->TrackVtbl
);
43 } else if (IsEqualIID (riid
, &IID_IPersistStream
)) {
44 *ppobj
= (LPPERSISTSTREAM
)&This
->PersistStreamVtbl
;
45 IDirectMusicSegTriggerTrack_IPersistStream_AddRef ((LPPERSISTSTREAM
)&This
->PersistStreamVtbl
);
49 WARN("(%p, %s, %p): not found\n", This
, debugstr_dmguid(riid
), ppobj
);
53 ULONG WINAPI
IDirectMusicSegTriggerTrack_IUnknown_AddRef (LPUNKNOWN iface
) {
54 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, UnknownVtbl
, iface
);
55 TRACE("(%p): AddRef from %ld\n", This
, This
->ref
);
59 ULONG WINAPI
IDirectMusicSegTriggerTrack_IUnknown_Release (LPUNKNOWN iface
) {
60 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, UnknownVtbl
, iface
);
61 ULONG ref
= --This
->ref
;
62 TRACE("(%p): ReleaseRef to %ld\n", This
, This
->ref
);
64 HeapFree(GetProcessHeap(), 0, This
);
69 IUnknownVtbl DirectMusicSegTriggerTrack_Unknown_Vtbl
= {
70 IDirectMusicSegTriggerTrack_IUnknown_QueryInterface
,
71 IDirectMusicSegTriggerTrack_IUnknown_AddRef
,
72 IDirectMusicSegTriggerTrack_IUnknown_Release
75 /* IDirectMusicSegTriggerTrack IDirectMusicTrack8 part: */
76 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_QueryInterface (LPDIRECTMUSICTRACK8 iface
, REFIID riid
, LPVOID
*ppobj
) {
77 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
78 return IDirectMusicSegTriggerTrack_IUnknown_QueryInterface ((LPUNKNOWN
)&This
->UnknownVtbl
, riid
, ppobj
);
81 ULONG WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_AddRef (LPDIRECTMUSICTRACK8 iface
) {
82 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
83 return IDirectMusicSegTriggerTrack_IUnknown_AddRef ((LPUNKNOWN
)&This
->UnknownVtbl
);
86 ULONG WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_Release (LPDIRECTMUSICTRACK8 iface
) {
87 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
88 return IDirectMusicSegTriggerTrack_IUnknown_Release ((LPUNKNOWN
)&This
->UnknownVtbl
);
91 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_Init (LPDIRECTMUSICTRACK8 iface
, IDirectMusicSegment
* pSegment
)
93 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
94 FIXME("(%p, %p): stub\n", This
, pSegment
);
98 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_InitPlay (LPDIRECTMUSICTRACK8 iface
, IDirectMusicSegmentState
* pSegmentState
, IDirectMusicPerformance
* pPerformance
, void** ppStateData
, DWORD dwVirtualTrack8ID
, DWORD dwFlags
)
100 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
101 FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This
, pSegmentState
, pPerformance
, ppStateData
, dwVirtualTrack8ID
, dwFlags
);
105 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_EndPlay (LPDIRECTMUSICTRACK8 iface
, void* pStateData
)
107 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
108 FIXME("(%p, %p): stub\n", This
, pStateData
);
112 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_Play (LPDIRECTMUSICTRACK8 iface
, void* pStateData
, MUSIC_TIME mtStart
, MUSIC_TIME mtEnd
, MUSIC_TIME mtOffset
, DWORD dwFlags
, IDirectMusicPerformance
* pPerf
, IDirectMusicSegmentState
* pSegSt
, DWORD dwVirtualID
)
114 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
115 FIXME("(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): stub\n", This
, pStateData
, mtStart
, mtEnd
, mtOffset
, dwFlags
, pPerf
, pSegSt
, dwVirtualID
);
119 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_GetParam (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidType
, MUSIC_TIME mtTime
, MUSIC_TIME
* pmtNext
, void* pParam
) {
120 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
121 FIXME("(%p, %s, %ld, %p, %p): stub\n", This
, debugstr_dmguid(rguidType
), mtTime
, pmtNext
, pParam
);
125 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_SetParam (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidType
, MUSIC_TIME mtTime
, void* pParam
) {
126 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
127 FIXME("(%p, %s, %ld, %p): stub\n", This
, debugstr_dmguid(rguidType
), mtTime
, pParam
);
131 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_IsParamSupported (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidType
) {
132 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
134 TRACE("(%p, %s): ", This
, debugstr_dmguid(rguidType
));
135 /* didn't find any params */
136 TRACE("param unsupported\n");
137 return DMUS_E_TYPE_UNSUPPORTED
;
140 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_AddNotificationType (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidNotificationType
) {
141 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
142 FIXME("(%p, %s): stub\n", This
, debugstr_dmguid(rguidNotificationType
));
146 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_RemoveNotificationType (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidNotificationType
) {
147 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
148 FIXME("(%p, %s): stub\n", This
, debugstr_dmguid(rguidNotificationType
));
152 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_Clone (LPDIRECTMUSICTRACK8 iface
, MUSIC_TIME mtStart
, MUSIC_TIME mtEnd
, IDirectMusicTrack
** ppTrack
) {
153 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
154 FIXME("(%p, %ld, %ld, %p): stub\n", This
, mtStart
, mtEnd
, ppTrack
);
158 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_PlayEx (LPDIRECTMUSICTRACK8 iface
, void* pStateData
, REFERENCE_TIME rtStart
, REFERENCE_TIME rtEnd
, REFERENCE_TIME rtOffset
, DWORD dwFlags
, IDirectMusicPerformance
* pPerf
, IDirectMusicSegmentState
* pSegSt
, DWORD dwVirtualID
) {
159 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
160 FIXME("(%p, %p, %lli, %lli, %lli, %ld, %p, %p, %ld): stub\n", This
, pStateData
, rtStart
, rtEnd
, rtOffset
, dwFlags
, pPerf
, pSegSt
, dwVirtualID
);
164 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_GetParamEx (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidType
, REFERENCE_TIME rtTime
, REFERENCE_TIME
* prtNext
, void* pParam
, void* pStateData
, DWORD dwFlags
) {
165 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
166 FIXME("(%p, %s, %lli, %p, %p, %p, %ld): stub\n", This
, debugstr_dmguid(rguidType
), rtTime
, prtNext
, pParam
, pStateData
, dwFlags
);
170 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_SetParamEx (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidType
, REFERENCE_TIME rtTime
, void* pParam
, void* pStateData
, DWORD dwFlags
) {
171 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
172 FIXME("(%p, %s, %lli, %p, %p, %ld): stub\n", This
, debugstr_dmguid(rguidType
), rtTime
, pParam
, pStateData
, dwFlags
);
176 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_Compose (LPDIRECTMUSICTRACK8 iface
, IUnknown
* pContext
, DWORD dwTrackGroup
, IDirectMusicTrack
** ppResultTrack
) {
177 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
178 FIXME("(%p, %p, %ld, %p): stub\n", This
, pContext
, dwTrackGroup
, ppResultTrack
);
182 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IDirectMusicTrack_Join (LPDIRECTMUSICTRACK8 iface
, IDirectMusicTrack
* pNewTrack
, MUSIC_TIME mtJoin
, IUnknown
* pContext
, DWORD dwTrackGroup
, IDirectMusicTrack
** ppResultTrack
) {
183 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, TrackVtbl
, iface
);
184 FIXME("(%p, %p, %ld, %p, %ld, %p): stub\n", This
, pNewTrack
, mtJoin
, pContext
, dwTrackGroup
, ppResultTrack
);
188 IDirectMusicTrack8Vtbl DirectMusicSegTriggerTrack_Track_Vtbl
= {
189 IDirectMusicSegTriggerTrack_IDirectMusicTrack_QueryInterface
,
190 IDirectMusicSegTriggerTrack_IDirectMusicTrack_AddRef
,
191 IDirectMusicSegTriggerTrack_IDirectMusicTrack_Release
,
192 IDirectMusicSegTriggerTrack_IDirectMusicTrack_Init
,
193 IDirectMusicSegTriggerTrack_IDirectMusicTrack_InitPlay
,
194 IDirectMusicSegTriggerTrack_IDirectMusicTrack_EndPlay
,
195 IDirectMusicSegTriggerTrack_IDirectMusicTrack_Play
,
196 IDirectMusicSegTriggerTrack_IDirectMusicTrack_GetParam
,
197 IDirectMusicSegTriggerTrack_IDirectMusicTrack_SetParam
,
198 IDirectMusicSegTriggerTrack_IDirectMusicTrack_IsParamSupported
,
199 IDirectMusicSegTriggerTrack_IDirectMusicTrack_AddNotificationType
,
200 IDirectMusicSegTriggerTrack_IDirectMusicTrack_RemoveNotificationType
,
201 IDirectMusicSegTriggerTrack_IDirectMusicTrack_Clone
,
202 IDirectMusicSegTriggerTrack_IDirectMusicTrack_PlayEx
,
203 IDirectMusicSegTriggerTrack_IDirectMusicTrack_GetParamEx
,
204 IDirectMusicSegTriggerTrack_IDirectMusicTrack_SetParamEx
,
205 IDirectMusicSegTriggerTrack_IDirectMusicTrack_Compose
,
206 IDirectMusicSegTriggerTrack_IDirectMusicTrack_Join
209 /* IDirectMusicSegTriggerTrack IPersistStream part: */
210 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IPersistStream_QueryInterface (LPPERSISTSTREAM iface
, REFIID riid
, LPVOID
*ppobj
) {
211 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, PersistStreamVtbl
, iface
);
212 return IDirectMusicSegTriggerTrack_IUnknown_QueryInterface ((LPUNKNOWN
)&This
->UnknownVtbl
, riid
, ppobj
);
215 ULONG WINAPI
IDirectMusicSegTriggerTrack_IPersistStream_AddRef (LPPERSISTSTREAM iface
) {
216 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, PersistStreamVtbl
, iface
);
217 return IDirectMusicSegTriggerTrack_IUnknown_AddRef ((LPUNKNOWN
)&This
->UnknownVtbl
);
220 ULONG WINAPI
IDirectMusicSegTriggerTrack_IPersistStream_Release (LPPERSISTSTREAM iface
) {
221 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, PersistStreamVtbl
, iface
);
222 return IDirectMusicSegTriggerTrack_IUnknown_Release ((LPUNKNOWN
)&This
->UnknownVtbl
);
225 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IPersistStream_GetClassID (LPPERSISTSTREAM iface
, CLSID
* pClassID
) {
226 ICOM_THIS_MULTI(IDirectMusicSegment8Impl
, PersistStreamVtbl
, iface
);
227 TRACE("(%p, %p)\n", This
, pClassID
);
228 memcpy(pClassID
, &CLSID_DirectMusicSegTriggerTrack
, sizeof(CLSID
));
232 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IPersistStream_IsDirty (LPPERSISTSTREAM iface
) {
233 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, PersistStreamVtbl
, iface
);
234 FIXME("(%p): stub, always S_FALSE\n", This
);
238 static HRESULT
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment (LPPERSISTSTREAM iface
, DMUS_PRIVATE_CHUNK
* pChunk
, IStream
* pStm
) {
239 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, PersistStreamVtbl
, iface
);
240 DMUS_PRIVATE_CHUNK Chunk
;
241 DWORD ListSize
[3], ListCount
[3];
242 LARGE_INTEGER liMove
; /* used when skipping chunks */
245 IDirectMusicObject
* pObject
= NULL
;
246 LPDMUS_PRIVATE_SEGMENT_ITEM pNewItem
= NULL
;
248 if (pChunk
->fccID
!= DMUS_FOURCC_SEGMENT_LIST
) {
249 ERR_(dmfile
)(": %s chunk should be a SEGMENT list\n", debugstr_fourcc (pChunk
->fccID
));
253 ListSize
[0] = pChunk
->dwSize
- sizeof(FOURCC
);
257 IStream_Read (pStm
, &Chunk
, sizeof(FOURCC
)+sizeof(DWORD
), NULL
);
258 ListCount
[0] += sizeof(FOURCC
) + sizeof(DWORD
) + Chunk
.dwSize
;
259 TRACE_(dmfile
)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk
.fccID
), Chunk
.dwSize
);
260 switch (Chunk
.fccID
) {
261 case DMUS_FOURCC_SEGMENTITEM_CHUNK
: {
262 TRACE_(dmfile
)(": segment item chunk\n");
263 /** alloc new item entry */
264 pNewItem
= HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, sizeof(DMUS_PRIVATE_SEGMENT_ITEM
));
265 if (NULL
== pNewItem
) {
266 ERR(": no more memory\n");
267 return E_OUTOFMEMORY
;
269 IStream_Read (pStm
, &pNewItem
->header
, sizeof(DMUS_IO_SEGMENT_ITEM_HEADER
), NULL
);
270 TRACE_(dmfile
)(" - lTimePhysical: %lu\n", pNewItem
->header
.lTimeLogical
);
271 TRACE_(dmfile
)(" - lTimePhysical: %lu\n", pNewItem
->header
.lTimePhysical
);
272 TRACE_(dmfile
)(" - dwPlayFlags: 0x%08lx\n", pNewItem
->header
.dwPlayFlags
);
273 TRACE_(dmfile
)(" - dwFlags: 0x%08lx\n", pNewItem
->header
.dwFlags
);
274 list_add_tail (&This
->Items
, &pNewItem
->entry
);
277 case DMUS_FOURCC_SEGMENTITEMNAME_CHUNK
: {
278 TRACE_(dmfile
)(": segment item name chunk\n");
279 IStream_Read (pStm
, pNewItem
->wszName
, Chunk
.dwSize
, NULL
);
280 TRACE_(dmfile
)(" - name: %s \n", debugstr_w(pNewItem
->wszName
));
284 IStream_Read (pStm
, &Chunk
.fccID
, sizeof(FOURCC
), NULL
);
285 TRACE_(dmfile
)(": LIST chunk of type %s", debugstr_fourcc(Chunk
.fccID
));
286 ListSize
[1] = Chunk
.dwSize
- sizeof(FOURCC
);
288 switch (Chunk
.fccID
) {
289 case DMUS_FOURCC_REF_LIST
: {
290 FIXME_(dmfile
)(": DMRF (DM References) list\n");
291 hr
= IDirectMusicUtils_IPersistStream_ParseReference (iface
, &Chunk
, pStm
, &pObject
);
293 ERR(": could not load Reference\n");
296 pNewItem
->pObject
= pObject
;
300 TRACE_(dmfile
)(": unknown (skipping)\n");
301 liMove
.QuadPart
= Chunk
.dwSize
- sizeof(FOURCC
);
302 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
309 TRACE_(dmfile
)(": unknown chunk (irrevelant & skipping)\n");
310 liMove
.QuadPart
= Chunk
.dwSize
;
311 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
315 TRACE_(dmfile
)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount
[0], ListSize
[0]);
316 } while (ListCount
[0] < ListSize
[0]);
321 static HRESULT
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegmentsList (LPPERSISTSTREAM iface
, DMUS_PRIVATE_CHUNK
* pChunk
, IStream
* pStm
) {
322 /*ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack, PersistStreamVtbl, iface);*/
324 DMUS_PRIVATE_CHUNK Chunk
;
325 DWORD ListSize
[3], ListCount
[3];
326 LARGE_INTEGER liMove
; /* used when skipping chunks */
328 if (pChunk
->fccID
!= DMUS_FOURCC_SEGMENTS_LIST
) {
329 ERR_(dmfile
)(": %s chunk should be a SEGMENTS list\n", debugstr_fourcc (pChunk
->fccID
));
333 ListSize
[0] = pChunk
->dwSize
- sizeof(FOURCC
);
337 IStream_Read (pStm
, &Chunk
, sizeof(FOURCC
)+sizeof(DWORD
), NULL
);
338 ListCount
[0] += sizeof(FOURCC
) + sizeof(DWORD
) + Chunk
.dwSize
;
339 TRACE_(dmfile
)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk
.fccID
), Chunk
.dwSize
);
340 switch (Chunk
.fccID
) {
342 IStream_Read (pStm
, &Chunk
.fccID
, sizeof(FOURCC
), NULL
);
343 TRACE_(dmfile
)(": LIST chunk of type %s", debugstr_fourcc(Chunk
.fccID
));
344 ListSize
[1] = Chunk
.dwSize
- sizeof(FOURCC
);
346 switch (Chunk
.fccID
) {
347 case DMUS_FOURCC_SEGMENT_LIST
: {
348 TRACE_(dmfile
)(": SEGMENT list\n");
349 hr
= IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment (iface
, &Chunk
, pStm
);
350 if (FAILED(hr
)) return hr
;
354 TRACE_(dmfile
)(": unknown (skipping)\n");
355 liMove
.QuadPart
= Chunk
.dwSize
- sizeof(FOURCC
);
356 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
363 TRACE_(dmfile
)(": unknown chunk (irrevelant & skipping)\n");
364 liMove
.QuadPart
= Chunk
.dwSize
;
365 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
369 TRACE_(dmfile
)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount
[0], ListSize
[0]);
370 } while (ListCount
[0] < ListSize
[0]);
375 static HRESULT
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegTrackList (LPPERSISTSTREAM iface
, DMUS_PRIVATE_CHUNK
* pChunk
, IStream
* pStm
) {
376 /*ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack, PersistStreamVtbl, iface);*/
378 DMUS_PRIVATE_CHUNK Chunk
;
379 DWORD ListSize
[3], ListCount
[3];
380 LARGE_INTEGER liMove
; /* used when skipping chunks */
382 if (pChunk
->fccID
!= DMUS_FOURCC_SEGTRACK_LIST
) {
383 ERR_(dmfile
)(": %s chunk should be a SEGTRACK list\n", debugstr_fourcc (pChunk
->fccID
));
387 ListSize
[0] = pChunk
->dwSize
- sizeof(FOURCC
);
391 IStream_Read (pStm
, &Chunk
, sizeof(FOURCC
)+sizeof(DWORD
), NULL
);
392 ListCount
[0] += sizeof(FOURCC
) + sizeof(DWORD
) + Chunk
.dwSize
;
393 TRACE_(dmfile
)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk
.fccID
), Chunk
.dwSize
);
394 switch (Chunk
.fccID
) {
395 case DMUS_FOURCC_SEGTRACK_CHUNK
: {
396 TRACE_(dmfile
)(": segment trigger track chunk\n");
397 liMove
.QuadPart
= Chunk
.dwSize
;
398 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
402 IStream_Read (pStm
, &Chunk
.fccID
, sizeof(FOURCC
), NULL
);
403 TRACE_(dmfile
)(": LIST chunk of type %s", debugstr_fourcc(Chunk
.fccID
));
404 ListSize
[1] = Chunk
.dwSize
- sizeof(FOURCC
);
406 switch (Chunk
.fccID
) {
407 case DMUS_FOURCC_SEGMENTS_LIST
: {
408 TRACE_(dmfile
)(": SEGMENTS list\n");
409 hr
= IDirectMusicSegTriggerTrack_IPersistStream_ParseSegmentsList (iface
, &Chunk
, pStm
);
410 if (FAILED(hr
)) return hr
;
414 TRACE_(dmfile
)(": unknown (skipping)\n");
415 liMove
.QuadPart
= Chunk
.dwSize
- sizeof(FOURCC
);
416 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
423 TRACE_(dmfile
)(": unknown chunk (irrevelant & skipping)\n");
424 liMove
.QuadPart
= Chunk
.dwSize
;
425 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
429 TRACE_(dmfile
)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount
[0], ListSize
[0]);
430 } while (ListCount
[0] < ListSize
[0]);
435 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IPersistStream_Load (LPPERSISTSTREAM iface
, IStream
* pStm
) {
436 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, PersistStreamVtbl
, iface
);
438 DMUS_PRIVATE_CHUNK Chunk
;
439 LARGE_INTEGER liMove
;
442 TRACE("(%p, %p): Loading\n", This
, pStm
);
445 IStream_Read (pStm
, &Chunk
, sizeof(FOURCC
)+sizeof(DWORD
), NULL
);
446 TRACE_(dmfile
)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk
.fccID
), Chunk
.dwSize
);
447 switch (Chunk
.fccID
) {
449 IStream_Read (pStm
, &Chunk
.fccID
, sizeof(FOURCC
), NULL
);
450 TRACE_(dmfile
)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk
.fccID
), Chunk
.dwSize
);
451 switch (Chunk
.fccID
) {
452 case DMUS_FOURCC_SEGTRACK_LIST
: {
453 TRACE_(dmfile
)(": segment trigger track list\n");
454 hr
= IDirectMusicSegTriggerTrack_IPersistStream_ParseSegTrackList (iface
, &Chunk
, pStm
);
455 if (FAILED(hr
)) return hr
;
459 TRACE_(dmfile
)(": unexpected chunk; loading failed)\n");
460 liMove
.QuadPart
= Chunk
.dwSize
;
461 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
465 TRACE_(dmfile
)(": reading finished\n");
469 TRACE_(dmfile
)(": unexpected chunk; loading failed)\n");
470 liMove
.QuadPart
= Chunk
.dwSize
;
471 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
); /* skip the rest of the chunk */
480 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IPersistStream_Save (LPPERSISTSTREAM iface
, IStream
* pStm
, BOOL fClearDirty
) {
481 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, PersistStreamVtbl
, iface
);
482 FIXME("(%p): Saving not implemented yet\n", This
);
486 HRESULT WINAPI
IDirectMusicSegTriggerTrack_IPersistStream_GetSizeMax (LPPERSISTSTREAM iface
, ULARGE_INTEGER
* pcbSize
) {
487 ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack
, PersistStreamVtbl
, iface
);
488 FIXME("(%p, %p): stub\n", This
, pcbSize
);
492 IPersistStreamVtbl DirectMusicSegTriggerTrack_PersistStream_Vtbl
= {
493 IDirectMusicSegTriggerTrack_IPersistStream_QueryInterface
,
494 IDirectMusicSegTriggerTrack_IPersistStream_AddRef
,
495 IDirectMusicSegTriggerTrack_IPersistStream_Release
,
496 IDirectMusicSegTriggerTrack_IPersistStream_GetClassID
,
497 IDirectMusicSegTriggerTrack_IPersistStream_IsDirty
,
498 IDirectMusicSegTriggerTrack_IPersistStream_Load
,
499 IDirectMusicSegTriggerTrack_IPersistStream_Save
,
500 IDirectMusicSegTriggerTrack_IPersistStream_GetSizeMax
503 /* for ClassFactory */
504 HRESULT WINAPI
DMUSIC_CreateDirectMusicSegTriggerTrack (LPCGUID lpcGUID
, LPVOID
*ppobj
, LPUNKNOWN pUnkOuter
) {
505 IDirectMusicSegTriggerTrack
* track
;
507 track
= HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectMusicSegTriggerTrack
));
509 *ppobj
= (LPVOID
) NULL
;
510 return E_OUTOFMEMORY
;
512 track
->UnknownVtbl
= &DirectMusicSegTriggerTrack_Unknown_Vtbl
;
513 track
->TrackVtbl
= &DirectMusicSegTriggerTrack_Track_Vtbl
;
514 track
->PersistStreamVtbl
= &DirectMusicSegTriggerTrack_PersistStream_Vtbl
;
515 track
->pDesc
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(DMUS_OBJECTDESC
));
516 DM_STRUCT_INIT(track
->pDesc
);
517 track
->pDesc
->dwValidData
|= DMUS_OBJ_CLASS
;
518 memcpy (&track
->pDesc
->guidClass
, &CLSID_DirectMusicSegTriggerTrack
, sizeof (CLSID
));
519 track
->ref
= 0; /* will be inited by QueryInterface */
520 list_init (&track
->Items
);
522 return IDirectMusicSegTriggerTrack_IUnknown_QueryInterface ((LPUNKNOWN
)&track
->UnknownVtbl
, lpcGUID
, ppobj
);