diff --git a/test/testautomation_audio.c b/test/testautomation_audio.c index 4a5e9eeaa..06071566f 100644 --- a/test/testautomation_audio.c +++ b/test/testautomation_audio.c @@ -3,6 +3,9 @@ * New/updated tests: aschiffler at ferzkopp dot net */ +/* quiet windows compiler warnings */ +#define _CRT_SECURE_NO_WARNINGS + #include #include @@ -25,11 +28,29 @@ _audioSetUp(void *arg) } } +void +_audioTearDown(void *arg) +{ + /* Remove a possibly created file from SDL disk writer audio driver; ignore errors */ + remove("sdlaudio.raw"); + + SDLTest_AssertPass("Cleanup of test files completed"); +} + + +/* Global counter for callback invocation */ +int _audio_testCallbackCounter; + +/* Global accumulator for total callback length */ +int _audio_testCallbackLength; + /* Test callback function */ void _audio_testCallback(void *userdata, Uint8 *stream, int len) { - /* TODO: add tracking if callback was called */ + /* track that callback was called */ + _audio_testCallbackCounter++; + _audio_testCallbackLength += len; } @@ -38,8 +59,8 @@ void _audio_testCallback(void *userdata, Uint8 *stream, int len) /** * \brief Stop and restart audio subsystem * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_QuitSubSystem - * \sa http://wiki.libsdl.org/moin.cgi/SDL_InitSubSystem + * \sa https://wiki.libsdl.org/SDL_QuitSubSystem + * \sa https://wiki.libsdl.org/SDL_InitSubSystem */ int audio_quitInitAudioSubSystem() { @@ -56,8 +77,8 @@ int audio_quitInitAudioSubSystem() /** * \brief Start and stop audio directly * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_InitAudio - * \sa http://wiki.libsdl.org/moin.cgi/SDL_QuitAudio + * \sa https://wiki.libsdl.org/SDL_InitAudio + * \sa https://wiki.libsdl.org/SDL_QuitAudio */ int audio_initQuitAudio() { @@ -110,15 +131,104 @@ int audio_initQuitAudio() /** * \brief Start, open, close and stop audio * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_InitAudio - * \sa http://wiki.libsdl.org/moin.cgi/SDL_OpenAudio - * \sa http://wiki.libsdl.org/moin.cgi/SDL_CloseAudio - * \sa http://wiki.libsdl.org/moin.cgi/SDL_QuitAudio + * \sa https://wiki.libsdl.org/SDL_InitAudio + * \sa https://wiki.libsdl.org/SDL_OpenAudio + * \sa https://wiki.libsdl.org/SDL_CloseAudio + * \sa https://wiki.libsdl.org/SDL_QuitAudio */ int audio_initOpenCloseQuitAudio() +{ + int result, expectedResult; + int i, iMax, j, k; + const char* audioDriver; + SDL_AudioSpec desired; + + /* Stop SDL audio subsystem */ + 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); + SDLTest_AssertCheck(audioDriver != NULL, "Audio driver name is not NULL"); + SDLTest_AssertCheck(audioDriver[0] != '\0', "Audio driver name is not empty; got: %s", audioDriver); + + /* Change specs */ + for (j = 0; j < 2; j++) { + + /* Call Init */ + result = SDL_AudioInit(audioDriver); + SDLTest_AssertPass("Call to SDL_AudioInit('%s')", audioDriver); + 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; + desired.format = AUDIO_S16SYS; + desired.channels = 2; + desired.samples = 4096; + desired.callback = _audio_testCallback; + desired.userdata = NULL; + + case 1: + /* Set custom desired spec */ + desired.freq = 48000; + desired.format = AUDIO_F32SYS; + desired.channels = 2; + desired.samples = 2048; + desired.callback = _audio_testCallback; + desired.userdata = NULL; + break; + } + + /* Call Open (maybe multiple times) */ + for (k=0; k <= j; k++) { + result = SDL_OpenAudio(&desired, NULL); + SDLTest_AssertPass("Call to SDL_OpenAudio(desired_spec_%d, NULL), call %d", j, k+1); + expectedResult = (k==0) ? 0 : -1; + SDLTest_AssertCheck(result == expectedResult, "Verify return value; expected: %d, got: %d", expectedResult, result); + } + + /* Call Close (maybe multiple times) */ + for (k=0; k <= j; k++) { + SDL_CloseAudio(); + SDLTest_AssertPass("Call to SDL_CloseAudio(), call %d", k+1); + } + + /* Call Quit (maybe multiple times) */ + for (k=0; k <= j; k++) { + SDL_AudioQuit(); + SDLTest_AssertPass("Call to SDL_AudioQuit(), call %d", k+1); + } + + } /* spec loop */ + } /* driver loop */ + + /* Restart audio again */ + _audioSetUp(NULL); + + return TEST_COMPLETED; +} + +/** + * \brief Pause and unpause audio + * + * \sa https://wiki.libsdl.org/SDL_PauseAudio + */ +int audio_pauseUnpauseAudio() { int result; - int i, iMax, j; + int i, iMax, j, k, l; + int totalDelay; + int pause_on; + int originalCounter; const char* audioDriver; SDL_AudioSpec desired; @@ -172,9 +282,47 @@ int audio_initOpenCloseQuitAudio() SDLTest_AssertPass("Call to SDL_OpenAudio(desired_spec_%d, NULL)", j); SDLTest_AssertCheck(result == 0, "Verify return value; expected: 0 got: %d", result); + /* Start and stop audio multiple times */ + for (l=0; l<3; l++) { + SDLTest_Log("Pause/Unpause iteration: %d", l+1); + + /* Reset callback counters */ + _audio_testCallbackCounter = 0; + _audio_testCallbackLength = 0; + + /* Un-pause audio to start playing (maybe multiple times) */ + pause_on = 0; + for (k=0; k <= j; k++) { + SDL_PauseAudio(pause_on); + SDLTest_AssertPass("Call to SDL_PauseAudio(%d), call %d", pause_on, k+1); + } + + /* Wait for callback */ + totalDelay = 0; + do { + SDL_Delay(10); + totalDelay += 10; + } + while (_audio_testCallbackCounter == 0 && totalDelay < 1000); + SDLTest_AssertCheck(_audio_testCallbackCounter > 0, "Verify callback counter; expected: >0 got: %d", _audio_testCallbackCounter); + SDLTest_AssertCheck(_audio_testCallbackLength > 0, "Verify callback length; expected: >0 got: %d", _audio_testCallbackLength); + + /* Pause audio to stop playing (maybe multiple times) */ + for (k=0; k <= j; k++) { + pause_on = (k==0) ? 1 : SDLTest_RandomIntegerInRange(99, 9999); + SDL_PauseAudio(pause_on); + SDLTest_AssertPass("Call to SDL_PauseAudio(%d), call %d", pause_on, k+1); + } + + /* Ensure callback is not called again */ + originalCounter = _audio_testCallbackCounter; + SDL_Delay(totalDelay + 10); + SDLTest_AssertCheck(originalCounter == _audio_testCallbackCounter, "Verify callback counter; expected: %d, got: %d", originalCounter, _audio_testCallbackCounter); + } + /* Call Close */ - SDL_CloseAudio(); - SDLTest_AssertPass("Call to SDL_CloseAudio()"); + SDL_CloseAudio(); + SDLTest_AssertPass("Call to SDL_CloseAudio()"); /* Call Quit */ SDL_AudioQuit(); @@ -183,8 +331,8 @@ int audio_initOpenCloseQuitAudio() } /* spec loop */ } /* driver loop */ - /* Restart audio again */ - _audioSetUp(NULL); + /* Restart audio again */ + _audioSetUp(NULL); return TEST_COMPLETED; } @@ -192,8 +340,8 @@ int audio_initOpenCloseQuitAudio() /** * \brief Enumerate and name available audio devices (output and capture). * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetNumAudioDevices - * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioDeviceName + * \sa https://wiki.libsdl.org/SDL_GetNumAudioDevices + * \sa https://wiki.libsdl.org/SDL_GetAudioDeviceName */ int audio_enumerateAndNameAudioDevices() { @@ -250,8 +398,8 @@ int audio_enumerateAndNameAudioDevices() /** * \brief Negative tests around enumeration and naming of audio devices. * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetNumAudioDevices - * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioDeviceName + * \sa https://wiki.libsdl.org/SDL_GetNumAudioDevices + * \sa https://wiki.libsdl.org/SDL_GetAudioDeviceName */ int audio_enumerateAndNameAudioDevicesNegativeTests() { @@ -297,8 +445,8 @@ int audio_enumerateAndNameAudioDevicesNegativeTests() /** * \brief Checks available audio driver names. * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetNumAudioDrivers - * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioDriver + * \sa https://wiki.libsdl.org/SDL_GetNumAudioDrivers + * \sa https://wiki.libsdl.org/SDL_GetAudioDriver */ int audio_printAudioDrivers() { @@ -330,7 +478,7 @@ int audio_printAudioDrivers() /** * \brief Checks current audio driver name with initialized audio. * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetCurrentAudioDriver + * \sa https://wiki.libsdl.org/SDL_GetCurrentAudioDriver */ int audio_printCurrentAudioDriver() { @@ -362,7 +510,7 @@ int _audioFrequencies[] = { 11025, 22050, 44100, 48000 }; /** * \brief Builds various audio conversion structures * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_BuildAudioCVT + * \sa https://wiki.libsdl.org/SDL_BuildAudioCVT */ int audio_buildAudioCVT() { @@ -426,7 +574,7 @@ int audio_buildAudioCVT() /** * \brief Checkes calls with invalid input to SDL_BuildAudioCVT * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_BuildAudioCVT + * \sa https://wiki.libsdl.org/SDL_BuildAudioCVT */ int audio_buildAudioCVTNegative() { @@ -521,7 +669,7 @@ int audio_buildAudioCVTNegative() /** * \brief Checks current audio status. * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioStatus + * \sa https://wiki.libsdl.org/SDL_GetAudioStatus */ int audio_getAudioStatus() { @@ -542,7 +690,7 @@ int audio_getAudioStatus() /** * \brief Opens, checks current audio status, and closes a device. * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_GetAudioStatus + * \sa https://wiki.libsdl.org/SDL_GetAudioStatus */ int audio_openCloseAndGetAudioStatus() { @@ -600,8 +748,8 @@ int audio_openCloseAndGetAudioStatus() /** * \brief Locks and unlocks open audio device. * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_LockAudioDevice - * \sa http://wiki.libsdl.org/moin.cgi/SDL_UnlockAudioDevice + * \sa https://wiki.libsdl.org/SDL_LockAudioDevice + * \sa https://wiki.libsdl.org/SDL_UnlockAudioDevice */ int audio_lockUnlockOpenAudioDevice() { @@ -663,8 +811,8 @@ int audio_lockUnlockOpenAudioDevice() /** * \brief Convert audio using various conversion structures * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_BuildAudioCVT - * \sa http://wiki.libsdl.org/moin.cgi/SDL_ConvertAudio + * \sa https://wiki.libsdl.org/SDL_BuildAudioCVT + * \sa https://wiki.libsdl.org/SDL_ConvertAudio */ int audio_convertAudio() { @@ -762,7 +910,7 @@ int audio_convertAudio() /** * \brief Opens, checks current connected status, and closes a device. * - * \sa http://wiki.libsdl.org/moin.cgi/SDL_AudioDeviceConnected + * \sa https://wiki.libsdl.org/SDL_AudioDeviceConnected */ int audio_openCloseAudioDeviceConnected() { @@ -871,11 +1019,14 @@ static const SDLTest_TestCaseReference audioTest13 = static const SDLTest_TestCaseReference audioTest14 = { (SDLTest_TestCaseFp)audio_initOpenCloseQuitAudio, "audio_initOpenCloseQuitAudio", "Cycle through init, open, close and quit with various audio specs.", TEST_ENABLED }; +static const SDLTest_TestCaseReference audioTest15 = + { (SDLTest_TestCaseFp)audio_pauseUnpauseAudio, "audio_pauseUnpauseAudio", "Pause and Unpause audio for various audio specs while testing callback.", TEST_ENABLED }; + /* Sequence of Audio test cases */ static const SDLTest_TestCaseReference *audioTests[] = { &audioTest1, &audioTest2, &audioTest3, &audioTest4, &audioTest5, &audioTest6, &audioTest7, &audioTest8, &audioTest9, &audioTest10, &audioTest11, - &audioTest12, &audioTest13, &audioTest14, NULL + &audioTest12, &audioTest13, &audioTest14, &audioTest15, NULL }; /* Audio test suite (global) */ @@ -883,5 +1034,5 @@ SDLTest_TestSuiteReference audioTestSuite = { "Audio", _audioSetUp, audioTests, - NULL + _audioTearDown };