dmime: Parse TimeSig track data.
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com> Signed-off-by: Michael Stefaniuc <mstefani@winehq.org> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
72517ff187
commit
6a67f56a52
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include "dmime_private.h"
|
#include "dmime_private.h"
|
||||||
#include "dmobject.h"
|
#include "dmobject.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
|
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
|
||||||
|
|
||||||
|
@ -29,6 +30,9 @@ typedef struct IDirectMusicTimeSigTrack {
|
||||||
IDirectMusicTrack IDirectMusicTrack_iface;
|
IDirectMusicTrack IDirectMusicTrack_iface;
|
||||||
struct dmobject dmobj; /* IPersistStream only */
|
struct dmobject dmobj; /* IPersistStream only */
|
||||||
LONG ref;
|
LONG ref;
|
||||||
|
|
||||||
|
DMUS_IO_TIMESIGNATURE_ITEM *items;
|
||||||
|
unsigned int count;
|
||||||
} IDirectMusicTimeSigTrack;
|
} IDirectMusicTimeSigTrack;
|
||||||
|
|
||||||
/* IDirectMusicTimeSigTrack IDirectMusicTrack8 part: */
|
/* IDirectMusicTimeSigTrack IDirectMusicTrack8 part: */
|
||||||
|
@ -37,6 +41,11 @@ static inline IDirectMusicTimeSigTrack *impl_from_IDirectMusicTrack(IDirectMusic
|
||||||
return CONTAINING_RECORD(iface, IDirectMusicTimeSigTrack, IDirectMusicTrack_iface);
|
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,
|
static HRESULT WINAPI IDirectMusicTrackImpl_QueryInterface(IDirectMusicTrack *iface, REFIID riid,
|
||||||
void **ret_iface)
|
void **ret_iface)
|
||||||
{
|
{
|
||||||
|
@ -77,6 +86,7 @@ static ULONG WINAPI IDirectMusicTrackImpl_Release(IDirectMusicTrack *iface)
|
||||||
TRACE("(%p) ref=%d\n", This, ref);
|
TRACE("(%p) ref=%d\n", This, ref);
|
||||||
|
|
||||||
if (!ref) {
|
if (!ref) {
|
||||||
|
heap_free(This->items);
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
DMIME_UnlockModule();
|
DMIME_UnlockModule();
|
||||||
}
|
}
|
||||||
|
@ -207,10 +217,60 @@ static const IDirectMusicTrackVtbl dmtack_vtbl = {
|
||||||
IDirectMusicTrackImpl_Clone
|
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)
|
static HRESULT WINAPI time_IPersistStream_Load(IPersistStream *iface, IStream *stream)
|
||||||
{
|
{
|
||||||
FIXME(": Loading not implemented yet\n");
|
IDirectMusicTimeSigTrack *This = impl_from_IPersistStream(iface);
|
||||||
return S_OK;
|
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 = {
|
static const IPersistStreamVtbl persiststream_vtbl = {
|
||||||
|
|
Loading…
Reference in New Issue