winewayland.drv: Implement vkGetPhysicalDeviceSurfaceSupportKHR.
[wine.git] / dlls / mfsrcsnk / tests / mfsrcsnk.c
blob1aba4094c62935c446b88c5b23debdd5b6212023
1 /*
2 * Copyright 2022 Nikolay Sivov for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <stdarg.h>
20 #include <string.h>
22 #define COBJMACROS
24 #include "windef.h"
26 #include "mfapi.h"
27 #include "mfidl.h"
28 #include "mferror.h"
30 #include "wine/test.h"
32 #define check_interface(a, b, c) check_interface_(__LINE__, a, b, c)
33 static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported)
35 IUnknown *iface = iface_ptr;
36 HRESULT hr, expected_hr;
37 IUnknown *unk;
39 expected_hr = supported ? S_OK : E_NOINTERFACE;
41 hr = IUnknown_QueryInterface(iface, iid, (void **)&unk);
42 ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr);
43 if (SUCCEEDED(hr))
44 IUnknown_Release(unk);
47 static void test_wave_sink(void)
49 IMFMediaType *media_type, *media_type2;
50 IMFMediaTypeHandler *type_handler;
51 IMFPresentationClock *clock;
52 IMFStreamSink *stream_sink;
53 IMFMediaSink *sink, *sink2;
54 IMFByteStream *bytestream;
55 DWORD id, count, flags;
56 HRESULT hr;
57 GUID guid;
59 hr = MFCreateWAVEMediaSink(NULL, NULL, NULL);
60 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
62 hr = MFCreateWAVEMediaSink(NULL, NULL, &sink);
63 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
65 hr = MFCreateMediaType(&media_type);
66 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
68 hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, 2);
69 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
70 hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_NUM_CHANNELS, 2);
71 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
72 hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio);
73 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
74 hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MFAudioFormat_PCM);
75 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
76 hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100);
77 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
78 hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_BITS_PER_SAMPLE, 8);
79 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
81 hr = MFCreateTempFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_DELETE_IF_EXIST, 0, &bytestream);
82 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
84 hr = MFCreateWAVEMediaSink(bytestream, NULL, &sink);
85 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
87 hr = MFCreateWAVEMediaSink(bytestream, media_type, &sink);
88 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
90 /* Sink tests */
91 hr = IMFMediaSink_GetCharacteristics(sink, &flags);
92 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
93 ok(flags == (MEDIASINK_FIXED_STREAMS | MEDIASINK_RATELESS), "Unexpected flags %#lx.\n", flags);
95 hr = IMFMediaSink_GetStreamSinkCount(sink, NULL);
96 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
98 hr = IMFMediaSink_GetStreamSinkCount(sink, &count);
99 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
100 ok(count == 1, "Unexpected count %lu.\n", count);
102 hr = IMFMediaSink_AddStreamSink(sink, 123, media_type, &stream_sink);
103 ok(hr == MF_E_STREAMSINKS_FIXED, "Unexpected hr %#lx.\n", hr);
105 check_interface(sink, &IID_IMFMediaEventGenerator, TRUE);
106 check_interface(sink, &IID_IMFFinalizableMediaSink, TRUE);
107 check_interface(sink, &IID_IMFClockStateSink, TRUE);
109 /* Clock */
110 hr = MFCreatePresentationClock(&clock);
111 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
113 hr = IMFMediaSink_SetPresentationClock(sink, NULL);
114 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
116 hr = IMFMediaSink_SetPresentationClock(sink, clock);
117 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
119 IMFPresentationClock_Release(clock);
121 /* Stream tests */
122 hr = IMFMediaSink_GetStreamSinkByIndex(sink, 0, &stream_sink);
123 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
124 hr = IMFStreamSink_GetIdentifier(stream_sink, &id);
125 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
126 ok(id == 1, "Unexpected id %#lx.\n", id);
127 IMFStreamSink_Release(stream_sink);
129 hr = IMFMediaSink_GetStreamSinkById(sink, 0, &stream_sink);
130 ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#lx.\n", hr);
131 hr = IMFMediaSink_GetStreamSinkById(sink, id, &stream_sink);
132 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
134 hr = IMFStreamSink_GetMediaSink(stream_sink, &sink2);
135 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
136 IMFMediaSink_Release(sink2);
138 check_interface(stream_sink, &IID_IMFMediaEventGenerator, TRUE);
139 check_interface(stream_sink, &IID_IMFMediaTypeHandler, TRUE);
141 hr = IMFStreamSink_GetMediaTypeHandler(stream_sink, &type_handler);
142 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
144 hr = IMFMediaTypeHandler_GetMajorType(type_handler, NULL);
145 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
146 hr = IMFMediaTypeHandler_GetMajorType(type_handler, &guid);
147 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
148 ok(IsEqualGUID(&guid, &MFMediaType_Audio), "Unexpected major type.\n");
150 hr = IMFMediaTypeHandler_GetMediaTypeCount(type_handler, &count);
151 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
152 ok(count == 1, "Unexpected count %lu.\n", count);
154 hr = IMFMediaTypeHandler_GetCurrentMediaType(type_handler, &media_type2);
155 todo_wine
156 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
158 if (SUCCEEDED(hr))
160 hr = IMFMediaType_SetUINT32(media_type2, &MF_MT_AUDIO_NUM_CHANNELS, 1);
161 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
163 hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, NULL);
164 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
165 hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, media_type2);
166 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
168 IMFMediaType_Release(media_type2);
171 /* Shutdown state */
172 hr = IMFMediaSink_Shutdown(sink);
173 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
175 hr = IMFMediaSink_Shutdown(sink);
176 ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
178 hr = IMFStreamSink_GetMediaSink(stream_sink, &sink2);
179 ok(hr == MF_E_STREAMSINK_REMOVED, "Unexpected hr %#lx.\n", hr);
181 hr = IMFStreamSink_GetIdentifier(stream_sink, &id);
182 ok(hr == MF_E_STREAMSINK_REMOVED, "Unexpected hr %#lx.\n", hr);
184 hr = IMFMediaTypeHandler_GetMajorType(type_handler, NULL);
185 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
186 hr = IMFMediaTypeHandler_GetMajorType(type_handler, &guid);
187 ok(hr == MF_E_STREAMSINK_REMOVED, "Unexpected hr %#lx.\n", hr);
189 IMFStreamSink_Release(stream_sink);
191 hr = IMFMediaSink_AddStreamSink(sink, 123, media_type, &stream_sink);
192 ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
193 hr = IMFMediaSink_GetStreamSinkByIndex(sink, 0, &stream_sink);
194 ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
195 hr = IMFMediaSink_GetStreamSinkById(sink, 0, &stream_sink);
196 ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
197 hr = IMFMediaSink_GetCharacteristics(sink, &flags);
198 ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
200 IMFMediaSink_Release(sink);
202 IMFMediaTypeHandler_Release(type_handler);
203 IMFMediaType_Release(media_type);
204 IMFByteStream_Release(bytestream);
207 START_TEST(mfsrcsnk)
209 HRESULT hr;
211 hr = MFStartup(MF_VERSION, MFSTARTUP_FULL);
212 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
214 test_wave_sink();
216 hr = MFShutdown();
217 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);