[PATCH] dmime: Move finding a track to a help function

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Tue Mar 24 02:53:07 CDT 2020


Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/dmime/segment.c | 98 ++++++++++++++++++++++++++------------------
 1 file changed, 57 insertions(+), 41 deletions(-)

diff --git a/dlls/dmime/segment.c b/dlls/dmime/segment.c
index 0455b6c5ddf..cfc67a7757d 100644
--- a/dlls/dmime/segment.c
+++ b/dlls/dmime/segment.c
@@ -160,53 +160,69 @@ static HRESULT WINAPI IDirectMusicSegment8Impl_SetDefaultResolution(IDirectMusic
   return S_OK;
 }
 
+static LPDMUS_PRIVATE_SEGMENT_TRACK get_track_entry(IDirectMusicSegment8Impl *This, REFGUID type,
+                DWORD group, DWORD index)
+{
+    struct list* pEntry = NULL;
+    LPDMUS_PRIVATE_SEGMENT_TRACK pIt = NULL;
+    CLSID pIt_clsid;
+    IPersistStream* pCLSIDStream = NULL;
+
+    LIST_FOR_EACH (pEntry, &This->Tracks) {
+        pIt = LIST_ENTRY(pEntry, DMUS_PRIVATE_SEGMENT_TRACK, entry);
+        TRACE(" - %p -> 0x%x,%p\n", pIt, pIt->dwGroupBits, pIt->pTrack);
+        if (0xFFFFFFFF != group && 0 == (pIt->dwGroupBits & group)) continue;
+        if (!IsEqualGUID(&GUID_NULL, type)) {
+            HRESULT hr;
+            /**
+             * it rguidType is not null we must check if CLSIDs are equal
+             * and the unique way to get it is using IPersistStream Interface
+             */
+            hr = IDirectMusicTrack_QueryInterface(pIt->pTrack, &IID_IPersistStream, (void**) &pCLSIDStream);
+            if (FAILED(hr)) {
+                ERR("(%p): object %p don't implement IPersistStream Interface. Expect a crash (critical problem)\n",
+                        This, pIt->pTrack);
+                continue;
+            }
+            hr = IPersistStream_GetClassID(pCLSIDStream, &pIt_clsid);
+            IPersistStream_Release(pCLSIDStream); pCLSIDStream = NULL;
+            if (FAILED(hr)) {
+                ERR("(%p): non-implemented GetClassID for object %p\n", This, pIt->pTrack);
+                continue;
+            }
+            TRACE(" - %p -> %s\n", pIt, debugstr_dmguid(&pIt_clsid));
+            if (!IsEqualGUID(&pIt_clsid, type)) continue;
+        }
+        if (0 == index) {
+            return pIt;
+        }
+        --index;
+    }
+
+    return NULL;
+}
+
 static HRESULT WINAPI IDirectMusicSegment8Impl_GetTrack(IDirectMusicSegment8 *iface,
-        REFGUID rguidType, DWORD dwGroupBits, DWORD dwIndex, IDirectMusicTrack **ppTrack)
+        REFGUID type, DWORD group, DWORD index, IDirectMusicTrack **track)
 {
-  IDirectMusicSegment8Impl *This = impl_from_IDirectMusicSegment8(iface);
-  CLSID pIt_clsid;
-  struct list* pEntry = NULL;
-  LPDMUS_PRIVATE_SEGMENT_TRACK pIt = NULL;
-  IPersistStream* pCLSIDStream = NULL;
-  HRESULT hr = S_OK;
+    IDirectMusicSegment8Impl *This = impl_from_IDirectMusicSegment8(iface);
+    LPDMUS_PRIVATE_SEGMENT_TRACK item = NULL;
 
-  TRACE("(%p, %s, %#x, %#x, %p)\n", This, debugstr_dmguid(rguidType), dwGroupBits, dwIndex, ppTrack);
+    TRACE("(%p, %s, %#x, %#x, %p)\n", This, debugstr_dmguid(type), group, index, track);
 
-  if (NULL == ppTrack) {
-    return E_POINTER;
-  }
+    if (!track) {
+        return E_POINTER;
+    }
 
-  LIST_FOR_EACH (pEntry, &This->Tracks) {
-    pIt = LIST_ENTRY(pEntry, DMUS_PRIVATE_SEGMENT_TRACK, entry);
-    TRACE(" - %p -> 0x%x,%p\n", pIt, pIt->dwGroupBits, pIt->pTrack);
-    if (0xFFFFFFFF != dwGroupBits && 0 == (pIt->dwGroupBits & dwGroupBits)) continue ;
-    if (FALSE == IsEqualGUID(&GUID_NULL, rguidType)) {
-      /**
-       * it rguidType is not null we must check if CLSIDs are equal
-       * and the unique way to get it is using IPersistStream Interface
-       */
-      hr = IDirectMusicTrack_QueryInterface(pIt->pTrack, &IID_IPersistStream, (void**) &pCLSIDStream);
-      if (FAILED(hr)) {
-	ERR("(%p): object %p don't implement IPersistStream Interface. Expect a crash (critical problem)\n", This, pIt->pTrack);
-	continue ;
-      }
-      hr = IPersistStream_GetClassID(pCLSIDStream, &pIt_clsid);
-      IPersistStream_Release(pCLSIDStream); pCLSIDStream = NULL;
-      if (FAILED(hr)) {
-	ERR("(%p): non-implemented GetClassID for object %p\n", This, pIt->pTrack);
-	continue ;
-      }
-      TRACE(" - %p -> %s\n", pIt, debugstr_dmguid(&pIt_clsid));
-      if (FALSE == IsEqualGUID(&pIt_clsid, rguidType)) continue ;
+    item = get_track_entry(This, type, group, index);
+    if (item)
+    {
+          *track = item->pTrack;
+          IDirectMusicTrack_AddRef(*track);
+          return S_OK;
     }
-    if (0 == dwIndex) {
-      *ppTrack = pIt->pTrack;
-      IDirectMusicTrack_AddRef(*ppTrack);
-      return S_OK;
-    } 
-    --dwIndex;
-  }  
-  return DMUS_E_NOT_FOUND;
+
+    return DMUS_E_NOT_FOUND;
 }
 
 static HRESULT WINAPI IDirectMusicSegment8Impl_GetTrackGroup(IDirectMusicSegment8 *iface,
-- 
2.25.1




More information about the wine-devel mailing list