[PATCH v2] dmime: Parse TimeSig track data.
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Thu Jul 30 19:32:03 CDT 2020
The tims data actually has a DWORD (size) before the structure.
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
dlls/dmime/timesigtrack.c | 61 +++++++++++++++++++++++++++++++++++++--
1 file changed, 59 insertions(+), 2 deletions(-)
diff --git a/dlls/dmime/timesigtrack.c b/dlls/dmime/timesigtrack.c
index 697b3e3593b..f61e87806e9 100644
--- a/dlls/dmime/timesigtrack.c
+++ b/dlls/dmime/timesigtrack.c
@@ -37,6 +37,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)
{
@@ -207,10 +212,62 @@ static const IDirectMusicTrackVtbl dmtack_vtbl = {
IDirectMusicTrackImpl_Clone
};
+struct timesig_item
+{
+ DWORD size;
+ DMUS_IO_TIMESIGNATURE_ITEM timesig;
+};
+
+static HRESULT parse_timetrack_list(IDirectMusicTimeSigTrack *This, IStream *stream,
+ struct chunk_entry *timesig)
+{
+ HRESULT hr;
+ struct chunk_entry chunk = {.parent = timesig};
+ struct timesig_item item;
+
+ TRACE("Parsing segment form in %p: %s\n", stream, debugstr_chunk(timesig));
+
+ while ((hr = stream_next_chunk(stream, &chunk)) == S_OK) {
+ if (chunk.id != DMUS_FOURCC_TIMESIGNATURE_TRACK)
+ return DMUS_E_UNSUPPORTED_STREAM;
+
+ if (FAILED(hr = stream_chunk_get_data(stream, &chunk, &item, sizeof(item)))) {
+ WARN("Failed to read data of %s\n", debugstr_chunk(&chunk));
+ return hr;
+ }
+
+ TRACE(" Size %d\n", item.size);
+
+ TRACE("Found DMUS_IO_TIMESIGNATURE_ITEM\n");
+ TRACE(" - lTime %d\n", item.timesig.lTime);
+ TRACE(" - bBeatsPerMeasure %d\n", item.timesig.bBeatsPerMeasure);
+ TRACE(" - bBeat %d\n", item.timesig.bBeat);
+ TRACE(" - wGridsPerBeat %d\n", item.timesig.wGridsPerBeat);
+ }
+
+ return SUCCEEDED(hr) ? S_OK : hr;
+}
+
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 = {
--
2.27.0
More information about the wine-devel
mailing list