Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com --- dlls/dmime/timesigtrack.c | 64 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-)
diff --git a/dlls/dmime/timesigtrack.c b/dlls/dmime/timesigtrack.c index 697b3e3593b..30432378cfa 100644 --- a/dlls/dmime/timesigtrack.c +++ b/dlls/dmime/timesigtrack.c @@ -19,6 +19,7 @@
#include "dmime_private.h" #include "dmobject.h" +#include "wine/heap.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
@@ -29,6 +30,9 @@ typedef struct IDirectMusicTimeSigTrack { IDirectMusicTrack IDirectMusicTrack_iface; struct dmobject dmobj; /* IPersistStream only */ LONG ref; + + DMUS_IO_TIMESIGNATURE_ITEM *items; + unsigned int count; } IDirectMusicTimeSigTrack;
/* IDirectMusicTimeSigTrack IDirectMusicTrack8 part: */ @@ -37,6 +41,11 @@ static inline IDirectMusicTimeSigTrack *impl_from_IDirectMusicTrack(IDirectMusic return CONTAINING_RECORD(iface, IDirectMusicTimeSigTrack, IDirectMusicTrack_iface); }
+static inline IDirectMusicTimeSigTrack *impl_from_IPersistStream(IPersistStream *iface) +{ + return CONTAINING_RECORD(iface, IDirectMusicTimeSigTrack, dmobj.IPersistStream_iface); +} + static HRESULT WINAPI IDirectMusicTrackImpl_QueryInterface(IDirectMusicTrack *iface, REFIID riid, void **ret_iface) { @@ -77,6 +86,7 @@ static ULONG WINAPI IDirectMusicTrackImpl_Release(IDirectMusicTrack *iface) TRACE("(%p) ref=%d\n", This, ref);
if (!ref) { + heap_free(This->items); HeapFree(GetProcessHeap(), 0, This); DMIME_UnlockModule(); } @@ -207,10 +217,60 @@ static const IDirectMusicTrackVtbl dmtack_vtbl = { IDirectMusicTrackImpl_Clone };
+static HRESULT parse_timetrack_list(IDirectMusicTimeSigTrack *This, IStream *stream, + struct chunk_entry *timesig) +{ + HRESULT hr; + struct chunk_entry chunk = {.parent = timesig}; + int i; + + TRACE("Parsing segment form in %p: %s\n", stream, debugstr_chunk(timesig)); + + if (FAILED(hr = stream_next_chunk(stream, &chunk))) { + WARN("Failed to read data of %s\n", debugstr_chunk(&chunk)); + return hr; + } + + if (chunk.id != DMUS_FOURCC_TIMESIGNATURE_TRACK) + return DMUS_E_UNSUPPORTED_STREAM; + + hr = stream_chunk_get_array(stream, &chunk, (void **)&This->items, &This->count, + sizeof(DMUS_IO_TIMESIGNATURE_ITEM)); + if (FAILED(hr)) + return hr; + + for (i = 0; i < This->count; i++) + { + TRACE("Found DMUS_IO_TIMESIGNATURE_ITEM\n"); + TRACE(" - lTime %d\n", This->items[i].lTime); + TRACE(" - bBeatsPerMeasure %d\n", This->items[i].bBeatsPerMeasure); + TRACE(" - bBeat %d\n", This->items[i].bBeat); + TRACE(" - wGridsPerBeat %d\n", This->items[i].wGridsPerBeat); + } + + return S_OK; +} + static HRESULT WINAPI time_IPersistStream_Load(IPersistStream *iface, IStream *stream) { - FIXME(": Loading not implemented yet\n"); - return S_OK; + IDirectMusicTimeSigTrack *This = impl_from_IPersistStream(iface); + HRESULT hr; + struct chunk_entry chunk = {0}; + + TRACE("%p, %p\n", This, stream); + + if (!stream) + return E_POINTER; + + if ((hr = stream_get_chunk(stream, &chunk) != S_OK)) + return hr; + + if (chunk.id == FOURCC_LIST && chunk.type == DMUS_FOURCC_TIMESIGTRACK_LIST) + hr = parse_timetrack_list(This, stream, &chunk); + else + hr = DMUS_E_UNSUPPORTED_STREAM; + + return hr; }
static const IPersistStreamVtbl persiststream_vtbl = {
Signed-off-by: Michael Stefaniuc mstefani@winehq.org
On 8/7/20 8:17 AM, Alistair Leslie-Hughes wrote:
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com
dlls/dmime/timesigtrack.c | 64 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-)
diff --git a/dlls/dmime/timesigtrack.c b/dlls/dmime/timesigtrack.c index 697b3e3593b..30432378cfa 100644 --- a/dlls/dmime/timesigtrack.c +++ b/dlls/dmime/timesigtrack.c @@ -19,6 +19,7 @@
#include "dmime_private.h" #include "dmobject.h" +#include "wine/heap.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
@@ -29,6 +30,9 @@ typedef struct IDirectMusicTimeSigTrack { IDirectMusicTrack IDirectMusicTrack_iface; struct dmobject dmobj; /* IPersistStream only */ LONG ref;
- DMUS_IO_TIMESIGNATURE_ITEM *items;
- unsigned int count;
} IDirectMusicTimeSigTrack;
/* IDirectMusicTimeSigTrack IDirectMusicTrack8 part: */ @@ -37,6 +41,11 @@ static inline IDirectMusicTimeSigTrack *impl_from_IDirectMusicTrack(IDirectMusic return CONTAINING_RECORD(iface, IDirectMusicTimeSigTrack, IDirectMusicTrack_iface); }
+static inline IDirectMusicTimeSigTrack *impl_from_IPersistStream(IPersistStream *iface) +{
- return CONTAINING_RECORD(iface, IDirectMusicTimeSigTrack, dmobj.IPersistStream_iface);
+}
static HRESULT WINAPI IDirectMusicTrackImpl_QueryInterface(IDirectMusicTrack *iface, REFIID riid, void **ret_iface) { @@ -77,6 +86,7 @@ static ULONG WINAPI IDirectMusicTrackImpl_Release(IDirectMusicTrack *iface) TRACE("(%p) ref=%d\n", This, ref);
if (!ref) {
}heap_free(This->items); HeapFree(GetProcessHeap(), 0, This); DMIME_UnlockModule();
@@ -207,10 +217,60 @@ static const IDirectMusicTrackVtbl dmtack_vtbl = { IDirectMusicTrackImpl_Clone };
+static HRESULT parse_timetrack_list(IDirectMusicTimeSigTrack *This, IStream *stream,
struct chunk_entry *timesig)
+{
- HRESULT hr;
- struct chunk_entry chunk = {.parent = timesig};
- int i;
- TRACE("Parsing segment form in %p: %s\n", stream, debugstr_chunk(timesig));
- if (FAILED(hr = stream_next_chunk(stream, &chunk))) {
WARN("Failed to read data of %s\n", debugstr_chunk(&chunk));
return hr;
- }
- if (chunk.id != DMUS_FOURCC_TIMESIGNATURE_TRACK)
return DMUS_E_UNSUPPORTED_STREAM;
- hr = stream_chunk_get_array(stream, &chunk, (void **)&This->items, &This->count,
sizeof(DMUS_IO_TIMESIGNATURE_ITEM));
- if (FAILED(hr))
return hr;
- for (i = 0; i < This->count; i++)
- {
TRACE("Found DMUS_IO_TIMESIGNATURE_ITEM\n");
TRACE(" - lTime %d\n", This->items[i].lTime);
TRACE(" - bBeatsPerMeasure %d\n", This->items[i].bBeatsPerMeasure);
TRACE(" - bBeat %d\n", This->items[i].bBeat);
TRACE(" - wGridsPerBeat %d\n", This->items[i].wGridsPerBeat);
- }
- return S_OK;
+}
static HRESULT WINAPI time_IPersistStream_Load(IPersistStream *iface, IStream *stream) {
- FIXME(": Loading not implemented yet\n");
- return S_OK;
- IDirectMusicTimeSigTrack *This = impl_from_IPersistStream(iface);
- HRESULT hr;
- struct chunk_entry chunk = {0};
- TRACE("%p, %p\n", This, stream);
- if (!stream)
return E_POINTER;
- if ((hr = stream_get_chunk(stream, &chunk) != S_OK))
return hr;
- if (chunk.id == FOURCC_LIST && chunk.type == DMUS_FOURCC_TIMESIGTRACK_LIST)
hr = parse_timetrack_list(This, stream, &chunk);
- else
hr = DMUS_E_UNSUPPORTED_STREAM;
- return hr;
}
static const IPersistStreamVtbl persiststream_vtbl = {