Module: wine Branch: master Commit: 89242d8b9401dbd0f709a4a3602194f2a9923ad7 URL: https://source.winehq.org/git/wine.git/?a=commit;h=89242d8b9401dbd0f709a4a36...
Author: Zebediah Figura z.figura12@gmail.com Date: Mon May 13 22:17:56 2019 -0500
strmbase: Determine the pin count using the GetPin() callback.
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/strmbase/enumpins.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/dlls/strmbase/enumpins.c b/dlls/strmbase/enumpins.c index 7aa6611..15d6cab 100644 --- a/dlls/strmbase/enumpins.c +++ b/dlls/strmbase/enumpins.c @@ -27,7 +27,7 @@ typedef struct IEnumPinsImpl { IEnumPins IEnumPins_iface; LONG refCount; - ULONG uIndex; + unsigned int uIndex, count; BaseFilter *base; DWORD Version; } IEnumPinsImpl; @@ -42,6 +42,7 @@ static const struct IEnumPinsVtbl IEnumPinsImpl_Vtbl; HRESULT enum_pins_create(BaseFilter *base, IEnumPins **ppEnum) { IEnumPinsImpl * pEnumPins; + IPin *pin;
if (!ppEnum) return E_POINTER; @@ -59,6 +60,13 @@ HRESULT enum_pins_create(BaseFilter *base, IEnumPins **ppEnum) IBaseFilter_AddRef(&base->IBaseFilter_iface); *ppEnum = &pEnumPins->IEnumPins_iface; pEnumPins->Version = base->pin_version; + pEnumPins->count = 0; + + while ((pin = base->pFuncsTable->pfnGetPin(base, pEnumPins->count))) + { + IPin_Release(pin); + ++pEnumPins->count; + }
TRACE("Created new enumerator (%p)\n", *ppEnum); return S_OK; @@ -161,7 +169,7 @@ static HRESULT WINAPI IEnumPinsImpl_Skip(IEnumPins *iface, ULONG count) if (enum_pins->Version != enum_pins->base->pin_version) return VFW_E_ENUM_OUT_OF_SYNC;
- if (enum_pins->uIndex + count > enum_pins->base->pFuncsTable->pfnGetPinCount(enum_pins->base)) + if (enum_pins->uIndex + count > enum_pins->count) return S_FALSE;
enum_pins->uIndex += count; @@ -171,9 +179,20 @@ static HRESULT WINAPI IEnumPinsImpl_Skip(IEnumPins *iface, ULONG count) static HRESULT WINAPI IEnumPinsImpl_Reset(IEnumPins *iface) { IEnumPinsImpl *enum_pins = impl_from_IEnumPins(iface); + IPin *pin;
TRACE("iface %p.\n", iface);
+ if (enum_pins->Version != enum_pins->base->pin_version) + { + enum_pins->count = 0; + while ((pin = enum_pins->base->pFuncsTable->pfnGetPin(enum_pins->base, enum_pins->count))) + { + IPin_Release(pin); + ++enum_pins->count; + } + } + enum_pins->Version = enum_pins->base->pin_version; enum_pins->uIndex = 0;