[PATCH v2 1/5] qcap/filewriter: Implement state change methods.
Zebediah Figura
z.figura12 at gmail.com
Thu Apr 23 20:03:21 CDT 2020
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/qcap/filewriter.c | 26 +++++++++++++++
dlls/qcap/tests/filewriter.c | 62 ++++++++++++++++++++++++++++++++++--
2 files changed, 86 insertions(+), 2 deletions(-)
diff --git a/dlls/qcap/filewriter.c b/dlls/qcap/filewriter.c
index aa58226bd0..caec4936cf 100644
--- a/dlls/qcap/filewriter.c
+++ b/dlls/qcap/filewriter.c
@@ -34,6 +34,7 @@ struct file_writer
struct strmbase_sink sink;
WCHAR *filename;
+ HANDLE file;
};
static inline struct file_writer *impl_from_strmbase_pin(struct strmbase_pin *iface)
@@ -106,11 +107,36 @@ static void file_writer_destroy(struct strmbase_filter *iface)
heap_free(filter);
}
+static HRESULT file_writer_init_stream(struct strmbase_filter *iface)
+{
+ struct file_writer *filter = impl_from_strmbase_filter(iface);
+ HANDLE file;
+
+ if ((file = CreateFileW(filter->filename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, CREATE_ALWAYS, 0, NULL)) == INVALID_HANDLE_VALUE)
+ {
+ ERR("Failed to create %s, error %u.\n", debugstr_w(filter->filename), GetLastError());
+ return HRESULT_FROM_WIN32(GetLastError());
+ }
+ filter->file = file;
+ return S_OK;
+}
+
+static HRESULT file_writer_cleanup_stream(struct strmbase_filter *iface)
+{
+ struct file_writer *filter = impl_from_strmbase_filter(iface);
+
+ CloseHandle(filter->file);
+ return S_OK;
+}
+
static struct strmbase_filter_ops filter_ops =
{
.filter_query_interface = file_writer_query_interface,
.filter_get_pin = file_writer_get_pin,
.filter_destroy = file_writer_destroy,
+ .filter_init_stream = file_writer_init_stream,
+ .filter_cleanup_stream = file_writer_cleanup_stream,
};
static inline struct file_writer *impl_from_IFileSinkFilter(IFileSinkFilter *iface)
diff --git a/dlls/qcap/tests/filewriter.c b/dlls/qcap/tests/filewriter.c
index cfc9e5d634..57bd2ec872 100644
--- a/dlls/qcap/tests/filewriter.c
+++ b/dlls/qcap/tests/filewriter.c
@@ -564,6 +564,58 @@ static void test_allocator(IMemInputPin *input, IMemAllocator *allocator)
IMemAllocator_Release(ret_allocator);
}
+static void test_filter_state(IMediaControl *control)
+{
+ OAFilterState state;
+ HRESULT hr;
+
+ hr = IMediaControl_GetState(control, 0, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(state == State_Stopped, "Got state %u.\n", state);
+
+ hr = IMediaControl_Pause(control);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMediaControl_GetState(control, 0, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(state == State_Paused, "Got state %u.\n", state);
+
+ hr = IMediaControl_Run(control);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMediaControl_GetState(control, 0, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(state == State_Running, "Got state %u.\n", state);
+
+ hr = IMediaControl_Pause(control);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMediaControl_GetState(control, 0, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(state == State_Paused, "Got state %u.\n", state);
+
+ hr = IMediaControl_Stop(control);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMediaControl_GetState(control, 0, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(state == State_Stopped, "Got state %u.\n", state);
+
+ hr = IMediaControl_Run(control);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMediaControl_GetState(control, 0, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(state == State_Running, "Got state %u.\n", state);
+
+ hr = IMediaControl_Stop(control);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMediaControl_GetState(control, 0, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(state == State_Stopped, "Got state %u.\n", state);
+}
+
static void test_connect_pin(void)
{
AM_MEDIA_TYPE req_mt =
@@ -574,19 +626,21 @@ static void test_connect_pin(void)
};
IBaseFilter *filter = create_file_writer();
+ WCHAR *filename = set_filename(filter);
struct testfilter source;
IMemAllocator *allocator;
+ IMediaControl *control;
IMemInputPin *meminput;
IFilterGraph2 *graph;
AM_MEDIA_TYPE mt;
IPin *pin, *peer;
HRESULT hr;
ULONG ref;
-
- set_filename(filter);
+ BOOL ret;
testfilter_init(&source);
CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&graph);
+ IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control);
hr = IFilterGraph2_AddFilter(graph, filter, L"filewriter");
ok(hr == S_OK, "Got hr %#x.\n", hr);
IFilterGraph2_AddFilter(graph, &source.filter.IBaseFilter_iface, L"source");
@@ -620,6 +674,7 @@ static void test_connect_pin(void)
&IID_IMemAllocator, (void **)&allocator);
test_allocator(meminput, allocator);
+ test_filter_state(control);
hr = IFilterGraph2_Disconnect(graph, pin);
ok(hr == S_OK, "Got hr %#x.\n", hr);
@@ -636,6 +691,9 @@ static void test_connect_pin(void)
hr = IPin_ConnectionMediaType(pin, &mt);
ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr);
+ ret = DeleteFileW(filename);
+ ok(ret, "Failed to delete file, error %u.\n", GetLastError());
+ IMediaControl_Release(control);
ref = IFilterGraph2_Release(graph);
ok(!ref, "Got outstanding refcount %d.\n", ref);
IMemInputPin_Release(meminput);
--
2.26.2
More information about the wine-devel
mailing list