Fixed header dependencies to be fully compatible with the Windows
[wine/multimedia.git] / dlls / dmband / bandtrack.c
blob83db7eab930151822f157a8917a783de1f1e2bfc
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.
20 #include <stdarg.h>
22 #include "windef.h"
23 #include "winbase.h"
24 #include "winuser.h"
25 #include "wingdi.h"
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);
45 *ppobj = This;
46 return S_OK;
47 } else if (IsEqualIID (riid, &IID_IPersistStream)) {
48 IDirectMusicBandTrackStream_AddRef ((LPPERSISTSTREAM)This->pStream);
49 *ppobj = This->pStream;
50 return S_OK;
52 WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
53 return E_NOINTERFACE;
56 ULONG WINAPI IDirectMusicBandTrack_AddRef (LPDIRECTMUSICTRACK8 iface)
58 ICOM_THIS(IDirectMusicBandTrack,iface);
59 TRACE("(%p) : AddRef from %ld\n", This, This->ref);
60 return ++(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);
68 if (ref == 0) {
69 HeapFree(GetProcessHeap(), 0, This);
71 return ref;
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);
81 return S_OK;
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);
90 return S_OK;
93 HRESULT WINAPI IDirectMusicBandTrack_EndPlay (LPDIRECTMUSICTRACK8 iface, void* pStateData)
95 ICOM_THIS(IDirectMusicBandTrack,iface);
97 FIXME("(%p, %p): stub\n", This, pStateData);
99 return S_OK;
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);
108 return S_OK;
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);
117 return S_OK;
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);
126 return S_OK;
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");
146 return S_OK;
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));
159 return S_OK;
162 HRESULT WINAPI IDirectMusicBandTrack_RemoveNotificationType (LPDIRECTMUSICTRACK8 iface, REFGUID rguidNotificationType)
164 ICOM_THIS(IDirectMusicBandTrack,iface);
166 FIXME("(%p, %s): stub\n", This, debugstr_guid(rguidNotificationType));
168 return S_OK;
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);
177 return S_OK;
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);
187 return S_OK;
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);
196 return S_OK;
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);
205 return S_OK;
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);
214 return S_OK;
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);
223 return S_OK;
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));
257 if (NULL == track) {
258 *ppTrack = (LPDIRECTMUSICTRACK8) NULL;
259 return E_OUTOFMEMORY;
261 track->lpVtbl = &DirectMusicBandTrack_Vtbl;
262 track->ref = 1;
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;
268 return S_OK;
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);
287 *ppobj = This;
288 return S_OK;
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);
306 if (ref == 0) {
307 HeapFree(GetProcessHeap(), 0, This);
309 return ref;
312 /* IDirectMusicBandTrackStream IPersist part: */
313 HRESULT WINAPI IDirectMusicBandTrackStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID)
315 return E_NOTIMPL;
318 /* IDirectMusicBandTrackStream IPersistStream part: */
319 HRESULT WINAPI IDirectMusicBandTrackStream_IsDirty (LPPERSISTSTREAM iface)
321 return E_NOTIMPL;
324 HRESULT WINAPI IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface, IStream* pStm)
326 ICOM_THIS(IDirectMusicBandTrackStream,iface);
327 FOURCC chunkID;
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);
340 switch (chunkID) {
341 case FOURCC_RIFF: {
342 IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
343 TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(chunkID));
344 StreamSize = chunkSize - sizeof(FOURCC);
345 StreamCount = 0;
346 switch (chunkID) {
347 case DMUS_FOURCC_BANDTRACK_FORM: {
348 TRACE_(dmfile)(": band track form\n");
349 do {
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);
354 switch (chunkID) {
355 case DMUS_FOURCC_BANDTRACK_CHUNK: {
356 TRACE_(dmfile)(": band track header chunk\n");
357 IStream_Read (pStm, &pTrack->btkHeader, chunkSize, NULL);
358 break;
360 case DMUS_FOURCC_GUID_CHUNK: {
361 TRACE_(dmfile)(": GUID chunk\n");
362 IStream_Read (pStm, &pTrack->vVersion, chunkSize, NULL);
363 break;
365 case DMUS_FOURCC_VERSION_CHUNK: {
366 TRACE_(dmfile)(": version chunk\n");
367 IStream_Read (pStm, &pTrack->guidID, chunkSize, NULL);
368 break;
370 case FOURCC_LIST: {
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);
374 ListCount[0] = 0;
375 switch (chunkID) {
376 case DMUS_FOURCC_UNFO_LIST: {
377 TRACE_(dmfile)(": UNFO list\n");
378 do {
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);
383 switch (chunkID) {
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);
388 break;
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);
394 break;
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);
400 break;
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);
406 break;
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);
412 break;
414 default: {
415 TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
416 liMove.QuadPart = chunkSize;
417 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
418 break;
421 TRACE_(dmfile)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]);
422 } while (ListCount[0] < ListSize[0]);
423 break;
425 case DMUS_FOURCC_BANDS_LIST: {
426 TRACE_(dmfile)(": bands list\n");
427 do {
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);
432 switch (chunkID) {
433 case FOURCC_LIST: {
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);
437 ListCount[1] = 0;
438 switch (chunkID) {
439 case DMUS_FOURCC_BAND_LIST: {
440 TRACE_(dmfile)(": band list\n");
441 do {
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);
446 switch (chunkID) {
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);
454 break;
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;
463 break;
465 case FOURCC_RIFF: {
466 TRACE_(dmfile)(": RIFF chunk (probably band form)\n");
467 liMove.QuadPart = 0;
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;
476 /* now pray... */
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);
487 } else {
488 ERR("Could not get IDirectMusicGetLoader... reference will not be loaded :(\n");
489 /* E_FAIL */
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);
495 break;
497 default: {
498 TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
499 liMove.QuadPart = chunkSize;
500 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
501 break;
504 TRACE_(dmfile)(": ListCount[1] = %ld < ListSize[1] = %ld\n", ListCount[1], ListSize[1]);
505 } while (ListCount[1] < ListSize[1]);
506 break;
508 default: {
509 TRACE_(dmfile)(": unknown (skipping)\n");
510 liMove.QuadPart = chunkSize - sizeof(FOURCC);
511 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
512 break;
515 break;
517 default: {
518 TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
519 liMove.QuadPart = chunkSize;
520 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
521 break;
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 */
527 break;
529 default: {
530 TRACE_(dmfile)(": unknown (skipping)\n");
531 liMove.QuadPart = chunkSize - sizeof(FOURCC);
532 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
533 break;
536 break;
538 default: {
539 TRACE_(dmfile)(": unknown chunk (skipping)\n");
540 liMove.QuadPart = chunkSize;
541 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip this chunk */
542 break;
545 TRACE_(dmfile)(": StreamCount[0] = %ld < StreamSize[0] = %ld\n", StreamCount, StreamSize);
546 } while (StreamCount < StreamSize);
547 break;
549 default: {
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 */
553 return E_FAIL;
556 TRACE_(dmfile)(": reading finished\n");
557 break;
559 default: {
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 */
563 return E_FAIL;
567 return S_OK;
570 HRESULT WINAPI IDirectMusicBandTrackStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty)
572 return E_NOTIMPL;
575 HRESULT WINAPI IDirectMusicBandTrackStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize)
577 return E_NOTIMPL;
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