2015-06-21 09:33:46 -06:00
/**
* Original code : automated SDL audio test written by Edgar Simo " bobbens "
* New / updated tests : aschiffler at ferzkopp dot net
*/
/* quiet windows compiler warnings */
2022-10-05 17:09:32 -06:00
# if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
2022-11-30 13:51:59 -07:00
# define _CRT_SECURE_NO_WARNINGS
2022-10-05 17:09:32 -06:00
# endif
2015-06-21 09:33:46 -06:00
2023-03-09 02:43:41 -07:00
# include <math.h>
2015-06-21 09:33:46 -06:00
# include <stdio.h>
2022-11-26 21:43:38 -07:00
# include <SDL3/SDL.h>
# include <SDL3/SDL_test.h>
2023-03-08 08:12:45 -07:00
# include "testautomation_suites.h"
2015-06-21 09:33:46 -06:00
/* ================= Test Case Implementation ================== */
/* Fixture */
2022-12-29 14:58:16 -07:00
static void audioSetUp ( void * arg )
2015-06-21 09:33:46 -06:00
{
/* Start SDL audio subsystem */
2022-11-30 13:51:59 -07:00
int ret = SDL_InitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_InitSubSystem(SDL_INIT_AUDIO) " ) ;
SDLTest_AssertCheck ( ret = = 0 , " Check result from SDL_InitSubSystem(SDL_INIT_AUDIO) " ) ;
2015-06-21 09:33:46 -06:00
if ( ret ! = 0 ) {
2022-11-30 13:51:59 -07:00
SDLTest_LogError ( " %s " , SDL_GetError ( ) ) ;
}
2015-06-21 09:33:46 -06:00
}
2022-12-29 14:58:16 -07:00
static void audioTearDown ( void * arg )
2015-06-21 09:33:46 -06:00
{
/* Remove a possibly created file from SDL disk writer audio driver; ignore errors */
2022-12-01 14:07:03 -07:00
( void ) remove ( " sdlaudio.raw " ) ;
2015-06-21 09:33:46 -06:00
SDLTest_AssertPass ( " Cleanup of test files completed " ) ;
}
/* Global counter for callback invocation */
2022-12-29 14:58:16 -07:00
static int g_audio_testCallbackCounter ;
2015-06-21 09:33:46 -06:00
/* Global accumulator for total callback length */
2022-12-29 14:58:16 -07:00
static int g_audio_testCallbackLength ;
2015-06-21 09:33:46 -06:00
/* Test callback function */
2022-12-29 14:58:16 -07:00
static void SDLCALL audio_testCallback ( void * userdata , Uint8 * stream , int len )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
/* track that callback was called */
2022-12-29 14:58:16 -07:00
g_audio_testCallbackCounter + + ;
g_audio_testCallbackLength + = len ;
2015-06-21 09:33:46 -06:00
}
2023-01-05 01:57:14 -07:00
static SDL_AudioDeviceID g_audio_id = - 1 ;
2015-06-21 09:33:46 -06:00
/* Test case functions */
/**
* \ brief Stop and restart audio subsystem
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_QuitSubSystem
* \ sa SDL_InitSubSystem
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_quitInitAudioSubSystem ( void * arg )
2015-06-21 09:33:46 -06:00
{
/* Stop SDL audio subsystem */
2022-11-30 13:51:59 -07:00
SDL_QuitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_QuitSubSystem(SDL_INIT_AUDIO) " ) ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
/* Restart audio again */
2022-12-29 14:58:16 -07:00
audioSetUp ( NULL ) ;
2015-06-21 09:33:46 -06:00
return TEST_COMPLETED ;
}
/**
* \ brief Start and stop audio directly
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_InitAudio
* \ sa SDL_QuitAudio
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_initQuitAudio ( void * arg )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
int result ;
2015-06-21 09:33:46 -06:00
int i , iMax ;
2022-11-30 13:51:59 -07:00
const char * audioDriver ;
2015-06-21 09:33:46 -06:00
/* Stop SDL audio subsystem */
2022-11-30 13:51:59 -07:00
SDL_QuitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_QuitSubSystem(SDL_INIT_AUDIO) " ) ;
/* Loop over all available audio drivers */
iMax = SDL_GetNumAudioDrivers ( ) ;
SDLTest_AssertPass ( " Call to SDL_GetNumAudioDrivers() " ) ;
SDLTest_AssertCheck ( iMax > 0 , " Validate number of audio drivers; expected: >0 got: %d " , iMax ) ;
for ( i = 0 ; i < iMax ; i + + ) {
audioDriver = SDL_GetAudioDriver ( i ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioDriver(%d) " , i ) ;
2022-12-01 14:07:03 -07:00
SDLTest_Assert ( audioDriver ! = NULL , " Audio driver name is not NULL " ) ;
SDLTest_AssertCheck ( audioDriver [ 0 ] ! = ' \0 ' , " Audio driver name is not empty; got: %s " , audioDriver ) ; /* NOLINT(clang-analyzer-core.NullDereference): Checked for NULL above */
2022-11-30 13:51:59 -07:00
/* Call Init */
2022-12-27 06:22:22 -07:00
SDL_SetHint ( " SDL_AUDIO_DRIVER " , audioDriver ) ;
result = SDL_InitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_InitSubSystem(SDL_INIT_AUDIO) with driver='%s' " , audioDriver ) ;
2022-11-30 13:51:59 -07:00
SDLTest_AssertCheck ( result = = 0 , " Validate result value; expected: 0 got: %d " , result ) ;
/* Call Quit */
2022-12-27 06:22:22 -07:00
SDL_QuitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_QuitSubSystem(SDL_INIT_AUDIO) " ) ;
2015-06-21 09:33:46 -06:00
}
/* NULL driver specification */
audioDriver = NULL ;
/* Call Init */
2022-12-27 06:22:22 -07:00
SDL_SetHint ( " SDL_AUDIO_DRIVER " , audioDriver ) ;
result = SDL_InitSubSystem ( SDL_INIT_AUDIO ) ;
2015-06-21 09:33:46 -06:00
SDLTest_AssertPass ( " Call to SDL_AudioInit(NULL) " ) ;
SDLTest_AssertCheck ( result = = 0 , " Validate result value; expected: 0 got: %d " , result ) ;
/* Call Quit */
2022-12-27 06:22:22 -07:00
SDL_QuitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_QuitSubSystem(SDL_INIT_AUDIO) " ) ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
/* Restart audio again */
2022-12-29 14:58:16 -07:00
audioSetUp ( NULL ) ;
2015-06-21 09:33:46 -06:00
return TEST_COMPLETED ;
}
/**
* \ brief Start , open , close and stop audio
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_InitAudio
* \ sa SDL_OpenAudioDevice
* \ sa SDL_CloseAudioDevice
* \ sa SDL_QuitAudio
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_initOpenCloseQuitAudio ( void * arg )
2015-06-21 09:33:46 -06:00
{
2023-01-05 01:57:14 -07:00
int result ;
2015-06-21 09:33:46 -06:00
int i , iMax , j , k ;
2022-11-30 13:51:59 -07:00
const char * audioDriver ;
2015-06-21 09:33:46 -06:00
SDL_AudioSpec desired ;
/* Stop SDL audio subsystem */
2022-11-30 13:51:59 -07:00
SDL_QuitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_QuitSubSystem(SDL_INIT_AUDIO) " ) ;
/* Loop over all available audio drivers */
iMax = SDL_GetNumAudioDrivers ( ) ;
SDLTest_AssertPass ( " Call to SDL_GetNumAudioDrivers() " ) ;
SDLTest_AssertCheck ( iMax > 0 , " Validate number of audio drivers; expected: >0 got: %d " , iMax ) ;
for ( i = 0 ; i < iMax ; i + + ) {
audioDriver = SDL_GetAudioDriver ( i ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioDriver(%d) " , i ) ;
2022-12-01 14:07:03 -07:00
SDLTest_Assert ( audioDriver ! = NULL , " Audio driver name is not NULL " ) ;
SDLTest_AssertCheck ( audioDriver [ 0 ] ! = ' \0 ' , " Audio driver name is not empty; got: %s " , audioDriver ) ; /* NOLINT(clang-analyzer-core.NullDereference): Checked for NULL above */
2022-11-30 13:51:59 -07:00
/* Change specs */
for ( j = 0 ; j < 2 ; j + + ) {
/* Call Init */
2022-12-27 06:22:22 -07:00
SDL_SetHint ( " SDL_AUDIO_DRIVER " , audioDriver ) ;
result = SDL_InitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_InitSubSystem(SDL_INIT_AUDIO) with driver='%s' " , audioDriver ) ;
2022-11-30 13:51:59 -07:00
SDLTest_AssertCheck ( result = = 0 , " Validate result value; expected: 0 got: %d " , result ) ;
/* Set spec */
SDL_memset ( & desired , 0 , sizeof ( desired ) ) ;
switch ( j ) {
case 0 :
/* Set standard desired spec */
desired . freq = 22050 ;
2023-05-02 06:00:28 -06:00
desired . format = SDL_AUDIO_S16SYS ;
2022-11-30 13:51:59 -07:00
desired . channels = 2 ;
desired . samples = 4096 ;
2022-12-29 14:58:16 -07:00
desired . callback = audio_testCallback ;
2022-11-30 13:51:59 -07:00
desired . userdata = NULL ;
case 1 :
/* Set custom desired spec */
desired . freq = 48000 ;
2023-05-02 06:00:28 -06:00
desired . format = SDL_AUDIO_F32SYS ;
2022-11-30 13:51:59 -07:00
desired . channels = 2 ;
desired . samples = 2048 ;
2022-12-29 14:58:16 -07:00
desired . callback = audio_testCallback ;
2022-11-30 13:51:59 -07:00
desired . userdata = NULL ;
break ;
2015-06-21 09:33:46 -06:00
}
/* Call Open (maybe multiple times) */
2022-11-30 13:51:59 -07:00
for ( k = 0 ; k < = j ; k + + ) {
2023-01-05 01:57:14 -07:00
result = SDL_OpenAudioDevice ( NULL , 0 , & desired , NULL , 0 ) ;
if ( k = = 0 ) {
g_audio_id = result ;
}
SDLTest_AssertPass ( " Call to SDL_OpenAudioDevice(NULL, 0, desired_spec_%d, NULL, 0), call %d " , j , k + 1 ) ;
SDLTest_AssertCheck ( result > 0 , " Verify return value; expected: > 0, got: %d " , result ) ;
2015-06-21 09:33:46 -06:00
}
/* Call Close (maybe multiple times) */
2022-11-30 13:51:59 -07:00
for ( k = 0 ; k < = j ; k + + ) {
2023-01-05 01:57:14 -07:00
SDL_CloseAudioDevice ( g_audio_id ) ;
SDLTest_AssertPass ( " Call to SDL_CloseAudioDevice(), call %d " , k + 1 ) ;
2015-06-21 09:33:46 -06:00
}
/* Call Quit (maybe multiple times) */
2022-11-30 13:51:59 -07:00
for ( k = 0 ; k < = j ; k + + ) {
2022-12-27 06:22:22 -07:00
SDL_QuitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_QuitSubSystem(SDL_INIT_AUDIO), call %d " , k + 1 ) ;
2015-06-21 09:33:46 -06:00
}
} /* spec loop */
2022-11-30 13:51:59 -07:00
} /* driver loop */
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
/* Restart audio again */
2022-12-29 14:58:16 -07:00
audioSetUp ( NULL ) ;
2015-06-21 09:33:46 -06:00
return TEST_COMPLETED ;
}
/**
* \ brief Pause and unpause audio
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_PauseAudioDevice
* \ sa SDL_PlayAudioDevice
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_pauseUnpauseAudio ( void * arg )
2015-06-21 09:33:46 -06:00
{
int result ;
int i , iMax , j , k , l ;
int totalDelay ;
int pause_on ;
int originalCounter ;
2022-11-30 13:51:59 -07:00
const char * audioDriver ;
2015-06-21 09:33:46 -06:00
SDL_AudioSpec desired ;
/* Stop SDL audio subsystem */
2022-11-30 13:51:59 -07:00
SDL_QuitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_QuitSubSystem(SDL_INIT_AUDIO) " ) ;
/* Loop over all available audio drivers */
iMax = SDL_GetNumAudioDrivers ( ) ;
SDLTest_AssertPass ( " Call to SDL_GetNumAudioDrivers() " ) ;
SDLTest_AssertCheck ( iMax > 0 , " Validate number of audio drivers; expected: >0 got: %d " , iMax ) ;
for ( i = 0 ; i < iMax ; i + + ) {
audioDriver = SDL_GetAudioDriver ( i ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioDriver(%d) " , i ) ;
2022-12-01 14:07:03 -07:00
SDLTest_Assert ( audioDriver ! = NULL , " Audio driver name is not NULL " ) ;
SDLTest_AssertCheck ( audioDriver [ 0 ] ! = ' \0 ' , " Audio driver name is not empty; got: %s " , audioDriver ) ; /* NOLINT(clang-analyzer-core.NullDereference): Checked for NULL above */
2022-11-30 13:51:59 -07:00
/* Change specs */
for ( j = 0 ; j < 2 ; j + + ) {
/* Call Init */
2022-12-27 06:22:22 -07:00
SDL_SetHint ( " SDL_AUDIO_DRIVER " , audioDriver ) ;
result = SDL_InitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_InitSubSystem(SDL_INIT_AUDIO) with driver='%s' " , audioDriver ) ;
2022-11-30 13:51:59 -07:00
SDLTest_AssertCheck ( result = = 0 , " Validate result value; expected: 0 got: %d " , result ) ;
/* Set spec */
SDL_memset ( & desired , 0 , sizeof ( desired ) ) ;
switch ( j ) {
case 0 :
/* Set standard desired spec */
desired . freq = 22050 ;
2023-05-02 06:00:28 -06:00
desired . format = SDL_AUDIO_S16SYS ;
2022-11-30 13:51:59 -07:00
desired . channels = 2 ;
desired . samples = 4096 ;
2022-12-29 14:58:16 -07:00
desired . callback = audio_testCallback ;
2022-11-30 13:51:59 -07:00
desired . userdata = NULL ;
2023-03-18 13:34:56 -06:00
break ;
2022-11-30 13:51:59 -07:00
case 1 :
/* Set custom desired spec */
desired . freq = 48000 ;
2023-05-02 06:00:28 -06:00
desired . format = SDL_AUDIO_F32SYS ;
2022-11-30 13:51:59 -07:00
desired . channels = 2 ;
desired . samples = 2048 ;
2022-12-29 14:58:16 -07:00
desired . callback = audio_testCallback ;
2022-11-30 13:51:59 -07:00
desired . userdata = NULL ;
break ;
2015-06-21 09:33:46 -06:00
}
/* Call Open */
2023-01-05 01:57:14 -07:00
g_audio_id = SDL_OpenAudioDevice ( NULL , 0 , & desired , NULL , 0 ) ;
result = g_audio_id ;
SDLTest_AssertPass ( " Call to SDL_OpenAudioDevice(NULL, 0, desired_spec_%d, NULL, 0) " , j ) ;
SDLTest_AssertCheck ( result > 0 , " Verify return value; expected > 0 got: %d " , result ) ;
2015-06-21 09:33:46 -06:00
/* Start and stop audio multiple times */
2022-11-30 13:51:59 -07:00
for ( l = 0 ; l < 3 ; l + + ) {
SDLTest_Log ( " Pause/Unpause iteration: %d " , l + 1 ) ;
2015-06-21 09:33:46 -06:00
/* Reset callback counters */
2022-12-29 14:58:16 -07:00
g_audio_testCallbackCounter = 0 ;
g_audio_testCallbackLength = 0 ;
2015-06-21 09:33:46 -06:00
/* Un-pause audio to start playing (maybe multiple times) */
pause_on = 0 ;
2022-11-30 13:51:59 -07:00
for ( k = 0 ; k < = j ; k + + ) {
2023-01-06 05:59:45 -07:00
SDL_PlayAudioDevice ( g_audio_id ) ;
SDLTest_AssertPass ( " Call to SDL_PlayAudioDevice(g_audio_id), call %d " , k + 1 ) ;
2015-06-21 09:33:46 -06:00
}
2022-11-30 13:51:59 -07:00
2015-06-21 09:33:46 -06:00
/* Wait for callback */
totalDelay = 0 ;
do {
SDL_Delay ( 10 ) ;
totalDelay + = 10 ;
2022-12-29 14:58:16 -07:00
} while ( g_audio_testCallbackCounter = = 0 & & totalDelay < 1000 ) ;
SDLTest_AssertCheck ( g_audio_testCallbackCounter > 0 , " Verify callback counter; expected: >0 got: %d " , g_audio_testCallbackCounter ) ;
SDLTest_AssertCheck ( g_audio_testCallbackLength > 0 , " Verify callback length; expected: >0 got: %d " , g_audio_testCallbackLength ) ;
2015-06-21 09:33:46 -06:00
/* Pause audio to stop playing (maybe multiple times) */
2022-11-30 13:51:59 -07:00
for ( k = 0 ; k < = j ; k + + ) {
pause_on = ( k = = 0 ) ? 1 : SDLTest_RandomIntegerInRange ( 99 , 9999 ) ;
2023-01-06 05:59:45 -07:00
if ( pause_on ) {
SDL_PauseAudioDevice ( g_audio_id ) ;
SDLTest_AssertPass ( " Call to SDL_PauseAudioDevice(g_audio_id), call %d " , k + 1 ) ;
} else {
SDL_PlayAudioDevice ( g_audio_id ) ;
SDLTest_AssertPass ( " Call to SDL_PlayAudioDevice(g_audio_id), call %d " , k + 1 ) ;
}
2015-06-21 09:33:46 -06:00
}
2022-11-30 13:51:59 -07:00
2015-06-21 09:33:46 -06:00
/* Ensure callback is not called again */
2022-12-29 14:58:16 -07:00
originalCounter = g_audio_testCallbackCounter ;
2015-06-21 09:33:46 -06:00
SDL_Delay ( totalDelay + 10 ) ;
2022-12-29 14:58:16 -07:00
SDLTest_AssertCheck ( originalCounter = = g_audio_testCallbackCounter , " Verify callback counter; expected: %d, got: %d " , originalCounter , g_audio_testCallbackCounter ) ;
2015-06-21 09:33:46 -06:00
}
/* Call Close */
2023-01-05 01:57:14 -07:00
SDL_CloseAudioDevice ( g_audio_id ) ;
SDLTest_AssertPass ( " Call to SDL_CloseAudioDevice() " ) ;
2015-06-21 09:33:46 -06:00
/* Call Quit */
2022-12-27 06:22:22 -07:00
SDL_QuitSubSystem ( SDL_INIT_AUDIO ) ;
SDLTest_AssertPass ( " Call to SDL_QuitSubSystem(SDL_INIT_AUDIO) " ) ;
2015-06-21 09:33:46 -06:00
} /* spec loop */
2022-11-30 13:51:59 -07:00
} /* driver loop */
2015-06-21 09:33:46 -06:00
/* Restart audio again */
2022-12-29 14:58:16 -07:00
audioSetUp ( NULL ) ;
2015-06-21 09:33:46 -06:00
return TEST_COMPLETED ;
}
/**
* \ brief Enumerate and name available audio devices ( output and capture ) .
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_GetNumAudioDevices
* \ sa SDL_GetAudioDeviceName
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_enumerateAndNameAudioDevices ( void * arg )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
int t , tt ;
int i , n , nn ;
const char * name , * nameAgain ;
/* Iterate over types: t=0 output device, t=1 input/capture device */
for ( t = 0 ; t < 2 ; t + + ) {
/* Get number of devices. */
n = SDL_GetNumAudioDevices ( t ) ;
SDLTest_AssertPass ( " Call to SDL_GetNumAudioDevices(%i) " , t ) ;
SDLTest_Log ( " Number of %s devices < 0, reported as %i " , ( t ) ? " capture " : " output " , n ) ;
SDLTest_AssertCheck ( n > = 0 , " Validate result is >= 0, got: %i " , n ) ;
/* Variation of non-zero type */
if ( t = = 1 ) {
tt = t + SDLTest_RandomIntegerInRange ( 1 , 10 ) ;
nn = SDL_GetNumAudioDevices ( tt ) ;
SDLTest_AssertCheck ( n = = nn , " Verify result from SDL_GetNumAudioDevices(%i), expected same number of audio devices %i, got %i " , tt , n , nn ) ;
nn = SDL_GetNumAudioDevices ( - tt ) ;
SDLTest_AssertCheck ( n = = nn , " Verify result from SDL_GetNumAudioDevices(%i), expected same number of audio devices %i, got %i " , - tt , n , nn ) ;
}
/* List devices. */
if ( n > 0 ) {
for ( i = 0 ; i < n ; i + + ) {
name = SDL_GetAudioDeviceName ( i , t ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioDeviceName(%i, %i) " , i , t ) ;
SDLTest_AssertCheck ( name ! = NULL , " Verify result from SDL_GetAudioDeviceName(%i, %i) is not NULL " , i , t ) ;
if ( name ! = NULL ) {
SDLTest_AssertCheck ( name [ 0 ] ! = ' \0 ' , " verify result from SDL_GetAudioDeviceName(%i, %i) is not empty, got: '%s' " , i , t , name ) ;
if ( t = = 1 ) {
/* Also try non-zero type */
tt = t + SDLTest_RandomIntegerInRange ( 1 , 10 ) ;
nameAgain = SDL_GetAudioDeviceName ( i , tt ) ;
SDLTest_AssertCheck ( nameAgain ! = NULL , " Verify result from SDL_GetAudioDeviceName(%i, %i) is not NULL " , i , tt ) ;
if ( nameAgain ! = NULL ) {
SDLTest_AssertCheck ( nameAgain [ 0 ] ! = ' \0 ' , " Verify result from SDL_GetAudioDeviceName(%i, %i) is not empty, got: '%s' " , i , tt , nameAgain ) ;
SDLTest_AssertCheck ( SDL_strcmp ( name , nameAgain ) = = 0 ,
" Verify SDL_GetAudioDeviceName(%i, %i) and SDL_GetAudioDeviceName(%i %i) return the same string " ,
i , t , i , tt ) ;
}
}
}
2015-06-21 09:33:46 -06:00
}
2022-11-30 13:51:59 -07:00
}
}
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
return TEST_COMPLETED ;
2015-06-21 09:33:46 -06:00
}
/**
* \ brief Negative tests around enumeration and naming of audio devices .
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_GetNumAudioDevices
* \ sa SDL_GetAudioDeviceName
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_enumerateAndNameAudioDevicesNegativeTests ( void * arg )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
int t ;
int i , j , no , nc ;
const char * name ;
/* Get number of devices. */
no = SDL_GetNumAudioDevices ( 0 ) ;
SDLTest_AssertPass ( " Call to SDL_GetNumAudioDevices(0) " ) ;
nc = SDL_GetNumAudioDevices ( 1 ) ;
SDLTest_AssertPass ( " Call to SDL_GetNumAudioDevices(1) " ) ;
/* Invalid device index when getting name */
for ( t = 0 ; t < 2 ; t + + ) {
/* Negative device index */
i = SDLTest_RandomIntegerInRange ( - 10 , - 1 ) ;
name = SDL_GetAudioDeviceName ( i , t ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioDeviceName(%i, %i) " , i , t ) ;
SDLTest_AssertCheck ( name = = NULL , " Check SDL_GetAudioDeviceName(%i, %i) result NULL, expected NULL, got: %s " , i , t , ( name = = NULL ) ? " NULL " : name ) ;
/* Device index past range */
for ( j = 0 ; j < 3 ; j + + ) {
i = ( t ) ? nc + j : no + j ;
name = SDL_GetAudioDeviceName ( i , t ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioDeviceName(%i, %i) " , i , t ) ;
SDLTest_AssertCheck ( name = = NULL , " Check SDL_GetAudioDeviceName(%i, %i) result, expected: NULL, got: %s " , i , t , ( name = = NULL ) ? " NULL " : name ) ;
}
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
/* Capture index past capture range but within output range */
if ( ( no > 0 ) & & ( no > nc ) & & ( t = = 1 ) ) {
i = no - 1 ;
name = SDL_GetAudioDeviceName ( i , t ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioDeviceName(%i, %i) " , i , t ) ;
SDLTest_AssertCheck ( name = = NULL , " Check SDL_GetAudioDeviceName(%i, %i) result, expected: NULL, got: %s " , i , t , ( name = = NULL ) ? " NULL " : name ) ;
}
}
return TEST_COMPLETED ;
}
2015-06-21 09:33:46 -06:00
/**
* \ brief Checks available audio driver names .
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_GetNumAudioDrivers
* \ sa SDL_GetAudioDriver
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_printAudioDrivers ( void * arg )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
int i , n ;
const char * name ;
/* Get number of drivers */
n = SDL_GetNumAudioDrivers ( ) ;
SDLTest_AssertPass ( " Call to SDL_GetNumAudioDrivers() " ) ;
SDLTest_AssertCheck ( n > = 0 , " Verify number of audio drivers >= 0, got: %i " , n ) ;
/* List drivers. */
if ( n > 0 ) {
for ( i = 0 ; i < n ; i + + ) {
name = SDL_GetAudioDriver ( i ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioDriver(%i) " , i ) ;
SDLTest_AssertCheck ( name ! = NULL , " Verify returned name is not NULL " ) ;
if ( name ! = NULL ) {
SDLTest_AssertCheck ( name [ 0 ] ! = ' \0 ' , " Verify returned name is not empty, got: '%s' " , name ) ;
}
}
}
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
return TEST_COMPLETED ;
}
2015-06-21 09:33:46 -06:00
/**
* \ brief Checks current audio driver name with initialized audio .
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_GetCurrentAudioDriver
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_printCurrentAudioDriver ( void * arg )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
/* Check current audio driver */
const char * name = SDL_GetCurrentAudioDriver ( ) ;
SDLTest_AssertPass ( " Call to SDL_GetCurrentAudioDriver() " ) ;
SDLTest_AssertCheck ( name ! = NULL , " Verify returned name is not NULL " ) ;
if ( name ! = NULL ) {
SDLTest_AssertCheck ( name [ 0 ] ! = ' \0 ' , " Verify returned name is not empty, got: '%s' " , name ) ;
}
return TEST_COMPLETED ;
2015-06-21 09:33:46 -06:00
}
/* Definition of all formats, channels, and frequencies used to test audio conversions */
2023-05-02 06:00:28 -06:00
static SDL_AudioFormat g_audioFormats [ ] = { SDL_AUDIO_S8 , SDL_AUDIO_U8 , SDL_AUDIO_S16LSB , SDL_AUDIO_S16MSB , SDL_AUDIO_S16SYS , SDL_AUDIO_S16 ,
SDL_AUDIO_S32LSB , SDL_AUDIO_S32MSB , SDL_AUDIO_S32SYS , SDL_AUDIO_S32 ,
SDL_AUDIO_F32LSB , SDL_AUDIO_F32MSB , SDL_AUDIO_F32SYS , SDL_AUDIO_F32 } ;
static const char * g_audioFormatsVerbose [ ] = { " SDL_AUDIO_S8 " , " SDL_AUDIO_U8 " , " SDL_AUDIO_S16LSB " , " SDL_AUDIO_S16MSB " , " SDL_AUDIO_S16SYS " , " SDL_AUDIO_S16 " ,
" SDL_AUDIO_S32LSB " , " SDL_AUDIO_S32MSB " , " SDL_AUDIO_S32SYS " , " SDL_AUDIO_S32 " ,
" SDL_AUDIO_F32LSB " , " SDL_AUDIO_F32MSB " , " SDL_AUDIO_F32SYS " , " SDL_AUDIO_F32 " } ;
2023-03-01 12:56:56 -07:00
static const int g_numAudioFormats = SDL_arraysize ( g_audioFormats ) ;
2023-01-16 01:45:34 -07:00
static Uint8 g_audioChannels [ ] = { 1 , 2 , 4 , 6 } ;
2023-03-01 14:12:30 -07:00
static const int g_numAudioChannels = SDL_arraysize ( g_audioChannels ) ;
2023-01-16 01:45:34 -07:00
static int g_audioFrequencies [ ] = { 11025 , 22050 , 44100 , 48000 } ;
2023-03-01 14:12:30 -07:00
static const int g_numAudioFrequencies = SDL_arraysize ( g_audioFrequencies ) ;
2015-06-21 09:33:46 -06:00
/**
* \ brief Builds various audio conversion structures
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_CreateAudioStream
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_buildAudioStream ( void * arg )
2015-06-21 09:33:46 -06:00
{
2023-01-16 01:45:34 -07:00
SDL_AudioStream * stream ;
2022-11-30 13:51:59 -07:00
SDL_AudioSpec spec1 ;
SDL_AudioSpec spec2 ;
int i , ii , j , jj , k , kk ;
/* No conversion needed */
2023-05-02 06:00:28 -06:00
spec1 . format = SDL_AUDIO_S16LSB ;
2022-11-30 13:51:59 -07:00
spec1 . channels = 2 ;
spec1 . freq = 22050 ;
2023-01-16 01:45:34 -07:00
stream = SDL_CreateAudioStream ( spec1 . format , spec1 . channels , spec1 . freq ,
spec1 . format , spec1 . channels , spec1 . freq ) ;
SDLTest_AssertPass ( " Call to SDL_CreateAudioStream(spec1 ==> spec1) " ) ;
SDLTest_AssertCheck ( stream ! = NULL , " Verify stream value; expected: != NULL, got: %p " , ( void * ) stream ) ;
SDL_DestroyAudioStream ( stream ) ;
2022-11-30 13:51:59 -07:00
/* Typical conversion */
2023-05-02 06:00:28 -06:00
spec1 . format = SDL_AUDIO_S8 ;
2022-11-30 13:51:59 -07:00
spec1 . channels = 1 ;
spec1 . freq = 22050 ;
2023-05-02 06:00:28 -06:00
spec2 . format = SDL_AUDIO_S16LSB ;
2022-11-30 13:51:59 -07:00
spec2 . channels = 2 ;
spec2 . freq = 44100 ;
2023-01-16 01:45:34 -07:00
stream = SDL_CreateAudioStream ( spec1 . format , spec1 . channels , spec1 . freq ,
spec2 . format , spec2 . channels , spec2 . freq ) ;
SDLTest_AssertPass ( " Call to SDL_CreateAudioStream(spec1 ==> spec2) " ) ;
SDLTest_AssertCheck ( stream ! = NULL , " Verify stream value; expected: != NULL, got: %p " , ( void * ) stream ) ;
SDL_DestroyAudioStream ( stream ) ;
2022-11-30 13:51:59 -07:00
/* All source conversions with random conversion targets, allow 'null' conversions */
2022-12-29 14:58:16 -07:00
for ( i = 0 ; i < g_numAudioFormats ; i + + ) {
for ( j = 0 ; j < g_numAudioChannels ; j + + ) {
for ( k = 0 ; k < g_numAudioFrequencies ; k + + ) {
spec1 . format = g_audioFormats [ i ] ;
spec1 . channels = g_audioChannels [ j ] ;
spec1 . freq = g_audioFrequencies [ k ] ;
ii = SDLTest_RandomIntegerInRange ( 0 , g_numAudioFormats - 1 ) ;
jj = SDLTest_RandomIntegerInRange ( 0 , g_numAudioChannels - 1 ) ;
kk = SDLTest_RandomIntegerInRange ( 0 , g_numAudioFrequencies - 1 ) ;
spec2 . format = g_audioFormats [ ii ] ;
spec2 . channels = g_audioChannels [ jj ] ;
spec2 . freq = g_audioFrequencies [ kk ] ;
2023-01-16 01:45:34 -07:00
stream = SDL_CreateAudioStream ( spec1 . format , spec1 . channels , spec1 . freq ,
spec2 . format , spec2 . channels , spec2 . freq ) ;
SDLTest_AssertPass ( " Call to SDL_CreateAudioStream(format[%i]=%s(%i),channels[%i]=%i,freq[%i]=%i ==> format[%i]=%s(%i),channels[%i]=%i,freq[%i]=%i) " ,
2022-12-29 14:58:16 -07:00
i , g_audioFormatsVerbose [ i ] , spec1 . format , j , spec1 . channels , k , spec1 . freq , ii , g_audioFormatsVerbose [ ii ] , spec2 . format , jj , spec2 . channels , kk , spec2 . freq ) ;
2023-01-16 01:45:34 -07:00
SDLTest_AssertCheck ( stream ! = NULL , " Verify stream value; expected: != NULL, got: %p " , ( void * ) stream ) ;
if ( stream = = NULL ) {
2022-11-30 13:51:59 -07:00
SDLTest_LogError ( " %s " , SDL_GetError ( ) ) ;
}
2023-01-16 01:45:34 -07:00
SDL_DestroyAudioStream ( stream ) ;
2022-11-30 13:51:59 -07:00
}
2015-06-21 09:33:46 -06:00
}
}
2022-11-30 13:51:59 -07:00
return TEST_COMPLETED ;
2015-06-21 09:33:46 -06:00
}
/**
2023-01-16 01:45:34 -07:00
* \ brief Checks calls with invalid input to SDL_CreateAudioStream
2015-06-21 09:33:46 -06:00
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_CreateAudioStream
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_buildAudioStreamNegative ( void * arg )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
const char * error ;
2023-01-16 01:45:34 -07:00
SDL_AudioStream * stream ;
2022-11-30 13:51:59 -07:00
SDL_AudioSpec spec1 ;
SDL_AudioSpec spec2 ;
int i ;
char message [ 256 ] ;
/* Valid format */
2023-05-02 06:00:28 -06:00
spec1 . format = SDL_AUDIO_S8 ;
2015-06-21 09:33:46 -06:00
spec1 . channels = 1 ;
spec1 . freq = 22050 ;
2023-05-02 06:00:28 -06:00
spec2 . format = SDL_AUDIO_S16LSB ;
2015-06-21 09:33:46 -06:00
spec2 . channels = 2 ;
spec2 . freq = 44100 ;
SDL_ClearError ( ) ;
SDLTest_AssertPass ( " Call to SDL_ClearError() " ) ;
2022-11-30 13:51:59 -07:00
/* Invalid conversions */
for ( i = 1 ; i < 64 ; i + + ) {
/* Valid format to start with */
2023-05-02 06:00:28 -06:00
spec1 . format = SDL_AUDIO_S8 ;
2022-11-30 13:51:59 -07:00
spec1 . channels = 1 ;
spec1 . freq = 22050 ;
2023-05-02 06:00:28 -06:00
spec2 . format = SDL_AUDIO_S16LSB ;
2022-11-30 13:51:59 -07:00
spec2 . channels = 2 ;
spec2 . freq = 44100 ;
SDL_ClearError ( ) ;
SDLTest_AssertPass ( " Call to SDL_ClearError() " ) ;
/* Set various invalid format inputs */
SDL_strlcpy ( message , " Invalid: " , 256 ) ;
if ( i & 1 ) {
SDL_strlcat ( message , " spec1.format " , 256 ) ;
spec1 . format = 0 ;
}
if ( i & 2 ) {
SDL_strlcat ( message , " spec1.channels " , 256 ) ;
spec1 . channels = 0 ;
}
if ( i & 4 ) {
SDL_strlcat ( message , " spec1.freq " , 256 ) ;
spec1 . freq = 0 ;
}
if ( i & 8 ) {
SDL_strlcat ( message , " spec2.format " , 256 ) ;
spec2 . format = 0 ;
}
if ( i & 16 ) {
SDL_strlcat ( message , " spec2.channels " , 256 ) ;
spec2 . channels = 0 ;
}
if ( i & 32 ) {
SDL_strlcat ( message , " spec2.freq " , 256 ) ;
spec2 . freq = 0 ;
}
SDLTest_Log ( " %s " , message ) ;
2023-01-16 01:45:34 -07:00
stream = SDL_CreateAudioStream ( spec1 . format , spec1 . channels , spec1 . freq ,
spec2 . format , spec2 . channels , spec2 . freq ) ;
SDLTest_AssertPass ( " Call to SDL_CreateAudioStream(spec1 ==> spec2) " ) ;
SDLTest_AssertCheck ( stream = = NULL , " Verify stream value; expected: NULL, got: %p " , ( void * ) stream ) ;
2022-11-30 13:51:59 -07:00
error = SDL_GetError ( ) ;
SDLTest_AssertPass ( " Call to SDL_GetError() " ) ;
SDLTest_AssertCheck ( error ! = NULL & & error [ 0 ] ! = ' \0 ' , " Validate that error message was not NULL or empty " ) ;
2023-01-16 01:45:34 -07:00
SDL_DestroyAudioStream ( stream ) ;
2022-11-30 13:51:59 -07:00
}
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
SDL_ClearError ( ) ;
SDLTest_AssertPass ( " Call to SDL_ClearError() " ) ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
return TEST_COMPLETED ;
2015-06-21 09:33:46 -06:00
}
/**
* \ brief Checks current audio status .
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_GetAudioDeviceStatus
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_getAudioStatus ( void * arg )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
SDL_AudioStatus result ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
/* Check current audio status */
2023-01-05 01:57:14 -07:00
result = SDL_GetAudioDeviceStatus ( g_audio_id ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioDeviceStatus(g_audio_id) " ) ;
2022-11-30 13:51:59 -07:00
SDLTest_AssertCheck ( result = = SDL_AUDIO_STOPPED | | result = = SDL_AUDIO_PLAYING | | result = = SDL_AUDIO_PAUSED ,
" Verify returned value; expected: STOPPED (%i) | PLAYING (%i) | PAUSED (%i), got: %i " ,
SDL_AUDIO_STOPPED , SDL_AUDIO_PLAYING , SDL_AUDIO_PAUSED , result ) ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
return TEST_COMPLETED ;
2015-06-21 09:33:46 -06:00
}
/**
* \ brief Opens , checks current audio status , and closes a device .
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_GetAudioStatus
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_openCloseAndGetAudioStatus ( void * arg )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
SDL_AudioStatus result ;
int i ;
int count ;
const char * device ;
SDL_AudioDeviceID id ;
SDL_AudioSpec desired , obtained ;
/* Get number of devices. */
count = SDL_GetNumAudioDevices ( 0 ) ;
SDLTest_AssertPass ( " Call to SDL_GetNumAudioDevices(0) " ) ;
if ( count > 0 ) {
for ( i = 0 ; i < count ; i + + ) {
/* Get device name */
device = SDL_GetAudioDeviceName ( i , 0 ) ;
SDLTest_AssertPass ( " SDL_GetAudioDeviceName(%i,0) " , i ) ;
SDLTest_AssertCheck ( device ! = NULL , " Validate device name is not NULL; got: %s " , ( device ! = NULL ) ? device : " NULL " ) ;
if ( device = = NULL ) {
return TEST_ABORTED ;
}
/* Set standard desired spec */
desired . freq = 22050 ;
2023-05-02 06:00:28 -06:00
desired . format = SDL_AUDIO_S16SYS ;
2022-11-30 13:51:59 -07:00
desired . channels = 2 ;
desired . samples = 4096 ;
2022-12-29 14:58:16 -07:00
desired . callback = audio_testCallback ;
2022-11-30 13:51:59 -07:00
desired . userdata = NULL ;
/* Open device */
id = SDL_OpenAudioDevice ( device , 0 , & desired , & obtained , SDL_AUDIO_ALLOW_ANY_CHANGE ) ;
SDLTest_AssertPass ( " SDL_OpenAudioDevice('%s',...) " , device ) ;
2023-01-05 01:57:14 -07:00
SDLTest_AssertCheck ( id > 0 , " Validate device ID; expected: > 0, got: % " SDL_PRIu32 , id ) ;
if ( id > 0 ) {
2022-11-30 13:51:59 -07:00
/* Check device audio status */
result = SDL_GetAudioDeviceStatus ( id ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioDeviceStatus() " ) ;
SDLTest_AssertCheck ( result = = SDL_AUDIO_STOPPED | | result = = SDL_AUDIO_PLAYING | | result = = SDL_AUDIO_PAUSED ,
" Verify returned value; expected: STOPPED (%i) | PLAYING (%i) | PAUSED (%i), got: %i " ,
SDL_AUDIO_STOPPED , SDL_AUDIO_PLAYING , SDL_AUDIO_PAUSED , result ) ;
/* Close device again */
SDL_CloseAudioDevice ( id ) ;
SDLTest_AssertPass ( " Call to SDL_CloseAudioDevice() " ) ;
}
}
} else {
SDLTest_Log ( " No devices to test with " ) ;
}
return TEST_COMPLETED ;
2015-06-21 09:33:46 -06:00
}
/**
* \ brief Locks and unlocks open audio device .
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_LockAudioDevice
* \ sa SDL_UnlockAudioDevice
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_lockUnlockOpenAudioDevice ( void * arg )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
int i ;
int count ;
const char * device ;
SDL_AudioDeviceID id ;
SDL_AudioSpec desired , obtained ;
/* Get number of devices. */
count = SDL_GetNumAudioDevices ( 0 ) ;
SDLTest_AssertPass ( " Call to SDL_GetNumAudioDevices(0) " ) ;
if ( count > 0 ) {
for ( i = 0 ; i < count ; i + + ) {
/* Get device name */
device = SDL_GetAudioDeviceName ( i , 0 ) ;
SDLTest_AssertPass ( " SDL_GetAudioDeviceName(%i,0) " , i ) ;
SDLTest_AssertCheck ( device ! = NULL , " Validate device name is not NULL; got: %s " , ( device ! = NULL ) ? device : " NULL " ) ;
if ( device = = NULL ) {
return TEST_ABORTED ;
}
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
/* Set standard desired spec */
desired . freq = 22050 ;
2023-05-02 06:00:28 -06:00
desired . format = SDL_AUDIO_S16SYS ;
2022-11-30 13:51:59 -07:00
desired . channels = 2 ;
desired . samples = 4096 ;
2022-12-29 14:58:16 -07:00
desired . callback = audio_testCallback ;
2022-11-30 13:51:59 -07:00
desired . userdata = NULL ;
/* Open device */
id = SDL_OpenAudioDevice ( device , 0 , & desired , & obtained , SDL_AUDIO_ALLOW_ANY_CHANGE ) ;
SDLTest_AssertPass ( " SDL_OpenAudioDevice('%s',...) " , device ) ;
2023-01-05 01:57:14 -07:00
SDLTest_AssertCheck ( id > 1 , " Validate device ID; expected: > 0, got: % " SDL_PRIu32 , id ) ;
if ( id > 0 ) {
2022-11-30 13:51:59 -07:00
/* Lock to protect callback */
SDL_LockAudioDevice ( id ) ;
SDLTest_AssertPass ( " SDL_LockAudioDevice(% " SDL_PRIu32 " ) " , id ) ;
/* Simulate callback processing */
SDL_Delay ( 10 ) ;
SDLTest_Log ( " Simulate callback processing - delay " ) ;
/* Unlock again */
SDL_UnlockAudioDevice ( id ) ;
SDLTest_AssertPass ( " SDL_UnlockAudioDevice(% " SDL_PRIu32 " ) " , id ) ;
/* Close device again */
SDL_CloseAudioDevice ( id ) ;
SDLTest_AssertPass ( " Call to SDL_CloseAudioDevice() " ) ;
}
}
} else {
SDLTest_Log ( " No devices to test with " ) ;
}
return TEST_COMPLETED ;
}
2015-06-21 09:33:46 -06:00
/**
* \ brief Convert audio using various conversion structures
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_CreateAudioStream
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_convertAudio ( void * arg )
2015-06-21 09:33:46 -06:00
{
2023-01-16 01:45:34 -07:00
SDL_AudioStream * stream ;
2022-11-30 13:51:59 -07:00
SDL_AudioSpec spec1 ;
SDL_AudioSpec spec2 ;
int c ;
char message [ 128 ] ;
2023-01-16 01:45:34 -07:00
int i , ii , j , jj , k , kk ;
2022-11-30 13:51:59 -07:00
/* Iterate over bitmask that determines which parameters are modified in the conversion */
for ( c = 1 ; c < 8 ; c + + ) {
SDL_strlcpy ( message , " Changing: " , 128 ) ;
if ( c & 1 ) {
SDL_strlcat ( message , " Format " , 128 ) ;
}
if ( c & 2 ) {
SDL_strlcat ( message , " Channels " , 128 ) ;
}
if ( c & 4 ) {
SDL_strlcat ( message , " Frequencies " , 128 ) ;
}
SDLTest_Log ( " %s " , message ) ;
/* All source conversions with random conversion targets */
2022-12-29 14:58:16 -07:00
for ( i = 0 ; i < g_numAudioFormats ; i + + ) {
for ( j = 0 ; j < g_numAudioChannels ; j + + ) {
for ( k = 0 ; k < g_numAudioFrequencies ; k + + ) {
spec1 . format = g_audioFormats [ i ] ;
spec1 . channels = g_audioChannels [ j ] ;
spec1 . freq = g_audioFrequencies [ k ] ;
2022-11-30 13:51:59 -07:00
/* Ensure we have a different target format */
do {
if ( c & 1 ) {
2022-12-29 14:58:16 -07:00
ii = SDLTest_RandomIntegerInRange ( 0 , g_numAudioFormats - 1 ) ;
2022-11-30 13:51:59 -07:00
} else {
ii = 1 ;
}
if ( c & 2 ) {
2022-12-29 14:58:16 -07:00
jj = SDLTest_RandomIntegerInRange ( 0 , g_numAudioChannels - 1 ) ;
2022-11-30 13:51:59 -07:00
} else {
jj = j ;
}
if ( c & 4 ) {
2022-12-29 14:58:16 -07:00
kk = SDLTest_RandomIntegerInRange ( 0 , g_numAudioFrequencies - 1 ) ;
2022-11-30 13:51:59 -07:00
} else {
kk = k ;
}
} while ( ( i = = ii ) & & ( j = = jj ) & & ( k = = kk ) ) ;
2022-12-29 14:58:16 -07:00
spec2 . format = g_audioFormats [ ii ] ;
spec2 . channels = g_audioChannels [ jj ] ;
spec2 . freq = g_audioFrequencies [ kk ] ;
2022-11-30 13:51:59 -07:00
2023-01-16 01:45:34 -07:00
stream = SDL_CreateAudioStream ( spec1 . format , spec1 . channels , spec1 . freq ,
spec2 . format , spec2 . channels , spec2 . freq ) ;
SDLTest_AssertPass ( " Call to SDL_CreateAudioStream(format[%i]=%s(%i),channels[%i]=%i,freq[%i]=%i ==> format[%i]=%s(%i),channels[%i]=%i,freq[%i]=%i) " ,
2022-12-29 14:58:16 -07:00
i , g_audioFormatsVerbose [ i ] , spec1 . format , j , spec1 . channels , k , spec1 . freq , ii , g_audioFormatsVerbose [ ii ] , spec2 . format , jj , spec2 . channels , kk , spec2 . freq ) ;
2023-01-16 01:45:34 -07:00
SDLTest_AssertCheck ( stream ! = NULL , " Verify stream value; expected: != NULL, got: %p " , ( void * ) stream ) ;
if ( stream = = NULL ) {
2022-11-30 13:51:59 -07:00
SDLTest_LogError ( " %s " , SDL_GetError ( ) ) ;
} else {
2023-01-16 01:45:34 -07:00
Uint8 * dst_buf = NULL , * src_buf = NULL ;
int dst_len = 0 , src_len = 0 , real_dst_len = 0 ;
int l = 64 ;
int src_samplesize , dst_samplesize ;
src_samplesize = ( SDL_AUDIO_BITSIZE ( spec1 . format ) / 8 ) * spec1 . channels ;
dst_samplesize = ( SDL_AUDIO_BITSIZE ( spec2 . format ) / 8 ) * spec2 . channels ;
/* Create some random data to convert */
src_len = l * src_samplesize ;
SDLTest_Log ( " Creating dummy sample buffer of %i length (%i bytes) " , l , src_len ) ;
src_buf = ( Uint8 * ) SDL_malloc ( src_len ) ;
SDLTest_AssertCheck ( dst_buf ! = NULL , " Check src data buffer to convert is not NULL " ) ;
if ( src_buf = = NULL ) {
2022-11-30 13:51:59 -07:00
return TEST_ABORTED ;
}
2023-01-16 01:45:34 -07:00
src_len = src_len & ~ ( src_samplesize - 1 ) ;
dst_len = dst_samplesize * ( src_len / src_samplesize ) ;
if ( spec1 . freq < spec2 . freq ) {
const double mult = ( ( double ) spec2 . freq ) / ( ( double ) spec1 . freq ) ;
dst_len * = ( int ) SDL_ceil ( mult ) ;
}
dst_len = dst_len & ~ ( dst_samplesize - 1 ) ;
dst_buf = ( Uint8 * ) SDL_calloc ( 1 , dst_len ) ;
SDLTest_AssertCheck ( dst_buf ! = NULL , " Check dst data buffer to convert is not NULL " ) ;
if ( dst_buf = = NULL ) {
return TEST_ABORTED ;
}
/* Run the audio converter */
if ( SDL_PutAudioStreamData ( stream , src_buf , src_len ) < 0 | |
SDL_FlushAudioStream ( stream ) < 0 ) {
2022-11-30 13:51:59 -07:00
return TEST_ABORTED ;
}
2023-01-16 01:45:34 -07:00
real_dst_len = SDL_GetAudioStreamData ( stream , dst_buf , dst_len ) ;
SDLTest_AssertCheck ( real_dst_len > 0 , " Verify result value; expected: > 0; got: %i " , real_dst_len ) ;
if ( real_dst_len < 0 ) {
return TEST_ABORTED ;
}
2022-11-30 13:51:59 -07:00
2023-01-16 01:45:34 -07:00
SDL_DestroyAudioStream ( stream ) ;
2022-11-30 13:51:59 -07:00
/* Free converted buffer */
2023-01-16 01:45:34 -07:00
SDL_free ( src_buf ) ;
SDL_free ( dst_buf ) ;
2022-11-30 13:51:59 -07:00
}
}
2022-11-27 09:38:43 -07:00
}
2015-06-21 09:33:46 -06:00
}
}
2022-11-30 13:51:59 -07:00
return TEST_COMPLETED ;
2015-06-21 09:33:46 -06:00
}
/**
* \ brief Opens , checks current connected status , and closes a device .
*
2023-02-01 16:21:53 -07:00
* \ sa SDL_AudioDeviceConnected
2015-06-21 09:33:46 -06:00
*/
2023-01-16 01:45:34 -07:00
static int audio_openCloseAudioDeviceConnected ( void * arg )
2015-06-21 09:33:46 -06:00
{
2022-11-30 13:51:59 -07:00
int result = - 1 ;
int i ;
int count ;
const char * device ;
SDL_AudioDeviceID id ;
SDL_AudioSpec desired , obtained ;
/* Get number of devices. */
count = SDL_GetNumAudioDevices ( 0 ) ;
SDLTest_AssertPass ( " Call to SDL_GetNumAudioDevices(0) " ) ;
if ( count > 0 ) {
for ( i = 0 ; i < count ; i + + ) {
/* Get device name */
device = SDL_GetAudioDeviceName ( i , 0 ) ;
SDLTest_AssertPass ( " SDL_GetAudioDeviceName(%i,0) " , i ) ;
SDLTest_AssertCheck ( device ! = NULL , " Validate device name is not NULL; got: %s " , ( device ! = NULL ) ? device : " NULL " ) ;
if ( device = = NULL ) {
return TEST_ABORTED ;
}
/* Set standard desired spec */
desired . freq = 22050 ;
2023-05-02 06:00:28 -06:00
desired . format = SDL_AUDIO_S16SYS ;
2022-11-30 13:51:59 -07:00
desired . channels = 2 ;
desired . samples = 4096 ;
2022-12-29 14:58:16 -07:00
desired . callback = audio_testCallback ;
2022-11-30 13:51:59 -07:00
desired . userdata = NULL ;
/* Open device */
id = SDL_OpenAudioDevice ( device , 0 , & desired , & obtained , SDL_AUDIO_ALLOW_ANY_CHANGE ) ;
SDLTest_AssertPass ( " SDL_OpenAudioDevice('%s',...) " , device ) ;
2023-01-05 01:57:14 -07:00
SDLTest_AssertCheck ( id > 0 , " Validate device ID; expected: > 0, got: % " SDL_PRIu32 , id ) ;
if ( id > 0 ) {
2022-11-30 13:51:59 -07:00
/* TODO: enable test code when function is available in SDL3 */
2015-06-21 09:33:46 -06:00
# ifdef AUDIODEVICECONNECTED_DEFINED
2022-11-30 13:51:59 -07:00
/* Get connected status */
result = SDL_AudioDeviceConnected ( id ) ;
SDLTest_AssertPass ( " Call to SDL_AudioDeviceConnected() " ) ;
2015-06-21 09:33:46 -06:00
# endif
2022-11-30 13:51:59 -07:00
SDLTest_AssertCheck ( result = = 1 , " Verify returned value; expected: 1; got: %i " , result ) ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
/* Close device again */
SDL_CloseAudioDevice ( id ) ;
SDLTest_AssertPass ( " Call to SDL_CloseAudioDevice() " ) ;
}
}
} else {
SDLTest_Log ( " No devices to test with " ) ;
}
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
return TEST_COMPLETED ;
}
2015-06-21 09:33:46 -06:00
2023-03-09 02:43:41 -07:00
static double sine_wave_sample ( const Sint64 idx , const Sint64 rate , const Sint64 freq , const double phase )
{
/* Using integer modulo to avoid precision loss caused by large floating
* point numbers . Sint64 is needed for the large integer multiplication .
* The integers are assumed to be non - negative so that modulo is always
* non - negative .
* sin ( i / rate * freq * 2 * PI + phase )
* = sin ( mod ( i / rate * freq , 1 ) * 2 * PI + phase )
* = sin ( mod ( i * freq , rate ) / rate * 2 * PI + phase ) */
return SDL_sin ( ( ( double ) ( idx * freq % rate ) ) / ( ( double ) rate ) * ( SDL_PI_D * 2 ) + phase ) ;
}
/**
* \ brief Check signal - to - noise ratio and maximum error of audio resampling .
*
* \ sa https : //wiki.libsdl.org/SDL_CreateAudioStream
* \ sa https : //wiki.libsdl.org/SDL_DestroyAudioStream
* \ sa https : //wiki.libsdl.org/SDL_PutAudioStreamData
* \ sa https : //wiki.libsdl.org/SDL_FlushAudioStream
* \ sa https : //wiki.libsdl.org/SDL_GetAudioStreamData
*/
static int audio_resampleLoss ( void * arg )
{
/* Note: always test long input time (>= 5s from experience) in some test
* cases because an improper implementation may suffer from low resampling
* precision with long input due to e . g . doing subtraction with large floats . */
struct test_spec_t {
int time ;
int freq ;
double phase ;
int rate_in ;
int rate_out ;
double signal_to_noise ;
double max_error ;
} test_specs [ ] = {
{ 50 , 440 , 0 , 44100 , 48000 , 60 , 0.0025 } ,
{ 50 , 5000 , SDL_PI_D / 2 , 20000 , 10000 , 65 , 0.0010 } ,
{ 0 }
} ;
int spec_idx = 0 ;
for ( spec_idx = 0 ; test_specs [ spec_idx ] . time > 0 ; + + spec_idx ) {
const struct test_spec_t * spec = & test_specs [ spec_idx ] ;
const int frames_in = spec - > time * spec - > rate_in ;
const int frames_target = spec - > time * spec - > rate_out ;
const int len_in = frames_in * ( int ) sizeof ( float ) ;
const int len_target = frames_target * ( int ) sizeof ( float ) ;
Uint64 tick_beg = 0 ;
Uint64 tick_end = 0 ;
int i = 0 ;
int ret = 0 ;
SDL_AudioStream * stream = NULL ;
float * buf_in = NULL ;
float * buf_out = NULL ;
int len_out = 0 ;
double max_error = 0 ;
double sum_squared_error = 0 ;
double sum_squared_value = 0 ;
double signal_to_noise = 0 ;
SDLTest_AssertPass ( " Test resampling of %i s %i Hz %f phase sine wave from sampling rate of %i Hz to %i Hz " ,
spec - > time , spec - > freq , spec - > phase , spec - > rate_in , spec - > rate_out ) ;
2023-05-02 06:00:28 -06:00
stream = SDL_CreateAudioStream ( SDL_AUDIO_F32 , 1 , spec - > rate_in , SDL_AUDIO_F32 , 1 , spec - > rate_out ) ;
SDLTest_AssertPass ( " Call to SDL_CreateAudioStream(SDL_AUDIO_F32, 1, %i, SDL_AUDIO_F32, 1, %i) " , spec - > rate_in , spec - > rate_out ) ;
2023-03-09 02:43:41 -07:00
SDLTest_AssertCheck ( stream ! = NULL , " Expected SDL_CreateAudioStream to succeed. " ) ;
if ( stream = = NULL ) {
return TEST_ABORTED ;
}
buf_in = ( float * ) SDL_malloc ( len_in ) ;
SDLTest_AssertCheck ( buf_in ! = NULL , " Expected input buffer to be created. " ) ;
if ( buf_in = = NULL ) {
SDL_DestroyAudioStream ( stream ) ;
return TEST_ABORTED ;
}
for ( i = 0 ; i < frames_in ; + + i ) {
* ( buf_in + i ) = ( float ) sine_wave_sample ( i , spec - > rate_in , spec - > freq , spec - > phase ) ;
}
tick_beg = SDL_GetPerformanceCounter ( ) ;
ret = SDL_PutAudioStreamData ( stream , buf_in , len_in ) ;
SDLTest_AssertPass ( " Call to SDL_PutAudioStreamData(stream, buf_in, %i) " , len_in ) ;
SDLTest_AssertCheck ( ret = = 0 , " Expected SDL_PutAudioStreamData to succeed. " ) ;
SDL_free ( buf_in ) ;
if ( ret ! = 0 ) {
SDL_DestroyAudioStream ( stream ) ;
return TEST_ABORTED ;
}
ret = SDL_FlushAudioStream ( stream ) ;
SDLTest_AssertPass ( " Call to SDL_FlushAudioStream(stream) " ) ;
SDLTest_AssertCheck ( ret = = 0 , " Expected SDL_FlushAudioStream to succeed " ) ;
if ( ret ! = 0 ) {
SDL_DestroyAudioStream ( stream ) ;
return TEST_ABORTED ;
}
buf_out = ( float * ) SDL_malloc ( len_target ) ;
SDLTest_AssertCheck ( buf_out ! = NULL , " Expected output buffer to be created. " ) ;
if ( buf_out = = NULL ) {
SDL_DestroyAudioStream ( stream ) ;
return TEST_ABORTED ;
}
len_out = SDL_GetAudioStreamData ( stream , buf_out , len_target ) ;
SDLTest_AssertPass ( " Call to SDL_GetAudioStreamData(stream, buf_out, %i) " , len_target ) ;
/** !!! FIXME: SDL_AudioStream does not return output of the same length as
* * ! ! ! FIXME : the input even if SDL_FlushAudioStream is called . */
SDLTest_AssertCheck ( len_out < = len_target , " Expected output length to be no larger than %i, got %i. " ,
len_target , len_out ) ;
SDL_DestroyAudioStream ( stream ) ;
if ( len_out > len_target ) {
SDL_free ( buf_out ) ;
return TEST_ABORTED ;
}
tick_end = SDL_GetPerformanceCounter ( ) ;
SDLTest_Log ( " Resampling used %f seconds. " , ( ( double ) ( tick_end - tick_beg ) ) / SDL_GetPerformanceFrequency ( ) ) ;
for ( i = 0 ; i < len_out / ( int ) sizeof ( float ) ; + + i ) {
const float output = * ( buf_out + i ) ;
const double target = sine_wave_sample ( i , spec - > rate_out , spec - > freq , spec - > phase ) ;
const double error = SDL_fabs ( target - output ) ;
max_error = SDL_max ( max_error , error ) ;
sum_squared_error + = error * error ;
sum_squared_value + = target * target ;
}
SDL_free ( buf_out ) ;
signal_to_noise = 10 * SDL_log10 ( sum_squared_value / sum_squared_error ) ; /* decibel */
SDLTest_AssertCheck ( isfinite ( sum_squared_value ) , " Sum of squared target should be finite. " ) ;
SDLTest_AssertCheck ( isfinite ( sum_squared_error ) , " Sum of squared error should be finite. " ) ;
/* Infinity is theoretically possible when there is very little to no noise */
SDLTest_AssertCheck ( ! isnan ( signal_to_noise ) , " Signal-to-noise ratio should not be NaN. " ) ;
SDLTest_AssertCheck ( isfinite ( max_error ) , " Maximum conversion error should be finite. " ) ;
SDLTest_AssertCheck ( signal_to_noise > = spec - > signal_to_noise , " Conversion signal-to-noise ratio %f dB should be no less than %f dB. " ,
signal_to_noise , spec - > signal_to_noise ) ;
SDLTest_AssertCheck ( max_error < = spec - > max_error , " Maximum conversion error %f should be no more than %f. " ,
max_error , spec - > max_error ) ;
}
return TEST_COMPLETED ;
}
2015-06-21 09:33:46 -06:00
/* ================= Test Case References ================== */
/* Audio test cases */
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest1 = {
2023-01-16 01:45:34 -07:00
audio_enumerateAndNameAudioDevices , " audio_enumerateAndNameAudioDevices " , " Enumerate and name available audio devices (output and capture) " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest2 = {
2023-01-16 01:45:34 -07:00
audio_enumerateAndNameAudioDevicesNegativeTests , " audio_enumerateAndNameAudioDevicesNegativeTests " , " Negative tests around enumeration and naming of audio devices. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest3 = {
2023-01-16 01:45:34 -07:00
audio_printAudioDrivers , " audio_printAudioDrivers " , " Checks available audio driver names. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest4 = {
2023-01-16 01:45:34 -07:00
audio_printCurrentAudioDriver , " audio_printCurrentAudioDriver " , " Checks current audio driver name with initialized audio. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest5 = {
2023-01-16 01:45:34 -07:00
audio_buildAudioStream , " audio_buildAudioStream " , " Builds various audio conversion structures. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest6 = {
2023-01-16 01:45:34 -07:00
audio_buildAudioStreamNegative , " audio_buildAudioStreamNegative " , " Checks calls with invalid input to SDL_CreateAudioStream " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest7 = {
2023-01-16 01:45:34 -07:00
audio_getAudioStatus , " audio_getAudioStatus " , " Checks current audio status. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest8 = {
2023-01-16 01:45:34 -07:00
audio_openCloseAndGetAudioStatus , " audio_openCloseAndGetAudioStatus " , " Opens and closes audio device and get audio status. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest9 = {
2023-01-16 01:45:34 -07:00
audio_lockUnlockOpenAudioDevice , " audio_lockUnlockOpenAudioDevice " , " Locks and unlocks an open audio device. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2023-01-16 01:45:34 -07:00
/* TODO: enable test when SDL_ConvertAudio segfaults on cygwin have been fixed.
* TODO : re - check , since this was changer to AudioStream */
2015-06-21 09:33:46 -06:00
/* For debugging, test case can be run manually using --filter audio_convertAudio */
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest10 = {
2023-01-16 01:45:34 -07:00
audio_convertAudio , " audio_convertAudio " , " Convert audio using available formats. " , TEST_DISABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
/* TODO: enable test when SDL_AudioDeviceConnected has been implemented. */
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest11 = {
2023-01-16 01:45:34 -07:00
audio_openCloseAudioDeviceConnected , " audio_openCloseAudioDeviceConnected " , " Opens and closes audio device and get connected status. " , TEST_DISABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest12 = {
2023-01-16 01:45:34 -07:00
audio_quitInitAudioSubSystem , " audio_quitInitAudioSubSystem " , " Quit and re-init audio subsystem. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest13 = {
2023-01-16 01:45:34 -07:00
audio_initQuitAudio , " audio_initQuitAudio " , " Init and quit audio drivers directly. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest14 = {
2023-01-16 01:45:34 -07:00
audio_initOpenCloseQuitAudio , " audio_initOpenCloseQuitAudio " , " Cycle through init, open, close and quit with various audio specs. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference audioTest15 = {
2023-01-16 01:45:34 -07:00
audio_pauseUnpauseAudio , " audio_pauseUnpauseAudio " , " Pause and Unpause audio for various audio specs while testing callback. " , TEST_ENABLED
2022-11-30 13:51:59 -07:00
} ;
2015-06-21 09:33:46 -06:00
2023-03-09 02:43:41 -07:00
static const SDLTest_TestCaseReference audioTest16 = {
audio_resampleLoss , " audio_resampleLoss " , " Check signal-to-noise ratio and maximum error of audio resampling. " , TEST_ENABLED
} ;
2015-06-21 09:33:46 -06:00
/* Sequence of Audio test cases */
2022-11-30 13:51:59 -07:00
static const SDLTest_TestCaseReference * audioTests [ ] = {
2015-06-21 09:33:46 -06:00
& audioTest1 , & audioTest2 , & audioTest3 , & audioTest4 , & audioTest5 , & audioTest6 ,
& audioTest7 , & audioTest8 , & audioTest9 , & audioTest10 , & audioTest11 ,
2023-03-09 02:43:41 -07:00
& audioTest12 , & audioTest13 , & audioTest14 , & audioTest15 , & audioTest16 , NULL
2015-06-21 09:33:46 -06:00
} ;
/* Audio test suite (global) */
SDLTest_TestSuiteReference audioTestSuite = {
" Audio " ,
2022-12-29 14:58:16 -07:00
audioSetUp ,
2015-06-21 09:33:46 -06:00
audioTests ,
2022-12-29 14:58:16 -07:00
audioTearDown
2015-06-21 09:33:46 -06:00
} ;