[PATCH] dmime: Parse TimeSig track data.

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Thu Jul 30 18:18:34 CDT 2020


Hi Michael,

This is causing an error for me,  I'll submit a new version shortly.

Regards.
Alistair

On 31/7/20 7:42 am, Michael Stefaniuc wrote:
> From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
> 
> Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
> Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
> ---
> v2: Pass the buffer/expected size to stream_chunk_get_data()
> 
> 
>   dlls/dmime/timesigtrack.c | 54 +++++++++++++++++++++++++++++++++++++--
>   1 file changed, 52 insertions(+), 2 deletions(-)
> 
> diff --git a/dlls/dmime/timesigtrack.c b/dlls/dmime/timesigtrack.c
> index 697b3e3593b..a85f134e0f1 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,55 @@ 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};
> +    DMUS_IO_TIMESIGNATURE_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("Found DMUS_IO_TIMESIGNATURE_ITEM\n");
> +        TRACE("  - lTime %d\n", item.lTime);
> +        TRACE("  - bBeatsPerMeasure %d\n", item.bBeatsPerMeasure);
> +        TRACE("  - bBeat %d\n", item.bBeat);
> +        TRACE("  - wGridsPerBeat %d\n", item.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 = {
> 



More information about the wine-devel mailing list