Zebediah Figura : strmbase: Determine the pin count using the GetPin() callback.
Alexandre Julliard
julliard at winehq.org
Tue May 14 15:43:01 CDT 2019
Module: wine
Branch: master
Commit: 89242d8b9401dbd0f709a4a3602194f2a9923ad7
URL: https://source.winehq.org/git/wine.git/?a=commit;h=89242d8b9401dbd0f709a4a3602194f2a9923ad7
Author: Zebediah Figura <z.figura12 at 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 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
More information about the wine-cvs
mailing list