@@ -220,6 +220,30 @@ static HRESULT parse_lbin_list(struct band *This, IStream *stream, struct chunk_
220
220
return hr ;
221
221
}
222
222
223
+ static HRESULT parse_lbil_list (struct band * This , IStream * stream , struct chunk_entry * parent )
224
+ {
225
+ struct chunk_entry chunk = {.parent = parent };
226
+ HRESULT hr ;
227
+
228
+ while ((hr = stream_next_chunk (stream , & chunk )) == S_OK )
229
+ {
230
+ switch (MAKE_IDTYPE (chunk .id , chunk .type ))
231
+ {
232
+ case MAKE_IDTYPE (FOURCC_LIST , DMUS_FOURCC_INSTRUMENT_LIST ):
233
+ hr = parse_lbin_list (This , stream , & chunk );
234
+ break ;
235
+
236
+ default :
237
+ FIXME ("Ignoring chunk %s %s\n" , debugstr_fourcc (chunk .id ), debugstr_fourcc (chunk .type ));
238
+ break ;
239
+ }
240
+
241
+ if (FAILED (hr )) break ;
242
+ }
243
+
244
+ return hr ;
245
+ }
246
+
223
247
static HRESULT WINAPI band_object_ParseDescriptor (IDirectMusicObject * iface ,
224
248
IStream * stream , DMUS_OBJECTDESC * desc )
225
249
{
@@ -269,64 +293,6 @@ static const IDirectMusicObjectVtbl band_object_vtbl =
269
293
band_object_ParseDescriptor ,
270
294
};
271
295
272
- static HRESULT parse_instruments_list (struct band * This , DMUS_PRIVATE_CHUNK * pChunk ,
273
- IStream * pStm )
274
- {
275
- HRESULT hr ;
276
- DMUS_PRIVATE_CHUNK Chunk ;
277
- DWORD ListSize [3 ], ListCount [3 ];
278
- LARGE_INTEGER liMove ; /* used when skipping chunks */
279
-
280
- if (pChunk -> fccID != DMUS_FOURCC_INSTRUMENTS_LIST ) {
281
- ERR_ (dmfile )(": %s chunk should be an INSTRUMENTS list\n" , debugstr_fourcc (pChunk -> fccID ));
282
- return E_FAIL ;
283
- }
284
-
285
- ListSize [0 ] = pChunk -> dwSize - sizeof (FOURCC );
286
- ListCount [0 ] = 0 ;
287
-
288
- do {
289
- IStream_Read (pStm , & Chunk , sizeof (FOURCC )+ sizeof (DWORD ), NULL );
290
- ListCount [0 ] += sizeof (FOURCC ) + sizeof (DWORD ) + Chunk .dwSize ;
291
- TRACE_ (dmfile )(": %s chunk (size = %ld)" , debugstr_fourcc (Chunk .fccID ), Chunk .dwSize );
292
- switch (Chunk .fccID ) {
293
- case FOURCC_LIST : {
294
- IStream_Read (pStm , & Chunk .fccID , sizeof (FOURCC ), NULL );
295
- TRACE_ (dmfile )(": LIST chunk of type %s" , debugstr_fourcc (Chunk .fccID ));
296
- ListSize [1 ] = Chunk .dwSize - sizeof (FOURCC );
297
- ListCount [1 ] = 0 ;
298
- switch (Chunk .fccID ) {
299
- case DMUS_FOURCC_INSTRUMENT_LIST : {
300
- static const LARGE_INTEGER zero = {0 };
301
- struct chunk_entry chunk = {FOURCC_LIST , .size = Chunk .dwSize , .type = Chunk .fccID };
302
- TRACE_ (dmfile )(": Instrument list\n" );
303
- IStream_Seek (pStm , zero , STREAM_SEEK_CUR , & chunk .offset );
304
- chunk .offset .QuadPart -= 12 ;
305
- if (FAILED (hr = parse_lbin_list (This , pStm , & chunk ))) return hr ;
306
- break ;
307
- }
308
- default : {
309
- TRACE_ (dmfile )(": unknown chunk (irrelevant & skipping)\n" );
310
- liMove .QuadPart = ListSize [1 ];
311
- IStream_Seek (pStm , liMove , STREAM_SEEK_CUR , NULL );
312
- break ;
313
- }
314
- }
315
- break ;
316
- }
317
- default : {
318
- TRACE_ (dmfile )(": unknown chunk (irrelevant & skipping)\n" );
319
- liMove .QuadPart = Chunk .dwSize ;
320
- IStream_Seek (pStm , liMove , STREAM_SEEK_CUR , NULL );
321
- break ;
322
- }
323
- }
324
- TRACE_ (dmfile )(": ListCount[0] = %ld < ListSize[0] = %ld\n" , ListCount [0 ], ListSize [0 ]);
325
- } while (ListCount [0 ] < ListSize [0 ]);
326
-
327
- return S_OK ;
328
- }
329
-
330
296
static HRESULT parse_band_form (struct band * This , DMUS_PRIVATE_CHUNK * pChunk ,
331
297
IStream * pStm )
332
298
{
@@ -392,8 +358,12 @@ static HRESULT parse_band_form(struct band *This, DMUS_PRIVATE_CHUNK *pChunk,
392
358
break ;
393
359
}
394
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 };
395
363
TRACE_ (dmfile )(": INSTRUMENTS list\n" );
396
- hr = parse_instruments_list (This , & Chunk , pStm );
364
+ IStream_Seek (pStm , zero , STREAM_SEEK_CUR , & chunk .offset );
365
+ chunk .offset .QuadPart -= 12 ;
366
+ hr = parse_lbil_list (This , pStm , & chunk );
397
367
if (FAILED (hr )) return hr ;
398
368
break ;
399
369
}
0 commit comments