From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmstyle/style.c | 65 ++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 35 deletions(-)
diff --git a/dlls/dmstyle/style.c b/dlls/dmstyle/style.c index 6d4cf2e3b07..bac5a2ba839 100644 --- a/dlls/dmstyle/style.c +++ b/dlls/dmstyle/style.c @@ -63,8 +63,7 @@ static inline IDirectMusicStyle8Impl *impl_from_IDirectMusicStyle8(IDirectMusicS return CONTAINING_RECORD(iface, IDirectMusicStyle8Impl, IDirectMusicStyle8_iface); }
-/* DirectMusicStyle8Impl IDirectMusicStyle8 part: */ -static HRESULT WINAPI IDirectMusicStyle8Impl_QueryInterface(IDirectMusicStyle8 *iface, REFIID riid, +static HRESULT WINAPI style_QueryInterface(IDirectMusicStyle8 *iface, REFIID riid, void **ret_iface) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -89,7 +88,7 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_QueryInterface(IDirectMusicStyle8 * return S_OK; }
-static ULONG WINAPI IDirectMusicStyle8Impl_AddRef(IDirectMusicStyle8 *iface) +static ULONG WINAPI style_AddRef(IDirectMusicStyle8 *iface) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); LONG ref = InterlockedIncrement(&This->ref); @@ -99,7 +98,7 @@ static ULONG WINAPI IDirectMusicStyle8Impl_AddRef(IDirectMusicStyle8 *iface) return ref; }
-static ULONG WINAPI IDirectMusicStyle8Impl_Release(IDirectMusicStyle8 *iface) +static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); LONG ref = InterlockedDecrement(&This->ref); @@ -131,8 +130,7 @@ static ULONG WINAPI IDirectMusicStyle8Impl_Release(IDirectMusicStyle8 *iface) return ref; }
-/* IDirectMusicStyle8Impl IDirectMusicStyle(8) part: */ -static HRESULT WINAPI IDirectMusicStyle8Impl_GetBand(IDirectMusicStyle8 *iface, WCHAR *name, +static HRESULT WINAPI style_GetBand(IDirectMusicStyle8 *iface, WCHAR *name, IDirectMusicBand **band) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -167,7 +165,7 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_GetBand(IDirectMusicStyle8 *iface, return S_FALSE; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_EnumBand(IDirectMusicStyle8 *iface, DWORD dwIndex, +static HRESULT WINAPI style_EnumBand(IDirectMusicStyle8 *iface, DWORD dwIndex, WCHAR *pwszName) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -175,7 +173,7 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_EnumBand(IDirectMusicStyle8 *iface, return S_OK; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_GetDefaultBand(IDirectMusicStyle8 *iface, +static HRESULT WINAPI style_GetDefaultBand(IDirectMusicStyle8 *iface, IDirectMusicBand **band) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -189,7 +187,7 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_GetDefaultBand(IDirectMusicStyle8 * return S_FALSE; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_EnumMotif(IDirectMusicStyle8 *iface, DWORD index, +static HRESULT WINAPI style_EnumMotif(IDirectMusicStyle8 *iface, DWORD index, WCHAR *name) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -222,7 +220,7 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_EnumMotif(IDirectMusicStyle8 *iface return S_OK; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_GetMotif(IDirectMusicStyle8 *iface, WCHAR *pwszName, +static HRESULT WINAPI style_GetMotif(IDirectMusicStyle8 *iface, WCHAR *pwszName, IDirectMusicSegment **ppSegment) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -230,7 +228,7 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_GetMotif(IDirectMusicStyle8 *iface, return S_FALSE; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_GetDefaultChordMap(IDirectMusicStyle8 *iface, +static HRESULT WINAPI style_GetDefaultChordMap(IDirectMusicStyle8 *iface, IDirectMusicChordMap **ppChordMap) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -238,7 +236,7 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_GetDefaultChordMap(IDirectMusicStyl return S_OK; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_EnumChordMap(IDirectMusicStyle8 *iface, DWORD dwIndex, +static HRESULT WINAPI style_EnumChordMap(IDirectMusicStyle8 *iface, DWORD dwIndex, WCHAR *pwszName) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -246,7 +244,7 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_EnumChordMap(IDirectMusicStyle8 *if return S_OK; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_GetChordMap(IDirectMusicStyle8 *iface, WCHAR *pwszName, +static HRESULT WINAPI style_GetChordMap(IDirectMusicStyle8 *iface, WCHAR *pwszName, IDirectMusicChordMap **ppChordMap) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -254,7 +252,7 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_GetChordMap(IDirectMusicStyle8 *ifa return S_OK; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_GetTimeSignature(IDirectMusicStyle8 *iface, +static HRESULT WINAPI style_GetTimeSignature(IDirectMusicStyle8 *iface, DMUS_TIMESIGNATURE *pTimeSig) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -262,7 +260,7 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_GetTimeSignature(IDirectMusicStyle8 return S_OK; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_GetEmbellishmentLength(IDirectMusicStyle8 *iface, +static HRESULT WINAPI style_GetEmbellishmentLength(IDirectMusicStyle8 *iface, DWORD dwType, DWORD dwLevel, DWORD *pdwMin, DWORD *pdwMax) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -270,14 +268,14 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_GetEmbellishmentLength(IDirectMusic return S_OK; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_GetTempo(IDirectMusicStyle8 *iface, double *pTempo) +static HRESULT WINAPI style_GetTempo(IDirectMusicStyle8 *iface, double *pTempo) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); FIXME("(%p, %p): stub\n", This, pTempo); return S_OK; }
-static HRESULT WINAPI IDirectMusicStyle8Impl_EnumPattern(IDirectMusicStyle8 *iface, DWORD dwIndex, +static HRESULT WINAPI style_EnumPattern(IDirectMusicStyle8 *iface, DWORD dwIndex, DWORD dwPatternType, WCHAR *pwszName) { IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); @@ -286,24 +284,23 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_EnumPattern(IDirectMusicStyle8 *ifa }
static const IDirectMusicStyle8Vtbl dmstyle8_vtbl = { - IDirectMusicStyle8Impl_QueryInterface, - IDirectMusicStyle8Impl_AddRef, - IDirectMusicStyle8Impl_Release, - IDirectMusicStyle8Impl_GetBand, - IDirectMusicStyle8Impl_EnumBand, - IDirectMusicStyle8Impl_GetDefaultBand, - IDirectMusicStyle8Impl_EnumMotif, - IDirectMusicStyle8Impl_GetMotif, - IDirectMusicStyle8Impl_GetDefaultChordMap, - IDirectMusicStyle8Impl_EnumChordMap, - IDirectMusicStyle8Impl_GetChordMap, - IDirectMusicStyle8Impl_GetTimeSignature, - IDirectMusicStyle8Impl_GetEmbellishmentLength, - IDirectMusicStyle8Impl_GetTempo, - IDirectMusicStyle8Impl_EnumPattern + style_QueryInterface, + style_AddRef, + style_Release, + style_GetBand, + style_EnumBand, + style_GetDefaultBand, + style_EnumMotif, + style_GetMotif, + style_GetDefaultChordMap, + style_EnumChordMap, + style_GetChordMap, + style_GetTimeSignature, + style_GetEmbellishmentLength, + style_GetTempo, + style_EnumPattern };
-/* IDirectMusicStyle8Impl IDirectMusicObject part: */ static HRESULT WINAPI style_IDirectMusicObject_ParseDescriptor(IDirectMusicObject *iface, IStream *stream, DMUS_OBJECTDESC *desc) { @@ -344,7 +341,6 @@ static const IDirectMusicObjectVtbl dmobject_vtbl = { style_IDirectMusicObject_ParseDescriptor };
-/* IDirectMusicStyle8Impl IPersistStream part: */ static inline IDirectMusicStyle8Impl *impl_from_IPersistStream(IPersistStream *iface) { return CONTAINING_RECORD(iface, IDirectMusicStyle8Impl, dmobj.IPersistStream_iface); @@ -958,7 +954,6 @@ static const IPersistStreamVtbl persiststream_vtbl = { unimpl_IPersistStream_GetSizeMax };
-/* for ClassFactory */ HRESULT create_dmstyle(REFIID lpcGUID, void **ppobj) { IDirectMusicStyle8Impl* obj;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmstyle/style.c | 121 +++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 63 deletions(-)
diff --git a/dlls/dmstyle/style.c b/dlls/dmstyle/style.c index bac5a2ba839..e95f91e41c4 100644 --- a/dlls/dmstyle/style.c +++ b/dlls/dmstyle/style.c @@ -1,5 +1,4 @@ -/* IDirectMusicStyle8 Implementation - * +/* * Copyright (C) 2003-2004 Rok Mandeljc * Copyright (C) 2003-2004 Raphael Junqueira * @@ -46,27 +45,25 @@ struct style_motif { struct list Items; };
-/***************************************************************************** - * IDirectMusicStyleImpl implementation - */ -typedef struct IDirectMusicStyle8Impl { +struct style +{ IDirectMusicStyle8 IDirectMusicStyle8_iface; struct dmobject dmobj; LONG ref; DMUS_IO_STYLE style; struct list motifs; struct list bands; -} IDirectMusicStyle8Impl; +};
-static inline IDirectMusicStyle8Impl *impl_from_IDirectMusicStyle8(IDirectMusicStyle8 *iface) +static inline struct style *impl_from_IDirectMusicStyle8(IDirectMusicStyle8 *iface) { - return CONTAINING_RECORD(iface, IDirectMusicStyle8Impl, IDirectMusicStyle8_iface); + return CONTAINING_RECORD(iface, struct style, IDirectMusicStyle8_iface); }
static HRESULT WINAPI style_QueryInterface(IDirectMusicStyle8 *iface, REFIID riid, void **ret_iface) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); + struct style *This = impl_from_IDirectMusicStyle8(iface);
TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
@@ -90,7 +87,7 @@ static HRESULT WINAPI style_QueryInterface(IDirectMusicStyle8 *iface, REFIID rii
static ULONG WINAPI style_AddRef(IDirectMusicStyle8 *iface) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); + struct style *This = impl_from_IDirectMusicStyle8(iface); LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref); @@ -100,7 +97,7 @@ static ULONG WINAPI style_AddRef(IDirectMusicStyle8 *iface)
static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); + struct style *This = impl_from_IDirectMusicStyle8(iface); LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref); @@ -133,7 +130,7 @@ static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface) static HRESULT WINAPI style_GetBand(IDirectMusicStyle8 *iface, WCHAR *name, IDirectMusicBand **band) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); + struct style *This = impl_from_IDirectMusicStyle8(iface); struct style_band *sband; HRESULT hr;
@@ -168,15 +165,15 @@ static HRESULT WINAPI style_GetBand(IDirectMusicStyle8 *iface, WCHAR *name, static HRESULT WINAPI style_EnumBand(IDirectMusicStyle8 *iface, DWORD dwIndex, WCHAR *pwszName) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); - FIXME("(%p, %ld, %p): stub\n", This, dwIndex, pwszName); - return S_OK; + struct style *This = impl_from_IDirectMusicStyle8(iface); + FIXME("(%p, %ld, %p): stub\n", This, dwIndex, pwszName); + return S_OK; }
static HRESULT WINAPI style_GetDefaultBand(IDirectMusicStyle8 *iface, IDirectMusicBand **band) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); + struct style *This = impl_from_IDirectMusicStyle8(iface); FIXME("(%p, %p): stub\n", This, band);
if (!band) @@ -190,7 +187,7 @@ static HRESULT WINAPI style_GetDefaultBand(IDirectMusicStyle8 *iface, static HRESULT WINAPI style_EnumMotif(IDirectMusicStyle8 *iface, DWORD index, WCHAR *name) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); + struct style *This = impl_from_IDirectMusicStyle8(iface); const struct style_motif *motif = NULL; const struct list *cursor; unsigned int i = 0; @@ -223,64 +220,64 @@ static HRESULT WINAPI style_EnumMotif(IDirectMusicStyle8 *iface, DWORD index, static HRESULT WINAPI style_GetMotif(IDirectMusicStyle8 *iface, WCHAR *pwszName, IDirectMusicSegment **ppSegment) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); - FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszName), ppSegment); - return S_FALSE; + struct style *This = impl_from_IDirectMusicStyle8(iface); + FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszName), ppSegment); + return S_FALSE; }
static HRESULT WINAPI style_GetDefaultChordMap(IDirectMusicStyle8 *iface, IDirectMusicChordMap **ppChordMap) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); - FIXME("(%p, %p): stub\n", This, ppChordMap); - return S_OK; + struct style *This = impl_from_IDirectMusicStyle8(iface); + FIXME("(%p, %p): stub\n", This, ppChordMap); + return S_OK; }
static HRESULT WINAPI style_EnumChordMap(IDirectMusicStyle8 *iface, DWORD dwIndex, WCHAR *pwszName) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); - FIXME("(%p, %ld, %p): stub\n", This, dwIndex, pwszName); - return S_OK; + struct style *This = impl_from_IDirectMusicStyle8(iface); + FIXME("(%p, %ld, %p): stub\n", This, dwIndex, pwszName); + return S_OK; }
static HRESULT WINAPI style_GetChordMap(IDirectMusicStyle8 *iface, WCHAR *pwszName, IDirectMusicChordMap **ppChordMap) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); - FIXME("(%p, %p, %p): stub\n", This, pwszName, ppChordMap); - return S_OK; + struct style *This = impl_from_IDirectMusicStyle8(iface); + FIXME("(%p, %p, %p): stub\n", This, pwszName, ppChordMap); + return S_OK; }
static HRESULT WINAPI style_GetTimeSignature(IDirectMusicStyle8 *iface, DMUS_TIMESIGNATURE *pTimeSig) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); - FIXME("(%p, %p): stub\n", This, pTimeSig); - return S_OK; + struct style *This = impl_from_IDirectMusicStyle8(iface); + FIXME("(%p, %p): stub\n", This, pTimeSig); + return S_OK; }
static HRESULT WINAPI style_GetEmbellishmentLength(IDirectMusicStyle8 *iface, DWORD dwType, DWORD dwLevel, DWORD *pdwMin, DWORD *pdwMax) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); - FIXME("(%p, %ld, %ld, %p, %p): stub\n", This, dwType, dwLevel, pdwMin, pdwMax); - return S_OK; + struct style *This = impl_from_IDirectMusicStyle8(iface); + FIXME("(%p, %ld, %ld, %p, %p): stub\n", This, dwType, dwLevel, pdwMin, pdwMax); + return S_OK; }
static HRESULT WINAPI style_GetTempo(IDirectMusicStyle8 *iface, double *pTempo) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); - FIXME("(%p, %p): stub\n", This, pTempo); - return S_OK; + struct style *This = impl_from_IDirectMusicStyle8(iface); + FIXME("(%p, %p): stub\n", This, pTempo); + return S_OK; }
static HRESULT WINAPI style_EnumPattern(IDirectMusicStyle8 *iface, DWORD dwIndex, DWORD dwPatternType, WCHAR *pwszName) { - IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface); - FIXME("(%p, %ld, %ld, %p): stub\n", This, dwIndex, dwPatternType, pwszName); - return S_OK; + struct style *This = impl_from_IDirectMusicStyle8(iface); + FIXME("(%p, %ld, %ld, %p): stub\n", This, dwIndex, dwPatternType, pwszName); + return S_OK; }
static const IDirectMusicStyle8Vtbl dmstyle8_vtbl = { @@ -341,9 +338,9 @@ static const IDirectMusicObjectVtbl dmobject_vtbl = { style_IDirectMusicObject_ParseDescriptor };
-static inline IDirectMusicStyle8Impl *impl_from_IPersistStream(IPersistStream *iface) +static inline struct style *impl_from_IPersistStream(IPersistStream *iface) { - return CONTAINING_RECORD(iface, IDirectMusicStyle8Impl, dmobj.IPersistStream_iface); + return CONTAINING_RECORD(iface, struct style, dmobj.IPersistStream_iface); }
static HRESULT load_band(IStream *pClonedStream, IDirectMusicBand **ppBand) @@ -595,8 +592,7 @@ static HRESULT parse_part_list(DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) return S_OK; }
-static HRESULT parse_pattern_list(IDirectMusicStyle8Impl *This, DMUS_PRIVATE_CHUNK *pChunk, - IStream *pStm) +static HRESULT parse_pattern_list(struct style *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) { HRESULT hr = E_FAIL; DMUS_PRIVATE_CHUNK Chunk; @@ -752,8 +748,7 @@ static HRESULT parse_pattern_list(IDirectMusicStyle8Impl *This, DMUS_PRIVATE_CHU return S_OK; }
-static HRESULT parse_style_form(IDirectMusicStyle8Impl *This, DMUS_PRIVATE_CHUNK *pChunk, - IStream *pStm) +static HRESULT parse_style_form(struct style *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) { HRESULT hr = E_FAIL; DMUS_PRIVATE_CHUNK Chunk; @@ -902,7 +897,7 @@ static HRESULT parse_style_form(IDirectMusicStyle8Impl *This, DMUS_PRIVATE_CHUNK
static HRESULT WINAPI IPersistStreamImpl_Load(IPersistStream *iface, IStream *pStm) { - IDirectMusicStyle8Impl *This = impl_from_IPersistStream(iface); + struct style *This = impl_from_IPersistStream(iface); DMUS_PRIVATE_CHUNK Chunk; LARGE_INTEGER liMove; /* used when skipping chunks */ HRESULT hr; @@ -956,21 +951,21 @@ static const IPersistStreamVtbl persiststream_vtbl = {
HRESULT create_dmstyle(REFIID lpcGUID, void **ppobj) { - IDirectMusicStyle8Impl* obj; - HRESULT hr; + struct style *obj; + HRESULT hr;
- *ppobj = NULL; - if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY; - obj->IDirectMusicStyle8_iface.lpVtbl = &dmstyle8_vtbl; - obj->ref = 1; - dmobject_init(&obj->dmobj, &CLSID_DirectMusicStyle, (IUnknown *)&obj->IDirectMusicStyle8_iface); - obj->dmobj.IDirectMusicObject_iface.lpVtbl = &dmobject_vtbl; - obj->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl; - list_init(&obj->bands); - list_init(&obj->motifs); + *ppobj = NULL; + if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY; + obj->IDirectMusicStyle8_iface.lpVtbl = &dmstyle8_vtbl; + obj->ref = 1; + dmobject_init(&obj->dmobj, &CLSID_DirectMusicStyle, (IUnknown *)&obj->IDirectMusicStyle8_iface); + obj->dmobj.IDirectMusicObject_iface.lpVtbl = &dmobject_vtbl; + obj->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl; + list_init(&obj->bands); + list_init(&obj->motifs);
- hr = IDirectMusicStyle8_QueryInterface(&obj->IDirectMusicStyle8_iface, lpcGUID, ppobj); - IDirectMusicStyle8_Release(&obj->IDirectMusicStyle8_iface); + hr = IDirectMusicStyle8_QueryInterface(&obj->IDirectMusicStyle8_iface, lpcGUID, ppobj); + IDirectMusicStyle8_Release(&obj->IDirectMusicStyle8_iface);
- return hr; + return hr; }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmstyle/style.c | 223 +++++++++++++++++++------------------------ 1 file changed, 99 insertions(+), 124 deletions(-)
diff --git a/dlls/dmstyle/style.c b/dlls/dmstyle/style.c index e95f91e41c4..f277499cbc5 100644 --- a/dlls/dmstyle/style.c +++ b/dlls/dmstyle/style.c @@ -34,6 +34,33 @@ struct style_partref_item { DMUS_IO_PARTREF part_ref; };
+struct style_part +{ + struct list entry; + DMUS_OBJECTDESC desc; + DMUS_IO_STYLEPART header; + DMUS_IO_STYLENOTE *notes; + UINT notes_count; + DMUS_IO_STYLECURVE *curves; + UINT curves_count; + DMUS_IO_STYLEMARKER *markers; + UINT markers_count; + DMUS_IO_STYLERESOLUTION *resolutions; + UINT resolutions_count; + DMUS_IO_STYLE_ANTICIPATION *anticipations; + UINT anticipations_count; +}; + +static void style_part_destroy(struct style_part *part) +{ + free(part->notes); + free(part->curves); + free(part->markers); + free(part->resolutions); + free(part->anticipations); + free(part); +} + struct style_motif { struct list entry; DWORD dwRhythm; @@ -53,6 +80,7 @@ struct style DMUS_IO_STYLE style; struct list motifs; struct list bands; + struct list parts; };
static inline struct style *impl_from_IDirectMusicStyle8(IDirectMusicStyle8 *iface) @@ -106,6 +134,8 @@ static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface) struct style_band *band, *band2; struct style_motif *motif, *motif2; struct style_partref_item *item, *item2; + struct style_part *part; + void *next;
LIST_FOR_EACH_ENTRY_SAFE(band, band2, &This->bands, struct style_band, entry) { list_remove(&band->entry); @@ -121,6 +151,13 @@ static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface) } free(motif); } + + LIST_FOR_EACH_ENTRY_SAFE(part, next, &This->parts, struct style_part, entry) + { + list_remove(&part->entry); + style_part_destroy(part); + } + free(This); }
@@ -460,136 +497,69 @@ static HRESULT parse_part_ref_list(DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm, return S_OK; }
-static HRESULT parse_part_list(DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) +static HRESULT parse_part_list(struct style *This, IStream *stream, struct chunk_entry *parent) { - HRESULT hr = E_FAIL; - DMUS_PRIVATE_CHUNK Chunk; - DWORD ListSize[3], ListCount[3]; - LARGE_INTEGER liMove; /* used when skipping chunks */ + struct chunk_entry chunk = {.parent = parent}; + struct style_part *part; + DMUS_OBJECTDESC desc; + HRESULT hr;
- DMUS_OBJECTDESC desc; - DWORD dwSize = 0; - DWORD cnt = 0; + if (FAILED(hr = dmobj_parsedescriptor(stream, parent, &desc, DMUS_OBJ_NAME)) + || FAILED(hr = stream_reset_chunk_data(stream, parent))) + return hr;
- if (pChunk->fccID != DMUS_FOURCC_PART_LIST) { - ERR_(dmfile)(": %s chunk should be a PART list\n", debugstr_fourcc (pChunk->fccID)); - return E_FAIL; - } + if (!(part = calloc(1, sizeof(*part)))) return E_OUTOFMEMORY; + part->desc = desc;
- ListSize[0] = pChunk->dwSize - sizeof(FOURCC); - ListCount[0] = 0; + while ((hr = stream_next_chunk(stream, &chunk)) == S_OK) + { + switch (MAKE_IDTYPE(chunk.id, chunk.type)) + { + case DMUS_FOURCC_PART_CHUNK: + hr = stream_chunk_get_data(stream, &chunk, &part->header, sizeof(part->header)); + break;
- do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case DMUS_FOURCC_PART_CHUNK: { - TRACE_(dmfile)(": Part chunk (skipping for now)\n" ); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case DMUS_FOURCC_NOTE_CHUNK: { - TRACE_(dmfile)(": Note chunk (skipping for now)\n"); - IStream_Read (pStm, &dwSize, sizeof(DWORD), NULL); - cnt = (Chunk.dwSize - sizeof(DWORD)); - TRACE_(dmfile)(" - dwSize: %lu\n", dwSize); - TRACE_(dmfile)(" - cnt: %lu (%lu / %lu)\n", cnt / dwSize, cnt, dwSize); - if (cnt % dwSize != 0) { - ERR("Invalid Array Size\n"); - return E_FAIL; - } - cnt /= dwSize; - /** skip for now */ - liMove.QuadPart = cnt * dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case DMUS_FOURCC_CURVE_CHUNK: { - TRACE_(dmfile)(": Curve chunk (skipping for now)\n"); - IStream_Read (pStm, &dwSize, sizeof(DWORD), NULL); - cnt = (Chunk.dwSize - sizeof(DWORD)); - TRACE_(dmfile)(" - dwSize: %lu\n", dwSize); - TRACE_(dmfile)(" - cnt: %lu (%lu / %lu)\n", cnt / dwSize, cnt, dwSize); - if (cnt % dwSize != 0) { - ERR("Invalid Array Size\n"); - return E_FAIL; - } - cnt /= dwSize; - /** skip for now */ - liMove.QuadPart = cnt * dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case DMUS_FOURCC_MARKER_CHUNK: { - TRACE_(dmfile)(": Marker chunk (skipping for now)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case DMUS_FOURCC_RESOLUTION_CHUNK: { - TRACE_(dmfile)(": Resolution chunk (skipping for now)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case DMUS_FOURCC_ANTICIPATION_CHUNK: { - TRACE_(dmfile)(": Anticipation chunk (skipping for now)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case FOURCC_LIST: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[1] = Chunk.dwSize - sizeof(FOURCC); - ListCount[1] = 0; - switch (Chunk.fccID) { - case DMUS_FOURCC_UNFO_LIST: { - TRACE_(dmfile)(": UNFO list\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - - hr = IDirectMusicUtils_IPersistStream_ParseUNFOGeneric(&Chunk, pStm, &desc); - if (FAILED(hr)) return hr; - - if (hr == S_FALSE) { - switch (Chunk.fccID) { - default: { - TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - } - TRACE_(dmfile)(": ListCount[1] = %ld < ListSize[1] = %ld\n", ListCount[1], ListSize[1]); - } while (ListCount[1] < ListSize[1]); - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } + case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_UNFO_LIST): + /* already parsed by dmobj_parsedescriptor */ + break; + + case DMUS_FOURCC_NOTE_CHUNK: + hr = stream_chunk_get_array(stream, &chunk, (void **)&part->notes, + &part->notes_count, sizeof(*part->notes)); + break; + + case DMUS_FOURCC_CURVE_CHUNK: + hr = stream_chunk_get_array(stream, &chunk, (void **)&part->curves, + &part->curves_count, sizeof(*part->curves)); + break; + + case DMUS_FOURCC_MARKER_CHUNK: + hr = stream_chunk_get_array(stream, &chunk, (void **)&part->markers, + &part->markers_count, sizeof(*part->markers)); + break; + + case DMUS_FOURCC_RESOLUTION_CHUNK: + hr = stream_chunk_get_array(stream, &chunk, (void **)&part->resolutions, + &part->resolutions_count, sizeof(*part->resolutions)); + break; + + case DMUS_FOURCC_ANTICIPATION_CHUNK: + hr = stream_chunk_get_array(stream, &chunk, (void **)&part->anticipations, + &part->anticipations_count, sizeof(*part->anticipations)); + break; + + default: + FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type)); + break; + } + + if (FAILED(hr)) break; } - TRACE_(dmfile)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]); - } while (ListCount[0] < ListSize[0]);
- return S_OK; + if (FAILED(hr)) style_part_destroy(part); + else list_add_tail(&This->parts, &part->entry); + + return hr; }
static HRESULT parse_pattern_list(struct style *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) @@ -861,8 +831,12 @@ static HRESULT parse_style_form(struct style *This, DMUS_PRIVATE_CHUNK *pChunk, break; } case DMUS_FOURCC_PART_LIST: { + static const LARGE_INTEGER zero = {0}; + struct chunk_entry chunk = {FOURCC_LIST, .size = Chunk.dwSize, .type = Chunk.fccID}; TRACE_(dmfile)(": PART list\n"); - hr = parse_part_list(&Chunk, pStm); + IStream_Seek(pStm, zero, STREAM_SEEK_CUR, &chunk.offset); + chunk.offset.QuadPart -= 12; + hr = parse_part_list(This, pStm, &chunk); if (FAILED(hr)) return hr; break; } @@ -961,6 +935,7 @@ HRESULT create_dmstyle(REFIID lpcGUID, void **ppobj) dmobject_init(&obj->dmobj, &CLSID_DirectMusicStyle, (IUnknown *)&obj->IDirectMusicStyle8_iface); obj->dmobj.IDirectMusicObject_iface.lpVtbl = &dmobject_vtbl; obj->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl; + list_init(&obj->parts); list_init(&obj->bands); list_init(&obj->motifs);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmstyle/style.c | 135 +++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 88 deletions(-)
diff --git a/dlls/dmstyle/style.c b/dlls/dmstyle/style.c index f277499cbc5..9080d73f943 100644 --- a/dlls/dmstyle/style.c +++ b/dlls/dmstyle/style.c @@ -28,10 +28,11 @@ struct style_band { IDirectMusicBand *pBand; };
-struct style_partref_item { +struct style_part_ref +{ struct list entry; DMUS_OBJECTDESC desc; - DMUS_IO_PARTREF part_ref; + DMUS_IO_PARTREF header; };
struct style_part @@ -69,7 +70,7 @@ struct style_motif { /** optional for motifs */ DMUS_IO_MOTIFSETTINGS settings; IDirectMusicBand *pBand; - struct list Items; + struct list part_refs; };
struct style @@ -133,7 +134,7 @@ static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface) if (!ref) { struct style_band *band, *band2; struct style_motif *motif, *motif2; - struct style_partref_item *item, *item2; + struct style_part_ref *part_ref; struct style_part *part; void *next;
@@ -145,9 +146,10 @@ static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface) } LIST_FOR_EACH_ENTRY_SAFE(motif, motif2, &This->motifs, struct style_motif, entry) { list_remove(&motif->entry); - LIST_FOR_EACH_ENTRY_SAFE(item, item2, &motif->Items, struct style_partref_item, entry) { - list_remove(&item->entry); - free(item); + LIST_FOR_EACH_ENTRY_SAFE(part_ref, next, &motif->part_refs, struct style_part_ref, entry) + { + list_remove(&part_ref->entry); + free(part_ref); } free(motif); } @@ -409,92 +411,45 @@ static HRESULT load_band(IStream *pClonedStream, IDirectMusicBand **ppBand) return S_OK; }
-static HRESULT parse_part_ref_list(DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm, - struct style_motif *pNewMotif) +static HRESULT parse_pref_list(struct style *This, IStream *stream, struct chunk_entry *parent, + struct list *list) { - HRESULT hr = E_FAIL; - DMUS_PRIVATE_CHUNK Chunk; - DWORD ListSize[3], ListCount[3]; - LARGE_INTEGER liMove; /* used when skipping chunks */ - struct style_partref_item *pNewItem = NULL; + struct chunk_entry chunk = {.parent = parent}; + struct style_part_ref *part_ref; + DMUS_OBJECTDESC desc; + HRESULT hr;
+ if (FAILED(hr = dmobj_parsedescriptor(stream, parent, &desc, DMUS_OBJ_NAME)) + || FAILED(hr = stream_reset_chunk_data(stream, parent))) + return hr;
- if (pChunk->fccID != DMUS_FOURCC_PARTREF_LIST) { - ERR_(dmfile)(": %s chunk should be a PARTREF list\n", debugstr_fourcc (pChunk->fccID)); - return E_FAIL; - } + if (!(part_ref = calloc(1, sizeof(*part_ref)))) return E_OUTOFMEMORY; + part_ref->desc = desc;
- ListSize[0] = pChunk->dwSize - sizeof(FOURCC); - ListCount[0] = 0; + while ((hr = stream_next_chunk(stream, &chunk)) == S_OK) + { + switch (MAKE_IDTYPE(chunk.id, chunk.type)) + { + case DMUS_FOURCC_PARTREF_CHUNK: + hr = stream_chunk_get_data(stream, &chunk, &part_ref->header, sizeof(part_ref->header)); + break;
- do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case DMUS_FOURCC_PARTREF_CHUNK: { - TRACE_(dmfile)(": PartRef chunk\n"); - if (!(pNewItem = calloc(1, sizeof(*pNewItem)))) return E_OUTOFMEMORY; - hr = IStream_Read (pStm, &pNewItem->part_ref, sizeof(DMUS_IO_PARTREF), NULL); - /*TRACE_(dmfile)(" - sizeof %lu\n", sizeof(DMUS_IO_PARTREF));*/ - list_add_tail (&pNewMotif->Items, &pNewItem->entry); - pNewItem->desc.dwSize = sizeof(pNewItem->desc); - break; - } - case FOURCC_LIST: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[1] = Chunk.dwSize - sizeof(FOURCC); - ListCount[1] = 0; - switch (Chunk.fccID) { - case DMUS_FOURCC_UNFO_LIST: { - TRACE_(dmfile)(": UNFO list\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - - if (!pNewItem) { - ERR(": pNewItem not yet allocated, chunk order bad?\n"); - return E_OUTOFMEMORY; - } - hr = IDirectMusicUtils_IPersistStream_ParseUNFOGeneric(&Chunk, pStm, &pNewItem->desc); - if (FAILED(hr)) return hr; - - if (hr == S_FALSE) { - switch (Chunk.fccID) { - default: { - TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - } - TRACE_(dmfile)(": ListCount[1] = %ld < ListSize[1] = %ld\n", ListCount[1], ListSize[1]); - } while (ListCount[1] < ListSize[1]); - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (skipping)\n"); - liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC); - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } + case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_UNFO_LIST): + /* already parsed by dmobj_parsedescriptor */ + break; + + default: + FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type)); + break; + } + + if (FAILED(hr)) break; } - TRACE_(dmfile)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]); - } while (ListCount[0] < ListSize[0]);
- return S_OK; + if (FAILED(hr)) free(part_ref); + else list_add_tail(list, &part_ref->entry); + + return S_OK; }
static HRESULT parse_part_list(struct style *This, IStream *stream, struct chunk_entry *parent) @@ -595,7 +550,7 @@ static HRESULT parse_pattern_list(struct style *This, DMUS_PRIVATE_CHUNK *pChunk
/** reset all data, as a new pattern begin */ pNewMotif->desc.dwSize = sizeof(pNewMotif->desc); - list_init (&pNewMotif->Items); + list_init (&pNewMotif->part_refs); break; } case DMUS_FOURCC_RHYTHM_CHUNK: { @@ -691,8 +646,12 @@ static HRESULT parse_pattern_list(struct style *This, DMUS_PRIVATE_CHUNK *pChunk break; } case DMUS_FOURCC_PARTREF_LIST: { + static const LARGE_INTEGER zero = {0}; + struct chunk_entry chunk = {FOURCC_LIST, .size = Chunk.dwSize, .type = Chunk.fccID}; TRACE_(dmfile)(": PartRef list\n"); - hr = parse_part_ref_list(&Chunk, pStm, pNewMotif); + IStream_Seek(pStm, zero, STREAM_SEEK_CUR, &chunk.offset); + chunk.offset.QuadPart -= 12; + hr = parse_pref_list(This, pStm, &chunk, &pNewMotif->part_refs); if (FAILED(hr)) return hr; break; }
From: Rémi Bernon rbernon@codeweavers.com
Doc says "A motif is a special kind of pattern in a style". --- dlls/dmstyle/style.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-)
diff --git a/dlls/dmstyle/style.c b/dlls/dmstyle/style.c index 9080d73f943..d3477fbf12e 100644 --- a/dlls/dmstyle/style.c +++ b/dlls/dmstyle/style.c @@ -62,7 +62,8 @@ static void style_part_destroy(struct style_part *part) free(part); }
-struct style_motif { +struct style_pattern +{ struct list entry; DWORD dwRhythm; DMUS_IO_PATTERN pattern; @@ -79,7 +80,7 @@ struct style struct dmobject dmobj; LONG ref; DMUS_IO_STYLE style; - struct list motifs; + struct list patterns; struct list bands; struct list parts; }; @@ -133,7 +134,7 @@ static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface)
if (!ref) { struct style_band *band, *band2; - struct style_motif *motif, *motif2; + struct style_pattern *pattern; struct style_part_ref *part_ref; struct style_part *part; void *next; @@ -144,14 +145,15 @@ static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface) IDirectMusicBand_Release(band->pBand); free(band); } - LIST_FOR_EACH_ENTRY_SAFE(motif, motif2, &This->motifs, struct style_motif, entry) { - list_remove(&motif->entry); - LIST_FOR_EACH_ENTRY_SAFE(part_ref, next, &motif->part_refs, struct style_part_ref, entry) + LIST_FOR_EACH_ENTRY_SAFE(pattern, next, &This->patterns, struct style_pattern, entry) + { + list_remove(&pattern->entry); + LIST_FOR_EACH_ENTRY_SAFE(part_ref, next, &pattern->part_refs, struct style_part_ref, entry) { list_remove(&part_ref->entry); free(part_ref); } - free(motif); + free(pattern); }
LIST_FOR_EACH_ENTRY_SAFE(part, next, &This->parts, struct style_part, entry) @@ -227,7 +229,7 @@ static HRESULT WINAPI style_EnumMotif(IDirectMusicStyle8 *iface, DWORD index, WCHAR *name) { struct style *This = impl_from_IDirectMusicStyle8(iface); - const struct style_motif *motif = NULL; + const struct style_pattern *pattern = NULL; const struct list *cursor; unsigned int i = 0;
@@ -237,18 +239,19 @@ static HRESULT WINAPI style_EnumMotif(IDirectMusicStyle8 *iface, DWORD index, return E_POINTER;
/* index is zero based */ - LIST_FOR_EACH(cursor, &This->motifs) { + LIST_FOR_EACH(cursor, &This->patterns) + { if (i == index) { - motif = LIST_ENTRY(cursor, struct style_motif, entry); + pattern = LIST_ENTRY(cursor, struct style_pattern, entry); break; } i++; } - if (!motif) + if (!pattern) return S_FALSE;
- if (motif->desc.dwValidData & DMUS_OBJ_NAME) - lstrcpynW(name, motif->desc.wszName, DMUS_MAX_NAME); + if (pattern->desc.dwValidData & DMUS_OBJ_NAME) + lstrcpynW(name, pattern->desc.wszName, DMUS_MAX_NAME); else name[0] = 0;
@@ -524,7 +527,7 @@ static HRESULT parse_pattern_list(struct style *This, DMUS_PRIVATE_CHUNK *pChunk DWORD ListSize[3], ListCount[3]; LARGE_INTEGER liMove; /* used when skipping chunks */ IDirectMusicBand* pBand = NULL; - struct style_motif *pNewMotif = NULL; + struct style_pattern *pNewMotif = NULL;
if (pChunk->fccID != DMUS_FOURCC_PATTERN_LIST) { ERR_(dmfile)(": %s chunk should be a PATTERN list\n", debugstr_fourcc (pChunk->fccID)); @@ -543,7 +546,7 @@ static HRESULT parse_pattern_list(struct style *This, DMUS_PRIVATE_CHUNK *pChunk TRACE_(dmfile)(": Pattern chunk\n"); /** alloc new motif entry */ if (!(pNewMotif = calloc(1, sizeof(*pNewMotif)))) return E_OUTOFMEMORY; - list_add_tail(&This->motifs, &pNewMotif->entry); + list_add_tail(&This->patterns, &pNewMotif->entry);
IStream_Read (pStm, &pNewMotif->pattern, Chunk.dwSize, NULL); /** TODO trace pattern */ @@ -896,7 +899,7 @@ HRESULT create_dmstyle(REFIID lpcGUID, void **ppobj) obj->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl; list_init(&obj->parts); list_init(&obj->bands); - list_init(&obj->motifs); + list_init(&obj->patterns);
hr = IDirectMusicStyle8_QueryInterface(&obj->IDirectMusicStyle8_iface, lpcGUID, ppobj); IDirectMusicStyle8_Release(&obj->IDirectMusicStyle8_iface);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmstyle/style.c | 248 +++++++++++++++---------------------------- 1 file changed, 87 insertions(+), 161 deletions(-)
diff --git a/dlls/dmstyle/style.c b/dlls/dmstyle/style.c index d3477fbf12e..c64e7e3d525 100644 --- a/dlls/dmstyle/style.c +++ b/dlls/dmstyle/style.c @@ -68,12 +68,25 @@ struct style_pattern DWORD dwRhythm; DMUS_IO_PATTERN pattern; DMUS_OBJECTDESC desc; - /** optional for motifs */ DMUS_IO_MOTIFSETTINGS settings; - IDirectMusicBand *pBand; + IDirectMusicBand *band; struct list part_refs; };
+static void style_pattern_destroy(struct style_pattern *pattern) +{ + struct style_part_ref *part_ref, *next; + + LIST_FOR_EACH_ENTRY_SAFE(part_ref, next, &pattern->part_refs, struct style_part_ref, entry) + { + list_remove(&part_ref->entry); + free(part_ref); + } + + if (pattern->band) IDirectMusicBand_Release(pattern->band); + free(pattern); +} + struct style { IDirectMusicStyle8 IDirectMusicStyle8_iface; @@ -135,7 +148,6 @@ static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface) if (!ref) { struct style_band *band, *band2; struct style_pattern *pattern; - struct style_part_ref *part_ref; struct style_part *part; void *next;
@@ -145,15 +157,11 @@ static ULONG WINAPI style_Release(IDirectMusicStyle8 *iface) IDirectMusicBand_Release(band->pBand); free(band); } + LIST_FOR_EACH_ENTRY_SAFE(pattern, next, &This->patterns, struct style_pattern, entry) { list_remove(&pattern->entry); - LIST_FOR_EACH_ENTRY_SAFE(part_ref, next, &pattern->part_refs, struct style_part_ref, entry) - { - list_remove(&part_ref->entry); - free(part_ref); - } - free(pattern); + style_pattern_destroy(pattern); }
LIST_FOR_EACH_ENTRY_SAFE(part, next, &This->parts, struct style_part, entry) @@ -520,164 +528,78 @@ static HRESULT parse_part_list(struct style *This, IStream *stream, struct chunk return hr; }
-static HRESULT parse_pattern_list(struct style *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) +static HRESULT parse_pttn_list(struct style *This, IStream *stream, struct chunk_entry *parent) { - HRESULT hr = E_FAIL; - DMUS_PRIVATE_CHUNK Chunk; - DWORD ListSize[3], ListCount[3]; - LARGE_INTEGER liMove; /* used when skipping chunks */ - IDirectMusicBand* pBand = NULL; - struct style_pattern *pNewMotif = NULL; + struct chunk_entry chunk = {.parent = parent}; + struct style_pattern *pattern; + DMUS_OBJECTDESC desc; + HRESULT hr;
- if (pChunk->fccID != DMUS_FOURCC_PATTERN_LIST) { - ERR_(dmfile)(": %s chunk should be a PATTERN list\n", debugstr_fourcc (pChunk->fccID)); - return E_FAIL; - } + if (FAILED(hr = dmobj_parsedescriptor(stream, parent, &desc, DMUS_OBJ_NAME)) + || FAILED(hr = stream_reset_chunk_data(stream, parent))) + return hr;
- ListSize[0] = pChunk->dwSize - sizeof(FOURCC); - ListCount[0] = 0; + if (!(pattern = calloc(1, sizeof(*pattern)))) return E_OUTOFMEMORY; + list_init(&pattern->part_refs); + pattern->desc = desc;
- do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case DMUS_FOURCC_PATTERN_CHUNK: { - TRACE_(dmfile)(": Pattern chunk\n"); - /** alloc new motif entry */ - if (!(pNewMotif = calloc(1, sizeof(*pNewMotif)))) return E_OUTOFMEMORY; - list_add_tail(&This->patterns, &pNewMotif->entry); - - IStream_Read (pStm, &pNewMotif->pattern, Chunk.dwSize, NULL); - /** TODO trace pattern */ - - /** reset all data, as a new pattern begin */ - pNewMotif->desc.dwSize = sizeof(pNewMotif->desc); - list_init (&pNewMotif->part_refs); - break; - } - case DMUS_FOURCC_RHYTHM_CHUNK: { - TRACE_(dmfile)(": Rhythm chunk\n"); - IStream_Read (pStm, &pNewMotif->dwRhythm, sizeof(DWORD), NULL); - TRACE_(dmfile)(" - dwRhythm: %lu\n", pNewMotif->dwRhythm); - /** TODO understand why some Chunks have size > 4 */ - liMove.QuadPart = Chunk.dwSize - sizeof(DWORD); - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case DMUS_FOURCC_MOTIFSETTINGS_CHUNK: { - TRACE_(dmfile)(": MotifSettings chunk (skipping for now)\n"); - IStream_Read (pStm, &pNewMotif->settings, Chunk.dwSize, NULL); - /** TODO trace settings */ - break; - } - case FOURCC_RIFF: { - /** - * should be embedded Bands into pattern - */ - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[1] = Chunk.dwSize - sizeof(FOURCC); - ListCount[1] = 0; - switch (Chunk.fccID) { - case DMUS_FOURCC_BAND_FORM: { - LPSTREAM pClonedStream = NULL; - - TRACE_(dmfile)(": BAND RIFF\n"); - - IStream_Clone (pStm, &pClonedStream); - - liMove.QuadPart = 0; - liMove.QuadPart -= sizeof(FOURCC) + (sizeof(FOURCC)+sizeof(DWORD)); - IStream_Seek (pClonedStream, liMove, STREAM_SEEK_CUR, NULL); - - hr = load_band(pClonedStream, &pBand); - if (FAILED(hr)) { - ERR(": could not load track\n"); - return hr; - } - IStream_Release (pClonedStream); - - pNewMotif->pBand = pBand; - IDirectMusicBand_AddRef(pBand); + while ((hr = stream_next_chunk(stream, &chunk)) == S_OK) + { + switch (MAKE_IDTYPE(chunk.id, chunk.type)) + { + case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_UNFO_LIST): + /* already parsed by dmobj_parsedescriptor */ + break;
- IDirectMusicTrack_Release(pBand); pBand = NULL; /* now we can release it as it's inserted */ - - /** now safe move the cursor */ - liMove.QuadPart = ListSize[1]; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); - liMove.QuadPart = ListSize[1]; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - break; - } - case FOURCC_LIST: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[1] = Chunk.dwSize - sizeof(FOURCC); - ListCount[1] = 0; - switch (Chunk.fccID) { - case DMUS_FOURCC_UNFO_LIST: { - TRACE_(dmfile)(": UNFO list\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - - hr = IDirectMusicUtils_IPersistStream_ParseUNFOGeneric(&Chunk, pStm, &pNewMotif->desc); - if (FAILED(hr)) return hr; - - if (hr == S_FALSE) { - switch (Chunk.fccID) { - default: { - TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - } - TRACE_(dmfile)(": ListCount[1] = %ld < ListSize[1] = %ld\n", ListCount[1], ListSize[1]); - } while (ListCount[1] < ListSize[1]); - break; - } - case DMUS_FOURCC_PARTREF_LIST: { - static const LARGE_INTEGER zero = {0}; - struct chunk_entry chunk = {FOURCC_LIST, .size = Chunk.dwSize, .type = Chunk.fccID}; - TRACE_(dmfile)(": PartRef list\n"); - IStream_Seek(pStm, zero, STREAM_SEEK_CUR, &chunk.offset); - chunk.offset.QuadPart -= 12; - hr = parse_pref_list(This, pStm, &chunk, &pNewMotif->part_refs); - if (FAILED(hr)) return hr; - break; - } - default: { - TRACE_(dmfile)(": unknown (skipping)\n"); - liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC); - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } + case DMUS_FOURCC_PATTERN_CHUNK: + hr = stream_chunk_get_data(stream, &chunk, &pattern->pattern, sizeof(pattern->pattern)); + break; + + case DMUS_FOURCC_RHYTHM_CHUNK: + if (chunk.size > sizeof(pattern->dwRhythm)) FIXME("Unsupported rythm chunk size\n"); + hr = stream_read(stream, &pattern->dwRhythm, sizeof(pattern->dwRhythm)); + break; + + case DMUS_FOURCC_MOTIFSETTINGS_CHUNK: + hr = stream_chunk_get_data(stream, &chunk, &pattern->settings, sizeof(pattern->settings)); + break; + + case MAKE_IDTYPE(FOURCC_RIFF, DMUS_FOURCC_BAND_FORM): + { + IPersistStream *persist; + + if (pattern->band) IDirectMusicBand_Release(pattern->band); + + if (FAILED(hr = CoCreateInstance(&CLSID_DirectMusicBand, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectMusicBand, (void **)&pattern->band))) + break; + + if (SUCCEEDED(hr = IDirectMusicBand_QueryInterface(pattern->band, &IID_IPersistStream, (void **)&persist))) + { + if (SUCCEEDED(hr = stream_reset_chunk_start(stream, &chunk))) + hr = IPersistStream_Load(persist, stream); + IPersistStream_Release(persist); + } + + break; + } + + case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_PARTREF_LIST): + hr = parse_pref_list(This, stream, &chunk, &pattern->part_refs); + break; + + default: + FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type)); + break; + } + + if (FAILED(hr)) break; } - TRACE_(dmfile)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]); - } while (ListCount[0] < ListSize[0]);
- return S_OK; + if (FAILED(hr)) style_pattern_destroy(pattern); + else list_add_tail(&This->patterns, &pattern->entry); + + return hr; }
static HRESULT parse_style_form(struct style *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) @@ -803,8 +725,12 @@ static HRESULT parse_style_form(struct style *This, DMUS_PRIVATE_CHUNK *pChunk, break; } case DMUS_FOURCC_PATTERN_LIST: { + static const LARGE_INTEGER zero = {0}; + struct chunk_entry chunk = {FOURCC_LIST, .size = Chunk.dwSize, .type = Chunk.fccID}; TRACE_(dmfile)(": PATTERN list\n"); - hr = parse_pattern_list(This, &Chunk, pStm); + IStream_Seek(pStm, zero, STREAM_SEEK_CUR, &chunk.offset); + chunk.offset.QuadPart -= 12; + hr = parse_pttn_list(This, pStm, &chunk); if (FAILED(hr)) return hr; break; }
Unrelated test failure in win.c
This merge request was approved by Michael Stefaniuc.