From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmusic/collection.c | 18 +++++++++++++----- dlls/dmusic/dmobject.c | 33 +++++++++++++++++++++++++++++++-- dlls/dmusic/dmobject.h | 2 +- 3 files changed, 45 insertions(+), 8 deletions(-)
diff --git a/dlls/dmusic/collection.c b/dlls/dmusic/collection.c index 3b3350780bc..a284bad0a81 100644 --- a/dlls/dmusic/collection.c +++ b/dlls/dmusic/collection.c @@ -320,15 +320,23 @@ static HRESULT WINAPI collection_stream_Load(IPersistStream *iface, break; } case FOURCC_DLID: { + struct chunk_entry info_chunk = {.id = chunk.fccID, .size = chunk.dwSize}; TRACE_(dmfile)(": DLID (GUID) chunk\n"); - This->dmobj.desc.dwValidData |= DMUS_OBJ_OBJECT; - IStream_Read(stream, &This->dmobj.desc.guidObject, chunk.dwSize, NULL); + liMove.QuadPart = 0; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, &info_chunk.offset); + info_chunk.offset.QuadPart -= 12; + stream_chunk_parse_desc(stream, &info_chunk, &This->dmobj.desc); + stream_skip_chunk(stream, &info_chunk); break; } case FOURCC_VERS: { + struct chunk_entry info_chunk = {.id = chunk.fccID, .size = chunk.dwSize}; TRACE_(dmfile)(": version chunk\n"); - This->dmobj.desc.dwValidData |= DMUS_OBJ_VERSION; - IStream_Read(stream, &This->dmobj.desc.vVersion, chunk.dwSize, NULL); + liMove.QuadPart = 0; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, &info_chunk.offset); + info_chunk.offset.QuadPart -= 12; + stream_chunk_parse_desc(stream, &info_chunk, &This->dmobj.desc); + stream_skip_chunk(stream, &info_chunk); break; } case FOURCC_PTBL: { @@ -351,7 +359,7 @@ static HRESULT WINAPI collection_stream_Load(IPersistStream *iface, liMove.QuadPart = 0; IStream_Seek(stream, liMove, STREAM_SEEK_CUR, &info_chunk.offset); info_chunk.offset.QuadPart -= 12; - stream_chunk_parse_info_list(stream, &info_chunk, &This->dmobj.desc); + stream_chunk_parse_desc(stream, &info_chunk, &This->dmobj.desc); stream_skip_chunk(stream, &info_chunk); break; } diff --git a/dlls/dmusic/dmobject.c b/dlls/dmusic/dmobject.c index 5bf856e2a04..cac54cfaa33 100644 --- a/dlls/dmusic/dmobject.c +++ b/dlls/dmusic/dmobject.c @@ -528,7 +528,7 @@ HRESULT WINAPI dmobj_IDirectMusicObject_SetDescriptor(IDirectMusicObject *iface, return ret; }
-HRESULT stream_chunk_parse_info_list(IStream *stream, const struct chunk_entry *parent, DMUS_OBJECTDESC *desc) +static HRESULT parse_info_list(IStream *stream, const struct chunk_entry *parent, DMUS_OBJECTDESC *desc) { struct chunk_entry chunk = {.parent = parent}; char *buffer; @@ -579,6 +579,35 @@ static inline void unfo_get_name(IStream *stream, const struct chunk_entry *unfo desc->dwValidData |= DMUS_OBJ_NAME; }
+HRESULT stream_chunk_parse_desc(IStream *stream, const struct chunk_entry *chunk, DMUS_OBJECTDESC *desc) +{ + HRESULT hr; + + switch (MAKE_IDTYPE(chunk->id, chunk->type)) + { + case FOURCC_DLID: + if (desc->dwValidData & DMUS_OBJ_OBJECT) return S_OK; + hr = stream_chunk_get_data(stream, chunk, &desc->guidObject, sizeof(desc->guidObject)); + if (hr == S_OK) desc->dwValidData |= DMUS_OBJ_OBJECT; + return hr; + + case FOURCC_VERS: + if (desc->dwValidData & DMUS_OBJ_VERSION) return S_OK; + hr = stream_chunk_get_data(stream, chunk, &desc->vVersion, sizeof(desc->vVersion)); + if (hr == S_OK) desc->dwValidData |= DMUS_OBJ_VERSION; + return hr; + + case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_INFO_LIST): + return parse_info_list(stream, chunk, desc); + + default: + FIXME("Unsupported chunk %s %s\n", debugstr_fourcc(chunk->id), debugstr_fourcc(chunk->type)); + break; + } + + return E_NOTIMPL; +} + HRESULT dmobj_parsedescriptor(IStream *stream, const struct chunk_entry *riff, DMUS_OBJECTDESC *desc, DWORD supported) { @@ -626,7 +655,7 @@ HRESULT dmobj_parsedescriptor(IStream *stream, const struct chunk_entry *riff, if (chunk.type == DMUS_FOURCC_UNFO_LIST && (supported & DMUS_OBJ_NAME)) unfo_get_name(stream, &chunk, desc, supported & DMUS_OBJ_NAME_INAM); else if (chunk.type == DMUS_FOURCC_INFO_LIST && (supported & DMUS_OBJ_NAME_INFO)) - stream_chunk_parse_info_list(stream, &chunk, desc); + parse_info_list(stream, &chunk, desc); break; } } diff --git a/dlls/dmusic/dmobject.h b/dlls/dmusic/dmobject.h index 8aed294c43c..ecd9d5401fb 100644 --- a/dlls/dmusic/dmobject.h +++ b/dlls/dmusic/dmobject.h @@ -44,7 +44,7 @@ HRESULT stream_chunk_get_data(IStream *stream, const struct chunk_entry *chunk, HRESULT stream_chunk_get_wstr(IStream *stream, const struct chunk_entry *chunk, WCHAR *str, ULONG size);
-HRESULT stream_chunk_parse_info_list(IStream *stream, const struct chunk_entry *parent, DMUS_OBJECTDESC *desc); +extern HRESULT stream_chunk_parse_desc(IStream *stream, const struct chunk_entry *chunk, DMUS_OBJECTDESC *desc);
static inline HRESULT stream_reset_chunk_data(IStream *stream, const struct chunk_entry *chunk) {