Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/tests/Makefile.in | 1 + dlls/qcap/tests/audiorecord.c | 103 ++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 dlls/qcap/tests/audiorecord.c
diff --git a/dlls/qcap/tests/Makefile.in b/dlls/qcap/tests/Makefile.in index 7a6336bce2..80b19624d7 100644 --- a/dlls/qcap/tests/Makefile.in +++ b/dlls/qcap/tests/Makefile.in @@ -2,5 +2,6 @@ TESTDLL = qcap.dll IMPORTS = strmiids uuid oleaut32 ole32 advapi32
C_SRCS = \ + audiorecord.c \ qcap.c \ smartteefilter.c diff --git a/dlls/qcap/tests/audiorecord.c b/dlls/qcap/tests/audiorecord.c new file mode 100644 index 0000000000..fb292cff5f --- /dev/null +++ b/dlls/qcap/tests/audiorecord.c @@ -0,0 +1,103 @@ +/* + * Audio capture filter unit tests + * + * Copyright 2018 Zebediah Figura + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS +#include "dshow.h" +#include "wine/test.h" + +#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) +static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported) +{ + IUnknown *iface = iface_ptr; + HRESULT hr, expected_hr; + IUnknown *unk; + + expected_hr = supported ? S_OK : E_NOINTERFACE; + + hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); + if (SUCCEEDED(hr)) + IUnknown_Release(unk); +} + +static void test_interfaces(IBaseFilter *filter) +{ + todo_wine check_interface(filter, &IID_IAMFilterMiscFlags, TRUE); + check_interface(filter, &IID_IBaseFilter, TRUE); + check_interface(filter, &IID_IMediaFilter, TRUE); + check_interface(filter, &IID_IPersist, TRUE); + check_interface(filter, &IID_IPersistPropertyBag, TRUE); + check_interface(filter, &IID_IUnknown, TRUE); + + check_interface(filter, &IID_IBasicAudio, FALSE); + check_interface(filter, &IID_IBasicVideo, FALSE); + check_interface(filter, &IID_IKsPropertySet, FALSE); + check_interface(filter, &IID_IMediaPosition, FALSE); + check_interface(filter, &IID_IMediaSeeking, FALSE); + check_interface(filter, &IID_IPin, FALSE); + check_interface(filter, &IID_IQualityControl, FALSE); + check_interface(filter, &IID_IQualProp, FALSE); + check_interface(filter, &IID_IReferenceClock, FALSE); + check_interface(filter, &IID_IVideoWindow, FALSE); +} + +START_TEST(audiorecord) +{ + ICreateDevEnum *devenum; + IEnumMoniker *enummon; + IBaseFilter *filter; + IMoniker *mon; + WCHAR *name; + HRESULT hr; + + CoInitialize(NULL); + + hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, + &IID_ICreateDevEnum, (void **)&devenum); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = ICreateDevEnum_CreateClassEnumerator(devenum, &CLSID_AudioInputDeviceCategory, &enummon, 0); + if (hr == S_FALSE) + { + skip("No audio input devices present.\n"); + ICreateDevEnum_Release(devenum); + CoUninitialize(); + return; + } + ok(hr == S_OK, "Got hr %#x.\n", hr); + + while (IEnumMoniker_Next(enummon, 1, &mon, NULL) == S_OK) + { + hr = IMoniker_GetDisplayName(mon, NULL, NULL, &name); + ok(hr == S_OK, "Got hr %#x.\n", hr); + trace("Testing device %s.\n", wine_dbgstr_w(name)); + CoTaskMemFree(name); + + hr = IMoniker_BindToObject(mon, NULL, NULL, &IID_IBaseFilter, (void **)&filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + test_interfaces(filter); + + IMoniker_Release(mon); + } + + IEnumMoniker_Release(enummon); + ICreateDevEnum_Release(devenum); + CoUninitialize(); +}
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/tests/audiorecord.c | 88 +++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+)
diff --git a/dlls/qcap/tests/audiorecord.c b/dlls/qcap/tests/audiorecord.c index fb292cff5f..5de019896c 100644 --- a/dlls/qcap/tests/audiorecord.c +++ b/dlls/qcap/tests/audiorecord.c @@ -58,6 +58,92 @@ static void test_interfaces(IBaseFilter *filter) check_interface(filter, &IID_IVideoWindow, FALSE); }
+static HRESULT WINAPI property_bag_QueryInterface(IPropertyBag *iface, REFIID iid, void **out) +{ + ok(0, "Unexpected call (iid %s).\n", wine_dbgstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI property_bag_AddRef(IPropertyBag *iface) +{ + ok(0, "Unexpected call.\n"); + return 2; +} + +static ULONG WINAPI property_bag_Release(IPropertyBag *iface) +{ + ok(0, "Unexpected call.\n"); + return 1; +} + +static const WCHAR waveinidW[] = {'W','a','v','e','I','n','I','d',0}; +static const WCHAR usemixerW[] = {'U','s','e','M','i','x','e','r',0}; +static int ppb_id; +static unsigned int ppb_got_read; + +static HRESULT WINAPI property_bag_Read(IPropertyBag *iface, const WCHAR *name, VARIANT *var, IErrorLog *log) +{ + if (!lstrcmpW(name, usemixerW)) + return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + + todo_wine ok(!lstrcmpW(name, waveinidW), "Got unexpected name %s.\n", wine_dbgstr_w(name)); + ok(V_VT(var) == VT_I4, "Got unexpected type %u.\n", V_VT(var)); + ok(!log, "Got unexpected error log %p.\n", log); + ppb_got_read++; + return S_OK; +} + +static HRESULT WINAPI property_bag_Write(IPropertyBag *iface, const WCHAR *name, VARIANT *var) +{ + ok(0, "Unexpected call (name %s).\n", wine_dbgstr_w(name)); + return E_FAIL; +} + +static const IPropertyBagVtbl property_bag_vtbl = +{ + property_bag_QueryInterface, + property_bag_AddRef, + property_bag_Release, + property_bag_Read, + property_bag_Write, +}; + +static void test_property_bag(IMoniker *mon) +{ + IPropertyBag property_bag = {&property_bag_vtbl}; + IPropertyBag *devenum_bag; + IPersistPropertyBag *ppb; + VARIANT var; + HRESULT hr; + ULONG ref; + + hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&devenum_bag); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + VariantInit(&var); + hr = IPropertyBag_Read(devenum_bag, waveinidW, &var, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ppb_id = V_I4(&var); + + hr = CoCreateInstance(&CLSID_AudioRecord, NULL, CLSCTX_INPROC_SERVER, + &IID_IPersistPropertyBag, (void **)&ppb); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IPersistPropertyBag_InitNew(ppb); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + + ppb_got_read = 0; + hr = IPersistPropertyBag_Load(ppb, &property_bag, NULL); + ok(hr == S_OK || broken(hr == E_FAIL) /* 8+, intermittent */, "Got hr %#x.\n", hr); + ok(ppb_got_read == 1, "Got %u calls to Read().\n", ppb_got_read); + + ref = IPersistPropertyBag_Release(ppb); + ok(!ref, "Got unexpected refcount %d.\n", ref); + + VariantClear(&var); + IPropertyBag_Release(devenum_bag); +} + START_TEST(audiorecord) { ICreateDevEnum *devenum; @@ -89,6 +175,8 @@ START_TEST(audiorecord) trace("Testing device %s.\n", wine_dbgstr_w(name)); CoTaskMemFree(name);
+ test_property_bag(mon); + hr = IMoniker_BindToObject(mon, NULL, NULL, &IID_IBaseFilter, (void **)&filter); ok(hr == S_OK, "Got hr %#x.\n", hr);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/tests/Makefile.in | 3 +- dlls/qcap/tests/avico.c | 146 ++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 dlls/qcap/tests/avico.c
diff --git a/dlls/qcap/tests/Makefile.in b/dlls/qcap/tests/Makefile.in index 80b19624d7..2b988476ad 100644 --- a/dlls/qcap/tests/Makefile.in +++ b/dlls/qcap/tests/Makefile.in @@ -1,7 +1,8 @@ TESTDLL = qcap.dll -IMPORTS = strmiids uuid oleaut32 ole32 advapi32 +IMPORTS = strmiids uuid oleaut32 ole32 advapi32 msvfw32
C_SRCS = \ audiorecord.c \ + avico.c \ qcap.c \ smartteefilter.c diff --git a/dlls/qcap/tests/avico.c b/dlls/qcap/tests/avico.c new file mode 100644 index 0000000000..53856d6205 --- /dev/null +++ b/dlls/qcap/tests/avico.c @@ -0,0 +1,146 @@ +/* + * AVI compressor filter unit tests + * + * Copyright 2018 Zebediah Figura + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS +#include "dshow.h" +#include "vfw.h" +#include "wine/test.h" + +static const DWORD test_fourcc = mmioFOURCC('w','t','s','t'); + +#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) +static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported) +{ + IUnknown *iface = iface_ptr; + HRESULT hr, expected_hr; + IUnknown *unk; + + expected_hr = supported ? S_OK : E_NOINTERFACE; + + hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); + if (SUCCEEDED(hr)) + IUnknown_Release(unk); +} + +static void test_interfaces(IBaseFilter *filter) +{ + check_interface(filter, &IID_IBaseFilter, TRUE); + check_interface(filter, &IID_IMediaFilter, TRUE); + check_interface(filter, &IID_IPersist, TRUE); + check_interface(filter, &IID_IPersistPropertyBag, TRUE); + check_interface(filter, &IID_IUnknown, TRUE); + + check_interface(filter, &IID_IAMFilterMiscFlags, FALSE); + check_interface(filter, &IID_IBasicAudio, FALSE); + check_interface(filter, &IID_IBasicVideo, FALSE); + check_interface(filter, &IID_IKsPropertySet, FALSE); + check_interface(filter, &IID_IMediaPosition, FALSE); + check_interface(filter, &IID_IMediaSeeking, FALSE); + check_interface(filter, &IID_IPin, FALSE); + check_interface(filter, &IID_IQualityControl, FALSE); + check_interface(filter, &IID_IQualProp, FALSE); + check_interface(filter, &IID_IReferenceClock, FALSE); + check_interface(filter, &IID_IVideoWindow, FALSE); +} + +static LRESULT CALLBACK driver_proc(DWORD_PTR id, HDRVR driver, UINT msg, + LPARAM lparam1, LPARAM lparam2) +{ + static const WCHAR nameW[] = {'f','o','o',0}; + if (winetest_debug > 1) trace("msg %#x, lparam1 %#lx, lparam2 %#lx.\n", msg, lparam1, lparam2); + + switch (msg) + { + case DRV_LOAD: + case DRV_OPEN: + case DRV_CLOSE: + case DRV_FREE: + return 1; + case ICM_GETINFO: + { + ICINFO *info = (ICINFO *)lparam1; + info->fccType = ICTYPE_VIDEO; + info->fccHandler = test_fourcc; + info->dwFlags = VIDCF_TEMPORAL; + info->dwVersion = 0x10101; + info->dwVersionICM = ICVERSION; + lstrcpyW(info->szName, nameW); + lstrcpyW(info->szDescription, nameW); + return sizeof(ICINFO); + } + } + + return 0; +} + +START_TEST(avico) +{ + static const WCHAR test_display_name[] = {'@','d','e','v','i','c','e',':', + 'c','m',':','{','3','3','D','9','A','7','6','0','-','9','0','C','8', + '-','1','1','D','0','-','B','D','4','3','-','0','0','A','0','C','9', + '1','1','C','E','8','6','}','\','w','t','s','t',0}; + ICreateDevEnum *devenum; + IEnumMoniker *enummon; + IBaseFilter *filter; + IMoniker *mon; + WCHAR *name; + HRESULT hr; + ULONG ref; + BOOL ret; + + ret = ICInstall(ICTYPE_VIDEO, test_fourcc, (LPARAM)driver_proc, NULL, ICINSTALL_FUNCTION); + ok(ret, "Failed to install test VFW driver.\n"); + + CoInitialize(NULL); + + hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, + &IID_ICreateDevEnum, (void **)&devenum); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = ICreateDevEnum_CreateClassEnumerator(devenum, &CLSID_VideoCompressorCategory, &enummon, 0); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + while (IEnumMoniker_Next(enummon, 1, &mon, NULL) == S_OK) + { + hr = IMoniker_GetDisplayName(mon, NULL, NULL, &name); + ok(hr == S_OK, "Got hr %#x.\n", hr); + if (!lstrcmpW(name, test_display_name)) + { + hr = IMoniker_BindToObject(mon, NULL, NULL, &IID_IBaseFilter, (void **)&filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + test_interfaces(filter); + + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + } + CoTaskMemFree(name); + + IMoniker_Release(mon); + } + + IEnumMoniker_Release(enummon); + ICreateDevEnum_Release(devenum); + + ret = ICRemove(ICTYPE_VIDEO, test_fourcc, 0); + ok(ret, "Failed to remove test driver.\n"); + + CoUninitialize(); +}
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/tests/avico.c | 126 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+)
diff --git a/dlls/qcap/tests/avico.c b/dlls/qcap/tests/avico.c index 53856d6205..5b01e14c0f 100644 --- a/dlls/qcap/tests/avico.c +++ b/dlls/qcap/tests/avico.c @@ -40,6 +40,13 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO IUnknown_Release(unk); }
+static ULONG get_refcount(void *iface) +{ + IUnknown *unknown = iface; + IUnknown_AddRef(unknown); + return IUnknown_Release(unknown); +} + static void test_interfaces(IBaseFilter *filter) { check_interface(filter, &IID_IBaseFilter, TRUE); @@ -61,6 +68,124 @@ static void test_interfaces(IBaseFilter *filter) check_interface(filter, &IID_IVideoWindow, FALSE); }
+static void test_enum_pins(IBaseFilter *filter) +{ + IEnumPins *enum1, *enum2; + ULONG ref, count; + IPin *pins[3]; + HRESULT hr; + + ref = get_refcount(filter); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + + hr = IBaseFilter_EnumPins(filter, NULL); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); + + hr = IBaseFilter_EnumPins(filter, &enum1); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ref = get_refcount(filter); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(enum1); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + + hr = IEnumPins_Next(enum1, 1, NULL, NULL); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 1, pins, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ref = get_refcount(filter); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(pins[0]); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(enum1); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + IPin_Release(pins[0]); + ref = get_refcount(filter); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + + hr = IEnumPins_Next(enum1, 1, pins, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ref = get_refcount(filter); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(pins[0]); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(enum1); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + IPin_Release(pins[0]); + ref = get_refcount(filter); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + + hr = IEnumPins_Next(enum1, 1, pins, NULL); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IEnumPins_Reset(enum1); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 1, pins, &count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); + IPin_Release(pins[0]); + + hr = IEnumPins_Next(enum1, 1, pins, &count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); + IPin_Release(pins[0]); + + hr = IEnumPins_Next(enum1, 1, pins, &count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); + + hr = IEnumPins_Reset(enum1); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 2, pins, NULL); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 2, pins, &count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); + IPin_Release(pins[0]); + IPin_Release(pins[1]); + + hr = IEnumPins_Next(enum1, 2, pins, &count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); + + hr = IEnumPins_Reset(enum1); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 3, pins, &count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); + IPin_Release(pins[0]); + IPin_Release(pins[1]); + + hr = IEnumPins_Reset(enum1); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Clone(enum1, &enum2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Skip(enum1, 3); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IEnumPins_Skip(enum1, 2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Skip(enum1, 1); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 1, pins, NULL); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum2, 1, pins, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + IPin_Release(pins[0]); + + IEnumPins_Release(enum2); + IEnumPins_Release(enum1); +} + static LRESULT CALLBACK driver_proc(DWORD_PTR id, HDRVR driver, UINT msg, LPARAM lparam1, LPARAM lparam2) { @@ -127,6 +252,7 @@ START_TEST(avico) ok(hr == S_OK, "Got hr %#x.\n", hr);
test_interfaces(filter); + test_enum_pins(filter);
ref = IBaseFilter_Release(filter); ok(!ref, "Got outstanding refcount %d.\n", ref);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/avico.c | 4 ++-- dlls/qcap/tests/qcap.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c index d5a44b21b6..d5020a0945 100644 --- a/dlls/qcap/avico.c +++ b/dlls/qcap/avico.c @@ -690,8 +690,8 @@ static const BaseOutputPinFuncTable AVICompressorBaseOutputPinVtbl = {
IUnknown* WINAPI QCAP_createAVICompressor(IUnknown *outer, HRESULT *phr) { - PIN_INFO in_pin_info = {NULL, PINDIR_INPUT, {'I','n','p','u','t',0}}; - PIN_INFO out_pin_info = {NULL, PINDIR_OUTPUT, {'O','u','t','p','u','t',0}}; + PIN_INFO in_pin_info = {NULL, PINDIR_INPUT, {'I','n',0}}; + PIN_INFO out_pin_info = {NULL, PINDIR_OUTPUT, {'O','u','t',0}}; AVICompressor *compressor; HRESULT hres;
diff --git a/dlls/qcap/tests/qcap.c b/dlls/qcap/tests/qcap.c index 2f6fe1d026..20ab2e97fa 100644 --- a/dlls/qcap/tests/qcap.c +++ b/dlls/qcap/tests/qcap.c @@ -1832,7 +1832,7 @@ static void test_AviCo(void) ok(hres == S_OK, "QueryPinInfo failed: %08x\n", hres); ok(pin_info.pFilter == avico, "pin_info.pFilter != avico\n"); ok(pin_info.dir == PINDIR_INPUT, "pin_info.dir = %d\n", pin_info.dir); - ok(!lstrcmpW(pin_info.achName, inputW), "pin_info.achName = %s\n", wine_dbgstr_w(pin_info.achName)); + todo_wine ok(!lstrcmpW(pin_info.achName, inputW), "pin_info.achName = %s\n", wine_dbgstr_w(pin_info.achName));
hres = IEnumPins_Next(enum_pins, 1, &out_pin, NULL); ok(hres == S_OK, "Next failed: %08x\n", hres); @@ -1841,7 +1841,7 @@ static void test_AviCo(void) ok(hres == S_OK, "QueryPinInfo failed: %08x\n", hres); ok(pin_info.pFilter == avico, "pin_info.pFilter != avico\n"); ok(pin_info.dir == PINDIR_OUTPUT, "pin_info.dir = %d\n", pin_info.dir); - ok(!lstrcmpW(pin_info.achName, outputW), "pin_info.achName = %s\n", wine_dbgstr_w(pin_info.achName)); + todo_wine ok(!lstrcmpW(pin_info.achName, outputW), "pin_info.achName = %s\n", wine_dbgstr_w(pin_info.achName));
IEnumPins_Release(enum_pins);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/tests/avico.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+)
diff --git a/dlls/qcap/tests/avico.c b/dlls/qcap/tests/avico.c index 5b01e14c0f..540c343f80 100644 --- a/dlls/qcap/tests/avico.c +++ b/dlls/qcap/tests/avico.c @@ -23,6 +23,11 @@ #include "vfw.h" #include "wine/test.h"
+static const WCHAR sink_id[] = {'I','n',0}; +static const WCHAR source_id[] = {'O','u','t',0}; +static const WCHAR sink_name[] = {'I','n','p','u','t',0}; +static const WCHAR source_name[] = {'O','u','t','p','u','t',0}; + static const DWORD test_fourcc = mmioFOURCC('w','t','s','t');
#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) @@ -186,6 +191,39 @@ static void test_enum_pins(IBaseFilter *filter) IEnumPins_Release(enum1); }
+static void test_find_pin(IBaseFilter *filter) +{ + IEnumPins *enum_pins; + IPin *pin, *pin2; + HRESULT hr; + + hr = IBaseFilter_EnumPins(filter, &enum_pins); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IBaseFilter_FindPin(filter, sink_id, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(pin == pin2, "Pins didn't match.\n"); + IPin_Release(pin); + IPin_Release(pin2); + + hr = IBaseFilter_FindPin(filter, source_id, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(pin == pin2, "Pins didn't match.\n"); + IPin_Release(pin); + IPin_Release(pin2); + + hr = IBaseFilter_FindPin(filter, sink_name, &pin); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); + hr = IBaseFilter_FindPin(filter, source_name, &pin); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); + + IEnumPins_Release(enum_pins); +} + static LRESULT CALLBACK driver_proc(DWORD_PTR id, HDRVR driver, UINT msg, LPARAM lparam1, LPARAM lparam2) { @@ -253,6 +291,7 @@ START_TEST(avico)
test_interfaces(filter); test_enum_pins(filter); + test_find_pin(filter);
ref = IBaseFilter_Release(filter); ok(!ref, "Got outstanding refcount %d.\n", ref);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/tests/avico.c | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+)
diff --git a/dlls/qcap/tests/avico.c b/dlls/qcap/tests/avico.c index 540c343f80..5c60846013 100644 --- a/dlls/qcap/tests/avico.c +++ b/dlls/qcap/tests/avico.c @@ -224,6 +224,57 @@ static void test_find_pin(IBaseFilter *filter) IEnumPins_Release(enum_pins); }
+static void test_pin_info(IBaseFilter *filter) +{ + PIN_DIRECTION dir; + PIN_INFO info; + HRESULT hr; + WCHAR *id; + IPin *pin; + + hr = IBaseFilter_FindPin(filter, sink_id, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IPin_QueryPinInfo(pin, &info); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); + ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); + todo_wine ok(!lstrcmpW(info.achName, sink_name), "Got name %s.\n", wine_dbgstr_w(info.achName)); + IBaseFilter_Release(info.pFilter); + + hr = IPin_QueryDirection(pin, &dir); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); + + hr = IPin_QueryId(pin, &id); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!lstrcmpW(id, sink_id), "Got id %s.\n", wine_dbgstr_w(id)); + CoTaskMemFree(id); + + IPin_Release(pin); + + hr = IBaseFilter_FindPin(filter, source_id, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IPin_QueryPinInfo(pin, &info); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); + ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); + todo_wine ok(!lstrcmpW(info.achName, source_name), "Got name %s.\n", wine_dbgstr_w(info.achName)); + IBaseFilter_Release(info.pFilter); + + hr = IPin_QueryDirection(pin, &dir); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); + + hr = IPin_QueryId(pin, &id); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!lstrcmpW(id, source_id), "Got id %s.\n", wine_dbgstr_w(id)); + CoTaskMemFree(id); + + IPin_Release(pin); +} + static LRESULT CALLBACK driver_proc(DWORD_PTR id, HDRVR driver, UINT msg, LPARAM lparam1, LPARAM lparam2) { @@ -292,6 +343,7 @@ START_TEST(avico) test_interfaces(filter); test_enum_pins(filter); test_find_pin(filter); + test_pin_info(filter);
ref = IBaseFilter_Release(filter); ok(!ref, "Got outstanding refcount %d.\n", ref);