From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/band.c | 53 +++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 27 deletions(-)
diff --git a/dlls/dmband/band.c b/dlls/dmband/band.c index 02e3573bab9..eb662f732ca 100644 --- a/dlls/dmband/band.c +++ b/dlls/dmband/band.c @@ -39,8 +39,7 @@ static inline IDirectMusicBandImpl *impl_from_IDirectMusicBand(IDirectMusicBand return CONTAINING_RECORD(iface, IDirectMusicBandImpl, IDirectMusicBand_iface); }
-/* DirectMusicBandImpl IDirectMusicBand part: */ -static HRESULT WINAPI IDirectMusicBandImpl_QueryInterface(IDirectMusicBand *iface, REFIID riid, +static HRESULT WINAPI band_QueryInterface(IDirectMusicBand *iface, REFIID riid, void **ret_iface) { IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); @@ -64,7 +63,7 @@ static HRESULT WINAPI IDirectMusicBandImpl_QueryInterface(IDirectMusicBand *ifac return S_OK; }
-static ULONG WINAPI IDirectMusicBandImpl_AddRef(IDirectMusicBand *iface) +static ULONG WINAPI band_AddRef(IDirectMusicBand *iface) { IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); LONG ref = InterlockedIncrement(&This->ref); @@ -74,7 +73,7 @@ static ULONG WINAPI IDirectMusicBandImpl_AddRef(IDirectMusicBand *iface) return ref; }
-static ULONG WINAPI IDirectMusicBandImpl_Release(IDirectMusicBand *iface) +static ULONG WINAPI band_Release(IDirectMusicBand *iface) { IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); LONG ref = InterlockedDecrement(&This->ref); @@ -86,7 +85,7 @@ static ULONG WINAPI IDirectMusicBandImpl_Release(IDirectMusicBand *iface) return ref; }
-static HRESULT WINAPI IDirectMusicBandImpl_CreateSegment(IDirectMusicBand *iface, +static HRESULT WINAPI band_CreateSegment(IDirectMusicBand *iface, IDirectMusicSegment **segment) { IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); @@ -110,7 +109,7 @@ static HRESULT WINAPI IDirectMusicBandImpl_CreateSegment(IDirectMusicBand *iface return hr; }
-static HRESULT WINAPI IDirectMusicBandImpl_Download(IDirectMusicBand *iface, +static HRESULT WINAPI band_Download(IDirectMusicBand *iface, IDirectMusicPerformance *pPerformance) { IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); @@ -118,7 +117,7 @@ static HRESULT WINAPI IDirectMusicBandImpl_Download(IDirectMusicBand *iface, return S_OK; }
-static HRESULT WINAPI IDirectMusicBandImpl_Unload(IDirectMusicBand *iface, +static HRESULT WINAPI band_Unload(IDirectMusicBand *iface, IDirectMusicPerformance *pPerformance) { IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); @@ -126,17 +125,17 @@ static HRESULT WINAPI IDirectMusicBandImpl_Unload(IDirectMusicBand *iface, return S_OK; }
-static const IDirectMusicBandVtbl dmband_vtbl = { - IDirectMusicBandImpl_QueryInterface, - IDirectMusicBandImpl_AddRef, - IDirectMusicBandImpl_Release, - IDirectMusicBandImpl_CreateSegment, - IDirectMusicBandImpl_Download, - IDirectMusicBandImpl_Unload +static const IDirectMusicBandVtbl band_vtbl = +{ + band_QueryInterface, + band_AddRef, + band_Release, + band_CreateSegment, + band_Download, + band_Unload, };
-/* IDirectMusicBandImpl IDirectMusicObject part: */ -static HRESULT WINAPI band_IDirectMusicObject_ParseDescriptor(IDirectMusicObject *iface, +static HRESULT WINAPI band_object_ParseDescriptor(IDirectMusicObject *iface, IStream *stream, DMUS_OBJECTDESC *desc) { struct chunk_entry riff = {0}; @@ -175,18 +174,18 @@ static HRESULT WINAPI band_IDirectMusicObject_ParseDescriptor(IDirectMusicObject return S_OK; }
-static const IDirectMusicObjectVtbl dmobject_vtbl = { +static const IDirectMusicObjectVtbl band_object_vtbl = +{ dmobj_IDirectMusicObject_QueryInterface, dmobj_IDirectMusicObject_AddRef, dmobj_IDirectMusicObject_Release, dmobj_IDirectMusicObject_GetDescriptor, dmobj_IDirectMusicObject_SetDescriptor, - band_IDirectMusicObject_ParseDescriptor + band_object_ParseDescriptor, };
#define DMUS_IO_INSTRUMENT_DX7_SIZE offsetof(DMUS_IO_INSTRUMENT, nPitchBendRange)
-/* IDirectMusicBandImpl IPersistStream part: */ static HRESULT parse_instrument(IDirectMusicBandImpl *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) { @@ -447,7 +446,7 @@ static inline IDirectMusicBandImpl *impl_from_IPersistStream(IPersistStream *ifa return CONTAINING_RECORD(iface, IDirectMusicBandImpl, dmobj.IPersistStream_iface); }
-static HRESULT WINAPI IPersistStreamImpl_Load(IPersistStream *iface, IStream *pStm) +static HRESULT WINAPI band_persist_stream_Load(IPersistStream *iface, IStream *pStm) { IDirectMusicBandImpl *This = impl_from_IPersistStream(iface); DMUS_PRIVATE_CHUNK Chunk; @@ -490,18 +489,18 @@ static HRESULT WINAPI IPersistStreamImpl_Load(IPersistStream *iface, IStream *pS return S_OK; }
-static const IPersistStreamVtbl persiststream_vtbl = { +static const IPersistStreamVtbl band_persist_stream_vtbl = +{ dmobj_IPersistStream_QueryInterface, dmobj_IPersistStream_AddRef, dmobj_IPersistStream_Release, unimpl_IPersistStream_GetClassID, unimpl_IPersistStream_IsDirty, - IPersistStreamImpl_Load, + band_persist_stream_Load, unimpl_IPersistStream_Save, - unimpl_IPersistStream_GetSizeMax + unimpl_IPersistStream_GetSizeMax, };
-/* for ClassFactory */ HRESULT create_dmband(REFIID lpcGUID, void **ppobj) { IDirectMusicBandImpl* obj; @@ -509,11 +508,11 @@ HRESULT create_dmband(REFIID lpcGUID, void **ppobj)
*ppobj = NULL; if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY; - obj->IDirectMusicBand_iface.lpVtbl = &dmband_vtbl; + obj->IDirectMusicBand_iface.lpVtbl = &band_vtbl; obj->ref = 1; dmobject_init(&obj->dmobj, &CLSID_DirectMusicBand, (IUnknown *)&obj->IDirectMusicBand_iface); - obj->dmobj.IDirectMusicObject_iface.lpVtbl = &dmobject_vtbl; - obj->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl; + obj->dmobj.IDirectMusicObject_iface.lpVtbl = &band_object_vtbl; + obj->dmobj.IPersistStream_iface.lpVtbl = &band_persist_stream_vtbl; list_init (&obj->Instruments);
hr = IDirectMusicBand_QueryInterface(&obj->IDirectMusicBand_iface, lpcGUID, ppobj);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/band.c | 39 ++++++++++++++++++--------------------- dlls/dmband/bandtrack.c | 3 +-- 2 files changed, 19 insertions(+), 23 deletions(-)
diff --git a/dlls/dmband/band.c b/dlls/dmband/band.c index eb662f732ca..bbf8c93a067 100644 --- a/dlls/dmband/band.c +++ b/dlls/dmband/band.c @@ -23,26 +23,23 @@ WINE_DEFAULT_DEBUG_CHANNEL(dmband); WINE_DECLARE_DEBUG_CHANNEL(dmfile);
- -/***************************************************************************** - * IDirectMusicBandImpl implementation - */ -typedef struct IDirectMusicBandImpl { +struct band +{ IDirectMusicBand IDirectMusicBand_iface; struct dmobject dmobj; LONG ref; struct list Instruments; -} IDirectMusicBandImpl; +};
-static inline IDirectMusicBandImpl *impl_from_IDirectMusicBand(IDirectMusicBand *iface) +static inline struct band *impl_from_IDirectMusicBand(IDirectMusicBand *iface) { - return CONTAINING_RECORD(iface, IDirectMusicBandImpl, IDirectMusicBand_iface); + return CONTAINING_RECORD(iface, struct band, IDirectMusicBand_iface); }
static HRESULT WINAPI band_QueryInterface(IDirectMusicBand *iface, REFIID riid, void **ret_iface) { - IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); + struct band *This = impl_from_IDirectMusicBand(iface);
TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
@@ -65,7 +62,7 @@ static HRESULT WINAPI band_QueryInterface(IDirectMusicBand *iface, REFIID riid,
static ULONG WINAPI band_AddRef(IDirectMusicBand *iface) { - IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); + struct band *This = impl_from_IDirectMusicBand(iface); LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref); @@ -75,7 +72,7 @@ static ULONG WINAPI band_AddRef(IDirectMusicBand *iface)
static ULONG WINAPI band_Release(IDirectMusicBand *iface) { - IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); + struct band *This = impl_from_IDirectMusicBand(iface); LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref); @@ -88,7 +85,7 @@ static ULONG WINAPI band_Release(IDirectMusicBand *iface) static HRESULT WINAPI band_CreateSegment(IDirectMusicBand *iface, IDirectMusicSegment **segment) { - IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); + struct band *This = impl_from_IDirectMusicBand(iface); HRESULT hr; DMUS_BAND_PARAM bandparam;
@@ -112,7 +109,7 @@ static HRESULT WINAPI band_CreateSegment(IDirectMusicBand *iface, static HRESULT WINAPI band_Download(IDirectMusicBand *iface, IDirectMusicPerformance *pPerformance) { - IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); + struct band *This = impl_from_IDirectMusicBand(iface); FIXME("(%p, %p): stub\n", This, pPerformance); return S_OK; } @@ -120,7 +117,7 @@ static HRESULT WINAPI band_Download(IDirectMusicBand *iface, static HRESULT WINAPI band_Unload(IDirectMusicBand *iface, IDirectMusicPerformance *pPerformance) { - IDirectMusicBandImpl *This = impl_from_IDirectMusicBand(iface); + struct band *This = impl_from_IDirectMusicBand(iface); FIXME("(%p, %p): stub\n", This, pPerformance); return S_OK; } @@ -186,7 +183,7 @@ static const IDirectMusicObjectVtbl band_object_vtbl =
#define DMUS_IO_INSTRUMENT_DX7_SIZE offsetof(DMUS_IO_INSTRUMENT, nPitchBendRange)
-static HRESULT parse_instrument(IDirectMusicBandImpl *This, DMUS_PRIVATE_CHUNK *pChunk, +static HRESULT parse_instrument(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) { DMUS_PRIVATE_CHUNK Chunk; @@ -293,7 +290,7 @@ static HRESULT parse_instrument(IDirectMusicBandImpl *This, DMUS_PRIVATE_CHUNK * return S_OK; }
-static HRESULT parse_instruments_list(IDirectMusicBandImpl *This, DMUS_PRIVATE_CHUNK *pChunk, +static HRESULT parse_instruments_list(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) { HRESULT hr; @@ -348,7 +345,7 @@ static HRESULT parse_instruments_list(IDirectMusicBandImpl *This, DMUS_PRIVATE_C return S_OK; }
-static HRESULT parse_band_form(IDirectMusicBandImpl *This, DMUS_PRIVATE_CHUNK *pChunk, +static HRESULT parse_band_form(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) { HRESULT hr = E_FAIL; @@ -441,14 +438,14 @@ static HRESULT parse_band_form(IDirectMusicBandImpl *This, DMUS_PRIVATE_CHUNK *p return S_OK; }
-static inline IDirectMusicBandImpl *impl_from_IPersistStream(IPersistStream *iface) +static inline struct band *impl_from_IPersistStream(IPersistStream *iface) { - return CONTAINING_RECORD(iface, IDirectMusicBandImpl, dmobj.IPersistStream_iface); + return CONTAINING_RECORD(iface, struct band, dmobj.IPersistStream_iface); }
static HRESULT WINAPI band_persist_stream_Load(IPersistStream *iface, IStream *pStm) { - IDirectMusicBandImpl *This = impl_from_IPersistStream(iface); + struct band *This = impl_from_IPersistStream(iface); DMUS_PRIVATE_CHUNK Chunk; LARGE_INTEGER liMove; HRESULT hr; @@ -503,7 +500,7 @@ static const IPersistStreamVtbl band_persist_stream_vtbl =
HRESULT create_dmband(REFIID lpcGUID, void **ppobj) { - IDirectMusicBandImpl* obj; + struct band* obj; HRESULT hr;
*ppobj = NULL; diff --git a/dlls/dmband/bandtrack.c b/dlls/dmband/bandtrack.c index bdb9344b064..bf494d39df2 100644 --- a/dlls/dmband/bandtrack.c +++ b/dlls/dmband/bandtrack.c @@ -1,5 +1,4 @@ -/* IDirectMusicBandTrack Implementation - * +/* * Copyright (C) 2003-2004 Rok Mandeljc * * This program is free software; you can redistribute it and/or
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/bandtrack.c | 101 +++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 52 deletions(-)
diff --git a/dlls/dmband/bandtrack.c b/dlls/dmband/bandtrack.c index bf494d39df2..53515bc8690 100644 --- a/dlls/dmband/bandtrack.c +++ b/dlls/dmband/bandtrack.c @@ -22,27 +22,24 @@ WINE_DEFAULT_DEBUG_CHANNEL(dmband); WINE_DECLARE_DEBUG_CHANNEL(dmfile);
-/***************************************************************************** - * IDirectMusicBandTrack implementation - */ -typedef struct IDirectMusicBandTrack { +struct band_track +{ IDirectMusicTrack8 IDirectMusicTrack8_iface; struct dmobject dmobj; /* IPersistStream only */ LONG ref; DMUS_IO_BAND_TRACK_HEADER header; struct list Bands; -} IDirectMusicBandTrack; +};
-/* IDirectMusicBandTrack IDirectMusicTrack8 part: */ -static inline IDirectMusicBandTrack *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface) +static inline struct band_track *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface) { - return CONTAINING_RECORD(iface, IDirectMusicBandTrack, IDirectMusicTrack8_iface); + return CONTAINING_RECORD(iface, struct band_track, IDirectMusicTrack8_iface); }
static HRESULT WINAPI band_track_QueryInterface(IDirectMusicTrack8 *iface, REFIID riid, void **ret_iface) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
@@ -64,7 +61,7 @@ static HRESULT WINAPI band_track_QueryInterface(IDirectMusicTrack8 *iface, REFII
static ULONG WINAPI band_track_AddRef(IDirectMusicTrack8 *iface) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface); LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref); @@ -74,7 +71,7 @@ static ULONG WINAPI band_track_AddRef(IDirectMusicTrack8 *iface)
static ULONG WINAPI band_track_Release(IDirectMusicTrack8 *iface) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface); LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref); @@ -86,16 +83,16 @@ static ULONG WINAPI band_track_Release(IDirectMusicTrack8 *iface)
static HRESULT WINAPI band_track_Init(IDirectMusicTrack8 *iface, IDirectMusicSegment *pSegment) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %p): stub\n", This, pSegment); - return S_OK; + struct band_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %p): stub\n", This, pSegment); + return S_OK; }
static HRESULT WINAPI band_track_InitPlay(IDirectMusicTrack8 *iface, IDirectMusicSegmentState *segment_state, IDirectMusicPerformance *performance, void **state_data, DWORD virtual_track8id, DWORD flags) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
FIXME("(%p, %p, %p, %p, %ld, %lx): stub\n", This, segment_state, performance, state_data, virtual_track8id, flags);
@@ -104,9 +101,9 @@ static HRESULT WINAPI band_track_InitPlay(IDirectMusicTrack8 *iface,
static HRESULT WINAPI band_track_EndPlay(IDirectMusicTrack8 *iface, void *pStateData) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %p): stub\n", This, pStateData); - return S_OK; + struct band_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %p): stub\n", This, pStateData); + return S_OK; }
static HRESULT WINAPI band_track_Play(IDirectMusicTrack8 *iface, void *state_data, @@ -114,7 +111,7 @@ static HRESULT WINAPI band_track_Play(IDirectMusicTrack8 *iface, void *state_dat IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD virtual_id) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
FIXME("(%p, %p, %ld, %ld, %ld, %lx, %p, %p, %ld): semi-stub\n", This, state_data, mtStart, mtEnd, mtOffset, flags, performance, segment_state, virtual_id);
@@ -131,7 +128,7 @@ static HRESULT WINAPI band_track_Play(IDirectMusicTrack8 *iface, void *state_dat static HRESULT WINAPI band_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, MUSIC_TIME *next, void *param) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s, %ld, %p, %p)\n", This, debugstr_dmguid(type), time, next, param);
@@ -148,7 +145,7 @@ static HRESULT WINAPI band_track_GetParam(IDirectMusicTrack8 *iface, REFGUID typ static HRESULT WINAPI band_track_SetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, void *param) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s, %ld, %p)\n", This, debugstr_dmguid(type), time, param);
@@ -183,7 +180,7 @@ static HRESULT WINAPI band_track_SetParam(IDirectMusicTrack8 *iface, REFGUID typ
static HRESULT WINAPI band_track_IsParamSupported(IDirectMusicTrack8 *iface, REFGUID rguidType) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s)\n", This, debugstr_dmguid(rguidType));
@@ -211,7 +208,7 @@ static HRESULT WINAPI band_track_IsParamSupported(IDirectMusicTrack8 *iface, REF
static HRESULT WINAPI band_track_AddNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype)); return E_NOTIMPL; @@ -220,7 +217,7 @@ static HRESULT WINAPI band_track_AddNotificationType(IDirectMusicTrack8 *iface, static HRESULT WINAPI band_track_RemoveNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype)); return E_NOTIMPL; @@ -229,9 +226,9 @@ static HRESULT WINAPI band_track_RemoveNotificationType(IDirectMusicTrack8 *ifac static HRESULT WINAPI band_track_Clone(IDirectMusicTrack8 *iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack); - return S_OK; + struct band_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack); + return S_OK; }
static HRESULT WINAPI band_track_PlayEx(IDirectMusicTrack8 *iface, void *state_data, @@ -239,7 +236,7 @@ static HRESULT WINAPI band_track_PlayEx(IDirectMusicTrack8 *iface, void *state_d IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD virtual_id) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
FIXME("(%p, %p, 0x%s, 0x%s, 0x%s, %lx, %p, %p, %ld): stub\n", This, state_data, wine_dbgstr_longlong(rtStart), wine_dbgstr_longlong(rtEnd), wine_dbgstr_longlong(rtOffset), flags, performance, segment_state, virtual_id); @@ -251,7 +248,7 @@ static HRESULT WINAPI band_track_GetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *rtNext, void *param, void *state_data, DWORD flags) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
FIXME("(%p, %s, 0x%s, %p, %p, %p, %lx): stub\n", This, debugstr_dmguid(rguidType), wine_dbgstr_longlong(rtTime), rtNext, param, state_data, flags); @@ -262,7 +259,7 @@ static HRESULT WINAPI band_track_GetParamEx(IDirectMusicTrack8 *iface, static HRESULT WINAPI band_track_SetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, void *param, void *state_data, DWORD flags) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
FIXME("(%p, %s, 0x%s, %p, %p, %lx): stub\n", This, debugstr_dmguid(rguidType), wine_dbgstr_longlong(rtTime), param, state_data, flags); @@ -273,7 +270,7 @@ static HRESULT WINAPI band_track_SetParamEx(IDirectMusicTrack8 *iface, REFGUID r static HRESULT WINAPI band_track_Compose(IDirectMusicTrack8 *iface, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **track) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); + struct band_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %p, %ld, %p): method not implemented\n", This, context, trackgroup, track); return E_NOTIMPL; @@ -283,12 +280,13 @@ static HRESULT WINAPI band_track_Join(IDirectMusicTrack8 *iface, IDirectMusicTra MUSIC_TIME mtJoin, IUnknown *pContext, DWORD dwTrackGroup, IDirectMusicTrack **ppResultTrack) { - IDirectMusicBandTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %p, %ld, %p, %ld, %p): stub\n", This, pNewTrack, mtJoin, pContext, dwTrackGroup, ppResultTrack); - return S_OK; + struct band_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %p, %ld, %p, %ld, %p): stub\n", This, pNewTrack, mtJoin, pContext, dwTrackGroup, ppResultTrack); + return S_OK; }
-static const IDirectMusicTrack8Vtbl dmtrack8_vtbl = { +static const IDirectMusicTrack8Vtbl band_track_vtbl = +{ band_track_QueryInterface, band_track_AddRef, band_track_Release, @@ -306,11 +304,10 @@ static const IDirectMusicTrack8Vtbl dmtrack8_vtbl = { band_track_GetParamEx, band_track_SetParamEx, band_track_Compose, - band_track_Join + band_track_Join, };
-/* IDirectMusicBandTrack IPersistStream part: */ -static HRESULT load_band(IDirectMusicBandTrack *This, IStream *pClonedStream, +static HRESULT load_band(struct band_track *This, IStream *pClonedStream, IDirectMusicBand **ppBand, DMUS_PRIVATE_BAND_ITEM_HEADER *pHeader) { HRESULT hr = E_FAIL; @@ -352,7 +349,7 @@ static HRESULT load_band(IDirectMusicBandTrack *This, IStream *pClonedStream, return S_OK; }
-static HRESULT parse_bands_list(IDirectMusicBandTrack *This, DMUS_PRIVATE_CHUNK *pChunk, +static HRESULT parse_bands_list(struct band_track *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) { HRESULT hr = E_FAIL; @@ -475,7 +472,7 @@ static HRESULT parse_bands_list(IDirectMusicBandTrack *This, DMUS_PRIVATE_CHUNK return S_OK; }
-static HRESULT parse_bandtrack_form(IDirectMusicBandTrack *This, DMUS_PRIVATE_CHUNK *pChunk, +static HRESULT parse_bandtrack_form(struct band_track *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) { HRESULT hr = E_FAIL; @@ -566,14 +563,14 @@ static HRESULT parse_bandtrack_form(IDirectMusicBandTrack *This, DMUS_PRIVATE_CH return S_OK; }
-static inline IDirectMusicBandTrack *impl_from_IPersistStream(IPersistStream *iface) +static inline struct band_track *impl_from_IPersistStream(IPersistStream *iface) { - return CONTAINING_RECORD(iface, IDirectMusicBandTrack, dmobj.IPersistStream_iface); + return CONTAINING_RECORD(iface, struct band_track, dmobj.IPersistStream_iface); }
-static HRESULT WINAPI IPersistStreamImpl_Load(IPersistStream *iface, IStream *pStm) +static HRESULT WINAPI band_track_persist_stream_Load(IPersistStream *iface, IStream *pStm) { - IDirectMusicBandTrack *This = impl_from_IPersistStream(iface); + struct band_track *This = impl_from_IPersistStream(iface); DMUS_PRIVATE_CHUNK Chunk; LARGE_INTEGER liMove; HRESULT hr; @@ -614,30 +611,30 @@ static HRESULT WINAPI IPersistStreamImpl_Load(IPersistStream *iface, IStream *pS return S_OK; }
-static const IPersistStreamVtbl persiststream_vtbl = { +static const IPersistStreamVtbl band_track_persist_stream_vtbl = +{ dmobj_IPersistStream_QueryInterface, dmobj_IPersistStream_AddRef, dmobj_IPersistStream_Release, dmobj_IPersistStream_GetClassID, unimpl_IPersistStream_IsDirty, - IPersistStreamImpl_Load, + band_track_persist_stream_Load, unimpl_IPersistStream_Save, - unimpl_IPersistStream_GetSizeMax + unimpl_IPersistStream_GetSizeMax, };
/* for ClassFactory */ HRESULT create_dmbandtrack(REFIID lpcGUID, void **ppobj) { - IDirectMusicBandTrack *track; + struct band_track *track; HRESULT hr;
*ppobj = NULL; if (!(track = calloc(1, sizeof(*track)))) return E_OUTOFMEMORY; - track->IDirectMusicTrack8_iface.lpVtbl = &dmtrack8_vtbl; + track->IDirectMusicTrack8_iface.lpVtbl = &band_track_vtbl; track->ref = 1; - dmobject_init(&track->dmobj, &CLSID_DirectMusicBandTrack, - (IUnknown *)&track->IDirectMusicTrack8_iface); - track->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl; + dmobject_init(&track->dmobj, &CLSID_DirectMusicBandTrack, (IUnknown *)&track->IDirectMusicTrack8_iface); + track->dmobj.IPersistStream_iface.lpVtbl = &band_track_persist_stream_vtbl; list_init (&track->Bands);
hr = IDirectMusicTrack8_QueryInterface(&track->IDirectMusicTrack8_iface, lpcGUID, ppobj);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/bandtrack.c | 45 ++++++++++++++++++++++++++++-------- dlls/dmband/dmband_private.h | 6 ----- 2 files changed, 35 insertions(+), 16 deletions(-)
diff --git a/dlls/dmband/bandtrack.c b/dlls/dmband/bandtrack.c index 53515bc8690..1a3cde5f1db 100644 --- a/dlls/dmband/bandtrack.c +++ b/dlls/dmband/bandtrack.c @@ -22,13 +22,26 @@ WINE_DEFAULT_DEBUG_CHANNEL(dmband); WINE_DECLARE_DEBUG_CHANNEL(dmfile);
+struct band_entry +{ + struct list entry; + DMUS_PRIVATE_BAND_ITEM_HEADER head; + IDirectMusicBand *band; +}; + +static void band_entry_destroy(struct band_entry *entry) +{ + IDirectMusicTrack_Release(entry->band); + free(entry); +} + struct band_track { IDirectMusicTrack8 IDirectMusicTrack8_iface; struct dmobject dmobj; /* IPersistStream only */ LONG ref; DMUS_IO_BAND_TRACK_HEADER header; - struct list Bands; + struct list bands; };
static inline struct band_track *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface) @@ -76,7 +89,18 @@ static ULONG WINAPI band_track_Release(IDirectMusicTrack8 *iface)
TRACE("(%p) ref=%ld\n", This, ref);
- if (!ref) free(This); + if (!ref) + { + struct band_entry *entry, *next; + + LIST_FOR_EACH_ENTRY_SAFE(entry, next, &This->bands, struct band_entry, entry) + { + list_remove(&entry->entry); + band_entry_destroy(entry); + } + + free(This); + }
return ref; } @@ -337,13 +361,14 @@ static HRESULT load_band(struct band_track *This, IStream *pClonedStream, /* * @TODO insert pBand into This */ - if (SUCCEEDED(hr)) { - LPDMUS_PRIVATE_BAND pNewBand; - if (!(pNewBand = calloc(1, sizeof(*pNewBand)))) return E_OUTOFMEMORY; - pNewBand->BandHeader = *pHeader; - pNewBand->band = *ppBand; - IDirectMusicBand_AddRef(*ppBand); - list_add_tail (&This->Bands, &pNewBand->entry); + if (SUCCEEDED(hr)) + { + struct band_entry *entry; + if (!(entry = calloc(1, sizeof(*entry)))) return E_OUTOFMEMORY; + entry->head = *pHeader; + entry->band = *ppBand; + IDirectMusicBand_AddRef(*ppBand); + list_add_tail(&This->bands, &entry->entry); }
return S_OK; @@ -635,7 +660,7 @@ HRESULT create_dmbandtrack(REFIID lpcGUID, void **ppobj) track->ref = 1; dmobject_init(&track->dmobj, &CLSID_DirectMusicBandTrack, (IUnknown *)&track->IDirectMusicTrack8_iface); track->dmobj.IPersistStream_iface.lpVtbl = &band_track_persist_stream_vtbl; - list_init (&track->Bands); + list_init(&track->bands);
hr = IDirectMusicTrack8_QueryInterface(&track->IDirectMusicTrack8_iface, lpcGUID, ppobj); IDirectMusicTrack8_Release(&track->IDirectMusicTrack8_iface); diff --git a/dlls/dmband/dmband_private.h b/dlls/dmband/dmband_private.h index 0b1807eaf93..f4d2bbbbc8e 100644 --- a/dlls/dmband/dmband_private.h +++ b/dlls/dmband/dmband_private.h @@ -67,12 +67,6 @@ typedef struct _DMUS_PRIVATE_INSTRUMENT { IDirectMusicCollection* ppReferenceCollection; } DMUS_PRIVATE_INSTRUMENT, *LPDMUS_PRIVATE_INSTRUMENT;
-typedef struct _DMUS_PRIVATE_BAND { - struct list entry; /* for listing elements */ - DMUS_PRIVATE_BAND_ITEM_HEADER BandHeader; - IDirectMusicBand *band; -} DMUS_PRIVATE_BAND, *LPDMUS_PRIVATE_BAND; - /***************************************************************************** * Misc. */
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/band.c | 40 ++++++++++++++++++++++++++++-------- dlls/dmband/dmband_private.h | 6 ------ 2 files changed, 32 insertions(+), 14 deletions(-)
diff --git a/dlls/dmband/band.c b/dlls/dmband/band.c index bbf8c93a067..102e58fe39b 100644 --- a/dlls/dmband/band.c +++ b/dlls/dmband/band.c @@ -23,12 +23,25 @@ WINE_DEFAULT_DEBUG_CHANNEL(dmband); WINE_DECLARE_DEBUG_CHANNEL(dmfile);
+struct instrument_entry +{ + struct list entry; + DMUS_IO_INSTRUMENT instrument; + IDirectMusicCollection *collection; +}; + +static void instrument_entry_destroy(struct instrument_entry *entry) +{ + if (entry->collection) IDirectMusicCollection_Release(entry->collection); + free(entry); +} + struct band { IDirectMusicBand IDirectMusicBand_iface; struct dmobject dmobj; LONG ref; - struct list Instruments; + struct list instruments; };
static inline struct band *impl_from_IDirectMusicBand(IDirectMusicBand *iface) @@ -77,7 +90,18 @@ static ULONG WINAPI band_Release(IDirectMusicBand *iface)
TRACE("(%p) ref=%ld\n", This, ref);
- if (!ref) free(This); + if (!ref) + { + struct instrument_entry *entry, *next; + + LIST_FOR_EACH_ENTRY_SAFE(entry, next, &This->instruments, struct instrument_entry, entry) + { + list_remove(&entry->entry); + instrument_entry_destroy(entry); + } + + free(This); + }
return ref; } @@ -192,7 +216,7 @@ static HRESULT parse_instrument(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, HRESULT hr;
DMUS_IO_INSTRUMENT inst; - LPDMUS_PRIVATE_INSTRUMENT pNewInstrument; + struct instrument_entry *pNewInstrument; IDirectMusicObject* pObject = NULL;
if (pChunk->fccID != DMUS_FOURCC_INSTRUMENT_LIST) { @@ -272,8 +296,8 @@ static HRESULT parse_instrument(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, * @TODO insert pNewInstrument into This */ if (!(pNewInstrument = calloc(1, sizeof(*pNewInstrument)))) return E_OUTOFMEMORY; - memcpy(&pNewInstrument->pInstrument, &inst, sizeof(DMUS_IO_INSTRUMENT)); - pNewInstrument->ppReferenceCollection = NULL; + memcpy(&pNewInstrument->instrument, &inst, sizeof(DMUS_IO_INSTRUMENT)); + pNewInstrument->collection = NULL; if (NULL != pObject) { IDirectMusicCollection* pCol = NULL; hr = IDirectMusicObject_QueryInterface (pObject, &IID_IDirectMusicCollection, (void**) &pCol); @@ -282,10 +306,10 @@ static HRESULT parse_instrument(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, free(pNewInstrument); return hr; } - pNewInstrument->ppReferenceCollection = pCol; + pNewInstrument->collection = pCol; IDirectMusicObject_Release(pObject); } - list_add_tail (&This->Instruments, &pNewInstrument->entry); + list_add_tail(&This->instruments, &pNewInstrument->entry);
return S_OK; } @@ -510,7 +534,7 @@ HRESULT create_dmband(REFIID lpcGUID, void **ppobj) dmobject_init(&obj->dmobj, &CLSID_DirectMusicBand, (IUnknown *)&obj->IDirectMusicBand_iface); obj->dmobj.IDirectMusicObject_iface.lpVtbl = &band_object_vtbl; obj->dmobj.IPersistStream_iface.lpVtbl = &band_persist_stream_vtbl; - list_init (&obj->Instruments); + list_init(&obj->instruments);
hr = IDirectMusicBand_QueryInterface(&obj->IDirectMusicBand_iface, lpcGUID, ppobj); IDirectMusicBand_Release(&obj->IDirectMusicBand_iface); diff --git a/dlls/dmband/dmband_private.h b/dlls/dmband/dmband_private.h index f4d2bbbbc8e..da6f0fa302f 100644 --- a/dlls/dmband/dmband_private.h +++ b/dlls/dmband/dmband_private.h @@ -61,12 +61,6 @@ typedef struct _DMUS_PRIVATE_BAND_ITEM_HEADER { MUSIC_TIME lBandTimePhysical; } DMUS_PRIVATE_BAND_ITEM_HEADER;
-typedef struct _DMUS_PRIVATE_INSTRUMENT { - struct list entry; /* for listing elements */ - DMUS_IO_INSTRUMENT pInstrument; - IDirectMusicCollection* ppReferenceCollection; -} DMUS_PRIVATE_INSTRUMENT, *LPDMUS_PRIVATE_INSTRUMENT; - /***************************************************************************** * Misc. */
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/band.c | 180 +++++++++++++++++---------------------------- 1 file changed, 69 insertions(+), 111 deletions(-)
diff --git a/dlls/dmband/band.c b/dlls/dmband/band.c index 102e58fe39b..a95cf85458a 100644 --- a/dlls/dmband/band.c +++ b/dlls/dmband/band.c @@ -156,6 +156,70 @@ static const IDirectMusicBandVtbl band_vtbl = band_Unload, };
+static HRESULT parse_lbin_list(struct band *This, IStream *stream, struct chunk_entry *parent) +{ + struct chunk_entry chunk = {.parent = parent}; + IDirectMusicCollection *collection = NULL; + struct instrument_entry *entry; + DMUS_IO_INSTRUMENT inst = {0}; + HRESULT hr; + + while ((hr = stream_next_chunk(stream, &chunk)) == S_OK) + { + switch (MAKE_IDTYPE(chunk.id, chunk.type)) + { + case DMUS_FOURCC_INSTRUMENT_CHUNK: + { + UINT size = sizeof(inst); + + if (chunk.size == offsetof(DMUS_IO_INSTRUMENT, nPitchBendRange)) size = chunk.size; + if (FAILED(hr = stream_chunk_get_data(stream, &chunk, &inst, size))) break; + TRACE_(dmfile)(" - dwPatch: %lu\n", inst.dwPatch); + TRACE_(dmfile)(" - dwAssignPatch: %lu\n", inst.dwAssignPatch); + TRACE_(dmfile)(" - dwNoteRanges[0]: %lu\n", inst.dwNoteRanges[0]); + TRACE_(dmfile)(" - dwNoteRanges[1]: %lu\n", inst.dwNoteRanges[1]); + TRACE_(dmfile)(" - dwNoteRanges[2]: %lu\n", inst.dwNoteRanges[2]); + TRACE_(dmfile)(" - dwNoteRanges[3]: %lu\n", inst.dwNoteRanges[3]); + TRACE_(dmfile)(" - dwPChannel: %lu\n", inst.dwPChannel); + TRACE_(dmfile)(" - dwFlags: %lx\n", inst.dwFlags); + TRACE_(dmfile)(" - bPan: %u\n", inst.bPan); + TRACE_(dmfile)(" - bVolume: %u\n", inst.bVolume); + TRACE_(dmfile)(" - nTranspose: %d\n", inst.nTranspose); + TRACE_(dmfile)(" - dwChannelPriority: %lu\n", inst.dwChannelPriority); + TRACE_(dmfile)(" - nPitchBendRange: %d\n", inst.nPitchBendRange); + break; + } + + case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_REF_LIST): + { + IDirectMusicObject *object; + + if (FAILED(hr = dmobj_parsereference(stream, &chunk, &object))) break; + TRACE_(dmfile)(" - object: %p\n", object); + + hr = IDirectMusicObject_QueryInterface(object, &IID_IDirectMusicCollection, (void **)&collection); + IDirectMusicObject_Release(object); + break; + } + + default: + FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type)); + break; + } + + if (FAILED(hr)) break; + } + + if (FAILED(hr)) return hr; + + if (!(entry = calloc(1, sizeof(*entry)))) return E_OUTOFMEMORY; + memcpy(&entry->instrument, &inst, sizeof(DMUS_IO_INSTRUMENT)); + entry->collection = collection; + list_add_tail(&This->instruments, &entry->entry); + + return hr; +} + static HRESULT WINAPI band_object_ParseDescriptor(IDirectMusicObject *iface, IStream *stream, DMUS_OBJECTDESC *desc) { @@ -205,115 +269,6 @@ static const IDirectMusicObjectVtbl band_object_vtbl = band_object_ParseDescriptor, };
-#define DMUS_IO_INSTRUMENT_DX7_SIZE offsetof(DMUS_IO_INSTRUMENT, nPitchBendRange) - -static HRESULT parse_instrument(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, - IStream *pStm) -{ - DMUS_PRIVATE_CHUNK Chunk; - DWORD ListSize[3], ListCount[3]; - LARGE_INTEGER liMove; /* used when skipping chunks */ - HRESULT hr; - - DMUS_IO_INSTRUMENT inst; - struct instrument_entry *pNewInstrument; - IDirectMusicObject* pObject = NULL; - - if (pChunk->fccID != DMUS_FOURCC_INSTRUMENT_LIST) { - ERR_(dmfile)(": %s chunk should be an INSTRUMENT list\n", debugstr_fourcc (pChunk->fccID)); - return E_FAIL; - } - - ListSize[0] = pChunk->dwSize - sizeof(FOURCC); - ListCount[0] = 0; - - 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_INSTRUMENT_CHUNK: { - TRACE_(dmfile)(": Instrument chunk\n"); - if (Chunk.dwSize != sizeof(DMUS_IO_INSTRUMENT) && Chunk.dwSize != DMUS_IO_INSTRUMENT_DX7_SIZE) { - ERR_(dmfile)("unexpected size %ld\n", Chunk.dwSize); - return E_FAIL; - } - IStream_Read (pStm, &inst, Chunk.dwSize, NULL); - if (Chunk.dwSize != sizeof(DMUS_IO_INSTRUMENT)) - inst.nPitchBendRange = 0; - - TRACE_(dmfile)(" - dwPatch: %lu\n", inst.dwPatch); - TRACE_(dmfile)(" - dwAssignPatch: %lu\n", inst.dwAssignPatch); - TRACE_(dmfile)(" - dwNoteRanges[0]: %lu\n", inst.dwNoteRanges[0]); - TRACE_(dmfile)(" - dwNoteRanges[1]: %lu\n", inst.dwNoteRanges[1]); - TRACE_(dmfile)(" - dwNoteRanges[2]: %lu\n", inst.dwNoteRanges[2]); - TRACE_(dmfile)(" - dwNoteRanges[3]: %lu\n", inst.dwNoteRanges[3]); - TRACE_(dmfile)(" - dwPChannel: %lu\n", inst.dwPChannel); - TRACE_(dmfile)(" - dwFlags: %lx\n", inst.dwFlags); - TRACE_(dmfile)(" - bPan: %u\n", inst.bPan); - TRACE_(dmfile)(" - bVolume: %u\n", inst.bVolume); - TRACE_(dmfile)(" - nTranspose: %d\n", inst.nTranspose); - TRACE_(dmfile)(" - dwChannelPriority: %lu\n", inst.dwChannelPriority); - TRACE_(dmfile)(" - nPitchBendRange: %d\n", inst.nPitchBendRange); - 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_REF_LIST: { - FIXME_(dmfile)(": DMRF (DM References) list\n"); - hr = IDirectMusicUtils_IPersistStream_ParseReference(&This->dmobj.IPersistStream_iface, - &Chunk, pStm, &pObject); - if (FAILED(hr)) { - ERR(": could not load Reference\n"); - 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; - } - } - TRACE_(dmfile)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]); - } while (ListCount[0] < ListSize[0]); - - /* - * @TODO insert pNewInstrument into This - */ - if (!(pNewInstrument = calloc(1, sizeof(*pNewInstrument)))) return E_OUTOFMEMORY; - memcpy(&pNewInstrument->instrument, &inst, sizeof(DMUS_IO_INSTRUMENT)); - pNewInstrument->collection = NULL; - if (NULL != pObject) { - IDirectMusicCollection* pCol = NULL; - hr = IDirectMusicObject_QueryInterface (pObject, &IID_IDirectMusicCollection, (void**) &pCol); - if (FAILED(hr)) { - ERR(": failed to get IDirectMusicCollection Interface from DMObject\n"); - free(pNewInstrument); - return hr; - } - pNewInstrument->collection = pCol; - IDirectMusicObject_Release(pObject); - } - list_add_tail(&This->instruments, &pNewInstrument->entry); - - return S_OK; -} - static HRESULT parse_instruments_list(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) { @@ -342,9 +297,12 @@ static HRESULT parse_instruments_list(struct band *This, DMUS_PRIVATE_CHUNK *pCh ListCount[1] = 0; switch (Chunk.fccID) { case DMUS_FOURCC_INSTRUMENT_LIST: { + static const LARGE_INTEGER zero = {0}; + struct chunk_entry chunk = {FOURCC_LIST, .size = Chunk.dwSize, .type = Chunk.fccID}; TRACE_(dmfile)(": Instrument list\n"); - hr = parse_instrument(This, &Chunk, pStm); - if (FAILED(hr)) return hr; + IStream_Seek(pStm, zero, STREAM_SEEK_CUR, &chunk.offset); + chunk.offset.QuadPart -= 12; + if (FAILED(hr = parse_lbin_list(This, pStm, &chunk))) return hr; break; } default: {
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/band.c | 88 +++++++++++++++------------------------------- 1 file changed, 29 insertions(+), 59 deletions(-)
diff --git a/dlls/dmband/band.c b/dlls/dmband/band.c index a95cf85458a..11f4a120130 100644 --- a/dlls/dmband/band.c +++ b/dlls/dmband/band.c @@ -220,6 +220,30 @@ static HRESULT parse_lbin_list(struct band *This, IStream *stream, struct chunk_ return hr; }
+static HRESULT parse_lbil_list(struct band *This, IStream *stream, struct chunk_entry *parent) +{ + struct chunk_entry chunk = {.parent = parent}; + HRESULT hr; + + while ((hr = stream_next_chunk(stream, &chunk)) == S_OK) + { + switch (MAKE_IDTYPE(chunk.id, chunk.type)) + { + case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_INSTRUMENT_LIST): + hr = parse_lbin_list(This, stream, &chunk); + break; + + default: + FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type)); + break; + } + + if (FAILED(hr)) break; + } + + return hr; +} + static HRESULT WINAPI band_object_ParseDescriptor(IDirectMusicObject *iface, IStream *stream, DMUS_OBJECTDESC *desc) { @@ -269,64 +293,6 @@ static const IDirectMusicObjectVtbl band_object_vtbl = band_object_ParseDescriptor, };
-static HRESULT parse_instruments_list(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, - IStream *pStm) -{ - HRESULT hr; - DMUS_PRIVATE_CHUNK Chunk; - DWORD ListSize[3], ListCount[3]; - LARGE_INTEGER liMove; /* used when skipping chunks */ - - if (pChunk->fccID != DMUS_FOURCC_INSTRUMENTS_LIST) { - ERR_(dmfile)(": %s chunk should be an INSTRUMENTS list\n", debugstr_fourcc (pChunk->fccID)); - return E_FAIL; - } - - ListSize[0] = pChunk->dwSize - sizeof(FOURCC); - ListCount[0] = 0; - - 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 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_INSTRUMENT_LIST: { - static const LARGE_INTEGER zero = {0}; - struct chunk_entry chunk = {FOURCC_LIST, .size = Chunk.dwSize, .type = Chunk.fccID}; - TRACE_(dmfile)(": Instrument list\n"); - IStream_Seek(pStm, zero, STREAM_SEEK_CUR, &chunk.offset); - chunk.offset.QuadPart -= 12; - if (FAILED(hr = parse_lbin_list(This, pStm, &chunk))) return hr; - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); - liMove.QuadPart = ListSize[1]; - 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; - } - } - TRACE_(dmfile)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]); - } while (ListCount[0] < ListSize[0]); - - return S_OK; -} - static HRESULT parse_band_form(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, IStream *pStm) { @@ -392,8 +358,12 @@ static HRESULT parse_band_form(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, break; } case DMUS_FOURCC_INSTRUMENTS_LIST: { + static const LARGE_INTEGER zero = {0}; + struct chunk_entry chunk = {FOURCC_LIST, .size = Chunk.dwSize, .type = Chunk.fccID}; TRACE_(dmfile)(": INSTRUMENTS list\n"); - hr = parse_instruments_list(This, &Chunk, pStm); + IStream_Seek(pStm, zero, STREAM_SEEK_CUR, &chunk.offset); + chunk.offset.QuadPart -= 12; + hr = parse_lbil_list(This, pStm, &chunk); if (FAILED(hr)) return hr; break; }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/band.c | 138 +++++++++++++-------------------------------- 1 file changed, 40 insertions(+), 98 deletions(-)
diff --git a/dlls/dmband/band.c b/dlls/dmband/band.c index 11f4a120130..3a2413b7439 100644 --- a/dlls/dmband/band.c +++ b/dlls/dmband/band.c @@ -244,6 +244,41 @@ static HRESULT parse_lbil_list(struct band *This, IStream *stream, struct chunk_ return hr; }
+static HRESULT parse_dmbd_chunk(struct band *This, IStream *stream, struct chunk_entry *parent) +{ + struct chunk_entry chunk = {.parent = parent}; + HRESULT hr; + + if (FAILED(hr = dmobj_parsedescriptor(stream, parent, &This->dmobj.desc, + DMUS_OBJ_OBJECT|DMUS_OBJ_NAME|DMUS_OBJ_NAME_INAM|DMUS_OBJ_CATEGORY|DMUS_OBJ_VERSION)) + || FAILED(hr = stream_reset_chunk_data(stream, parent))) + return hr; + + while ((hr = stream_next_chunk(stream, &chunk)) == S_OK) + { + switch (MAKE_IDTYPE(chunk.id, chunk.type)) + { + case DMUS_FOURCC_GUID_CHUNK: + case DMUS_FOURCC_VERSION_CHUNK: + case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_UNFO_LIST): + /* already parsed by dmobj_parsedescriptor */ + break; + + case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_INSTRUMENTS_LIST): + hr = parse_lbil_list(This, stream, &chunk); + break; + + default: + FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type)); + break; + } + + if (FAILED(hr)) break; + } + + return hr; +} + static HRESULT WINAPI band_object_ParseDescriptor(IDirectMusicObject *iface, IStream *stream, DMUS_OBJECTDESC *desc) { @@ -293,103 +328,6 @@ static const IDirectMusicObjectVtbl band_object_vtbl = band_object_ParseDescriptor, };
-static HRESULT parse_band_form(struct band *This, DMUS_PRIVATE_CHUNK *pChunk, - IStream *pStm) -{ - HRESULT hr = E_FAIL; - DMUS_PRIVATE_CHUNK Chunk; - DWORD StreamSize, StreamCount, ListSize[3], ListCount[3]; - LARGE_INTEGER liMove; /* used when skipping chunks */ - - GUID tmp_guid; - - if (pChunk->fccID != DMUS_FOURCC_BAND_FORM) { - ERR_(dmfile)(": %s chunk should be a BAND form\n", debugstr_fourcc (pChunk->fccID)); - return E_FAIL; - } - - StreamSize = pChunk->dwSize - sizeof(FOURCC); - StreamCount = 0; - - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - StreamCount += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - - hr = IDirectMusicUtils_IPersistStream_ParseDescGeneric(&Chunk, pStm, &This->dmobj.desc); - if (FAILED(hr)) return hr; - - if (hr == S_FALSE) { - switch (Chunk.fccID) { - case DMUS_FOURCC_GUID_CHUNK: { - TRACE_(dmfile)(": GUID\n"); - IStream_Read (pStm, &tmp_guid, sizeof(GUID), NULL); - TRACE_(dmfile)(" - guid: %s\n", debugstr_dmguid(&tmp_guid)); - break; - } - case FOURCC_LIST: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[0] = Chunk.dwSize - sizeof(FOURCC); - ListCount[0] = 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[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - - hr = IDirectMusicUtils_IPersistStream_ParseUNFOGeneric(&Chunk, pStm, &This->dmobj.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[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]); - } while (ListCount[0] < ListSize[0]); - break; - } - case DMUS_FOURCC_INSTRUMENTS_LIST: { - static const LARGE_INTEGER zero = {0}; - struct chunk_entry chunk = {FOURCC_LIST, .size = Chunk.dwSize, .type = Chunk.fccID}; - TRACE_(dmfile)(": INSTRUMENTS list\n"); - IStream_Seek(pStm, zero, STREAM_SEEK_CUR, &chunk.offset); - chunk.offset.QuadPart -= 12; - hr = parse_lbil_list(This, pStm, &chunk); - 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; - } - } - } - TRACE_(dmfile)(": StreamCount[0] = %ld < StreamSize[0] = %ld\n", StreamCount, StreamSize); - } while (StreamCount < StreamSize); - - return S_OK; -} - static inline struct band *impl_from_IPersistStream(IPersistStream *iface) { return CONTAINING_RECORD(iface, struct band, dmobj.IPersistStream_iface); @@ -412,8 +350,12 @@ static HRESULT WINAPI band_persist_stream_Load(IPersistStream *iface, IStream *p TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); switch (Chunk.fccID) { case DMUS_FOURCC_BAND_FORM: { + static const LARGE_INTEGER zero = {0}; + struct chunk_entry chunk = {FOURCC_LIST, .size = Chunk.dwSize, .type = Chunk.fccID}; TRACE_(dmfile)(": Band form\n"); - hr = parse_band_form(This, &Chunk, pStm); + IStream_Seek(pStm, zero, STREAM_SEEK_CUR, &chunk.offset); + chunk.offset.QuadPart -= 12; + hr = parse_dmbd_chunk(This, pStm, &chunk); if (FAILED(hr)) return hr; break; }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/band.c | 117 ++++++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 60 deletions(-)
diff --git a/dlls/dmband/band.c b/dlls/dmband/band.c index 3a2413b7439..d91775681bb 100644 --- a/dlls/dmband/band.c +++ b/dlls/dmband/band.c @@ -21,7 +21,24 @@ #include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmband); -WINE_DECLARE_DEBUG_CHANNEL(dmfile); + +void dump_DMUS_IO_INSTRUMENT(DMUS_IO_INSTRUMENT *inst) +{ + TRACE("DMUS_IO_INSTRUMENT: %p\n", inst); + TRACE(" - dwPatch: %lu\n", inst->dwPatch); + TRACE(" - dwAssignPatch: %lu\n", inst->dwAssignPatch); + TRACE(" - dwNoteRanges[0]: %lu\n", inst->dwNoteRanges[0]); + TRACE(" - dwNoteRanges[1]: %lu\n", inst->dwNoteRanges[1]); + TRACE(" - dwNoteRanges[2]: %lu\n", inst->dwNoteRanges[2]); + TRACE(" - dwNoteRanges[3]: %lu\n", inst->dwNoteRanges[3]); + TRACE(" - dwPChannel: %lu\n", inst->dwPChannel); + TRACE(" - dwFlags: %lx\n", inst->dwFlags); + TRACE(" - bPan: %u\n", inst->bPan); + TRACE(" - bVolume: %u\n", inst->bVolume); + TRACE(" - nTranspose: %d\n", inst->nTranspose); + TRACE(" - dwChannelPriority: %lu\n", inst->dwChannelPriority); + TRACE(" - nPitchBendRange: %d\n", inst->nPitchBendRange); +}
struct instrument_entry { @@ -171,32 +188,15 @@ static HRESULT parse_lbin_list(struct band *This, IStream *stream, struct chunk_ case DMUS_FOURCC_INSTRUMENT_CHUNK: { UINT size = sizeof(inst); - if (chunk.size == offsetof(DMUS_IO_INSTRUMENT, nPitchBendRange)) size = chunk.size; if (FAILED(hr = stream_chunk_get_data(stream, &chunk, &inst, size))) break; - TRACE_(dmfile)(" - dwPatch: %lu\n", inst.dwPatch); - TRACE_(dmfile)(" - dwAssignPatch: %lu\n", inst.dwAssignPatch); - TRACE_(dmfile)(" - dwNoteRanges[0]: %lu\n", inst.dwNoteRanges[0]); - TRACE_(dmfile)(" - dwNoteRanges[1]: %lu\n", inst.dwNoteRanges[1]); - TRACE_(dmfile)(" - dwNoteRanges[2]: %lu\n", inst.dwNoteRanges[2]); - TRACE_(dmfile)(" - dwNoteRanges[3]: %lu\n", inst.dwNoteRanges[3]); - TRACE_(dmfile)(" - dwPChannel: %lu\n", inst.dwPChannel); - TRACE_(dmfile)(" - dwFlags: %lx\n", inst.dwFlags); - TRACE_(dmfile)(" - bPan: %u\n", inst.bPan); - TRACE_(dmfile)(" - bVolume: %u\n", inst.bVolume); - TRACE_(dmfile)(" - nTranspose: %d\n", inst.nTranspose); - TRACE_(dmfile)(" - dwChannelPriority: %lu\n", inst.dwChannelPriority); - TRACE_(dmfile)(" - nPitchBendRange: %d\n", inst.nPitchBendRange); break; }
case MAKE_IDTYPE(FOURCC_LIST, DMUS_FOURCC_REF_LIST): { IDirectMusicObject *object; - if (FAILED(hr = dmobj_parsereference(stream, &chunk, &object))) break; - TRACE_(dmfile)(" - object: %p\n", object); - hr = IDirectMusicObject_QueryInterface(object, &IID_IDirectMusicCollection, (void **)&collection); IDirectMusicObject_Release(object); break; @@ -333,51 +333,48 @@ static inline struct band *impl_from_IPersistStream(IPersistStream *iface) return CONTAINING_RECORD(iface, struct band, dmobj.IPersistStream_iface); }
-static HRESULT WINAPI band_persist_stream_Load(IPersistStream *iface, IStream *pStm) +static HRESULT WINAPI band_persist_stream_Load(IPersistStream *iface, IStream *stream) { - struct band *This = impl_from_IPersistStream(iface); - DMUS_PRIVATE_CHUNK Chunk; - LARGE_INTEGER liMove; - HRESULT hr; - - TRACE("(%p,%p): loading\n", This, pStm); - - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_RIFF: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case DMUS_FOURCC_BAND_FORM: { - static const LARGE_INTEGER zero = {0}; - struct chunk_entry chunk = {FOURCC_LIST, .size = Chunk.dwSize, .type = Chunk.fccID}; - TRACE_(dmfile)(": Band form\n"); - IStream_Seek(pStm, zero, STREAM_SEEK_CUR, &chunk.offset); - chunk.offset.QuadPart -= 12; - hr = parse_dmbd_chunk(This, pStm, &chunk); - if (FAILED(hr)) return hr; - break; - } - default: { - TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - return E_FAIL; + struct band *This = impl_from_IPersistStream(iface); + struct chunk_entry chunk = {0}; + HRESULT hr; + + TRACE("%p, %p\n", iface, stream); + + if ((hr = stream_get_chunk(stream, &chunk)) == S_OK) + { + switch (MAKE_IDTYPE(chunk.id, chunk.type)) + { + case MAKE_IDTYPE(FOURCC_RIFF, DMUS_FOURCC_BAND_FORM): + hr = parse_dmbd_chunk(This, stream, &chunk); + break; + + default: + WARN("Invalid band chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type)); + hr = DMUS_E_UNSUPPORTED_STREAM; + break; + } } + + if (FAILED(hr)) return hr; + + if (TRACE_ON(dmband)) + { + struct instrument_entry *entry; + + TRACE("Loaded IDirectMusicBand %p\n", This); + dump_DMUS_OBJECTDESC(&This->dmobj.desc); + + TRACE(" - Instruments:\n"); + LIST_FOR_EACH_ENTRY(entry, &This->instruments, struct instrument_entry, entry) + { + dump_DMUS_IO_INSTRUMENT(&entry->instrument); + TRACE(" - collection: %p\n", entry->collection); + } } - TRACE_(dmfile)(": reading finished\n"); - break; - } - default: { - TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */ - return E_FAIL; - } - } - - return S_OK; + + stream_skip_chunk(stream, &chunk); + return S_OK; }
static const IPersistStreamVtbl band_persist_stream_vtbl =
Tests don't fail in DirectMusic DLLs but a random crash later on.
This merge request was approved by Michael Stefaniuc.