test/testautomation_audio.c
author Sam Lantinga <slouken@libsdl.org>
Thu, 25 Apr 2013 00:26:17 -0700
changeset 7110 2a98852fd58d
parent 7094 330d3bb2476d
child 7126 6fce42265686
permissions -rw-r--r--
Fixed bug 1582 - Allow disabling SDL_VIDEO_DRIVER_WINDOWS

Marcus von Appen

Trying to build SDL 2.x (HG) on Win32 platforms with either VS.NET or MinGW requires one to have the video subsystem and SDL_VIDEO_DRIVER_WINDOWS flag enabled due to the helper window creation routines.

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