[PATCH v5] dmime: Parse TimeSig track data.
Michael Stefaniuc
mstefani at winehq.org
Fri Aug 7 09:22:38 CDT 2020
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
On 8/7/20 8:17 AM, Alistair Leslie-Hughes wrote:
> Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at 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 = {
>
More information about the wine-devel
mailing list