2 * Test winmm sound capture in each sound format
4 * Copyright (c) 2002 Francois Gouget
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #include "wine/test.h"
34 extern GUID KSDATAFORMAT_SUBTYPE_PCM
;
35 extern GUID KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
;
37 #include "winmm_test.h"
39 static const char * wave_in_error(MMRESULT error
)
41 static char msg
[1024];
42 static char long_msg
[1100];
45 rc
= waveInGetErrorText(error
, msg
, sizeof(msg
));
46 if (rc
!= MMSYSERR_NOERROR
)
47 sprintf(long_msg
, "waveInGetErrorText(%x) failed with error %x", error
, rc
);
49 sprintf(long_msg
, "%s(%s)", mmsys_error(error
), msg
);
53 static void check_position(int device
, HWAVEIN win
, DWORD bytes
,
62 samples
=bytes
/(pwfx
->wBitsPerSample
/8*pwfx
->nChannels
);
63 duration
=((double)samples
)/pwfx
->nSamplesPerSec
;
65 mmtime
.wType
= TIME_BYTES
;
66 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
67 ok(rc
==MMSYSERR_NOERROR
,
68 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
69 if (mmtime
.wType
!= TIME_BYTES
&& winetest_debug
> 1)
70 trace("waveInGetPosition(%s): TIME_BYTES not supported, returned %s\n",
71 dev_name(device
),wave_time_format(mmtime
.wType
));
72 returned
= time_to_bytes(&mmtime
, pwfx
);
73 ok(returned
== bytes
, "waveInGetPosition(%s): returned %d bytes, "
74 "should be %d\n", dev_name(device
), returned
, bytes
);
76 mmtime
.wType
= TIME_SAMPLES
;
77 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
78 ok(rc
==MMSYSERR_NOERROR
,
79 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
80 if (mmtime
.wType
!= TIME_SAMPLES
&& winetest_debug
> 1)
81 trace("waveInGetPosition(%s): TIME_SAMPLES not supported, "
82 "returned %s\n",dev_name(device
),wave_time_format(mmtime
.wType
));
83 returned
= time_to_bytes(&mmtime
, pwfx
);
84 ok(returned
== bytes
, "waveInGetPosition(%s): returned %d samples, "
85 "should be %d\n", dev_name(device
), bytes_to_samples(returned
, pwfx
),
86 bytes_to_samples(bytes
, pwfx
));
88 mmtime
.wType
= TIME_MS
;
89 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
90 ok(rc
==MMSYSERR_NOERROR
,
91 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
92 if (mmtime
.wType
!= TIME_MS
&& winetest_debug
> 1)
93 trace("waveInGetPosition(%s): TIME_MS not supported, returned %s\n",
94 dev_name(device
), wave_time_format(mmtime
.wType
));
95 returned
= time_to_bytes(&mmtime
, pwfx
);
96 ok(returned
== bytes
, "waveInGetPosition(%s): returned %d ms, "
97 "should be %d\n", dev_name(device
), bytes_to_ms(returned
, pwfx
),
98 bytes_to_ms(bytes
, pwfx
));
100 mmtime
.wType
= TIME_SMPTE
;
101 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
102 ok(rc
==MMSYSERR_NOERROR
,
103 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
104 if (mmtime
.wType
!= TIME_SMPTE
&& winetest_debug
> 1)
105 trace("waveInGetPosition(%s): TIME_SMPTE not supported, returned %s\n",
106 dev_name(device
),wave_time_format(mmtime
.wType
));
107 returned
= time_to_bytes(&mmtime
, pwfx
);
108 ok(returned
== bytes
, "waveInGetPosition(%s): SMPTE test failed\n",
111 mmtime
.wType
= TIME_MIDI
;
112 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
113 ok(rc
==MMSYSERR_NOERROR
,
114 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
115 if (mmtime
.wType
!= TIME_MIDI
&& winetest_debug
> 1)
116 trace("waveInGetPosition(%s): TIME_MIDI not supported, returned %s\n",
117 dev_name(device
),wave_time_format(mmtime
.wType
));
118 returned
= time_to_bytes(&mmtime
, pwfx
);
119 ok(returned
== bytes
, "waveInGetPosition(%s): MIDI test failed\n",
122 mmtime
.wType
= TIME_TICKS
;
123 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
124 ok(rc
==MMSYSERR_NOERROR
,
125 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
126 if (mmtime
.wType
!= TIME_TICKS
&& winetest_debug
> 1)
127 trace("waveInGetPosition(%s): TIME_TICKS not supported, returned %s\n",
128 dev_name(device
),wave_time_format(mmtime
.wType
));
129 returned
= time_to_bytes(&mmtime
, pwfx
);
130 ok(returned
== bytes
, "waveInGetPosition(%s): TICKS test failed\n",
134 static void wave_in_test_deviceIn(int device
, LPWAVEFORMATEX pwfx
, DWORD format
, DWORD flags
, LPWAVEINCAPS pcaps
)
141 WORD nChannels
= pwfx
->nChannels
;
142 WORD wBitsPerSample
= pwfx
->wBitsPerSample
;
143 DWORD nSamplesPerSec
= pwfx
->nSamplesPerSec
;
145 hevent
=CreateEvent(NULL
,FALSE
,FALSE
,NULL
);
146 ok(hevent
!=NULL
,"CreateEvent(): error=%d\n",GetLastError());
151 rc
=waveInOpen(&win
,device
,pwfx
,(DWORD
)hevent
,0,CALLBACK_EVENT
|flags
);
152 /* Note: Win9x doesn't know WAVE_FORMAT_DIRECT */
153 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_BADDEVICEID
||
154 rc
==MMSYSERR_NOTENABLED
|| rc
==MMSYSERR_NODRIVER
||
155 rc
==MMSYSERR_ALLOCATED
||
156 ((rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_NOTSUPPORTED
) &&
157 (flags
& WAVE_FORMAT_DIRECT
) && !(pcaps
->dwFormats
& format
)) ||
158 ((rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_NOTSUPPORTED
) &&
159 (!(flags
& WAVE_FORMAT_DIRECT
) || (flags
& WAVE_MAPPED
)) &&
160 !(pcaps
->dwFormats
& format
)) ||
161 (rc
==MMSYSERR_INVALFLAG
&& (flags
& WAVE_FORMAT_DIRECT
)),
162 "waveInOpen(%s): format=%dx%2dx%d flags=%lx(%s) rc=%s\n",
163 dev_name(device
),pwfx
->nSamplesPerSec
,pwfx
->wBitsPerSample
,
164 pwfx
->nChannels
,CALLBACK_EVENT
|flags
,
165 wave_open_flags(CALLBACK_EVENT
|flags
),wave_in_error(rc
));
166 if ((rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_NOTSUPPORTED
) &&
167 (flags
& WAVE_FORMAT_DIRECT
) && (pcaps
->dwFormats
& format
))
168 trace(" Reason: The device lists this format as supported in it's "
169 "capabilities but opening it failed.\n");
170 if ((rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_NOTSUPPORTED
) &&
171 !(pcaps
->dwFormats
& format
))
172 trace("waveInOpen(%s): format=%dx%2dx%d %s rc=%s failed but format "
173 "not supported so OK.\n",dev_name(device
),pwfx
->nSamplesPerSec
,
174 pwfx
->wBitsPerSample
,pwfx
->nChannels
,
175 flags
& WAVE_FORMAT_DIRECT
? "flags=WAVE_FORMAT_DIRECT" :
176 flags
& WAVE_MAPPED
? "flags=WAVE_MAPPED" : "", mmsys_error(rc
));
177 if (rc
!=MMSYSERR_NOERROR
) {
181 res
=WaitForSingleObject(hevent
,1000);
182 ok(res
==WAIT_OBJECT_0
,"WaitForSingleObject failed for open\n");
184 ok(pwfx
->nChannels
==nChannels
&&
185 pwfx
->wBitsPerSample
==wBitsPerSample
&&
186 pwfx
->nSamplesPerSec
==nSamplesPerSec
,
187 "got the wrong format: %dx%2dx%d instead of %dx%2dx%d\n",
188 pwfx
->nSamplesPerSec
, pwfx
->wBitsPerSample
,
189 pwfx
->nChannels
, nSamplesPerSec
, wBitsPerSample
, nChannels
);
191 /* Check that the position is 0 at start */
192 check_position(device
, win
, 0, pwfx
);
194 frag
.lpData
=malloc(pwfx
->nAvgBytesPerSec
);
195 frag
.dwBufferLength
=pwfx
->nAvgBytesPerSec
;
196 frag
.dwBytesRecorded
=0;
202 rc
=waveInPrepareHeader(win
, &frag
, sizeof(frag
));
203 ok(rc
==MMSYSERR_NOERROR
, "waveInPrepareHeader(%s): rc=%s\n",
204 dev_name(device
),wave_in_error(rc
));
205 ok(frag
.dwFlags
&WHDR_PREPARED
,"waveInPrepareHeader(%s): prepared flag "
206 "not set\n",dev_name(device
));
208 if (winetest_interactive
&& rc
==MMSYSERR_NOERROR
) {
209 trace("Recording for 1 second at %5dx%2dx%d %s %s\n",
210 pwfx
->nSamplesPerSec
, pwfx
->wBitsPerSample
,pwfx
->nChannels
,
211 get_format_str(pwfx
->wFormatTag
),
212 flags
& WAVE_FORMAT_DIRECT
? "WAVE_FORMAT_DIRECT" :
213 flags
& WAVE_MAPPED
? "WAVE_MAPPED" : "");
214 rc
=waveInAddBuffer(win
, &frag
, sizeof(frag
));
215 ok(rc
==MMSYSERR_NOERROR
,"waveInAddBuffer(%s): rc=%s\n",
216 dev_name(device
),wave_in_error(rc
));
218 /* Check that the position is 0 at start */
219 check_position(device
, win
, 0, pwfx
);
222 ok(rc
==MMSYSERR_NOERROR
,"waveInStart(%s): rc=%s\n",
223 dev_name(device
),wave_in_error(rc
));
225 res
= WaitForSingleObject(hevent
,1200);
226 ok(res
==WAIT_OBJECT_0
,"WaitForSingleObject failed for header\n");
227 ok(frag
.dwFlags
&WHDR_DONE
,"WHDR_DONE not set in frag.dwFlags\n");
228 ok(frag
.dwBytesRecorded
==pwfx
->nAvgBytesPerSec
,
229 "frag.dwBytesRecorded=%d, should=%d\n",
230 frag
.dwBytesRecorded
,pwfx
->nAvgBytesPerSec
);
232 /* stop playing on error */
233 if (res
!=WAIT_OBJECT_0
) {
235 ok(rc
==MMSYSERR_NOERROR
,
236 "waveInStop(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
240 rc
=waveInUnprepareHeader(win
, &frag
, sizeof(frag
));
241 ok(rc
==MMSYSERR_NOERROR
,"waveInUnprepareHeader(%s): rc=%s\n",
242 dev_name(device
),wave_in_error(rc
));
245 ok(rc
==MMSYSERR_NOERROR
,
246 "waveInClose(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
247 res
=WaitForSingleObject(hevent
,1000);
248 ok(res
==WAIT_OBJECT_0
,"WaitForSingleObject failed for close\n");
250 if (winetest_interactive
)
253 * Now play back what we recorded
257 trace("Playing back recorded sound\n");
258 rc
=waveOutOpen(&wout
,WAVE_MAPPER
,pwfx
,(DWORD
)hevent
,0,CALLBACK_EVENT
);
259 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_BADDEVICEID
||
260 rc
==MMSYSERR_NOTENABLED
|| rc
==MMSYSERR_NODRIVER
||
261 rc
==MMSYSERR_ALLOCATED
||
262 ((rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_NOTSUPPORTED
) &&
263 !(pcaps
->dwFormats
& format
)),
264 "waveOutOpen(%s) format=%dx%2dx%d flags=%lx(%s) rc=%s\n",
265 dev_name(device
),pwfx
->nSamplesPerSec
,pwfx
->wBitsPerSample
,
266 pwfx
->nChannels
,CALLBACK_EVENT
|flags
,
267 wave_open_flags(CALLBACK_EVENT
),wave_out_error(rc
));
268 if (rc
==MMSYSERR_NOERROR
)
270 rc
=waveOutPrepareHeader(wout
, &frag
, sizeof(frag
));
271 ok(rc
==MMSYSERR_NOERROR
,"waveOutPrepareHeader(%s): rc=%s\n",
272 dev_name(device
),wave_out_error(rc
));
274 if (rc
==MMSYSERR_NOERROR
)
276 WaitForSingleObject(hevent
,INFINITE
);
277 rc
=waveOutWrite(wout
, &frag
, sizeof(frag
));
278 ok(rc
==MMSYSERR_NOERROR
,"waveOutWrite(%s): rc=%s\n",
279 dev_name(device
),wave_out_error(rc
));
280 WaitForSingleObject(hevent
,INFINITE
);
282 rc
=waveOutUnprepareHeader(wout
, &frag
, sizeof(frag
));
283 ok(rc
==MMSYSERR_NOERROR
,"waveOutUnprepareHeader(%s): rc=%s\n",
284 dev_name(device
),wave_out_error(rc
));
286 rc
=waveOutClose(wout
);
287 ok(rc
==MMSYSERR_NOERROR
,"waveOutClose(%s): rc=%s\n",
288 dev_name(device
),wave_out_error(rc
));
291 trace("Unable to play back the recorded sound\n");
298 static void wave_in_test_device(int device
)
302 WAVEFORMATEX format
,oformat
;
303 WAVEFORMATEXTENSIBLE wfex
;
312 SYSTEM_INFO sSysInfo
;
316 GetSystemInfo(&sSysInfo
);
317 dwPageSize
= sSysInfo
.dwPageSize
;
319 rc
=waveInGetDevCapsA(device
,&capsA
,sizeof(capsA
));
320 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_BADDEVICEID
||
321 rc
==MMSYSERR_NODRIVER
,
322 "waveInGetDevCapsA(%s): failed to get capabilities: rc=%s\n",
323 dev_name(device
),wave_in_error(rc
));
324 if (rc
==MMSYSERR_BADDEVICEID
|| rc
==MMSYSERR_NODRIVER
)
327 rc
=waveInGetDevCapsW(device
,&capsW
,sizeof(capsW
));
328 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_NOTSUPPORTED
,
329 "waveInGetDevCapsW(%s): MMSYSERR_NOERROR or MMSYSERR_NOTSUPPORTED "
330 "expected, got %s\n",dev_name(device
),wave_in_error(rc
));
332 rc
=waveInGetDevCapsA(device
,NULL
,sizeof(capsA
));
333 ok(rc
==MMSYSERR_INVALPARAM
,
334 "waveInGetDevCapsA(%s): MMSYSERR_INVALPARAM expected, got %s\n",
335 dev_name(device
),wave_in_error(rc
));
337 rc
=waveInGetDevCapsW(device
,NULL
,sizeof(capsW
));
338 ok(rc
==MMSYSERR_INVALPARAM
|| rc
==MMSYSERR_NOTSUPPORTED
,
339 "waveInGetDevCapsW(%s): MMSYSERR_INVALPARAM or MMSYSERR_NOTSUPPORTED "
340 "expected, got %s\n",dev_name(device
),wave_in_error(rc
));
344 /* FIXME: this works on windows but crashes wine */
345 rc
=waveInGetDevCapsA(device
,(LPWAVEINCAPSA
)1,sizeof(capsA
));
346 ok(rc
==MMSYSERR_INVALPARAM
,
347 "waveInGetDevCapsA(%s): MMSYSERR_INVALPARAM expected, got %s\n",
348 dev_name(device
),wave_in_error(rc
));
350 rc
=waveInGetDevCapsW(device
,(LPWAVEINCAPSW
)1,sizeof(capsW
));
351 ok(rc
==MMSYSERR_INVALPARAM
|| rc
==MMSYSERR_NOTSUPPORTED
,
352 "waveInGetDevCapsW(%s): MMSYSERR_INVALPARAM or MMSYSERR_NOTSUPPORTED "
353 "expected, got %s\n",dev_name(device
),wave_in_error(rc
));
356 rc
=waveInGetDevCapsA(device
,&capsA
,4);
357 ok(rc
==MMSYSERR_NOERROR
,
358 "waveInGetDevCapsA(%s): MMSYSERR_NOERROR expected, got %s\n",
359 dev_name(device
),wave_in_error(rc
));
361 rc
=waveInGetDevCapsW(device
,&capsW
,4);
362 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_NOTSUPPORTED
,
363 "waveInGetDevCapsW(%s): MMSYSERR_NOERROR or MMSYSERR_NOTSUPPORTED "
364 "expected, got %s\n",dev_name(device
),wave_in_error(rc
));
367 rc
=waveInMessage((HWAVEIN
)device
, DRV_QUERYDEVICEINTERFACESIZE
,
368 (DWORD_PTR
)&size
, 0);
369 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_INVALPARAM
||
370 rc
==MMSYSERR_NOTSUPPORTED
,
371 "waveInMessage(%s): failed to get interface size: rc=%s\n",
372 dev_name(device
),wave_in_error(rc
));
373 if (rc
==MMSYSERR_NOERROR
) {
374 nameW
= (WCHAR
*)malloc(size
);
375 rc
=waveInMessage((HWAVEIN
)device
, DRV_QUERYDEVICEINTERFACE
,
376 (DWORD_PTR
)nameW
, size
);
377 ok(rc
==MMSYSERR_NOERROR
,"waveInMessage(%s): failed to get interface "
378 "name: rc=%s\n",dev_name(device
),wave_in_error(rc
));
379 ok(lstrlenW(nameW
)+1==size
/sizeof(WCHAR
),
380 "got an incorrect size %d\n", size
);
381 if (rc
==MMSYSERR_NOERROR
) {
382 nameA
= malloc(size
/sizeof(WCHAR
));
383 WideCharToMultiByte(CP_ACP
, 0, nameW
, size
/sizeof(WCHAR
),
384 nameA
, size
/sizeof(WCHAR
), NULL
, NULL
);
387 } else if (rc
==MMSYSERR_NOTSUPPORTED
) {
388 nameA
=strdup("not supported");
391 trace(" %s: \"%s\" (%s) %d.%d (%d:%d)\n",dev_name(device
),capsA
.szPname
,
392 (nameA
?nameA
:"failed"),capsA
.vDriverVersion
>> 8,
393 capsA
.vDriverVersion
& 0xff,capsA
.wMid
,capsA
.wPid
);
394 trace(" channels=%d formats=%05x\n",
395 capsA
.wChannels
,capsA
.dwFormats
);
399 for (f
=0;f
<NB_WIN_FORMATS
;f
++) {
400 format
.wFormatTag
=WAVE_FORMAT_PCM
;
401 format
.nChannels
=win_formats
[f
][3];
402 format
.wBitsPerSample
=win_formats
[f
][2];
403 format
.nSamplesPerSec
=win_formats
[f
][1];
404 format
.nBlockAlign
=format
.nChannels
*format
.wBitsPerSample
/8;
405 format
.nAvgBytesPerSec
=format
.nSamplesPerSec
*format
.nBlockAlign
;
407 wave_in_test_deviceIn(device
,&format
,win_formats
[f
][0],0, &capsA
);
408 if (device
!= WAVE_MAPPER
) {
409 wave_in_test_deviceIn(device
,&format
,win_formats
[f
][0],
410 WAVE_FORMAT_DIRECT
, &capsA
);
411 wave_in_test_deviceIn(device
,&format
,win_formats
[f
][0],
412 WAVE_MAPPED
, &capsA
);
416 /* Try a PCMWAVEFORMAT aligned next to an unaccessible page for bounds
418 twoPages
= VirtualAlloc(NULL
, 2 * dwPageSize
, MEM_RESERVE
| MEM_COMMIT
,
420 ok(twoPages
!=NULL
,"Failed to allocate 2 pages of memory\n");
422 res
= VirtualProtect(twoPages
+ dwPageSize
, dwPageSize
, PAGE_NOACCESS
,
424 ok(res
, "Failed to set memory access on second page\n");
426 LPWAVEFORMATEX pwfx
= (LPWAVEFORMATEX
)(twoPages
+ dwPageSize
-
427 sizeof(PCMWAVEFORMAT
));
428 pwfx
->wFormatTag
=WAVE_FORMAT_PCM
;
430 pwfx
->wBitsPerSample
=8;
431 pwfx
->nSamplesPerSec
=22050;
432 pwfx
->nBlockAlign
=pwfx
->nChannels
*pwfx
->wBitsPerSample
/8;
433 pwfx
->nAvgBytesPerSec
=pwfx
->nSamplesPerSec
*pwfx
->nBlockAlign
;
434 wave_in_test_deviceIn(device
,pwfx
,WAVE_FORMAT_2M08
,0, &capsA
);
435 if (device
!= WAVE_MAPPER
) {
436 wave_in_test_deviceIn(device
,pwfx
,WAVE_FORMAT_2M08
,
437 WAVE_FORMAT_DIRECT
, &capsA
);
438 wave_in_test_deviceIn(device
,pwfx
,WAVE_FORMAT_2M08
,
439 WAVE_MAPPED
, &capsA
);
442 VirtualFree(twoPages
, 2 * dwPageSize
, MEM_RELEASE
);
445 /* Testing invalid format: 2 MHz sample rate */
446 format
.wFormatTag
=WAVE_FORMAT_PCM
;
448 format
.wBitsPerSample
=16;
449 format
.nSamplesPerSec
=2000000;
450 format
.nBlockAlign
=format
.nChannels
*format
.wBitsPerSample
/8;
451 format
.nAvgBytesPerSec
=format
.nSamplesPerSec
*format
.nBlockAlign
;
454 rc
=waveInOpen(&win
,device
,&format
,0,0,CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
455 ok(rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_INVALFLAG
||
456 rc
==MMSYSERR_INVALPARAM
,
457 "waveInOpen(%s): opening the device with 2 MHz sample rate should fail: "
458 " rc=%s\n",dev_name(device
),wave_in_error(rc
));
459 if (rc
==MMSYSERR_NOERROR
) {
460 trace(" got %dx%2dx%d for %dx%2dx%d\n",
461 format
.nSamplesPerSec
, format
.wBitsPerSample
,
463 oformat
.nSamplesPerSec
, oformat
.wBitsPerSample
,
468 /* test non PCM formats */
469 format
.wFormatTag
=WAVE_FORMAT_MULAW
;
471 format
.wBitsPerSample
=8;
472 format
.nSamplesPerSec
=8000;
473 format
.nBlockAlign
=format
.nChannels
*format
.wBitsPerSample
/8;
474 format
.nAvgBytesPerSec
=format
.nSamplesPerSec
*format
.nBlockAlign
;
476 rc
=waveInOpen(&win
,device
,&format
,0,0,CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
477 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
478 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
479 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
480 if (rc
==MMSYSERR_NOERROR
) {
482 wave_in_test_deviceIn(device
,&format
,0,0,&capsA
);
484 trace("waveInOpen(%s): WAVE_FORMAT_MULAW not supported\n",
487 format
.wFormatTag
=WAVE_FORMAT_ADPCM
;
489 format
.wBitsPerSample
=4;
490 format
.nSamplesPerSec
=22050;
491 format
.nBlockAlign
=format
.nChannels
*format
.wBitsPerSample
/8;
492 format
.nAvgBytesPerSec
=format
.nSamplesPerSec
*format
.nBlockAlign
;
494 rc
=waveInOpen(&win
,device
,&format
,0,0,CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
495 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
496 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
497 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
498 if (rc
==MMSYSERR_NOERROR
) {
500 wave_in_test_deviceIn(device
,&format
,0,0,&capsA
);
502 trace("waveInOpen(%s): WAVE_FORMAT_ADPCM not supported\n",
505 /* test if WAVEFORMATEXTENSIBLE supported */
506 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
507 wfex
.Format
.nChannels
=2;
508 wfex
.Format
.wBitsPerSample
=16;
509 wfex
.Format
.nSamplesPerSec
=22050;
510 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
511 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
512 wfex
.Format
.nBlockAlign
;
513 wfex
.Format
.cbSize
=22;
514 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
515 wfex
.dwChannelMask
=SPEAKER_ALL
;
516 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_PCM
;
517 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
518 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
519 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
520 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
521 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
522 if (rc
==MMSYSERR_NOERROR
) {
524 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
526 trace("waveInOpen(%s): WAVE_FORMAT_EXTENSIBLE not supported\n",
529 /* test if 4 channels supported */
530 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
531 wfex
.Format
.nChannels
=4;
532 wfex
.Format
.wBitsPerSample
=16;
533 wfex
.Format
.nSamplesPerSec
=22050;
534 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
535 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
536 wfex
.Format
.nBlockAlign
;
537 wfex
.Format
.cbSize
=22;
538 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
539 wfex
.dwChannelMask
=SPEAKER_ALL
;
540 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_PCM
;
541 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
542 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
543 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
544 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
545 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
546 if (rc
==MMSYSERR_NOERROR
) {
548 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
550 trace("waveInOpen(%s): 4 channels not supported\n",
553 /* test if 6 channels supported */
554 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
555 wfex
.Format
.nChannels
=6;
556 wfex
.Format
.wBitsPerSample
=16;
557 wfex
.Format
.nSamplesPerSec
=22050;
558 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
559 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
560 wfex
.Format
.nBlockAlign
;
561 wfex
.Format
.cbSize
=22;
562 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
563 wfex
.dwChannelMask
=SPEAKER_ALL
;
564 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_PCM
;
565 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
566 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
567 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
568 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
569 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
570 if (rc
==MMSYSERR_NOERROR
) {
572 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
574 trace("waveInOpen(%s): 6 channels not supported\n",
579 /* FIXME: ALSA doesn't like this */
580 /* test if 24 bit samples supported */
581 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
582 wfex
.Format
.nChannels
=2;
583 wfex
.Format
.wBitsPerSample
=24;
584 wfex
.Format
.nSamplesPerSec
=22050;
585 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
586 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
587 wfex
.Format
.nBlockAlign
;
588 wfex
.Format
.cbSize
=22;
589 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
590 wfex
.dwChannelMask
=SPEAKER_ALL
;
591 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_PCM
;
592 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
593 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
594 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
595 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
596 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
597 if (rc
==MMSYSERR_NOERROR
) {
599 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
601 trace("waveInOpen(%s): 24 bit samples not supported\n",
605 /* test if 32 bit samples supported */
606 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
607 wfex
.Format
.nChannels
=2;
608 wfex
.Format
.wBitsPerSample
=32;
609 wfex
.Format
.nSamplesPerSec
=22050;
610 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
611 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
612 wfex
.Format
.nBlockAlign
;
613 wfex
.Format
.cbSize
=22;
614 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
615 wfex
.dwChannelMask
=SPEAKER_ALL
;
616 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_PCM
;
617 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
618 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
619 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
620 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
621 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
622 if (rc
==MMSYSERR_NOERROR
) {
624 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
626 trace("waveInOpen(%s): 32 bit samples not supported\n",
629 /* test if 32 bit float samples supported */
630 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
631 wfex
.Format
.nChannels
=2;
632 wfex
.Format
.wBitsPerSample
=32;
633 wfex
.Format
.nSamplesPerSec
=22050;
634 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
635 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
636 wfex
.Format
.nBlockAlign
;
637 wfex
.Format
.cbSize
=22;
638 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
639 wfex
.dwChannelMask
=SPEAKER_ALL
;
640 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
;
641 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
642 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
643 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
644 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
645 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
646 if (rc
==MMSYSERR_NOERROR
) {
648 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
650 trace("waveInOpen(%s): 32 bit float samples not supported\n",
654 static void wave_in_tests(void)
663 ndev
=waveInGetNumDevs();
664 trace("found %d WaveIn devices\n",ndev
);
666 rc
=waveInGetDevCapsA(ndev
+1,&capsA
,sizeof(capsA
));
667 ok(rc
==MMSYSERR_BADDEVICEID
,
668 "waveInGetDevCapsA(%s): MMSYSERR_BADDEVICEID expected, got %s\n",
669 dev_name(ndev
+1),wave_in_error(rc
));
671 rc
=waveInGetDevCapsA(WAVE_MAPPER
,&capsA
,sizeof(capsA
));
673 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_NODRIVER
,
674 "waveInGetDevCapsA(%s): MMSYSERR_NOERROR or MMSYSERR_NODRIVER "
675 "expected, got %s\n",dev_name(WAVE_MAPPER
),wave_in_error(rc
));
677 ok(rc
==MMSYSERR_BADDEVICEID
|| rc
==MMSYSERR_NODRIVER
,
678 "waveInGetDevCapsA(%s): MMSYSERR_BADDEVICEID or MMSYSERR_NODRIVER "
679 "expected, got %s\n",dev_name(WAVE_MAPPER
),wave_in_error(rc
));
681 rc
=waveInGetDevCapsW(ndev
+1,&capsW
,sizeof(capsW
));
682 ok(rc
==MMSYSERR_BADDEVICEID
|| rc
==MMSYSERR_NOTSUPPORTED
,
683 "waveInGetDevCapsW(%s): MMSYSERR_BADDEVICEID or MMSYSERR_NOTSUPPORTED "
684 "expected, got %s\n",dev_name(ndev
+1),wave_in_error(rc
));
686 rc
=waveInGetDevCapsW(WAVE_MAPPER
,&capsW
,sizeof(capsW
));
688 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_NODRIVER
||
689 rc
==MMSYSERR_NOTSUPPORTED
,
690 "waveInGetDevCapsW(%s): MMSYSERR_NOERROR or MMSYSERR_NODRIVER or "
691 "MMSYSERR_NOTSUPPORTED expected, got %s\n",
692 dev_name(ndev
+1),wave_in_error(rc
));
694 ok(rc
==MMSYSERR_BADDEVICEID
|| rc
==MMSYSERR_NODRIVER
||
695 rc
==MMSYSERR_NOTSUPPORTED
,
696 "waveInGetDevCapsW(%s): MMSYSERR_BADDEVICEID or MMSYSERR_NODRIVER or"
697 "MMSYSERR_NOTSUPPORTED expected, got %s\n",
698 dev_name(ndev
+1),wave_in_error(rc
));
700 format
.wFormatTag
=WAVE_FORMAT_PCM
;
702 format
.wBitsPerSample
=16;
703 format
.nSamplesPerSec
=44100;
704 format
.nBlockAlign
=format
.nChannels
*format
.wBitsPerSample
/8;
705 format
.nAvgBytesPerSec
=format
.nSamplesPerSec
*format
.nBlockAlign
;
707 rc
=waveInOpen(&win
,ndev
+1,&format
,0,0,CALLBACK_NULL
);
708 ok(rc
==MMSYSERR_BADDEVICEID
,
709 "waveInOpen(%s): MMSYSERR_BADDEVICEID expected, got %s\n",
710 dev_name(ndev
+1),wave_in_error(rc
));
713 wave_in_test_device(d
);
716 wave_in_test_device(WAVE_MAPPER
);