1 | /** |
2 | * Original code: automated SDL audio test written by Edgar Simo "bobbens" |
3 | * New/updated tests: aschiffler at ferzkopp dot net |
4 | */ |
5 | |
6 | /* quiet windows compiler warnings */ |
7 | #define _CRT_SECURE_NO_WARNINGS |
8 | |
9 | #include <stdio.h> |
10 | #include <string.h> |
11 | |
12 | #include "SDL.h" |
13 | #include "SDL_test.h" |
14 | |
15 | /* ================= Test Case Implementation ================== */ |
16 | |
17 | /* Fixture */ |
18 | |
19 | void |
20 | _audioSetUp(void *arg) |
21 | { |
22 | /* Start SDL audio subsystem */ |
23 | int ret = SDL_InitSubSystem( SDL_INIT_AUDIO ); |
24 | SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_AUDIO)" ); |
25 | SDLTest_AssertCheck(ret==0, "Check result from SDL_InitSubSystem(SDL_INIT_AUDIO)" ); |
26 | if (ret != 0) { |
27 | SDLTest_LogError("%s" , SDL_GetError()); |
28 | } |
29 | } |
30 | |
31 | void |
32 | _audioTearDown(void *arg) |
33 | { |
34 | /* Remove a possibly created file from SDL disk writer audio driver; ignore errors */ |
35 | remove("sdlaudio.raw" ); |
36 | |
37 | SDLTest_AssertPass("Cleanup of test files completed" ); |
38 | } |
39 | |
40 | |
41 | /* Global counter for callback invocation */ |
42 | int _audio_testCallbackCounter; |
43 | |
44 | /* Global accumulator for total callback length */ |
45 | int _audio_testCallbackLength; |
46 | |
47 | |
48 | /* Test callback function */ |
49 | void SDLCALL _audio_testCallback(void *userdata, Uint8 *stream, int len) |
50 | { |
51 | /* track that callback was called */ |
52 | _audio_testCallbackCounter++; |
53 | _audio_testCallbackLength += len; |
54 | } |
55 | |
56 | |
57 | /* Test case functions */ |
58 | |
59 | /** |
60 | * \brief Stop and restart audio subsystem |
61 | * |
62 | * \sa https://wiki.libsdl.org/SDL_QuitSubSystem |
63 | * \sa https://wiki.libsdl.org/SDL_InitSubSystem |
64 | */ |
65 | int audio_quitInitAudioSubSystem() |
66 | { |
67 | /* Stop SDL audio subsystem */ |
68 | SDL_QuitSubSystem( SDL_INIT_AUDIO ); |
69 | SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_AUDIO)" ); |
70 | |
71 | /* Restart audio again */ |
72 | _audioSetUp(NULL); |
73 | |
74 | return TEST_COMPLETED; |
75 | } |
76 | |
77 | /** |
78 | * \brief Start and stop audio directly |
79 | * |
80 | * \sa https://wiki.libsdl.org/SDL_InitAudio |
81 | * \sa https://wiki.libsdl.org/SDL_QuitAudio |
82 | */ |
83 | int audio_initQuitAudio() |
84 | { |
85 | int result; |
86 | int i, iMax; |
87 | const char* audioDriver; |
88 | |
89 | /* Stop SDL audio subsystem */ |
90 | SDL_QuitSubSystem( SDL_INIT_AUDIO ); |
91 | SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_AUDIO)" ); |
92 | |
93 | /* Loop over all available audio drivers */ |
94 | iMax = SDL_GetNumAudioDrivers(); |
95 | SDLTest_AssertPass("Call to SDL_GetNumAudioDrivers()" ); |
96 | SDLTest_AssertCheck(iMax > 0, "Validate number of audio drivers; expected: >0 got: %d" , iMax); |
97 | for (i = 0; i < iMax; i++) { |
98 | audioDriver = SDL_GetAudioDriver(i); |
99 | SDLTest_AssertPass("Call to SDL_GetAudioDriver(%d)" , i); |
100 | SDLTest_AssertCheck(audioDriver != NULL, "Audio driver name is not NULL" ); |
101 | SDLTest_AssertCheck(audioDriver[0] != '\0', "Audio driver name is not empty; got: %s" , audioDriver); |
102 | |
103 | /* Call Init */ |
104 | result = SDL_AudioInit(audioDriver); |
105 | SDLTest_AssertPass("Call to SDL_AudioInit('%s')" , audioDriver); |
106 | SDLTest_AssertCheck(result == 0, "Validate result value; expected: 0 got: %d" , result); |
107 | |
108 | /* Call Quit */ |
109 | SDL_AudioQuit(); |
110 | SDLTest_AssertPass("Call to SDL_AudioQuit()" ); |
111 | } |
112 | |
113 | /* NULL driver specification */ |
114 | audioDriver = NULL; |
115 | |
116 | /* Call Init */ |
117 | result = SDL_AudioInit(audioDriver); |
118 | SDLTest_AssertPass("Call to SDL_AudioInit(NULL)" ); |
119 | SDLTest_AssertCheck(result == 0, "Validate result value; expected: 0 got: %d" , result); |
120 | |
121 | /* Call Quit */ |
122 | SDL_AudioQuit(); |
123 | SDLTest_AssertPass("Call to SDL_AudioQuit()" ); |
124 | |
125 | /* Restart audio again */ |
126 | _audioSetUp(NULL); |
127 | |
128 | return TEST_COMPLETED; |
129 | } |
130 | |
131 | /** |
132 | * \brief Start, open, close and stop audio |
133 | * |
134 | * \sa https://wiki.libsdl.org/SDL_InitAudio |
135 | * \sa https://wiki.libsdl.org/SDL_OpenAudio |
136 | * \sa https://wiki.libsdl.org/SDL_CloseAudio |
137 | * \sa https://wiki.libsdl.org/SDL_QuitAudio |
138 | */ |
139 | int audio_initOpenCloseQuitAudio() |
140 | { |
141 | int result, expectedResult; |
142 | int i, iMax, j, k; |
143 | const char* audioDriver; |
144 | SDL_AudioSpec desired; |
145 | |
146 | /* Stop SDL audio subsystem */ |
147 | SDL_QuitSubSystem( SDL_INIT_AUDIO ); |
148 | SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_AUDIO)" ); |
149 | |
150 | /* Loop over all available audio drivers */ |
151 | iMax = SDL_GetNumAudioDrivers(); |
152 | SDLTest_AssertPass("Call to SDL_GetNumAudioDrivers()" ); |
153 | SDLTest_AssertCheck(iMax > 0, "Validate number of audio drivers; expected: >0 got: %d" , iMax); |
154 | for (i = 0; i < iMax; i++) { |
155 | audioDriver = SDL_GetAudioDriver(i); |
156 | SDLTest_AssertPass("Call to SDL_GetAudioDriver(%d)" , i); |
157 | SDLTest_AssertCheck(audioDriver != NULL, "Audio driver name is not NULL" ); |
158 | SDLTest_AssertCheck(audioDriver[0] != '\0', "Audio driver name is not empty; got: %s" , audioDriver); |
159 | |
160 | /* Change specs */ |
161 | for (j = 0; j < 2; j++) { |
162 | |
163 | /* Call Init */ |
164 | result = SDL_AudioInit(audioDriver); |
165 | SDLTest_AssertPass("Call to SDL_AudioInit('%s')" , audioDriver); |
166 | SDLTest_AssertCheck(result == 0, "Validate result value; expected: 0 got: %d" , result); |
167 | |
168 | /* Set spec */ |
169 | SDL_memset(&desired, 0, sizeof(desired)); |
170 | switch (j) { |
171 | case 0: |
172 | /* Set standard desired spec */ |
173 | desired.freq = 22050; |
174 | desired.format = AUDIO_S16SYS; |
175 | desired.channels = 2; |
176 | desired.samples = 4096; |
177 | desired.callback = _audio_testCallback; |
178 | desired.userdata = NULL; |
179 | |
180 | case 1: |
181 | /* Set custom desired spec */ |
182 | desired.freq = 48000; |
183 | desired.format = AUDIO_F32SYS; |
184 | desired.channels = 2; |
185 | desired.samples = 2048; |
186 | desired.callback = _audio_testCallback; |
187 | desired.userdata = NULL; |
188 | break; |
189 | } |
190 | |
191 | /* Call Open (maybe multiple times) */ |
192 | for (k=0; k <= j; k++) { |
193 | result = SDL_OpenAudio(&desired, NULL); |
194 | SDLTest_AssertPass("Call to SDL_OpenAudio(desired_spec_%d, NULL), call %d" , j, k+1); |
195 | expectedResult = (k==0) ? 0 : -1; |
196 | SDLTest_AssertCheck(result == expectedResult, "Verify return value; expected: %d, got: %d" , expectedResult, result); |
197 | } |
198 | |
199 | /* Call Close (maybe multiple times) */ |
200 | for (k=0; k <= j; k++) { |
201 | SDL_CloseAudio(); |
202 | SDLTest_AssertPass("Call to SDL_CloseAudio(), call %d" , k+1); |
203 | } |
204 | |
205 | /* Call Quit (maybe multiple times) */ |
206 | for (k=0; k <= j; k++) { |
207 | SDL_AudioQuit(); |
208 | SDLTest_AssertPass("Call to SDL_AudioQuit(), call %d" , k+1); |
209 | } |
210 | |
211 | } /* spec loop */ |
212 | } /* driver loop */ |
213 | |
214 | /* Restart audio again */ |
215 | _audioSetUp(NULL); |
216 | |
217 | return TEST_COMPLETED; |
218 | } |
219 | |
220 | /** |
221 | * \brief Pause and unpause audio |
222 | * |
223 | * \sa https://wiki.libsdl.org/SDL_PauseAudio |
224 | */ |
225 | int audio_pauseUnpauseAudio() |
226 | { |
227 | int result; |
228 | int i, iMax, j, k, l; |
229 | int totalDelay; |
230 | int pause_on; |
231 | int originalCounter; |
232 | const char* audioDriver; |
233 | SDL_AudioSpec desired; |
234 | |
235 | /* Stop SDL audio subsystem */ |
236 | SDL_QuitSubSystem( SDL_INIT_AUDIO ); |
237 | SDLTest_AssertPass("Call to SDL_QuitSubSystem(SDL_INIT_AUDIO)" ); |
238 | |
239 | /* Loop over all available audio drivers */ |
240 | iMax = SDL_GetNumAudioDrivers(); |
241 | SDLTest_AssertPass("Call to SDL_GetNumAudioDrivers()" ); |
242 | SDLTest_AssertCheck(iMax > 0, "Validate number of audio drivers; expected: >0 got: %d" , iMax); |
243 | for (i = 0; i < iMax; i++) { |
244 | audioDriver = SDL_GetAudioDriver(i); |
245 | SDLTest_AssertPass("Call to SDL_GetAudioDriver(%d)" , i); |
246 | SDLTest_AssertCheck(audioDriver != NULL, "Audio driver name is not NULL" ); |
247 | SDLTest_AssertCheck(audioDriver[0] != '\0', "Audio driver name is not empty; got: %s" , audioDriver); |
248 | |
249 | /* Change specs */ |
250 | for (j = 0; j < 2; j++) { |
251 | |
252 | /* Call Init */ |
253 | result = SDL_AudioInit(audioDriver); |
254 | SDLTest_AssertPass("Call to SDL_AudioInit('%s')" , audioDriver); |
255 | SDLTest_AssertCheck(result == 0, "Validate result value; expected: 0 got: %d" , result); |
256 | |
257 | /* Set spec */ |
258 | SDL_memset(&desired, 0, sizeof(desired)); |
259 | switch (j) { |
260 | case 0: |
261 | /* Set standard desired spec */ |
262 | desired.freq = 22050; |
263 | desired.format = AUDIO_S16SYS; |
264 | desired.channels = 2; |
265 | desired.samples = 4096; |
266 | desired.callback = _audio_testCallback; |
267 | desired.userdata = NULL; |
268 | |
269 | case 1: |
270 | /* Set custom desired spec */ |
271 | desired.freq = 48000; |
272 | desired.format = AUDIO_F32SYS; |
273 | desired.channels = 2; |
274 | desired.samples = 2048; |
275 | desired.callback = _audio_testCallback; |
276 | desired.userdata = NULL; |
277 | break; |
278 | } |
279 | |
280 | /* Call Open */ |
281 | result = SDL_OpenAudio(&desired, NULL); |
282 | SDLTest_AssertPass("Call to SDL_OpenAudio(desired_spec_%d, NULL)" , j); |
283 | SDLTest_AssertCheck(result == 0, "Verify return value; expected: 0 got: %d" , result); |
284 | |
285 | /* Start and stop audio multiple times */ |
286 | for (l=0; l<3; l++) { |
287 | SDLTest_Log("Pause/Unpause iteration: %d" , l+1); |
288 | |
289 | /* Reset callback counters */ |
290 | _audio_testCallbackCounter = 0; |
291 | _audio_testCallbackLength = 0; |
292 | |
293 | /* Un-pause audio to start playing (maybe multiple times) */ |
294 | pause_on = 0; |
295 | for (k=0; k <= j; k++) { |
296 | SDL_PauseAudio(pause_on); |
297 | SDLTest_AssertPass("Call to SDL_PauseAudio(%d), call %d" , pause_on, k+1); |
298 | } |
299 | |
300 | /* Wait for callback */ |
301 | totalDelay = 0; |
302 | do { |
303 | SDL_Delay(10); |
304 | totalDelay += 10; |
305 | } |
306 | while (_audio_testCallbackCounter == 0 && totalDelay < 1000); |
307 | SDLTest_AssertCheck(_audio_testCallbackCounter > 0, "Verify callback counter; expected: >0 got: %d" , _audio_testCallbackCounter); |
308 | SDLTest_AssertCheck(_audio_testCallbackLength > 0, "Verify callback length; expected: >0 got: %d" , _audio_testCallbackLength); |
309 | |
310 | /* Pause audio to stop playing (maybe multiple times) */ |
311 | for (k=0; k <= j; k++) { |
312 | pause_on = (k==0) ? 1 : SDLTest_RandomIntegerInRange(99, 9999); |
313 | SDL_PauseAudio(pause_on); |
314 | SDLTest_AssertPass("Call to SDL_PauseAudio(%d), call %d" , pause_on, k+1); |
315 | } |
316 | |
317 | /* Ensure callback is not called again */ |
318 | originalCounter = _audio_testCallbackCounter; |
319 | SDL_Delay(totalDelay + 10); |
320 | SDLTest_AssertCheck(originalCounter == _audio_testCallbackCounter, "Verify callback counter; expected: %d, got: %d" , originalCounter, _audio_testCallbackCounter); |
321 | } |
322 | |
323 | /* Call Close */ |
324 | SDL_CloseAudio(); |
325 | SDLTest_AssertPass("Call to SDL_CloseAudio()" ); |
326 | |
327 | /* Call Quit */ |
328 | SDL_AudioQuit(); |
329 | SDLTest_AssertPass("Call to SDL_AudioQuit()" ); |
330 | |
331 | } /* spec loop */ |
332 | } /* driver loop */ |
333 | |
334 | /* Restart audio again */ |
335 | _audioSetUp(NULL); |
336 | |
337 | return TEST_COMPLETED; |
338 | } |
339 | |
340 | /** |
341 | * \brief Enumerate and name available audio devices (output and capture). |
342 | * |
343 | * \sa https://wiki.libsdl.org/SDL_GetNumAudioDevices |
344 | * \sa https://wiki.libsdl.org/SDL_GetAudioDeviceName |
345 | */ |
346 | int audio_enumerateAndNameAudioDevices() |
347 | { |
348 | int t, tt; |
349 | int i, n, nn; |
350 | const char *name, *nameAgain; |
351 | |
352 | /* Iterate over types: t=0 output device, t=1 input/capture device */ |
353 | for (t=0; t<2; t++) { |
354 | |
355 | /* Get number of devices. */ |
356 | n = SDL_GetNumAudioDevices(t); |
357 | SDLTest_AssertPass("Call to SDL_GetNumAudioDevices(%i)" , t); |
358 | SDLTest_Log("Number of %s devices < 0, reported as %i" , (t) ? "capture" : "output" , n); |
359 | SDLTest_AssertCheck(n >= 0, "Validate result is >= 0, got: %i" , n); |
360 | |
361 | /* Variation of non-zero type */ |
362 | if (t==1) { |
363 | tt = t + SDLTest_RandomIntegerInRange(1,10); |
364 | nn = SDL_GetNumAudioDevices(tt); |
365 | SDLTest_AssertCheck(n==nn, "Verify result from SDL_GetNumAudioDevices(%i), expected same number of audio devices %i, got %i" , tt, n, nn); |
366 | nn = SDL_GetNumAudioDevices(-tt); |
367 | SDLTest_AssertCheck(n==nn, "Verify result from SDL_GetNumAudioDevices(%i), expected same number of audio devices %i, got %i" , -tt, n, nn); |
368 | } |
369 | |
370 | /* List devices. */ |
371 | if (n>0) { |
372 | for (i=0; i<n; i++) { |
373 | name = SDL_GetAudioDeviceName(i, t); |
374 | SDLTest_AssertPass("Call to SDL_GetAudioDeviceName(%i, %i)" , i, t); |
375 | SDLTest_AssertCheck(name != NULL, "Verify result from SDL_GetAudioDeviceName(%i, %i) is not NULL" , i, t); |
376 | if (name != NULL) { |
377 | SDLTest_AssertCheck(name[0] != '\0', "verify result from SDL_GetAudioDeviceName(%i, %i) is not empty, got: '%s'" , i, t, name); |
378 | if (t==1) { |
379 | /* Also try non-zero type */ |
380 | tt = t + SDLTest_RandomIntegerInRange(1,10); |
381 | nameAgain = SDL_GetAudioDeviceName(i, tt); |
382 | SDLTest_AssertCheck(nameAgain != NULL, "Verify result from SDL_GetAudioDeviceName(%i, %i) is not NULL" , i, tt); |
383 | if (nameAgain != NULL) { |
384 | SDLTest_AssertCheck(nameAgain[0] != '\0', "Verify result from SDL_GetAudioDeviceName(%i, %i) is not empty, got: '%s'" , i, tt, nameAgain); |
385 | SDLTest_AssertCheck(SDL_strcmp(name, nameAgain)==0, |
386 | "Verify SDL_GetAudioDeviceName(%i, %i) and SDL_GetAudioDeviceName(%i %i) return the same string" , |
387 | i, t, i, tt); |
388 | } |
389 | } |
390 | } |
391 | } |
392 | } |
393 | } |
394 | |
395 | return TEST_COMPLETED; |
396 | } |
397 | |
398 | /** |
399 | * \brief Negative tests around enumeration and naming of audio devices. |
400 | * |
401 | * \sa https://wiki.libsdl.org/SDL_GetNumAudioDevices |
402 | * \sa https://wiki.libsdl.org/SDL_GetAudioDeviceName |
403 | */ |
404 | int audio_enumerateAndNameAudioDevicesNegativeTests() |
405 | { |
406 | int t; |
407 | int i, j, no, nc; |
408 | const char *name; |
409 | |
410 | /* Get number of devices. */ |
411 | no = SDL_GetNumAudioDevices(0); |
412 | SDLTest_AssertPass("Call to SDL_GetNumAudioDevices(0)" ); |
413 | nc = SDL_GetNumAudioDevices(1); |
414 | SDLTest_AssertPass("Call to SDL_GetNumAudioDevices(1)" ); |
415 | |
416 | /* Invalid device index when getting name */ |
417 | for (t=0; t<2; t++) { |
418 | /* Negative device index */ |
419 | i = SDLTest_RandomIntegerInRange(-10,-1); |
420 | name = SDL_GetAudioDeviceName(i, t); |
421 | SDLTest_AssertPass("Call to SDL_GetAudioDeviceName(%i, %i)" , i, t); |
422 | SDLTest_AssertCheck(name == NULL, "Check SDL_GetAudioDeviceName(%i, %i) result NULL, expected NULL, got: %s" , i, t, (name == NULL) ? "NULL" : name); |
423 | |
424 | /* Device index past range */ |
425 | for (j=0; j<3; j++) { |
426 | i = (t) ? nc+j : no+j; |
427 | name = SDL_GetAudioDeviceName(i, t); |
428 | SDLTest_AssertPass("Call to SDL_GetAudioDeviceName(%i, %i)" , i, t); |
429 | SDLTest_AssertCheck(name == NULL, "Check SDL_GetAudioDeviceName(%i, %i) result, expected: NULL, got: %s" , i, t, (name == NULL) ? "NULL" : name); |
430 | } |
431 | |
432 | /* Capture index past capture range but within output range */ |
433 | if ((no>0) && (no>nc) && (t==1)) { |
434 | i = no-1; |
435 | name = SDL_GetAudioDeviceName(i, t); |
436 | SDLTest_AssertPass("Call to SDL_GetAudioDeviceName(%i, %i)" , i, t); |
437 | SDLTest_AssertCheck(name == NULL, "Check SDL_GetAudioDeviceName(%i, %i) result, expected: NULL, got: %s" , i, t, (name == NULL) ? "NULL" : name); |
438 | } |
439 | } |
440 | |
441 | return TEST_COMPLETED; |
442 | } |
443 | |
444 | |
445 | /** |
446 | * \brief Checks available audio driver names. |
447 | * |
448 | * \sa https://wiki.libsdl.org/SDL_GetNumAudioDrivers |
449 | * \sa https://wiki.libsdl.org/SDL_GetAudioDriver |
450 | */ |
451 | int audio_printAudioDrivers() |
452 | { |
453 | int i, n; |
454 | const char *name; |
455 | |
456 | /* Get number of drivers */ |
457 | n = SDL_GetNumAudioDrivers(); |
458 | SDLTest_AssertPass("Call to SDL_GetNumAudioDrivers()" ); |
459 | SDLTest_AssertCheck(n>=0, "Verify number of audio drivers >= 0, got: %i" , n); |
460 | |
461 | /* List drivers. */ |
462 | if (n>0) |
463 | { |
464 | for (i=0; i<n; i++) { |
465 | name = SDL_GetAudioDriver(i); |
466 | SDLTest_AssertPass("Call to SDL_GetAudioDriver(%i)" , i); |
467 | SDLTest_AssertCheck(name != NULL, "Verify returned name is not NULL" ); |
468 | if (name != NULL) { |
469 | SDLTest_AssertCheck(name[0] != '\0', "Verify returned name is not empty, got: '%s'" , name); |
470 | } |
471 | } |
472 | } |
473 | |
474 | return TEST_COMPLETED; |
475 | } |
476 | |
477 | |
478 | /** |
479 | * \brief Checks current audio driver name with initialized audio. |
480 | * |
481 | * \sa https://wiki.libsdl.org/SDL_GetCurrentAudioDriver |
482 | */ |
483 | int audio_printCurrentAudioDriver() |
484 | { |
485 | /* Check current audio driver */ |
486 | const char *name = SDL_GetCurrentAudioDriver(); |
487 | SDLTest_AssertPass("Call to SDL_GetCurrentAudioDriver()" ); |
488 | SDLTest_AssertCheck(name != NULL, "Verify returned name is not NULL" ); |
489 | if (name != NULL) { |
490 | SDLTest_AssertCheck(name[0] != '\0', "Verify returned name is not empty, got: '%s'" , name); |
491 | } |
492 | |
493 | return TEST_COMPLETED; |
494 | } |
495 | |
496 | /* Definition of all formats, channels, and frequencies used to test audio conversions */ |
497 | const int _numAudioFormats = 18; |
498 | SDL_AudioFormat _audioFormats[] = { AUDIO_S8, AUDIO_U8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_S16SYS, AUDIO_S16, AUDIO_U16LSB, |
499 | AUDIO_U16MSB, AUDIO_U16SYS, AUDIO_U16, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_S32SYS, AUDIO_S32, |
500 | AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_F32SYS, AUDIO_F32 }; |
501 | char *_audioFormatsVerbose[] = { "AUDIO_S8" , "AUDIO_U8" , "AUDIO_S16LSB" , "AUDIO_S16MSB" , "AUDIO_S16SYS" , "AUDIO_S16" , "AUDIO_U16LSB" , |
502 | "AUDIO_U16MSB" , "AUDIO_U16SYS" , "AUDIO_U16" , "AUDIO_S32LSB" , "AUDIO_S32MSB" , "AUDIO_S32SYS" , "AUDIO_S32" , |
503 | "AUDIO_F32LSB" , "AUDIO_F32MSB" , "AUDIO_F32SYS" , "AUDIO_F32" }; |
504 | const int _numAudioChannels = 4; |
505 | Uint8 _audioChannels[] = { 1, 2, 4, 6 }; |
506 | const int _numAudioFrequencies = 4; |
507 | int _audioFrequencies[] = { 11025, 22050, 44100, 48000 }; |
508 | |
509 | |
510 | /** |
511 | * \brief Builds various audio conversion structures |
512 | * |
513 | * \sa https://wiki.libsdl.org/SDL_BuildAudioCVT |
514 | */ |
515 | int audio_buildAudioCVT() |
516 | { |
517 | int result; |
518 | SDL_AudioCVT cvt; |
519 | SDL_AudioSpec spec1; |
520 | SDL_AudioSpec spec2; |
521 | int i, ii, j, jj, k, kk; |
522 | |
523 | /* No conversion needed */ |
524 | spec1.format = AUDIO_S16LSB; |
525 | spec1.channels = 2; |
526 | spec1.freq = 22050; |
527 | result = SDL_BuildAudioCVT(&cvt, spec1.format, spec1.channels, spec1.freq, |
528 | spec1.format, spec1.channels, spec1.freq); |
529 | SDLTest_AssertPass("Call to SDL_BuildAudioCVT(spec1 ==> spec1)" ); |
530 | SDLTest_AssertCheck(result == 0, "Verify result value; expected: 0, got: %i" , result); |
531 | |
532 | /* Typical conversion */ |
533 | spec1.format = AUDIO_S8; |
534 | spec1.channels = 1; |
535 | spec1.freq = 22050; |
536 | spec2.format = AUDIO_S16LSB; |
537 | spec2.channels = 2; |
538 | spec2.freq = 44100; |
539 | result = SDL_BuildAudioCVT(&cvt, spec1.format, spec1.channels, spec1.freq, |
540 | spec2.format, spec2.channels, spec2.freq); |
541 | SDLTest_AssertPass("Call to SDL_BuildAudioCVT(spec1 ==> spec2)" ); |
542 | SDLTest_AssertCheck(result == 1, "Verify result value; expected: 1, got: %i" , result); |
543 | |
544 | /* All source conversions with random conversion targets, allow 'null' conversions */ |
545 | for (i = 0; i < _numAudioFormats; i++) { |
546 | for (j = 0; j < _numAudioChannels; j++) { |
547 | for (k = 0; k < _numAudioFrequencies; k++) { |
548 | spec1.format = _audioFormats[i]; |
549 | spec1.channels = _audioChannels[j]; |
550 | spec1.freq = _audioFrequencies[k]; |
551 | ii = SDLTest_RandomIntegerInRange(0, _numAudioFormats - 1); |
552 | jj = SDLTest_RandomIntegerInRange(0, _numAudioChannels - 1); |
553 | kk = SDLTest_RandomIntegerInRange(0, _numAudioFrequencies - 1); |
554 | spec2.format = _audioFormats[ii]; |
555 | spec2.channels = _audioChannels[jj]; |
556 | spec2.freq = _audioFrequencies[kk]; |
557 | result = SDL_BuildAudioCVT(&cvt, spec1.format, spec1.channels, spec1.freq, |
558 | spec2.format, spec2.channels, spec2.freq); |
559 | SDLTest_AssertPass("Call to SDL_BuildAudioCVT(format[%i]=%s(%i),channels[%i]=%i,freq[%i]=%i ==> format[%i]=%s(%i),channels[%i]=%i,freq[%i]=%i)" , |
560 | i, _audioFormatsVerbose[i], spec1.format, j, spec1.channels, k, spec1.freq, ii, _audioFormatsVerbose[ii], spec2.format, jj, spec2.channels, kk, spec2.freq); |
561 | SDLTest_AssertCheck(result == 0 || result == 1, "Verify result value; expected: 0 or 1, got: %i" , result); |
562 | if (result<0) { |
563 | SDLTest_LogError("%s" , SDL_GetError()); |
564 | } else { |
565 | SDLTest_AssertCheck(cvt.len_mult > 0, "Verify that cvt.len_mult value; expected: >0, got: %i" , cvt.len_mult); |
566 | } |
567 | } |
568 | } |
569 | } |
570 | |
571 | return TEST_COMPLETED; |
572 | } |
573 | |
574 | /** |
575 | * \brief Checkes calls with invalid input to SDL_BuildAudioCVT |
576 | * |
577 | * \sa https://wiki.libsdl.org/SDL_BuildAudioCVT |
578 | */ |
579 | int audio_buildAudioCVTNegative() |
580 | { |
581 | const char *expectedError = "Parameter 'cvt' is invalid" ; |
582 | const char *error; |
583 | int result; |
584 | SDL_AudioCVT cvt; |
585 | SDL_AudioSpec spec1; |
586 | SDL_AudioSpec spec2; |
587 | int i; |
588 | char message[256]; |
589 | |
590 | /* Valid format */ |
591 | spec1.format = AUDIO_S8; |
592 | spec1.channels = 1; |
593 | spec1.freq = 22050; |
594 | spec2.format = AUDIO_S16LSB; |
595 | spec2.channels = 2; |
596 | spec2.freq = 44100; |
597 | |
598 | SDL_ClearError(); |
599 | SDLTest_AssertPass("Call to SDL_ClearError()" ); |
600 | |
601 | /* NULL input for CVT buffer */ |
602 | result = SDL_BuildAudioCVT((SDL_AudioCVT *)NULL, spec1.format, spec1.channels, spec1.freq, |
603 | spec2.format, spec2.channels, spec2.freq); |
604 | SDLTest_AssertPass("Call to SDL_BuildAudioCVT(NULL,...)" ); |
605 | SDLTest_AssertCheck(result == -1, "Verify result value; expected: -1, got: %i" , result); |
606 | error = SDL_GetError(); |
607 | SDLTest_AssertPass("Call to SDL_GetError()" ); |
608 | SDLTest_AssertCheck(error != NULL, "Validate that error message was not NULL" ); |
609 | if (error != NULL) { |
610 | SDLTest_AssertCheck(SDL_strcmp(error, expectedError) == 0, |
611 | "Validate error message, expected: '%s', got: '%s'" , expectedError, error); |
612 | } |
613 | |
614 | /* Invalid conversions */ |
615 | for (i = 1; i < 64; i++) { |
616 | /* Valid format to start with */ |
617 | spec1.format = AUDIO_S8; |
618 | spec1.channels = 1; |
619 | spec1.freq = 22050; |
620 | spec2.format = AUDIO_S16LSB; |
621 | spec2.channels = 2; |
622 | spec2.freq = 44100; |
623 | |
624 | SDL_ClearError(); |
625 | SDLTest_AssertPass("Call to SDL_ClearError()" ); |
626 | |
627 | /* Set various invalid format inputs */ |
628 | SDL_strlcpy(message, "Invalid: " , 256); |
629 | if (i & 1) { |
630 | SDL_strlcat(message, " spec1.format" , 256); |
631 | spec1.format = 0; |
632 | } |
633 | if (i & 2) { |
634 | SDL_strlcat(message, " spec1.channels" , 256); |
635 | spec1.channels = 0; |
636 | } |
637 | if (i & 4) { |
638 | SDL_strlcat(message, " spec1.freq" , 256); |
639 | spec1.freq = 0; |
640 | } |
641 | if (i & 8) { |
642 | SDL_strlcat(message, " spec2.format" , 256); |
643 | spec2.format = 0; |
644 | } |
645 | if (i & 16) { |
646 | SDL_strlcat(message, " spec2.channels" , 256); |
647 | spec2.channels = 0; |
648 | } |
649 | if (i & 32) { |
650 | SDL_strlcat(message, " spec2.freq" , 256); |
651 | spec2.freq = 0; |
652 | } |
653 | SDLTest_Log("%s" , message); |
654 | result = SDL_BuildAudioCVT(&cvt, spec1.format, spec1.channels, spec1.freq, |
655 | spec2.format, spec2.channels, spec2.freq); |
656 | SDLTest_AssertPass("Call to SDL_BuildAudioCVT(spec1 ==> spec2)" ); |
657 | SDLTest_AssertCheck(result == -1, "Verify result value; expected: -1, got: %i" , result); |
658 | error = SDL_GetError(); |
659 | SDLTest_AssertPass("Call to SDL_GetError()" ); |
660 | SDLTest_AssertCheck(error != NULL && error[0] != '\0', "Validate that error message was not NULL or empty" ); |
661 | } |
662 | |
663 | SDL_ClearError(); |
664 | SDLTest_AssertPass("Call to SDL_ClearError()" ); |
665 | |
666 | return TEST_COMPLETED; |
667 | } |
668 | |
669 | /** |
670 | * \brief Checks current audio status. |
671 | * |
672 | * \sa https://wiki.libsdl.org/SDL_GetAudioStatus |
673 | */ |
674 | int audio_getAudioStatus() |
675 | { |
676 | SDL_AudioStatus result; |
677 | |
678 | /* Check current audio status */ |
679 | result = SDL_GetAudioStatus(); |
680 | SDLTest_AssertPass("Call to SDL_GetAudioStatus()" ); |
681 | SDLTest_AssertCheck(result == SDL_AUDIO_STOPPED || result == SDL_AUDIO_PLAYING || result == SDL_AUDIO_PAUSED, |
682 | "Verify returned value; expected: STOPPED (%i) | PLAYING (%i) | PAUSED (%i), got: %i" , |
683 | SDL_AUDIO_STOPPED, SDL_AUDIO_PLAYING, SDL_AUDIO_PAUSED, result); |
684 | |
685 | return TEST_COMPLETED; |
686 | } |
687 | |
688 | |
689 | |
690 | /** |
691 | * \brief Opens, checks current audio status, and closes a device. |
692 | * |
693 | * \sa https://wiki.libsdl.org/SDL_GetAudioStatus |
694 | */ |
695 | int audio_openCloseAndGetAudioStatus() |
696 | { |
697 | SDL_AudioStatus result; |
698 | int i; |
699 | int count; |
700 | char *device; |
701 | SDL_AudioDeviceID id; |
702 | SDL_AudioSpec desired, obtained; |
703 | |
704 | /* Get number of devices. */ |
705 | count = SDL_GetNumAudioDevices(0); |
706 | SDLTest_AssertPass("Call to SDL_GetNumAudioDevices(0)" ); |
707 | if (count > 0) { |
708 | for (i = 0; i < count; i++) { |
709 | /* Get device name */ |
710 | device = (char *)SDL_GetAudioDeviceName(i, 0); |
711 | SDLTest_AssertPass("SDL_GetAudioDeviceName(%i,0)" , i); |
712 | SDLTest_AssertCheck(device != NULL, "Validate device name is not NULL; got: %s" , (device != NULL) ? device : "NULL" ); |
713 | if (device == NULL) return TEST_ABORTED; |
714 | |
715 | /* Set standard desired spec */ |
716 | desired.freq=22050; |
717 | desired.format=AUDIO_S16SYS; |
718 | desired.channels=2; |
719 | desired.samples=4096; |
720 | desired.callback=_audio_testCallback; |
721 | desired.userdata=NULL; |
722 | |
723 | /* Open device */ |
724 | id = SDL_OpenAudioDevice((const char *)device, 0, &desired, &obtained, SDL_AUDIO_ALLOW_ANY_CHANGE); |
725 | SDLTest_AssertPass("SDL_OpenAudioDevice('%s',...)" , device); |
726 | SDLTest_AssertCheck(id > 1, "Validate device ID; expected: >=2, got: %i" , id); |
727 | if (id > 1) { |
728 | |
729 | /* Check device audio status */ |
730 | result = SDL_GetAudioDeviceStatus(id); |
731 | SDLTest_AssertPass("Call to SDL_GetAudioDeviceStatus()" ); |
732 | SDLTest_AssertCheck(result == SDL_AUDIO_STOPPED || result == SDL_AUDIO_PLAYING || result == SDL_AUDIO_PAUSED, |
733 | "Verify returned value; expected: STOPPED (%i) | PLAYING (%i) | PAUSED (%i), got: %i" , |
734 | SDL_AUDIO_STOPPED, SDL_AUDIO_PLAYING, SDL_AUDIO_PAUSED, result); |
735 | |
736 | /* Close device again */ |
737 | SDL_CloseAudioDevice(id); |
738 | SDLTest_AssertPass("Call to SDL_CloseAudioDevice()" ); |
739 | } |
740 | } |
741 | } else { |
742 | SDLTest_Log("No devices to test with" ); |
743 | } |
744 | |
745 | return TEST_COMPLETED; |
746 | } |
747 | |
748 | /** |
749 | * \brief Locks and unlocks open audio device. |
750 | * |
751 | * \sa https://wiki.libsdl.org/SDL_LockAudioDevice |
752 | * \sa https://wiki.libsdl.org/SDL_UnlockAudioDevice |
753 | */ |
754 | int audio_lockUnlockOpenAudioDevice() |
755 | { |
756 | int i; |
757 | int count; |
758 | char *device; |
759 | SDL_AudioDeviceID id; |
760 | SDL_AudioSpec desired, obtained; |
761 | |
762 | /* Get number of devices. */ |
763 | count = SDL_GetNumAudioDevices(0); |
764 | SDLTest_AssertPass("Call to SDL_GetNumAudioDevices(0)" ); |
765 | if (count > 0) { |
766 | for (i = 0; i < count; i++) { |
767 | /* Get device name */ |
768 | device = (char *)SDL_GetAudioDeviceName(i, 0); |
769 | SDLTest_AssertPass("SDL_GetAudioDeviceName(%i,0)" , i); |
770 | SDLTest_AssertCheck(device != NULL, "Validate device name is not NULL; got: %s" , (device != NULL) ? device : "NULL" ); |
771 | if (device == NULL) return TEST_ABORTED; |
772 | |
773 | /* Set standard desired spec */ |
774 | desired.freq=22050; |
775 | desired.format=AUDIO_S16SYS; |
776 | desired.channels=2; |
777 | desired.samples=4096; |
778 | desired.callback=_audio_testCallback; |
779 | desired.userdata=NULL; |
780 | |
781 | /* Open device */ |
782 | id = SDL_OpenAudioDevice((const char *)device, 0, &desired, &obtained, SDL_AUDIO_ALLOW_ANY_CHANGE); |
783 | SDLTest_AssertPass("SDL_OpenAudioDevice('%s',...)" , device); |
784 | SDLTest_AssertCheck(id > 1, "Validate device ID; expected: >=2, got: %i" , id); |
785 | if (id > 1) { |
786 | /* Lock to protect callback */ |
787 | SDL_LockAudioDevice(id); |
788 | SDLTest_AssertPass("SDL_LockAudioDevice(%i)" , id); |
789 | |
790 | /* Simulate callback processing */ |
791 | SDL_Delay(10); |
792 | SDLTest_Log("Simulate callback processing - delay" ); |
793 | |
794 | /* Unlock again */ |
795 | SDL_UnlockAudioDevice(id); |
796 | SDLTest_AssertPass("SDL_UnlockAudioDevice(%i)" , id); |
797 | |
798 | /* Close device again */ |
799 | SDL_CloseAudioDevice(id); |
800 | SDLTest_AssertPass("Call to SDL_CloseAudioDevice()" ); |
801 | } |
802 | } |
803 | } else { |
804 | SDLTest_Log("No devices to test with" ); |
805 | } |
806 | |
807 | return TEST_COMPLETED; |
808 | } |
809 | |
810 | |
811 | /** |
812 | * \brief Convert audio using various conversion structures |
813 | * |
814 | * \sa https://wiki.libsdl.org/SDL_BuildAudioCVT |
815 | * \sa https://wiki.libsdl.org/SDL_ConvertAudio |
816 | */ |
817 | int audio_convertAudio() |
818 | { |
819 | int result; |
820 | SDL_AudioCVT cvt; |
821 | SDL_AudioSpec spec1; |
822 | SDL_AudioSpec spec2; |
823 | int c; |
824 | char message[128]; |
825 | int i, ii, j, jj, k, kk, l, ll; |
826 | |
827 | /* Iterate over bitmask that determines which parameters are modified in the conversion */ |
828 | for (c = 1; c < 8; c++) { |
829 | SDL_strlcpy(message, "Changing:" , 128); |
830 | if (c & 1) { |
831 | SDL_strlcat(message, " Format" , 128); |
832 | } |
833 | if (c & 2) { |
834 | SDL_strlcat(message, " Channels" , 128); |
835 | } |
836 | if (c & 4) { |
837 | SDL_strlcat(message, " Frequencies" , 128); |
838 | } |
839 | SDLTest_Log("%s" , message); |
840 | /* All source conversions with random conversion targets */ |
841 | for (i = 0; i < _numAudioFormats; i++) { |
842 | for (j = 0; j < _numAudioChannels; j++) { |
843 | for (k = 0; k < _numAudioFrequencies; k++) { |
844 | spec1.format = _audioFormats[i]; |
845 | spec1.channels = _audioChannels[j]; |
846 | spec1.freq = _audioFrequencies[k]; |
847 | |
848 | /* Ensure we have a different target format */ |
849 | do { |
850 | if (c & 1) { |
851 | ii = SDLTest_RandomIntegerInRange(0, _numAudioFormats - 1); |
852 | } else { |
853 | ii = 1; |
854 | } |
855 | if (c & 2) { |
856 | jj = SDLTest_RandomIntegerInRange(0, _numAudioChannels - 1); |
857 | } else { |
858 | jj= j; |
859 | } |
860 | if (c & 4) { |
861 | kk = SDLTest_RandomIntegerInRange(0, _numAudioFrequencies - 1); |
862 | } else { |
863 | kk = k; |
864 | } |
865 | } while ((i == ii) && (j == jj) && (k == kk)); |
866 | spec2.format = _audioFormats[ii]; |
867 | spec2.channels = _audioChannels[jj]; |
868 | spec2.freq = _audioFrequencies[kk]; |
869 | |
870 | result = SDL_BuildAudioCVT(&cvt, spec1.format, spec1.channels, spec1.freq, |
871 | spec2.format, spec2.channels, spec2.freq); |
872 | SDLTest_AssertPass("Call to SDL_BuildAudioCVT(format[%i]=%s(%i),channels[%i]=%i,freq[%i]=%i ==> format[%i]=%s(%i),channels[%i]=%i,freq[%i]=%i)" , |
873 | i, _audioFormatsVerbose[i], spec1.format, j, spec1.channels, k, spec1.freq, ii, _audioFormatsVerbose[ii], spec2.format, jj, spec2.channels, kk, spec2.freq); |
874 | SDLTest_AssertCheck(result == 1, "Verify result value; expected: 1, got: %i" , result); |
875 | if (result != 1) { |
876 | SDLTest_LogError("%s" , SDL_GetError()); |
877 | } else { |
878 | SDLTest_AssertCheck(cvt.len_mult > 0, "Verify that cvt.len_mult value; expected: >0, got: %i" , cvt.len_mult); |
879 | if (cvt.len_mult < 1) return TEST_ABORTED; |
880 | |
881 | /* Create some random data to convert */ |
882 | l = 64; |
883 | ll = l * cvt.len_mult; |
884 | SDLTest_Log("Creating dummy sample buffer of %i length (%i bytes)" , l, ll); |
885 | cvt.len = l; |
886 | cvt.buf = (Uint8 *)SDL_malloc(ll); |
887 | SDLTest_AssertCheck(cvt.buf != NULL, "Check data buffer to convert is not NULL" ); |
888 | if (cvt.buf == NULL) return TEST_ABORTED; |
889 | |
890 | /* Convert the data */ |
891 | result = SDL_ConvertAudio(&cvt); |
892 | SDLTest_AssertPass("Call to SDL_ConvertAudio()" ); |
893 | SDLTest_AssertCheck(result == 0, "Verify result value; expected: 0; got: %i" , result); |
894 | SDLTest_AssertCheck(cvt.buf != NULL, "Verify conversion buffer is not NULL" ); |
895 | SDLTest_AssertCheck(cvt.len_ratio > 0.0, "Verify conversion length ratio; expected: >0; got: %f" , cvt.len_ratio); |
896 | |
897 | /* Free converted buffer */ |
898 | SDL_free(cvt.buf); |
899 | cvt.buf = NULL; |
900 | } |
901 | } |
902 | } |
903 | } |
904 | } |
905 | |
906 | return TEST_COMPLETED; |
907 | } |
908 | |
909 | |
910 | /** |
911 | * \brief Opens, checks current connected status, and closes a device. |
912 | * |
913 | * \sa https://wiki.libsdl.org/SDL_AudioDeviceConnected |
914 | */ |
915 | int audio_openCloseAudioDeviceConnected() |
916 | { |
917 | int result = -1; |
918 | int i; |
919 | int count; |
920 | char *device; |
921 | SDL_AudioDeviceID id; |
922 | SDL_AudioSpec desired, obtained; |
923 | |
924 | /* Get number of devices. */ |
925 | count = SDL_GetNumAudioDevices(0); |
926 | SDLTest_AssertPass("Call to SDL_GetNumAudioDevices(0)" ); |
927 | if (count > 0) { |
928 | for (i = 0; i < count; i++) { |
929 | /* Get device name */ |
930 | device = (char *)SDL_GetAudioDeviceName(i, 0); |
931 | SDLTest_AssertPass("SDL_GetAudioDeviceName(%i,0)" , i); |
932 | SDLTest_AssertCheck(device != NULL, "Validate device name is not NULL; got: %s" , (device != NULL) ? device : "NULL" ); |
933 | if (device == NULL) return TEST_ABORTED; |
934 | |
935 | /* Set standard desired spec */ |
936 | desired.freq=22050; |
937 | desired.format=AUDIO_S16SYS; |
938 | desired.channels=2; |
939 | desired.samples=4096; |
940 | desired.callback=_audio_testCallback; |
941 | desired.userdata=NULL; |
942 | |
943 | /* Open device */ |
944 | id = SDL_OpenAudioDevice((const char *)device, 0, &desired, &obtained, SDL_AUDIO_ALLOW_ANY_CHANGE); |
945 | SDLTest_AssertPass("SDL_OpenAudioDevice('%s',...)" , device); |
946 | SDLTest_AssertCheck(id > 1, "Validate device ID; expected: >1, got: %i" , id); |
947 | if (id > 1) { |
948 | |
949 | /* TODO: enable test code when function is available in SDL2 */ |
950 | |
951 | #ifdef AUDIODEVICECONNECTED_DEFINED |
952 | /* Get connected status */ |
953 | result = SDL_AudioDeviceConnected(id); |
954 | SDLTest_AssertPass("Call to SDL_AudioDeviceConnected()" ); |
955 | #endif |
956 | SDLTest_AssertCheck(result == 1, "Verify returned value; expected: 1; got: %i" , result); |
957 | |
958 | /* Close device again */ |
959 | SDL_CloseAudioDevice(id); |
960 | SDLTest_AssertPass("Call to SDL_CloseAudioDevice()" ); |
961 | } |
962 | } |
963 | } else { |
964 | SDLTest_Log("No devices to test with" ); |
965 | } |
966 | |
967 | return TEST_COMPLETED; |
968 | } |
969 | |
970 | |
971 | |
972 | /* ================= Test Case References ================== */ |
973 | |
974 | /* Audio test cases */ |
975 | static const SDLTest_TestCaseReference audioTest1 = |
976 | { (SDLTest_TestCaseFp)audio_enumerateAndNameAudioDevices, "audio_enumerateAndNameAudioDevices" , "Enumerate and name available audio devices (output and capture)" , TEST_ENABLED }; |
977 | |
978 | static const SDLTest_TestCaseReference audioTest2 = |
979 | { (SDLTest_TestCaseFp)audio_enumerateAndNameAudioDevicesNegativeTests, "audio_enumerateAndNameAudioDevicesNegativeTests" , "Negative tests around enumeration and naming of audio devices." , TEST_ENABLED }; |
980 | |
981 | static const SDLTest_TestCaseReference audioTest3 = |
982 | { (SDLTest_TestCaseFp)audio_printAudioDrivers, "audio_printAudioDrivers" , "Checks available audio driver names." , TEST_ENABLED }; |
983 | |
984 | static const SDLTest_TestCaseReference audioTest4 = |
985 | { (SDLTest_TestCaseFp)audio_printCurrentAudioDriver, "audio_printCurrentAudioDriver" , "Checks current audio driver name with initialized audio." , TEST_ENABLED }; |
986 | |
987 | static const SDLTest_TestCaseReference audioTest5 = |
988 | { (SDLTest_TestCaseFp)audio_buildAudioCVT, "audio_buildAudioCVT" , "Builds various audio conversion structures." , TEST_ENABLED }; |
989 | |
990 | static const SDLTest_TestCaseReference audioTest6 = |
991 | { (SDLTest_TestCaseFp)audio_buildAudioCVTNegative, "audio_buildAudioCVTNegative" , "Checks calls with invalid input to SDL_BuildAudioCVT" , TEST_ENABLED }; |
992 | |
993 | static const SDLTest_TestCaseReference audioTest7 = |
994 | { (SDLTest_TestCaseFp)audio_getAudioStatus, "audio_getAudioStatus" , "Checks current audio status." , TEST_ENABLED }; |
995 | |
996 | static const SDLTest_TestCaseReference audioTest8 = |
997 | { (SDLTest_TestCaseFp)audio_openCloseAndGetAudioStatus, "audio_openCloseAndGetAudioStatus" , "Opens and closes audio device and get audio status." , TEST_ENABLED }; |
998 | |
999 | static const SDLTest_TestCaseReference audioTest9 = |
1000 | { (SDLTest_TestCaseFp)audio_lockUnlockOpenAudioDevice, "audio_lockUnlockOpenAudioDevice" , "Locks and unlocks an open audio device." , TEST_ENABLED }; |
1001 | |
1002 | /* TODO: enable test when SDL_ConvertAudio segfaults on cygwin have been fixed. */ |
1003 | /* For debugging, test case can be run manually using --filter audio_convertAudio */ |
1004 | |
1005 | static const SDLTest_TestCaseReference audioTest10 = |
1006 | { (SDLTest_TestCaseFp)audio_convertAudio, "audio_convertAudio" , "Convert audio using available formats." , TEST_DISABLED }; |
1007 | |
1008 | /* TODO: enable test when SDL_AudioDeviceConnected has been implemented. */ |
1009 | |
1010 | static const SDLTest_TestCaseReference audioTest11 = |
1011 | { (SDLTest_TestCaseFp)audio_openCloseAudioDeviceConnected, "audio_openCloseAudioDeviceConnected" , "Opens and closes audio device and get connected status." , TEST_DISABLED }; |
1012 | |
1013 | static const SDLTest_TestCaseReference audioTest12 = |
1014 | { (SDLTest_TestCaseFp)audio_quitInitAudioSubSystem, "audio_quitInitAudioSubSystem" , "Quit and re-init audio subsystem." , TEST_ENABLED }; |
1015 | |
1016 | static const SDLTest_TestCaseReference audioTest13 = |
1017 | { (SDLTest_TestCaseFp)audio_initQuitAudio, "audio_initQuitAudio" , "Init and quit audio drivers directly." , TEST_ENABLED }; |
1018 | |
1019 | static const SDLTest_TestCaseReference audioTest14 = |
1020 | { (SDLTest_TestCaseFp)audio_initOpenCloseQuitAudio, "audio_initOpenCloseQuitAudio" , "Cycle through init, open, close and quit with various audio specs." , TEST_ENABLED }; |
1021 | |
1022 | static const SDLTest_TestCaseReference audioTest15 = |
1023 | { (SDLTest_TestCaseFp)audio_pauseUnpauseAudio, "audio_pauseUnpauseAudio" , "Pause and Unpause audio for various audio specs while testing callback." , TEST_ENABLED }; |
1024 | |
1025 | /* Sequence of Audio test cases */ |
1026 | static const SDLTest_TestCaseReference *audioTests[] = { |
1027 | &audioTest1, &audioTest2, &audioTest3, &audioTest4, &audioTest5, &audioTest6, |
1028 | &audioTest7, &audioTest8, &audioTest9, &audioTest10, &audioTest11, |
1029 | &audioTest12, &audioTest13, &audioTest14, &audioTest15, NULL |
1030 | }; |
1031 | |
1032 | /* Audio test suite (global) */ |
1033 | SDLTest_TestSuiteReference audioTestSuite = { |
1034 | "Audio" , |
1035 | _audioSetUp, |
1036 | audioTests, |
1037 | _audioTearDown |
1038 | }; |
1039 | |