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
,
60 mmtime
.wType
= TIME_BYTES
;
61 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
62 ok(rc
==MMSYSERR_NOERROR
,
63 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
64 if (mmtime
.wType
!= TIME_BYTES
&& winetest_debug
> 1)
65 trace("waveInGetPosition(%s): TIME_BYTES not supported, returned %s\n",
66 dev_name(device
),wave_time_format(mmtime
.wType
));
67 returned
= time_to_bytes(&mmtime
, pwfx
);
68 ok(returned
== bytes
, "waveInGetPosition(%s): returned %d bytes, "
69 "should be %d\n", dev_name(device
), returned
, bytes
);
71 mmtime
.wType
= TIME_SAMPLES
;
72 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
73 ok(rc
==MMSYSERR_NOERROR
,
74 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
75 if (mmtime
.wType
!= TIME_SAMPLES
&& winetest_debug
> 1)
76 trace("waveInGetPosition(%s): TIME_SAMPLES not supported, "
77 "returned %s\n",dev_name(device
),wave_time_format(mmtime
.wType
));
78 returned
= time_to_bytes(&mmtime
, pwfx
);
79 ok(returned
== bytes
, "waveInGetPosition(%s): returned %d samples, "
80 "should be %d\n", dev_name(device
), bytes_to_samples(returned
, pwfx
),
81 bytes_to_samples(bytes
, pwfx
));
83 mmtime
.wType
= TIME_MS
;
84 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
85 ok(rc
==MMSYSERR_NOERROR
,
86 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
87 if (mmtime
.wType
!= TIME_MS
&& winetest_debug
> 1)
88 trace("waveInGetPosition(%s): TIME_MS not supported, returned %s\n",
89 dev_name(device
), wave_time_format(mmtime
.wType
));
90 returned
= time_to_bytes(&mmtime
, pwfx
);
91 ok(returned
== bytes
, "waveInGetPosition(%s): returned %d ms, "
92 "should be %d\n", dev_name(device
), bytes_to_ms(returned
, pwfx
),
93 bytes_to_ms(bytes
, pwfx
));
95 mmtime
.wType
= TIME_SMPTE
;
96 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
97 ok(rc
==MMSYSERR_NOERROR
,
98 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
99 if (mmtime
.wType
!= TIME_SMPTE
&& winetest_debug
> 1)
100 trace("waveInGetPosition(%s): TIME_SMPTE not supported, returned %s\n",
101 dev_name(device
),wave_time_format(mmtime
.wType
));
102 returned
= time_to_bytes(&mmtime
, pwfx
);
103 ok(returned
== bytes
, "waveInGetPosition(%s): SMPTE test failed\n",
106 mmtime
.wType
= TIME_MIDI
;
107 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
108 ok(rc
==MMSYSERR_NOERROR
,
109 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
110 if (mmtime
.wType
!= TIME_MIDI
&& winetest_debug
> 1)
111 trace("waveInGetPosition(%s): TIME_MIDI not supported, returned %s\n",
112 dev_name(device
),wave_time_format(mmtime
.wType
));
113 returned
= time_to_bytes(&mmtime
, pwfx
);
114 ok(returned
== bytes
, "waveInGetPosition(%s): MIDI test failed\n",
117 mmtime
.wType
= TIME_TICKS
;
118 rc
=waveInGetPosition(win
, &mmtime
, sizeof(mmtime
));
119 ok(rc
==MMSYSERR_NOERROR
,
120 "waveInGetPosition(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
121 if (mmtime
.wType
!= TIME_TICKS
&& winetest_debug
> 1)
122 trace("waveInGetPosition(%s): TIME_TICKS not supported, returned %s\n",
123 dev_name(device
),wave_time_format(mmtime
.wType
));
124 returned
= time_to_bytes(&mmtime
, pwfx
);
125 ok(returned
== bytes
, "waveInGetPosition(%s): TICKS test failed\n",
129 static void wave_in_test_deviceIn(int device
, LPWAVEFORMATEX pwfx
, DWORD format
, DWORD flags
, LPWAVEINCAPS pcaps
)
137 WORD nChannels
= pwfx
->nChannels
;
138 WORD wBitsPerSample
= pwfx
->wBitsPerSample
;
139 DWORD nSamplesPerSec
= pwfx
->nSamplesPerSec
;
141 hevent
=CreateEvent(NULL
,FALSE
,FALSE
,NULL
);
142 ok(hevent
!=NULL
,"CreateEvent(): error=%d\n",GetLastError());
147 rc
=waveInOpen(&win
,device
,pwfx
,(DWORD_PTR
)hevent
,0,CALLBACK_EVENT
|flags
);
148 /* Note: Win9x doesn't know WAVE_FORMAT_DIRECT */
149 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_BADDEVICEID
||
150 rc
==MMSYSERR_NOTENABLED
|| rc
==MMSYSERR_NODRIVER
||
151 rc
==MMSYSERR_ALLOCATED
||
152 ((rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_NOTSUPPORTED
) &&
153 (flags
& WAVE_FORMAT_DIRECT
) && !(pcaps
->dwFormats
& format
)) ||
154 ((rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_NOTSUPPORTED
) &&
155 (!(flags
& WAVE_FORMAT_DIRECT
) || (flags
& WAVE_MAPPED
)) &&
156 !(pcaps
->dwFormats
& format
)) ||
157 (rc
==MMSYSERR_INVALFLAG
&& (flags
& WAVE_FORMAT_DIRECT
)),
158 "waveInOpen(%s): format=%dx%2dx%d flags=%x(%s) rc=%s\n",
159 dev_name(device
),pwfx
->nSamplesPerSec
,pwfx
->wBitsPerSample
,
160 pwfx
->nChannels
,CALLBACK_EVENT
|flags
,
161 wave_open_flags(CALLBACK_EVENT
|flags
),wave_in_error(rc
));
162 if ((rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_NOTSUPPORTED
) &&
163 (flags
& WAVE_FORMAT_DIRECT
) && (pcaps
->dwFormats
& format
))
164 trace(" Reason: The device lists this format as supported in it's "
165 "capabilities but opening it failed.\n");
166 if ((rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_NOTSUPPORTED
) &&
167 !(pcaps
->dwFormats
& format
))
168 trace("waveInOpen(%s): format=%dx%2dx%d %s rc=%s failed but format "
169 "not supported so OK.\n",dev_name(device
),pwfx
->nSamplesPerSec
,
170 pwfx
->wBitsPerSample
,pwfx
->nChannels
,
171 flags
& WAVE_FORMAT_DIRECT
? "flags=WAVE_FORMAT_DIRECT" :
172 flags
& WAVE_MAPPED
? "flags=WAVE_MAPPED" : "", mmsys_error(rc
));
173 if (rc
!=MMSYSERR_NOERROR
) {
177 res
=WaitForSingleObject(hevent
,1000);
178 ok(res
==WAIT_OBJECT_0
,"WaitForSingleObject failed for open\n");
180 ok(pwfx
->nChannels
==nChannels
&&
181 pwfx
->wBitsPerSample
==wBitsPerSample
&&
182 pwfx
->nSamplesPerSec
==nSamplesPerSec
,
183 "got the wrong format: %dx%2dx%d instead of %dx%2dx%d\n",
184 pwfx
->nSamplesPerSec
, pwfx
->wBitsPerSample
,
185 pwfx
->nChannels
, nSamplesPerSec
, wBitsPerSample
, nChannels
);
187 /* Check that the position is 0 at start */
188 check_position(device
, win
, 0, pwfx
);
190 frag
.lpData
=HeapAlloc(GetProcessHeap(), 0, pwfx
->nAvgBytesPerSec
);
191 frag
.dwBufferLength
=pwfx
->nAvgBytesPerSec
;
192 frag
.dwBytesRecorded
=0;
198 rc
=waveInPrepareHeader(win
, &frag
, sizeof(frag
));
199 ok(rc
==MMSYSERR_NOERROR
, "waveInPrepareHeader(%s): rc=%s\n",
200 dev_name(device
),wave_in_error(rc
));
201 ok(frag
.dwFlags
&WHDR_PREPARED
,"waveInPrepareHeader(%s): prepared flag "
202 "not set\n",dev_name(device
));
204 if (winetest_interactive
&& rc
==MMSYSERR_NOERROR
) {
205 trace("Recording for 1 second at %5dx%2dx%d %s %s\n",
206 pwfx
->nSamplesPerSec
, pwfx
->wBitsPerSample
,pwfx
->nChannels
,
207 get_format_str(pwfx
->wFormatTag
),
208 flags
& WAVE_FORMAT_DIRECT
? "WAVE_FORMAT_DIRECT" :
209 flags
& WAVE_MAPPED
? "WAVE_MAPPED" : "");
210 rc
=waveInAddBuffer(win
, &frag
, sizeof(frag
));
211 ok(rc
==MMSYSERR_NOERROR
,"waveInAddBuffer(%s): rc=%s\n",
212 dev_name(device
),wave_in_error(rc
));
214 /* Check that the position is 0 at start */
215 check_position(device
, win
, 0, pwfx
);
218 ok(rc
==MMSYSERR_NOERROR
,"waveInStart(%s): rc=%s\n",
219 dev_name(device
),wave_in_error(rc
));
221 res
= WaitForSingleObject(hevent
,1200);
222 ok(res
==WAIT_OBJECT_0
,"WaitForSingleObject failed for header\n");
223 ok(frag
.dwFlags
&WHDR_DONE
,"WHDR_DONE not set in frag.dwFlags\n");
224 ok(frag
.dwBytesRecorded
==pwfx
->nAvgBytesPerSec
,
225 "frag.dwBytesRecorded=%d, should=%d\n",
226 frag
.dwBytesRecorded
,pwfx
->nAvgBytesPerSec
);
228 mmt
.wType
= TIME_SAMPLES
;
229 rc
=waveInGetPosition(win
, &mmt
, sizeof(mmt
));
230 ok(rc
==MMSYSERR_NOERROR
,"waveInGetPosition(%s): rc=%s\n",
231 dev_name(device
),wave_in_error(rc
));
232 ok(mmt
.u
.cb
== frag
.dwBytesRecorded
, "Got wrong position: %u\n", mmt
.u
.cb
);
234 /* stop playing on error */
235 if (res
!=WAIT_OBJECT_0
) {
237 ok(rc
==MMSYSERR_NOERROR
,
238 "waveInStop(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
242 rc
=waveInUnprepareHeader(win
, &frag
, sizeof(frag
));
243 ok(rc
==MMSYSERR_NOERROR
,"waveInUnprepareHeader(%s): rc=%s\n",
244 dev_name(device
),wave_in_error(rc
));
247 ok(rc
==MMSYSERR_NOERROR
,
248 "waveInClose(%s): rc=%s\n",dev_name(device
),wave_in_error(rc
));
249 res
=WaitForSingleObject(hevent
,1000);
250 ok(res
==WAIT_OBJECT_0
,"WaitForSingleObject failed for close\n");
252 if (winetest_interactive
)
255 * Now play back what we recorded
259 trace("Playing back recorded sound\n");
260 rc
=waveOutOpen(&wout
,WAVE_MAPPER
,pwfx
,(DWORD_PTR
)hevent
,0,CALLBACK_EVENT
);
261 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_BADDEVICEID
||
262 rc
==MMSYSERR_NOTENABLED
|| rc
==MMSYSERR_NODRIVER
||
263 rc
==MMSYSERR_ALLOCATED
||
264 ((rc
==WAVERR_BADFORMAT
|| rc
==MMSYSERR_NOTSUPPORTED
) &&
265 !(pcaps
->dwFormats
& format
)),
266 "waveOutOpen(%s) format=%dx%2dx%d flags=%x(%s) rc=%s\n",
267 dev_name(device
),pwfx
->nSamplesPerSec
,pwfx
->wBitsPerSample
,
268 pwfx
->nChannels
,CALLBACK_EVENT
|flags
,
269 wave_open_flags(CALLBACK_EVENT
),wave_out_error(rc
));
270 if (rc
==MMSYSERR_NOERROR
)
272 rc
=waveOutPrepareHeader(wout
, &frag
, sizeof(frag
));
273 ok(rc
==MMSYSERR_NOERROR
,"waveOutPrepareHeader(%s): rc=%s\n",
274 dev_name(device
),wave_out_error(rc
));
276 if (rc
==MMSYSERR_NOERROR
)
278 WaitForSingleObject(hevent
,INFINITE
);
279 rc
=waveOutWrite(wout
, &frag
, sizeof(frag
));
280 ok(rc
==MMSYSERR_NOERROR
,"waveOutWrite(%s): rc=%s\n",
281 dev_name(device
),wave_out_error(rc
));
282 WaitForSingleObject(hevent
,INFINITE
);
284 rc
=waveOutUnprepareHeader(wout
, &frag
, sizeof(frag
));
285 ok(rc
==MMSYSERR_NOERROR
,"waveOutUnprepareHeader(%s): rc=%s\n",
286 dev_name(device
),wave_out_error(rc
));
288 rc
=waveOutClose(wout
);
289 ok(rc
==MMSYSERR_NOERROR
,"waveOutClose(%s): rc=%s\n",
290 dev_name(device
),wave_out_error(rc
));
293 trace("Unable to play back the recorded sound\n");
296 HeapFree(GetProcessHeap(), 0, frag
.lpData
);
300 static void wave_in_test_device(UINT_PTR device
)
305 WAVEFORMATEXTENSIBLE wfex
;
314 SYSTEM_INFO sSysInfo
;
318 GetSystemInfo(&sSysInfo
);
319 dwPageSize
= sSysInfo
.dwPageSize
;
321 rc
=waveInGetDevCapsA(device
,&capsA
,sizeof(capsA
));
322 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_BADDEVICEID
||
323 rc
==MMSYSERR_NODRIVER
,
324 "waveInGetDevCapsA(%s): failed to get capabilities: rc=%s\n",
325 dev_name(device
),wave_in_error(rc
));
326 if (rc
==MMSYSERR_BADDEVICEID
|| rc
==MMSYSERR_NODRIVER
)
329 rc
=waveInGetDevCapsW(device
,&capsW
,sizeof(capsW
));
330 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_NOTSUPPORTED
,
331 "waveInGetDevCapsW(%s): MMSYSERR_NOERROR or MMSYSERR_NOTSUPPORTED "
332 "expected, got %s\n",dev_name(device
),wave_in_error(rc
));
334 rc
=waveInGetDevCapsA(device
,NULL
,sizeof(capsA
));
335 ok(rc
==MMSYSERR_INVALPARAM
,
336 "waveInGetDevCapsA(%s): MMSYSERR_INVALPARAM expected, got %s\n",
337 dev_name(device
),wave_in_error(rc
));
339 rc
=waveInGetDevCapsW(device
,NULL
,sizeof(capsW
));
340 ok(rc
==MMSYSERR_INVALPARAM
|| rc
==MMSYSERR_NOTSUPPORTED
,
341 "waveInGetDevCapsW(%s): MMSYSERR_INVALPARAM or MMSYSERR_NOTSUPPORTED "
342 "expected, got %s\n",dev_name(device
),wave_in_error(rc
));
346 /* FIXME: this works on windows but crashes wine */
347 rc
=waveInGetDevCapsA(device
,(LPWAVEINCAPSA
)1,sizeof(capsA
));
348 ok(rc
==MMSYSERR_INVALPARAM
,
349 "waveInGetDevCapsA(%s): MMSYSERR_INVALPARAM expected, got %s\n",
350 dev_name(device
),wave_in_error(rc
));
352 rc
=waveInGetDevCapsW(device
,(LPWAVEINCAPSW
)1,sizeof(capsW
));
353 ok(rc
==MMSYSERR_INVALPARAM
|| rc
==MMSYSERR_NOTSUPPORTED
,
354 "waveInGetDevCapsW(%s): MMSYSERR_INVALPARAM or MMSYSERR_NOTSUPPORTED "
355 "expected, got %s\n",dev_name(device
),wave_in_error(rc
));
358 rc
=waveInGetDevCapsA(device
,&capsA
,4);
359 ok(rc
==MMSYSERR_NOERROR
,
360 "waveInGetDevCapsA(%s): MMSYSERR_NOERROR expected, got %s\n",
361 dev_name(device
),wave_in_error(rc
));
363 rc
=waveInGetDevCapsW(device
,&capsW
,4);
364 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_NOTSUPPORTED
||
365 rc
==MMSYSERR_INVALPARAM
, /* Vista, W2K8 */
366 "waveInGetDevCapsW(%s): unexpected return value %s\n",
367 dev_name(device
),wave_in_error(rc
));
370 rc
=waveInMessage((HWAVEIN
)device
, DRV_QUERYDEVICEINTERFACESIZE
,
371 (DWORD_PTR
)&size
, 0);
372 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_INVALPARAM
||
373 rc
==MMSYSERR_NOTSUPPORTED
,
374 "waveInMessage(%s): failed to get interface size: rc=%s\n",
375 dev_name(device
),wave_in_error(rc
));
376 if (rc
==MMSYSERR_NOERROR
) {
377 nameW
= HeapAlloc(GetProcessHeap(), 0, size
);
378 rc
=waveInMessage((HWAVEIN
)device
, DRV_QUERYDEVICEINTERFACE
,
379 (DWORD_PTR
)nameW
, size
);
380 ok(rc
==MMSYSERR_NOERROR
,"waveInMessage(%s): failed to get interface "
381 "name: rc=%s\n",dev_name(device
),wave_in_error(rc
));
382 ok(lstrlenW(nameW
)+1==size
/sizeof(WCHAR
),
383 "got an incorrect size %d\n", size
);
384 if (rc
==MMSYSERR_NOERROR
) {
385 nameA
= HeapAlloc(GetProcessHeap(), 0, size
/sizeof(WCHAR
));
386 WideCharToMultiByte(CP_ACP
, 0, nameW
, size
/sizeof(WCHAR
),
387 nameA
, size
/sizeof(WCHAR
), NULL
, NULL
);
389 HeapFree(GetProcessHeap(), 0, nameW
);
390 } else if (rc
==MMSYSERR_NOTSUPPORTED
) {
391 nameA
=HeapAlloc(GetProcessHeap(), 0, sizeof("not supported"));
392 strcpy(nameA
, "not supported");
395 trace(" %s: \"%s\" (%s) %d.%d (%d:%d)\n",dev_name(device
),capsA
.szPname
,
396 (nameA
?nameA
:"failed"),capsA
.vDriverVersion
>> 8,
397 capsA
.vDriverVersion
& 0xff,capsA
.wMid
,capsA
.wPid
);
398 trace(" channels=%d formats=%05x\n",
399 capsA
.wChannels
,capsA
.dwFormats
);
401 HeapFree(GetProcessHeap(), 0, nameA
);
403 for (f
=0;f
<NB_WIN_FORMATS
;f
++) {
404 format
.wFormatTag
=WAVE_FORMAT_PCM
;
405 format
.nChannels
=win_formats
[f
][3];
406 format
.wBitsPerSample
=win_formats
[f
][2];
407 format
.nSamplesPerSec
=win_formats
[f
][1];
408 format
.nBlockAlign
=format
.nChannels
*format
.wBitsPerSample
/8;
409 format
.nAvgBytesPerSec
=format
.nSamplesPerSec
*format
.nBlockAlign
;
411 wave_in_test_deviceIn(device
,&format
,win_formats
[f
][0],0, &capsA
);
412 if (device
!= WAVE_MAPPER
) {
413 wave_in_test_deviceIn(device
,&format
,win_formats
[f
][0],
414 WAVE_FORMAT_DIRECT
, &capsA
);
415 wave_in_test_deviceIn(device
,&format
,win_formats
[f
][0],
416 WAVE_MAPPED
, &capsA
);
420 /* Try a PCMWAVEFORMAT aligned next to an unaccessible page for bounds
422 twoPages
= VirtualAlloc(NULL
, 2 * dwPageSize
, MEM_RESERVE
| MEM_COMMIT
,
424 ok(twoPages
!=NULL
,"Failed to allocate 2 pages of memory\n");
426 res
= VirtualProtect(twoPages
+ dwPageSize
, dwPageSize
, PAGE_NOACCESS
,
428 ok(res
, "Failed to set memory access on second page\n");
430 LPWAVEFORMATEX pwfx
= (LPWAVEFORMATEX
)(twoPages
+ dwPageSize
-
431 sizeof(PCMWAVEFORMAT
));
432 pwfx
->wFormatTag
=WAVE_FORMAT_PCM
;
434 pwfx
->wBitsPerSample
=8;
435 pwfx
->nSamplesPerSec
=22050;
436 pwfx
->nBlockAlign
=pwfx
->nChannels
*pwfx
->wBitsPerSample
/8;
437 pwfx
->nAvgBytesPerSec
=pwfx
->nSamplesPerSec
*pwfx
->nBlockAlign
;
438 wave_in_test_deviceIn(device
,pwfx
,WAVE_FORMAT_2M08
,0, &capsA
);
439 if (device
!= WAVE_MAPPER
) {
440 wave_in_test_deviceIn(device
,pwfx
,WAVE_FORMAT_2M08
,
441 WAVE_FORMAT_DIRECT
, &capsA
);
442 wave_in_test_deviceIn(device
,pwfx
,WAVE_FORMAT_2M08
,
443 WAVE_MAPPED
, &capsA
);
446 VirtualFree(twoPages
, 2 * dwPageSize
, MEM_RELEASE
);
449 /* test non PCM formats */
450 format
.wFormatTag
=WAVE_FORMAT_MULAW
;
452 format
.wBitsPerSample
=8;
453 format
.nSamplesPerSec
=8000;
454 format
.nBlockAlign
=format
.nChannels
*format
.wBitsPerSample
/8;
455 format
.nAvgBytesPerSec
=format
.nSamplesPerSec
*format
.nBlockAlign
;
457 rc
=waveInOpen(&win
,device
,&format
,0,0,CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
458 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
459 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
460 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
461 if (rc
==MMSYSERR_NOERROR
) {
463 wave_in_test_deviceIn(device
,&format
,0,0,&capsA
);
465 trace("waveInOpen(%s): WAVE_FORMAT_MULAW not supported\n",
468 format
.wFormatTag
=WAVE_FORMAT_ADPCM
;
470 format
.wBitsPerSample
=4;
471 format
.nSamplesPerSec
=22050;
472 format
.nBlockAlign
=format
.nChannels
*format
.wBitsPerSample
/8;
473 format
.nAvgBytesPerSec
=format
.nSamplesPerSec
*format
.nBlockAlign
;
475 rc
=waveInOpen(&win
,device
,&format
,0,0,CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
476 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
477 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
478 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
479 if (rc
==MMSYSERR_NOERROR
) {
481 wave_in_test_deviceIn(device
,&format
,0,0,&capsA
);
483 trace("waveInOpen(%s): WAVE_FORMAT_ADPCM not supported\n",
486 /* test if WAVEFORMATEXTENSIBLE supported */
487 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
488 wfex
.Format
.nChannels
=2;
489 wfex
.Format
.wBitsPerSample
=16;
490 wfex
.Format
.nSamplesPerSec
=22050;
491 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
492 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
493 wfex
.Format
.nBlockAlign
;
494 wfex
.Format
.cbSize
=22;
495 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
496 wfex
.dwChannelMask
=SPEAKER_ALL
;
497 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_PCM
;
498 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
499 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
500 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
501 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
502 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
503 if (rc
==MMSYSERR_NOERROR
) {
505 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
507 trace("waveInOpen(%s): WAVE_FORMAT_EXTENSIBLE not supported\n",
510 /* test if 4 channels supported */
511 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
512 wfex
.Format
.nChannels
=4;
513 wfex
.Format
.wBitsPerSample
=16;
514 wfex
.Format
.nSamplesPerSec
=22050;
515 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
516 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
517 wfex
.Format
.nBlockAlign
;
518 wfex
.Format
.cbSize
=22;
519 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
520 wfex
.dwChannelMask
=SPEAKER_ALL
;
521 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_PCM
;
522 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
523 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
524 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
525 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
526 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
527 if (rc
==MMSYSERR_NOERROR
) {
529 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
531 trace("waveInOpen(%s): 4 channels not supported\n",
534 /* test if 6 channels supported */
535 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
536 wfex
.Format
.nChannels
=6;
537 wfex
.Format
.wBitsPerSample
=16;
538 wfex
.Format
.nSamplesPerSec
=22050;
539 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
540 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
541 wfex
.Format
.nBlockAlign
;
542 wfex
.Format
.cbSize
=22;
543 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
544 wfex
.dwChannelMask
=SPEAKER_ALL
;
545 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_PCM
;
546 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
547 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
548 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
549 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
550 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
551 if (rc
==MMSYSERR_NOERROR
) {
553 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
555 trace("waveInOpen(%s): 6 channels not supported\n",
560 /* FIXME: ALSA doesn't like this */
561 /* test if 24 bit samples supported */
562 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
563 wfex
.Format
.nChannels
=2;
564 wfex
.Format
.wBitsPerSample
=24;
565 wfex
.Format
.nSamplesPerSec
=22050;
566 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
567 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
568 wfex
.Format
.nBlockAlign
;
569 wfex
.Format
.cbSize
=22;
570 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
571 wfex
.dwChannelMask
=SPEAKER_ALL
;
572 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_PCM
;
573 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
574 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
575 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
576 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
577 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
578 if (rc
==MMSYSERR_NOERROR
) {
580 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
582 trace("waveInOpen(%s): 24 bit samples not supported\n",
586 /* test if 32 bit samples supported */
587 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
588 wfex
.Format
.nChannels
=2;
589 wfex
.Format
.wBitsPerSample
=32;
590 wfex
.Format
.nSamplesPerSec
=22050;
591 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
592 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
593 wfex
.Format
.nBlockAlign
;
594 wfex
.Format
.cbSize
=22;
595 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
596 wfex
.dwChannelMask
=SPEAKER_ALL
;
597 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_PCM
;
598 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
599 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
600 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
601 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
602 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
603 if (rc
==MMSYSERR_NOERROR
) {
605 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
607 trace("waveInOpen(%s): 32 bit samples not supported\n",
610 /* test if 32 bit float samples supported */
611 wfex
.Format
.wFormatTag
=WAVE_FORMAT_EXTENSIBLE
;
612 wfex
.Format
.nChannels
=2;
613 wfex
.Format
.wBitsPerSample
=32;
614 wfex
.Format
.nSamplesPerSec
=22050;
615 wfex
.Format
.nBlockAlign
=wfex
.Format
.nChannels
*wfex
.Format
.wBitsPerSample
/8;
616 wfex
.Format
.nAvgBytesPerSec
=wfex
.Format
.nSamplesPerSec
*
617 wfex
.Format
.nBlockAlign
;
618 wfex
.Format
.cbSize
=22;
619 wfex
.Samples
.wValidBitsPerSample
=wfex
.Format
.wBitsPerSample
;
620 wfex
.dwChannelMask
=SPEAKER_ALL
;
621 wfex
.SubFormat
=KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
;
622 rc
=waveInOpen(&win
,device
,&wfex
.Format
,0,0,
623 CALLBACK_NULL
|WAVE_FORMAT_DIRECT
);
624 ok(rc
==MMSYSERR_NOERROR
|| rc
==WAVERR_BADFORMAT
||
625 rc
==MMSYSERR_INVALFLAG
|| rc
==MMSYSERR_INVALPARAM
,
626 "waveInOpen(%s): returned: %s\n",dev_name(device
),wave_in_error(rc
));
627 if (rc
==MMSYSERR_NOERROR
) {
629 wave_in_test_deviceIn(device
,&wfex
.Format
,0,0,&capsA
);
631 trace("waveInOpen(%s): 32 bit float samples not supported\n",
635 static void wave_in_tests(void)
644 ndev
=waveInGetNumDevs();
645 trace("found %d WaveIn devices\n",ndev
);
647 rc
=waveInGetDevCapsA(ndev
+1,&capsA
,sizeof(capsA
));
648 ok(rc
==MMSYSERR_BADDEVICEID
,
649 "waveInGetDevCapsA(%s): MMSYSERR_BADDEVICEID expected, got %s\n",
650 dev_name(ndev
+1),wave_in_error(rc
));
652 rc
=waveInGetDevCapsA(WAVE_MAPPER
,&capsA
,sizeof(capsA
));
653 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_NODRIVER
|| (!ndev
&& (rc
==MMSYSERR_BADDEVICEID
)),
654 "waveInGetDevCapsA(%s): got %s\n",dev_name(WAVE_MAPPER
),wave_in_error(rc
));
656 rc
=waveInGetDevCapsW(ndev
+1,&capsW
,sizeof(capsW
));
657 ok(rc
==MMSYSERR_BADDEVICEID
|| rc
==MMSYSERR_NOTSUPPORTED
,
658 "waveInGetDevCapsW(%s): MMSYSERR_BADDEVICEID or MMSYSERR_NOTSUPPORTED "
659 "expected, got %s\n",dev_name(ndev
+1),wave_in_error(rc
));
661 rc
=waveInGetDevCapsW(WAVE_MAPPER
,&capsW
,sizeof(capsW
));
662 ok(rc
==MMSYSERR_NOERROR
|| rc
==MMSYSERR_NODRIVER
||
663 rc
==MMSYSERR_NOTSUPPORTED
|| (!ndev
&& (rc
==MMSYSERR_BADDEVICEID
)),
664 "waveInGetDevCapsW(%s): got %s\n", dev_name(ndev
+1),wave_in_error(rc
));
666 format
.wFormatTag
=WAVE_FORMAT_PCM
;
668 format
.wBitsPerSample
=16;
669 format
.nSamplesPerSec
=44100;
670 format
.nBlockAlign
=format
.nChannels
*format
.wBitsPerSample
/8;
671 format
.nAvgBytesPerSec
=format
.nSamplesPerSec
*format
.nBlockAlign
;
673 rc
=waveInOpen(&win
,ndev
+1,&format
,0,0,CALLBACK_NULL
);
674 ok(rc
==MMSYSERR_BADDEVICEID
,
675 "waveInOpen(%s): MMSYSERR_BADDEVICEID expected, got %s\n",
676 dev_name(ndev
+1),wave_in_error(rc
));
679 wave_in_test_device(d
);
682 wave_in_test_device(WAVE_MAPPER
);