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
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
;
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
);
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
;
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
);
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
);
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
);
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
);
156 ok(hr
== S_OK
, "Unexpected hr %#lx.\n", 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
);
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
);
211 hr
= MFStartup(MF_VERSION
, MFSTARTUP_FULL
);
212 ok(hr
== S_OK
, "Unexpected hr %#lx.\n", hr
);
217 ok(hr
== S_OK
, "Unexpected hr %#lx.\n", hr
);