Skip to content

Commit ba69ffe

Browse files
rbernonjulliard
authored andcommitted
dmband: Rewrite band lbil list parsing.
1 parent dfcb827 commit ba69ffe

File tree

1 file changed

+29
-59
lines changed

1 file changed

+29
-59
lines changed

dlls/dmband/band.c

+29-59
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,30 @@ static HRESULT parse_lbin_list(struct band *This, IStream *stream, struct chunk_
220220
return hr;
221221
}
222222

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+
223247
static HRESULT WINAPI band_object_ParseDescriptor(IDirectMusicObject *iface,
224248
IStream *stream, DMUS_OBJECTDESC *desc)
225249
{
@@ -269,64 +293,6 @@ static const IDirectMusicObjectVtbl band_object_vtbl =
269293
band_object_ParseDescriptor,
270294
};
271295

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-
330296
static HRESULT parse_band_form(struct band *This, DMUS_PRIVATE_CHUNK *pChunk,
331297
IStream *pStm)
332298
{
@@ -392,8 +358,12 @@ static HRESULT parse_band_form(struct band *This, DMUS_PRIVATE_CHUNK *pChunk,
392358
break;
393359
}
394360
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};
395363
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);
397367
if (FAILED(hr)) return hr;
398368
break;
399369
}

0 commit comments

Comments
 (0)