[PATCH] dmusic: Set instrument stream position where the instrument begins. Not at the beginning of the instruments list. Simplify CustomLoad accordingly.

Christian Costa titan.costa at gmail.com
Wed Dec 19 02:58:03 CST 2012


---
 dlls/dmusic/collection.c     |    7 +-
 dlls/dmusic/dmusic_private.h |    3 +
 dlls/dmusic/instrument.c     |  158 +++++++++++-------------------------------
 3 files changed, 49 insertions(+), 119 deletions(-)

diff --git a/dlls/dmusic/collection.c b/dlls/dmusic/collection.c
index e4ac798..5002c9e 100644
--- a/dlls/dmusic/collection.c
+++ b/dlls/dmusic/collection.c
@@ -118,7 +118,7 @@ static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_GetInstr
         if (patch == inst_patch) {
             *instrument = inst_entry->pInstrument;
             IDirectMusicInstrument_AddRef(inst_entry->pInstrument);
-            IDirectMusicInstrumentImpl_Custom_Load(inst_entry->pInstrument, This->pStm);
+            IDirectMusicInstrumentImpl_CustomLoad(inst_entry->pInstrument, This->pStm);
             TRACE(": returning instrument %p\n", *instrument);
             return S_OK;
         }
@@ -665,10 +665,11 @@ static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_Load(LPPERSISTST
                                             DMUSIC_CreateDirectMusicInstrumentImpl(&IID_IDirectMusicInstrument, (LPVOID*)&new_instrument->pInstrument, NULL);
                                             {
                                                 IDirectMusicInstrumentImpl *instrument = impl_from_IDirectMusicInstrument(new_instrument->pInstrument);
+                                                /* Store offset and length, they will be needed when loading the instrument */
                                                 liMove.QuadPart = 0;
                                                 IStream_Seek(stream, liMove, STREAM_SEEK_CUR, &dlibInstrumentPosition);
-                                                /* Store offset, it'll be needed later */
-                                                instrument->liInstrumentPosition.QuadPart = dlibInstrumentPosition.QuadPart - (2 * sizeof(FOURCC) + sizeof(DWORD));
+                                                instrument->liInstrumentPosition.QuadPart = dlibInstrumentPosition.QuadPart;
+                                                instrument->length = ListSize[1];
                                                 do {
                                                     IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL);
                                                     ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize;
diff --git a/dlls/dmusic/dmusic_private.h b/dlls/dmusic/dmusic_private.h
index 3e625d6..3c05ceb 100644
--- a/dlls/dmusic/dmusic_private.h
+++ b/dlls/dmusic/dmusic_private.h
@@ -230,6 +230,7 @@ struct IDirectMusicInstrumentImpl {
 
   /* IDirectMusicInstrumentImpl fields */
   LARGE_INTEGER liInstrumentPosition; /* offset in a stream where instrument chunk can be found */
+  ULONG length; /* Length of the instrument in the stream */
   LPGUID pInstrumentID;
   LPINSTHEADER pHeader;
   WCHAR wszName[DMUS_MAX_NAME];
@@ -242,7 +243,7 @@ static inline IDirectMusicInstrumentImpl *impl_from_IDirectMusicInstrument(IDire
 }
 
 /* custom :) */
-extern HRESULT IDirectMusicInstrumentImpl_Custom_Load (LPDIRECTMUSICINSTRUMENT iface, LPSTREAM pStm) DECLSPEC_HIDDEN;
+extern HRESULT IDirectMusicInstrumentImpl_CustomLoad(IDirectMusicInstrument *iface, IStream *stream) DECLSPEC_HIDDEN;
 
 /**********************************************************************
  * Dll lifetime tracking declaration for dmusic.dll
diff --git a/dlls/dmusic/instrument.c b/dlls/dmusic/instrument.c
index 9c3d3d6..cc57313 100644
--- a/dlls/dmusic/instrument.c
+++ b/dlls/dmusic/instrument.c
@@ -156,140 +156,68 @@ static inline DWORD subtract_bytes(DWORD len, DWORD bytes)
     return len - bytes;
 }
 
-static HRESULT load_instrument(IDirectMusicInstrumentImpl *This, IStream *stream, DWORD length)
+static inline HRESULT advance_stream(IStream *stream, ULONG bytes)
 {
-    HRESULT hr;
-    FOURCC fourcc;
-    DWORD bytes;
     LARGE_INTEGER move;
+    HRESULT ret;
 
-    while(length){
-        hr = read_from_stream(stream, &fourcc, sizeof(fourcc));
-        if(FAILED(hr))
-            return hr;
-
-        hr = read_from_stream(stream, &bytes, sizeof(bytes));
-        if(FAILED(hr))
-            return hr;
-
-        length = subtract_bytes(length, sizeof(fourcc) + sizeof(bytes));
-
-        switch(fourcc){
-        case FOURCC_INSH:
-            TRACE("INSH chunk: %u bytes\n", bytes);
-            hr = read_from_stream(stream, This->pHeader, sizeof(*This->pHeader));
-            if(FAILED(hr))
-                return hr;
-
-            move.QuadPart = bytes - sizeof(*This->pHeader);
-            hr = IStream_Seek(stream, move, STREAM_SEEK_CUR, NULL);
-            if(FAILED(hr)){
-                WARN("IStream_Seek failed: %08x\n", hr);
-                return hr;
-            }
-
-            length = subtract_bytes(length, bytes);
-            break;
-
-        case FOURCC_DLID:
-            TRACE("DLID chunk: %u bytes\n", bytes);
-            hr = read_from_stream(stream, This->pInstrumentID, sizeof(*This->pInstrumentID));
-            if(FAILED(hr))
-                return hr;
-
-            move.QuadPart = bytes - sizeof(*This->pInstrumentID);
-            hr = IStream_Seek(stream, move, STREAM_SEEK_CUR, NULL);
-            if(FAILED(hr)){
-                WARN("IStream_Seek failed: %08x\n", hr);
-                return hr;
-            }
-
-            length = subtract_bytes(length, bytes);
-            break;
-
-        default:
-            TRACE("Unknown chunk %s: %u bytes\n", debugstr_fourcc(fourcc), bytes);
-
-            move.QuadPart = bytes;
-            hr = IStream_Seek(stream, move, STREAM_SEEK_CUR, NULL);
-            if(FAILED(hr)){
-                WARN("IStream_Seek failed: %08x\n", hr);
-                return hr;
-            }
-
-            length = subtract_bytes(length, bytes);
-            break;
-        }
-    }
+    move.QuadPart = bytes;
 
-    return S_OK;
+    ret = IStream_Seek(stream, move, STREAM_SEEK_CUR, NULL);
+    if (FAILED(ret))
+        WARN("IStream_Seek failed: %08x\n", ret);
+
+    return ret;
 }
 
-/* aux. function that completely loads instrument; my tests indicate that it's 
-   called somewhere around IDirectMusicCollection_GetInstrument */
-HRESULT IDirectMusicInstrumentImpl_Custom_Load(LPDIRECTMUSICINSTRUMENT iface, LPSTREAM stream)
+/* Function that loads all instrument data and which is called from IDirectMusicCollection_GetInstrument as in native */
+HRESULT IDirectMusicInstrumentImpl_CustomLoad(IDirectMusicInstrument *iface, IStream *stream)
 {
     IDirectMusicInstrumentImpl *This = impl_from_IDirectMusicInstrument(iface);
-    LARGE_INTEGER move;
-    FOURCC fourcc;
-    DWORD bytes;
     HRESULT hr;
+    DMUS_PRIVATE_CHUNK chunk;
+    ULONG length = This->length;
 
-    TRACE("(%p, %p, offset = %s)\n", This, stream, wine_dbgstr_longlong(This->liInstrumentPosition.QuadPart));
+    TRACE("(%p, %p): offset = 0x%s, length = %u)\n", This, stream, wine_dbgstr_longlong(This->liInstrumentPosition.QuadPart), This->length);
 
     hr = IStream_Seek(stream, This->liInstrumentPosition, STREAM_SEEK_SET, NULL);
-    if(FAILED(hr)){
+    if (FAILED(hr))
+    {
         WARN("IStream_Seek failed: %08x\n", hr);
-        goto load_failure;
+        return DMUS_E_UNSUPPORTED_STREAM;
     }
 
-    hr = read_from_stream(stream, &fourcc, sizeof(fourcc));
-    if(FAILED(hr))
-        goto load_failure;
+    while (length)
+    {
+        hr = read_from_stream(stream, &chunk, sizeof(chunk));
+        if (FAILED(hr))
+            return DMUS_E_UNSUPPORTED_STREAM;
 
-    if(fourcc != FOURCC_LIST){
-        WARN("Loading failed: Expected LIST chunk, got: %s\n", debugstr_fourcc(fourcc));
-        goto load_failure;
-    }
+        length = subtract_bytes(length, sizeof(chunk) + chunk.dwSize);
+
+        switch (chunk.fccID)
+        {
+            case FOURCC_INSH:
+            case FOURCC_DLID:
+                TRACE("Chunk %s: %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize);
+
+                /* Instrument header and id are already set so just skip */
+                hr = advance_stream(stream, chunk.dwSize);
+                if (FAILED(hr))
+                    return DMUS_E_UNSUPPORTED_STREAM;
 
-    hr = read_from_stream(stream, &bytes, sizeof(bytes));
-    if(FAILED(hr))
-        goto load_failure;
-
-    TRACE("LIST chunk: %u bytes\n", bytes);
-    while(1){
-        hr = read_from_stream(stream, &fourcc, sizeof(fourcc));
-        if(FAILED(hr))
-            goto load_failure;
-
-        switch(fourcc){
-        case FOURCC_INS:
-            TRACE("INS  chunk: (no byte count)\n");
-            hr = load_instrument(This, stream, bytes - sizeof(FOURCC));
-            if(FAILED(hr))
-                goto load_failure;
-            break;
-
-        default:
-            hr = read_from_stream(stream, &bytes, sizeof(bytes));
-            if(FAILED(hr))
-                goto load_failure;
-
-            TRACE("Unknown chunk %s: %u bytes\n", debugstr_fourcc(fourcc), bytes);
-
-            move.QuadPart = bytes;
-            hr = IStream_Seek(stream, move, STREAM_SEEK_CUR, NULL);
-            if(FAILED(hr)){
-                WARN("IStream_Seek failed: %08x\n", hr);
-                return hr;
-            }
-
-            break;
+                break;
+
+            default:
+                TRACE("Unknown chunk %s: %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize);
+
+                hr = advance_stream(stream, chunk.dwSize);
+                if (FAILED(hr))
+                    return DMUS_E_UNSUPPORTED_STREAM;
+
+                break;
         }
     }
 
     return S_OK;
-
-load_failure:
-    return DMUS_E_UNSUPPORTED_STREAM;
 }




More information about the wine-patches mailing list