Christian Costa : dmusic: Add support for loading articulations.
Alexandre Julliard
julliard at winehq.org
Tue Jan 22 14:52:21 CST 2013
Module: wine
Branch: master
Commit: 2562969804782c043f6e676339c742cac5a11a1c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2562969804782c043f6e676339c742cac5a11a1c
Author: Christian Costa <titan.costa at gmail.com>
Date: Tue Jan 22 08:35:56 2013 +0100
dmusic: Add support for loading articulations.
---
dlls/dmusic/dmusic_private.h | 7 ++++
dlls/dmusic/instrument.c | 69 +++++++++++++++++++++++++++++++++++++++++-
2 files changed, 75 insertions(+), 1 deletions(-)
diff --git a/dlls/dmusic/dmusic_private.h b/dlls/dmusic/dmusic_private.h
index ff16833..badc2df 100644
--- a/dlls/dmusic/dmusic_private.h
+++ b/dlls/dmusic/dmusic_private.h
@@ -85,6 +85,11 @@ typedef struct instrument_region {
BOOL loop_present;
} instrument_region;
+typedef struct instrument_articulation {
+ CONNECTIONLIST connections_list;
+ CONNECTION *connections;
+} instrument_articulation;
+
/*****************************************************************************
* ClassFactory
*/
@@ -245,6 +250,8 @@ struct IDirectMusicInstrumentImpl {
/* instrument data */
BOOL loaded;
instrument_region *regions;
+ ULONG nb_articulations;
+ instrument_articulation *articulations;
};
static inline IDirectMusicInstrumentImpl *impl_from_IDirectMusicInstrument(IDirectMusicInstrument *iface)
diff --git a/dlls/dmusic/instrument.c b/dlls/dmusic/instrument.c
index d6de0db..9df3e0c 100644
--- a/dlls/dmusic/instrument.c
+++ b/dlls/dmusic/instrument.c
@@ -76,7 +76,12 @@ static ULONG WINAPI IDirectMusicInstrumentImpl_Release(LPDIRECTMUSICINSTRUMENT i
if (!ref)
{
+ ULONG i;
+
HeapFree(GetProcessHeap(), 0, This->regions);
+ for (i = 0; i < This->nb_articulations; i++)
+ HeapFree(GetProcessHeap(), 0, This->articulations->connections);
+ HeapFree(GetProcessHeap(), 0, This->articulations);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -243,6 +248,42 @@ static HRESULT load_region(IDirectMusicInstrumentImpl *This, IStream *stream, in
return S_OK;
}
+static HRESULT load_articulation(IDirectMusicInstrumentImpl *This, IStream *stream, ULONG length)
+{
+ HRESULT ret;
+ instrument_articulation *articulation;
+
+ if (!This->articulations)
+ This->articulations = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->articulations));
+ else
+ This->articulations = HeapReAlloc(GetProcessHeap(), 0, This->articulations, sizeof(*This->articulations) * (This->nb_articulations + 1));
+ if (!This->articulations)
+ return E_OUTOFMEMORY;
+
+ articulation = &This->articulations[This->nb_articulations];
+
+ ret = read_from_stream(stream, &articulation->connections_list, sizeof(CONNECTIONLIST));
+ if (FAILED(ret))
+ return ret;
+
+ articulation->connections = HeapAlloc(GetProcessHeap(), 0, sizeof(CONNECTION) * articulation->connections_list.cConnections);
+ if (!articulation->connections)
+ return E_OUTOFMEMORY;
+
+ ret = read_from_stream(stream, articulation->connections, sizeof(CONNECTION) * articulation->connections_list.cConnections);
+ if (FAILED(ret))
+ {
+ HeapFree(GetProcessHeap(), 0, articulation->connections);
+ return ret;
+ }
+
+ subtract_bytes(length, sizeof(CONNECTIONLIST) + sizeof(CONNECTION) * articulation->connections_list.cConnections);
+
+ This->nb_articulations++;
+
+ return S_OK;
+}
+
/* Function that loads all instrument data and which is called from IDirectMusicCollection_GetInstrument as in native */
HRESULT IDirectMusicInstrumentImpl_CustomLoad(IDirectMusicInstrument *iface, IStream *stream)
{
@@ -323,7 +364,7 @@ HRESULT IDirectMusicInstrumentImpl_CustomLoad(IDirectMusicInstrument *iface, ISt
if (chunk.fccID == FOURCC_RGN)
{
- TRACE("RGN chunk (region list): %u bytes\n", chunk.dwSize);
+ TRACE("RGN chunk (region): %u bytes\n", chunk.dwSize);
hr = load_region(This, stream, &This->regions[i++], chunk.dwSize - sizeof(chunk.fccID));
}
else
@@ -338,6 +379,32 @@ HRESULT IDirectMusicInstrumentImpl_CustomLoad(IDirectMusicInstrument *iface, ISt
}
break;
+ case FOURCC_LART:
+ TRACE("LART chunk (articulations list): %u bytes\n", size);
+
+ while (size)
+ {
+ hr = read_from_stream(stream, &chunk, sizeof(chunk));
+ if (FAILED(hr))
+ goto error;
+
+ if (chunk.fccID == FOURCC_ART1)
+ {
+ TRACE("ART1 chunk (level 1 articulation): %u bytes\n", chunk.dwSize);
+ hr = load_articulation(This, stream, chunk.dwSize);
+ }
+ else
+ {
+ TRACE("Unknown chunk %s: %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize);
+ hr = advance_stream(stream, chunk.dwSize);
+ }
+ if (FAILED(hr))
+ goto error;
+
+ size = subtract_bytes(size, chunk.dwSize + sizeof(chunk));
+ }
+ break;
+
default:
TRACE("Unknown chunk %s: %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize);
More information about the wine-cvs
mailing list