1 /* IDirectMusicBandTrack Implementation
3 * Copyright (C) 2003 Rok Mandeljc
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (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
13 * GNU Library General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 #include "wine/debug.h"
28 #include "dmband_private.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(dmband
);
31 WINE_DECLARE_DEBUG_CHANNEL(dmfile
);
33 /*****************************************************************************
34 * IDirectMusicBandTrack implementation
36 /* IDirectMusicBandTrack IUnknown part: */
37 HRESULT WINAPI
IDirectMusicBandTrack_QueryInterface (LPDIRECTMUSICTRACK8 iface
, REFIID riid
, LPVOID
*ppobj
)
39 ICOM_THIS(IDirectMusicBandTrack
,iface
);
41 if (IsEqualIID (riid
, &IID_IUnknown
) ||
42 IsEqualIID (riid
, &IID_IDirectMusicTrack
) ||
43 IsEqualIID (riid
, &IID_IDirectMusicTrack8
)) {
44 IDirectMusicBandTrack_AddRef(iface
);
47 } else if (IsEqualIID (riid
, &IID_IPersistStream
)) {
48 IDirectMusicBandTrackStream_AddRef ((LPPERSISTSTREAM
)This
->pStream
);
49 *ppobj
= This
->pStream
;
52 WARN("(%p)->(%s,%p),not found\n", This
, debugstr_guid(riid
), ppobj
);
56 ULONG WINAPI
IDirectMusicBandTrack_AddRef (LPDIRECTMUSICTRACK8 iface
)
58 ICOM_THIS(IDirectMusicBandTrack
,iface
);
59 TRACE("(%p) : AddRef from %ld\n", This
, This
->ref
);
63 ULONG WINAPI
IDirectMusicBandTrack_Release (LPDIRECTMUSICTRACK8 iface
)
65 ICOM_THIS(IDirectMusicBandTrack
,iface
);
66 ULONG ref
= --This
->ref
;
67 TRACE("(%p) : ReleaseRef to %ld\n", This
, This
->ref
);
69 HeapFree(GetProcessHeap(), 0, This
);
74 /* IDirectMusicBandTrack IDirectMusicTrack part: */
75 HRESULT WINAPI
IDirectMusicBandTrack_Init (LPDIRECTMUSICTRACK8 iface
, IDirectMusicSegment
* pSegment
)
77 ICOM_THIS(IDirectMusicBandTrack
,iface
);
79 FIXME("(%p, %p): stub\n", This
, pSegment
);
84 HRESULT WINAPI
IDirectMusicBandTrack_InitPlay (LPDIRECTMUSICTRACK8 iface
, IDirectMusicSegmentState
* pSegmentState
, IDirectMusicPerformance
* pPerformance
, void** ppStateData
, DWORD dwVirtualTrack8ID
, DWORD dwFlags
)
86 ICOM_THIS(IDirectMusicBandTrack
,iface
);
88 FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This
, pSegmentState
, pPerformance
, ppStateData
, dwVirtualTrack8ID
, dwFlags
);
93 HRESULT WINAPI
IDirectMusicBandTrack_EndPlay (LPDIRECTMUSICTRACK8 iface
, void* pStateData
)
95 ICOM_THIS(IDirectMusicBandTrack
,iface
);
97 FIXME("(%p, %p): stub\n", This
, pStateData
);
102 HRESULT WINAPI
IDirectMusicBandTrack_Play (LPDIRECTMUSICTRACK8 iface
, void* pStateData
, MUSIC_TIME mtStart
, MUSIC_TIME mtEnd
, MUSIC_TIME mtOffset
, DWORD dwFlags
, IDirectMusicPerformance
* pPerf
, IDirectMusicSegmentState
* pSegSt
, DWORD dwVirtualID
)
104 ICOM_THIS(IDirectMusicBandTrack
,iface
);
106 FIXME("(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): stub\n", This
, pStateData
, mtStart
, mtEnd
, mtOffset
, dwFlags
, pPerf
, pSegSt
, dwVirtualID
);
111 HRESULT WINAPI
IDirectMusicBandTrack_GetParam (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidType
, MUSIC_TIME mtTime
, MUSIC_TIME
* pmtNext
, void* pParam
)
113 ICOM_THIS(IDirectMusicBandTrack
,iface
);
115 FIXME("(%p, %s, %ld, %p, %p): stub\n", This
, debugstr_guid(rguidType
), mtTime
, pmtNext
, pParam
);
120 HRESULT WINAPI
IDirectMusicBandTrack_SetParam (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidType
, MUSIC_TIME mtTime
, void* pParam
)
122 ICOM_THIS(IDirectMusicBandTrack
,iface
);
124 FIXME("(%p, %s, %ld, %p): stub\n", This
, debugstr_guid(rguidType
), mtTime
, pParam
);
129 HRESULT WINAPI
IDirectMusicBandTrack_IsParamSupported (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidType
)
131 ICOM_THIS(IDirectMusicBandTrack
,iface
);
133 TRACE("(%p, %s): ", This
, debugstr_guid(rguidType
));
134 if (IsEqualGUID (rguidType
, &GUID_BandParam
)
135 || IsEqualGUID (rguidType
, &GUID_Clear_All_Bands
)
136 || IsEqualGUID (rguidType
, &GUID_ConnectToDLSCollection
)
137 || IsEqualGUID (rguidType
, &GUID_Disable_Auto_Download
)
138 || IsEqualGUID (rguidType
, &GUID_Download
)
139 || IsEqualGUID (rguidType
, &GUID_DownloadToAudioPath
)
140 || IsEqualGUID (rguidType
, &GUID_Enable_Auto_Download
)
141 || IsEqualGUID (rguidType
, &GUID_IDirectMusicBand
)
142 || IsEqualGUID (rguidType
, &GUID_StandardMIDIFile
)
143 || IsEqualGUID (rguidType
, &GUID_Unload
)
144 || IsEqualGUID (rguidType
, &GUID_UnloadFromAudioPath
)) {
145 TRACE("param supported\n");
149 TRACE("param unsupported\n");
150 return DMUS_E_TYPE_UNSUPPORTED
;
153 HRESULT WINAPI
IDirectMusicBandTrack_AddNotificationType (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidNotificationType
)
155 ICOM_THIS(IDirectMusicBandTrack
,iface
);
157 FIXME("(%p, %s): stub\n", This
, debugstr_guid(rguidNotificationType
));
162 HRESULT WINAPI
IDirectMusicBandTrack_RemoveNotificationType (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidNotificationType
)
164 ICOM_THIS(IDirectMusicBandTrack
,iface
);
166 FIXME("(%p, %s): stub\n", This
, debugstr_guid(rguidNotificationType
));
171 HRESULT WINAPI
IDirectMusicBandTrack_Clone (LPDIRECTMUSICTRACK8 iface
, MUSIC_TIME mtStart
, MUSIC_TIME mtEnd
, IDirectMusicTrack
** ppTrack
)
173 ICOM_THIS(IDirectMusicBandTrack
,iface
);
175 FIXME("(%p, %ld, %ld, %p): stub\n", This
, mtStart
, mtEnd
, ppTrack
);
180 /* IDirectMusicBandTrack IDirectMusicTrack8 part: */
181 HRESULT WINAPI
IDirectMusicBandTrack_PlayEx (LPDIRECTMUSICTRACK8 iface
, void* pStateData
, REFERENCE_TIME rtStart
, REFERENCE_TIME rtEnd
, REFERENCE_TIME rtOffset
, DWORD dwFlags
, IDirectMusicPerformance
* pPerf
, IDirectMusicSegmentState
* pSegSt
, DWORD dwVirtualID
)
183 ICOM_THIS(IDirectMusicBandTrack
,iface
);
185 FIXME("(%p, %p, %lli, %lli, %lli, %ld, %p, %p, %ld): stub\n", This
, pStateData
, rtStart
, rtEnd
, rtOffset
, dwFlags
, pPerf
, pSegSt
, dwVirtualID
);
190 HRESULT WINAPI
IDirectMusicBandTrack_GetParamEx (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidType
, REFERENCE_TIME rtTime
, REFERENCE_TIME
* prtNext
, void* pParam
, void* pStateData
, DWORD dwFlags
)
192 ICOM_THIS(IDirectMusicBandTrack
,iface
);
194 FIXME("(%p, %s, %lli, %p, %p, %p, %ld): stub\n", This
, debugstr_guid(rguidType
), rtTime
, prtNext
, pParam
, pStateData
, dwFlags
);
199 HRESULT WINAPI
IDirectMusicBandTrack_SetParamEx (LPDIRECTMUSICTRACK8 iface
, REFGUID rguidType
, REFERENCE_TIME rtTime
, void* pParam
, void* pStateData
, DWORD dwFlags
)
201 ICOM_THIS(IDirectMusicBandTrack
,iface
);
203 FIXME("(%p, %s, %lli, %p, %p, %ld): stub\n", This
, debugstr_guid(rguidType
), rtTime
, pParam
, pStateData
, dwFlags
);
208 HRESULT WINAPI
IDirectMusicBandTrack_Compose (LPDIRECTMUSICTRACK8 iface
, IUnknown
* pContext
, DWORD dwTrackGroup
, IDirectMusicTrack
** ppResultTrack
)
210 ICOM_THIS(IDirectMusicBandTrack
,iface
);
212 FIXME("(%p, %p, %ld, %p): stub\n", This
, pContext
, dwTrackGroup
, ppResultTrack
);
217 HRESULT WINAPI
IDirectMusicBandTrack_Join (LPDIRECTMUSICTRACK8 iface
, IDirectMusicTrack
* pNewTrack
, MUSIC_TIME mtJoin
, IUnknown
* pContext
, DWORD dwTrackGroup
, IDirectMusicTrack
** ppResultTrack
)
219 ICOM_THIS(IDirectMusicBandTrack
,iface
);
221 FIXME("(%p, %p, %ld, %p, %ld, %p): stub\n", This
, pNewTrack
, mtJoin
, pContext
, dwTrackGroup
, ppResultTrack
);
226 ICOM_VTABLE(IDirectMusicTrack8
) DirectMusicBandTrack_Vtbl
=
228 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
229 IDirectMusicBandTrack_QueryInterface
,
230 IDirectMusicBandTrack_AddRef
,
231 IDirectMusicBandTrack_Release
,
232 IDirectMusicBandTrack_Init
,
233 IDirectMusicBandTrack_InitPlay
,
234 IDirectMusicBandTrack_EndPlay
,
235 IDirectMusicBandTrack_Play
,
236 IDirectMusicBandTrack_GetParam
,
237 IDirectMusicBandTrack_SetParam
,
238 IDirectMusicBandTrack_IsParamSupported
,
239 IDirectMusicBandTrack_AddNotificationType
,
240 IDirectMusicBandTrack_RemoveNotificationType
,
241 IDirectMusicBandTrack_Clone
,
242 IDirectMusicBandTrack_PlayEx
,
243 IDirectMusicBandTrack_GetParamEx
,
244 IDirectMusicBandTrack_SetParamEx
,
245 IDirectMusicBandTrack_Compose
,
246 IDirectMusicBandTrack_Join
249 /* for ClassFactory */
250 HRESULT WINAPI
DMUSIC_CreateDirectMusicBandTrack (LPCGUID lpcGUID
, LPDIRECTMUSICTRACK8
*ppTrack
, LPUNKNOWN pUnkOuter
)
252 IDirectMusicBandTrack
* track
;
254 if (IsEqualIID (lpcGUID
, &IID_IDirectMusicTrack
)
255 || IsEqualIID (lpcGUID
, &IID_IDirectMusicTrack8
)) {
256 track
= HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectMusicBandTrack
));
258 *ppTrack
= (LPDIRECTMUSICTRACK8
) NULL
;
259 return E_OUTOFMEMORY
;
261 track
->lpVtbl
= &DirectMusicBandTrack_Vtbl
;
263 track
->pStream
= HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, sizeof(IDirectMusicBandTrackStream
));
264 track
->pStream
->lpVtbl
= &DirectMusicBandTrackStream_Vtbl
;
265 track
->pStream
->ref
= 1;
266 track
->pStream
->pParentTrack
= track
;
267 *ppTrack
= (LPDIRECTMUSICTRACK8
) track
;
270 WARN("No interface found\n");
272 return E_NOINTERFACE
;
276 /*****************************************************************************
277 * IDirectMusicBandTrackStream implementation
279 /* IDirectMusicBandTrackStream IUnknown part: */
280 HRESULT WINAPI
IDirectMusicBandTrackStream_QueryInterface (LPPERSISTSTREAM iface
, REFIID riid
, LPVOID
*ppobj
)
282 ICOM_THIS(IDirectMusicBandTrackStream
,iface
);
284 if (IsEqualIID (riid
, &IID_IUnknown
)
285 || IsEqualIID (riid
, &IID_IPersistStream
)) {
286 IDirectMusicBandTrackStream_AddRef(iface
);
290 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
291 return E_NOINTERFACE
;
294 ULONG WINAPI
IDirectMusicBandTrackStream_AddRef (LPPERSISTSTREAM iface
)
296 ICOM_THIS(IDirectMusicBandTrackStream
,iface
);
297 TRACE("(%p) : AddRef from %ld\n", This
, This
->ref
);
298 return ++(This
->ref
);
301 ULONG WINAPI
IDirectMusicBandTrackStream_Release (LPPERSISTSTREAM iface
)
303 ICOM_THIS(IDirectMusicBandTrackStream
,iface
);
304 ULONG ref
= --This
->ref
;
305 TRACE("(%p) : ReleaseRef to %ld\n", This
, This
->ref
);
307 HeapFree(GetProcessHeap(), 0, This
);
312 /* IDirectMusicBandTrackStream IPersist part: */
313 HRESULT WINAPI
IDirectMusicBandTrackStream_GetClassID (LPPERSISTSTREAM iface
, CLSID
* pClassID
)
318 /* IDirectMusicBandTrackStream IPersistStream part: */
319 HRESULT WINAPI
IDirectMusicBandTrackStream_IsDirty (LPPERSISTSTREAM iface
)
324 HRESULT WINAPI
IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface
, IStream
* pStm
)
326 ICOM_THIS(IDirectMusicBandTrackStream
,iface
);
328 DWORD chunkSize
, StreamSize
, StreamCount
, ListSize
[3], ListCount
[3];
329 LARGE_INTEGER liMove
; /* used when skipping chunks */
330 DMUS_OBJECTDESC ObjDesc
;
331 IDirectMusicBandTrack
* pTrack
= This
->pParentTrack
; /* that's where we load data to */
332 DMUS_IO_BAND_ITEM_HEADER tempHeaderV1
;
333 DMUS_IO_BAND_ITEM_HEADER2 tempHeaderV2
;
334 LPDIRECTMUSICLOADER pLoader
;
335 LPDIRECTMUSICGETLOADER pGetLoader
;
337 IStream_Read (pStm
, &chunkID
, sizeof(FOURCC
), NULL
);
338 IStream_Read (pStm
, &chunkSize
, sizeof(DWORD
), NULL
);
339 TRACE_(dmfile
)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID
), chunkSize
);
342 IStream_Read (pStm
, &chunkID
, sizeof(FOURCC
), NULL
);
343 TRACE_(dmfile
)(": RIFF chunk of type %s", debugstr_fourcc(chunkID
));
344 StreamSize
= chunkSize
- sizeof(FOURCC
);
347 case DMUS_FOURCC_BANDTRACK_FORM
: {
348 TRACE_(dmfile
)(": band track form\n");
350 IStream_Read (pStm
, &chunkID
, sizeof(FOURCC
), NULL
);
351 IStream_Read (pStm
, &chunkSize
, sizeof(FOURCC
), NULL
);
352 StreamCount
+= sizeof(FOURCC
) + sizeof(DWORD
) + chunkSize
;
353 TRACE_(dmfile
)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID
), chunkSize
);
355 case DMUS_FOURCC_BANDTRACK_CHUNK
: {
356 TRACE_(dmfile
)(": band track header chunk\n");
357 IStream_Read (pStm
, &pTrack
->btkHeader
, chunkSize
, NULL
);
360 case DMUS_FOURCC_GUID_CHUNK
: {
361 TRACE_(dmfile
)(": GUID chunk\n");
362 IStream_Read (pStm
, &pTrack
->vVersion
, chunkSize
, NULL
);
365 case DMUS_FOURCC_VERSION_CHUNK
: {
366 TRACE_(dmfile
)(": version chunk\n");
367 IStream_Read (pStm
, &pTrack
->guidID
, chunkSize
, NULL
);
371 IStream_Read (pStm
, &chunkID
, sizeof(FOURCC
), NULL
);
372 TRACE_(dmfile
)(": LIST chunk of type %s", debugstr_fourcc(chunkID
));
373 ListSize
[0] = chunkSize
- sizeof(FOURCC
);
376 case DMUS_FOURCC_UNFO_LIST
: {
377 TRACE_(dmfile
)(": UNFO list\n");
379 IStream_Read (pStm
, &chunkID
, sizeof(FOURCC
), NULL
);
380 IStream_Read (pStm
, &chunkSize
, sizeof(FOURCC
), NULL
);
381 ListCount
[0] += sizeof(FOURCC
) + sizeof(DWORD
) + chunkSize
;
382 TRACE_(dmfile
)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID
), chunkSize
);
384 case DMUS_FOURCC_UNAM_CHUNK
: {
385 TRACE_(dmfile
)(": name chunk\n");
386 pTrack
->wszName
= HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, chunkSize
);
387 IStream_Read (pStm
, pTrack
->wszName
, chunkSize
, NULL
);
390 case DMUS_FOURCC_UART_CHUNK
: {
391 TRACE_(dmfile
)(": artist chunk\n");
392 pTrack
->wszArtist
= HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, chunkSize
);
393 IStream_Read (pStm
, pTrack
->wszArtist
, chunkSize
, NULL
);
396 case DMUS_FOURCC_UCOP_CHUNK
: {
397 TRACE_(dmfile
)(": copyright chunk\n");
398 pTrack
->wszCopyright
= HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, chunkSize
);
399 IStream_Read (pStm
, pTrack
->wszCopyright
, chunkSize
, NULL
);
402 case DMUS_FOURCC_USBJ_CHUNK
: {
403 TRACE_(dmfile
)(": subject chunk\n");
404 pTrack
->wszSubject
= HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, chunkSize
);
405 IStream_Read (pStm
, pTrack
->wszSubject
, chunkSize
, NULL
);
408 case DMUS_FOURCC_UCMT_CHUNK
: {
409 TRACE_(dmfile
)(": comment chunk\n");
410 pTrack
->wszComment
= HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, chunkSize
);
411 IStream_Read (pStm
, pTrack
->wszComment
, chunkSize
, NULL
);
415 TRACE_(dmfile
)(": unknown chunk (irrevelant & skipping)\n");
416 liMove
.QuadPart
= chunkSize
;
417 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
421 TRACE_(dmfile
)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount
[0], ListSize
[0]);
422 } while (ListCount
[0] < ListSize
[0]);
425 case DMUS_FOURCC_BANDS_LIST
: {
426 TRACE_(dmfile
)(": bands list\n");
428 IStream_Read (pStm
, &chunkID
, sizeof(FOURCC
), NULL
);
429 IStream_Read (pStm
, &chunkSize
, sizeof(FOURCC
), NULL
);
430 ListCount
[0] += sizeof(FOURCC
) + sizeof(DWORD
) + chunkSize
;
431 TRACE_(dmfile
)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID
), chunkSize
);
434 IStream_Read (pStm
, &chunkID
, sizeof(FOURCC
), NULL
);
435 TRACE_(dmfile
)(": LIST chunk of type %s", debugstr_fourcc(chunkID
));
436 ListSize
[1] = chunkSize
- sizeof(FOURCC
);
439 case DMUS_FOURCC_BAND_LIST
: {
440 TRACE_(dmfile
)(": band list\n");
442 IStream_Read (pStm
, &chunkID
, sizeof(FOURCC
), NULL
);
443 IStream_Read (pStm
, &chunkSize
, sizeof(FOURCC
), NULL
);
444 ListCount
[1] += sizeof(FOURCC
) + sizeof(DWORD
) + chunkSize
;
445 TRACE_(dmfile
)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID
), chunkSize
);
447 case DMUS_FOURCC_BANDITEM_CHUNK
: {
448 TRACE_(dmfile
)(": band item header (v.1) chunk\n");
449 IStream_Read (pStm
, &tempHeaderV1
, chunkSize
, NULL
);
450 /* now transfer data to universal header */
451 pTrack
->pBandHeaders
[pTrack
->dwBands
].dwVersion
= 1;
452 pTrack
->pBandHeaders
[pTrack
->dwBands
].lBandTime
= tempHeaderV1
.lBandTime
;
453 TRACE_(dmfile
)(": (READ): header: lBandTime = %li\n", tempHeaderV1
.lBandTime
);
456 case DMUS_FOURCC_BANDITEM_CHUNK2
: {
457 TRACE_(dmfile
)(": band item header (v.2) chunk\n");
458 IStream_Read (pStm
, &tempHeaderV2
, chunkSize
, NULL
);
459 /* now transfer data to universal header */
460 pTrack
->pBandHeaders
[pTrack
->dwBands
].dwVersion
= 2;
461 pTrack
->pBandHeaders
[pTrack
->dwBands
].lBandTimeLogical
= tempHeaderV2
.lBandTimeLogical
;
462 pTrack
->pBandHeaders
[pTrack
->dwBands
].lBandTimePhysical
= tempHeaderV2
.lBandTimePhysical
;
466 TRACE_(dmfile
)(": RIFF chunk (probably band form)\n");
468 liMove
.QuadPart
-= (sizeof(FOURCC
) + sizeof(DWORD
)); /* goto the beginning of chunk */
469 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
470 /* perform sacrificial ritual so that loader will load band */
471 ZeroMemory ((LPVOID
)&ObjDesc
, sizeof(DMUS_OBJECTDESC
));
472 ObjDesc
.dwSize
= sizeof(DMUS_OBJECTDESC
);
473 ObjDesc
.dwValidData
= DMUS_OBJ_CLASS
| DMUS_OBJ_STREAM
;
474 ObjDesc
.guidClass
= CLSID_DirectMusicBand
;
475 ObjDesc
.pStream
= pStm
;
477 if (SUCCEEDED(IStream_QueryInterface (pStm
, &IID_IDirectMusicGetLoader
, (LPVOID
*)&pGetLoader
))) {
478 if (SUCCEEDED(IDirectMusicGetLoader_GetLoader (pGetLoader
, &pLoader
))) {
479 IDirectMusicObject
* pObject
;
480 if (SUCCEEDED(IDirectMusicLoader_GetObject (pLoader
, &ObjDesc
, &IID_IDirectMusicObject
, (LPVOID
*)&pObject
))) {
481 /* acquire band from loaded object */
482 IDirectMusicObject_QueryInterface (pObject
, &IID_IDirectMusicBand
, (LPVOID
*)&pTrack
->ppBands
[pTrack
->dwBands
]);
483 /*IDirectMusicLoader_Release (pLoader);*/
484 } else FIXME(": couldn't get band\n");
486 IDirectMusicGetLoader_Release (pGetLoader
);
488 ERR("Could not get IDirectMusicGetLoader... reference will not be loaded :(\n");
491 /* MSDN states that loader returns stream pointer to it's before-reading position,
492 which means that we must skip whole (loaded) chunk */
493 liMove
.QuadPart
= sizeof(FOURCC
) + sizeof(DWORD
) + chunkID
;
494 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
498 TRACE_(dmfile
)(": unknown chunk (irrevelant & skipping)\n");
499 liMove
.QuadPart
= chunkSize
;
500 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
504 TRACE_(dmfile
)(": ListCount[1] = %ld < ListSize[1] = %ld\n", ListCount
[1], ListSize
[1]);
505 } while (ListCount
[1] < ListSize
[1]);
509 TRACE_(dmfile
)(": unknown (skipping)\n");
510 liMove
.QuadPart
= chunkSize
- sizeof(FOURCC
);
511 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
518 TRACE_(dmfile
)(": unknown chunk (irrevelant & skipping)\n");
519 liMove
.QuadPart
= chunkSize
;
520 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
524 TRACE_(dmfile
)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount
[0], ListSize
[0]);
525 } while (ListCount
[0] < ListSize
[0]);
526 pTrack
->dwBands
++; /* add reference count */
530 TRACE_(dmfile
)(": unknown (skipping)\n");
531 liMove
.QuadPart
= chunkSize
- sizeof(FOURCC
);
532 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
);
539 TRACE_(dmfile
)(": unknown chunk (skipping)\n");
540 liMove
.QuadPart
= chunkSize
;
541 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
); /* skip this chunk */
545 TRACE_(dmfile
)(": StreamCount[0] = %ld < StreamSize[0] = %ld\n", StreamCount
, StreamSize
);
546 } while (StreamCount
< StreamSize
);
550 TRACE_(dmfile
)(": unexpected chunk; loading failed)\n");
551 liMove
.QuadPart
= StreamSize
;
552 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
); /* skip the rest of the chunk */
556 TRACE_(dmfile
)(": reading finished\n");
560 TRACE_(dmfile
)(": unexpected chunk; loading failed)\n");
561 liMove
.QuadPart
= chunkSize
;
562 IStream_Seek (pStm
, liMove
, STREAM_SEEK_CUR
, NULL
); /* skip the rest of the chunk */
570 HRESULT WINAPI
IDirectMusicBandTrackStream_Save (LPPERSISTSTREAM iface
, IStream
* pStm
, BOOL fClearDirty
)
575 HRESULT WINAPI
IDirectMusicBandTrackStream_GetSizeMax (LPPERSISTSTREAM iface
, ULARGE_INTEGER
* pcbSize
)
580 ICOM_VTABLE(IPersistStream
) DirectMusicBandTrackStream_Vtbl
=
582 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
583 IDirectMusicBandTrackStream_QueryInterface
,
584 IDirectMusicBandTrackStream_AddRef
,
585 IDirectMusicBandTrackStream_Release
,
586 IDirectMusicBandTrackStream_GetClassID
,
587 IDirectMusicBandTrackStream_IsDirty
,
588 IDirectMusicBandTrackStream_Load
,
589 IDirectMusicBandTrackStream_Save
,
590 IDirectMusicBandTrackStream_GetSizeMax