@@ -244,6 +244,41 @@ static HRESULT parse_lbil_list(struct band *This, IStream *stream, struct chunk_
244
244
return hr ;
245
245
}
246
246
247
+ static HRESULT parse_dmbd_chunk (struct band * This , IStream * stream , struct chunk_entry * parent )
248
+ {
249
+ struct chunk_entry chunk = {.parent = parent };
250
+ HRESULT hr ;
251
+
252
+ if (FAILED (hr = dmobj_parsedescriptor (stream , parent , & This -> dmobj .desc ,
253
+ DMUS_OBJ_OBJECT |DMUS_OBJ_NAME |DMUS_OBJ_NAME_INAM |DMUS_OBJ_CATEGORY |DMUS_OBJ_VERSION ))
254
+ || FAILED (hr = stream_reset_chunk_data (stream , parent )))
255
+ return hr ;
256
+
257
+ while ((hr = stream_next_chunk (stream , & chunk )) == S_OK )
258
+ {
259
+ switch (MAKE_IDTYPE (chunk .id , chunk .type ))
260
+ {
261
+ case DMUS_FOURCC_GUID_CHUNK :
262
+ case DMUS_FOURCC_VERSION_CHUNK :
263
+ case MAKE_IDTYPE (FOURCC_LIST , DMUS_FOURCC_UNFO_LIST ):
264
+ /* already parsed by dmobj_parsedescriptor */
265
+ break ;
266
+
267
+ case MAKE_IDTYPE (FOURCC_LIST , DMUS_FOURCC_INSTRUMENTS_LIST ):
268
+ hr = parse_lbil_list (This , stream , & chunk );
269
+ break ;
270
+
271
+ default :
272
+ FIXME ("Ignoring chunk %s %s\n" , debugstr_fourcc (chunk .id ), debugstr_fourcc (chunk .type ));
273
+ break ;
274
+ }
275
+
276
+ if (FAILED (hr )) break ;
277
+ }
278
+
279
+ return hr ;
280
+ }
281
+
247
282
static HRESULT WINAPI band_object_ParseDescriptor (IDirectMusicObject * iface ,
248
283
IStream * stream , DMUS_OBJECTDESC * desc )
249
284
{
@@ -293,103 +328,6 @@ static const IDirectMusicObjectVtbl band_object_vtbl =
293
328
band_object_ParseDescriptor ,
294
329
};
295
330
296
- static HRESULT parse_band_form (struct band * This , DMUS_PRIVATE_CHUNK * pChunk ,
297
- IStream * pStm )
298
- {
299
- HRESULT hr = E_FAIL ;
300
- DMUS_PRIVATE_CHUNK Chunk ;
301
- DWORD StreamSize , StreamCount , ListSize [3 ], ListCount [3 ];
302
- LARGE_INTEGER liMove ; /* used when skipping chunks */
303
-
304
- GUID tmp_guid ;
305
-
306
- if (pChunk -> fccID != DMUS_FOURCC_BAND_FORM ) {
307
- ERR_ (dmfile )(": %s chunk should be a BAND form\n" , debugstr_fourcc (pChunk -> fccID ));
308
- return E_FAIL ;
309
- }
310
-
311
- StreamSize = pChunk -> dwSize - sizeof (FOURCC );
312
- StreamCount = 0 ;
313
-
314
- do {
315
- IStream_Read (pStm , & Chunk , sizeof (FOURCC )+ sizeof (DWORD ), NULL );
316
- StreamCount += sizeof (FOURCC ) + sizeof (DWORD ) + Chunk .dwSize ;
317
- TRACE_ (dmfile )(": %s chunk (size = %ld)" , debugstr_fourcc (Chunk .fccID ), Chunk .dwSize );
318
-
319
- hr = IDirectMusicUtils_IPersistStream_ParseDescGeneric (& Chunk , pStm , & This -> dmobj .desc );
320
- if (FAILED (hr )) return hr ;
321
-
322
- if (hr == S_FALSE ) {
323
- switch (Chunk .fccID ) {
324
- case DMUS_FOURCC_GUID_CHUNK : {
325
- TRACE_ (dmfile )(": GUID\n" );
326
- IStream_Read (pStm , & tmp_guid , sizeof (GUID ), NULL );
327
- TRACE_ (dmfile )(" - guid: %s\n" , debugstr_dmguid (& tmp_guid ));
328
- break ;
329
- }
330
- case FOURCC_LIST : {
331
- IStream_Read (pStm , & Chunk .fccID , sizeof (FOURCC ), NULL );
332
- TRACE_ (dmfile )(": LIST chunk of type %s" , debugstr_fourcc (Chunk .fccID ));
333
- ListSize [0 ] = Chunk .dwSize - sizeof (FOURCC );
334
- ListCount [0 ] = 0 ;
335
- switch (Chunk .fccID ) {
336
- case DMUS_FOURCC_UNFO_LIST : {
337
- TRACE_ (dmfile )(": UNFO list\n" );
338
- do {
339
- IStream_Read (pStm , & Chunk , sizeof (FOURCC )+ sizeof (DWORD ), NULL );
340
- ListCount [0 ] += sizeof (FOURCC ) + sizeof (DWORD ) + Chunk .dwSize ;
341
- TRACE_ (dmfile )(": %s chunk (size = %ld)" , debugstr_fourcc (Chunk .fccID ), Chunk .dwSize );
342
-
343
- hr = IDirectMusicUtils_IPersistStream_ParseUNFOGeneric (& Chunk , pStm , & This -> dmobj .desc );
344
- if (FAILED (hr )) return hr ;
345
-
346
- if (hr == S_FALSE ) {
347
- switch (Chunk .fccID ) {
348
- default : {
349
- TRACE_ (dmfile )(": unknown chunk (irrelevant & skipping)\n" );
350
- liMove .QuadPart = Chunk .dwSize ;
351
- IStream_Seek (pStm , liMove , STREAM_SEEK_CUR , NULL );
352
- break ;
353
- }
354
- }
355
- }
356
- TRACE_ (dmfile )(": ListCount[0] = %ld < ListSize[0] = %ld\n" , ListCount [0 ], ListSize [0 ]);
357
- } while (ListCount [0 ] < ListSize [0 ]);
358
- break ;
359
- }
360
- case DMUS_FOURCC_INSTRUMENTS_LIST : {
361
- static const LARGE_INTEGER zero = {0 };
362
- struct chunk_entry chunk = {FOURCC_LIST , .size = Chunk .dwSize , .type = Chunk .fccID };
363
- TRACE_ (dmfile )(": INSTRUMENTS list\n" );
364
- IStream_Seek (pStm , zero , STREAM_SEEK_CUR , & chunk .offset );
365
- chunk .offset .QuadPart -= 12 ;
366
- hr = parse_lbil_list (This , pStm , & chunk );
367
- if (FAILED (hr )) return hr ;
368
- break ;
369
- }
370
- default : {
371
- TRACE_ (dmfile )(": unknown (skipping)\n" );
372
- liMove .QuadPart = Chunk .dwSize - sizeof (FOURCC );
373
- IStream_Seek (pStm , liMove , STREAM_SEEK_CUR , NULL );
374
- break ;
375
- }
376
- }
377
- break ;
378
- }
379
- default : {
380
- TRACE_ (dmfile )(": unknown chunk (irrelevant & skipping)\n" );
381
- liMove .QuadPart = Chunk .dwSize ;
382
- IStream_Seek (pStm , liMove , STREAM_SEEK_CUR , NULL );
383
- break ;
384
- }
385
- }
386
- }
387
- TRACE_ (dmfile )(": StreamCount[0] = %ld < StreamSize[0] = %ld\n" , StreamCount , StreamSize );
388
- } while (StreamCount < StreamSize );
389
-
390
- return S_OK ;
391
- }
392
-
393
331
static inline struct band * impl_from_IPersistStream (IPersistStream * iface )
394
332
{
395
333
return CONTAINING_RECORD (iface , struct band , dmobj .IPersistStream_iface );
@@ -412,8 +350,12 @@ static HRESULT WINAPI band_persist_stream_Load(IPersistStream *iface, IStream *p
412
350
TRACE_ (dmfile )(": %s chunk (size = %ld)" , debugstr_fourcc (Chunk .fccID ), Chunk .dwSize );
413
351
switch (Chunk .fccID ) {
414
352
case DMUS_FOURCC_BAND_FORM : {
353
+ static const LARGE_INTEGER zero = {0 };
354
+ struct chunk_entry chunk = {FOURCC_LIST , .size = Chunk .dwSize , .type = Chunk .fccID };
415
355
TRACE_ (dmfile )(": Band form\n" );
416
- hr = parse_band_form (This , & Chunk , pStm );
356
+ IStream_Seek (pStm , zero , STREAM_SEEK_CUR , & chunk .offset );
357
+ chunk .offset .QuadPart -= 12 ;
358
+ hr = parse_dmbd_chunk (This , pStm , & chunk );
417
359
if (FAILED (hr )) return hr ;
418
360
break ;
419
361
}
0 commit comments