changeset 3794:db24e43972ac SDL-ryan-multiple-audio-device

Test program to play audio to every available device, one at a time, then all at once.
author Ryan C. Gordon <icculus@icculus.org>
date Tue, 03 Oct 2006 23:45:36 +0000
parents 2b4795e92b62
children 589bc3d060cd
files test/Makefile.in test/testmultiaudio.c
diffstat 2 files changed, 140 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/test/Makefile.in	Tue Oct 03 22:19:45 2006 +0000
+++ b/test/Makefile.in	Tue Oct 03 23:45:36 2006 +0000
@@ -7,7 +7,7 @@
 CFLAGS  = @CFLAGS@
 LIBS	= @LIBS@
 
-TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testaudioinfo$(EXE) testalpha$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcdrom$(EXE) testcursor$(EXE) testdyngl$(EXE) testerror$(EXE) testfile$(EXE) testgamma$(EXE) testgl$(EXE) testgl2$(EXE) testhread$(EXE) testiconv$(EXE) testjoystick$(EXE) testkeys$(EXE) testlock$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testsem$(EXE) testsprite$(EXE) testsprite2$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm$(EXE) testwm2$(EXE) threadwin$(EXE) torturethread$(EXE)
+TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testaudioinfo$(EXE) testmultiaudio$(EXE) testalpha$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcdrom$(EXE) testcursor$(EXE) testdyngl$(EXE) testerror$(EXE) testfile$(EXE) testgamma$(EXE) testgl$(EXE) testgl2$(EXE) testhread$(EXE) testiconv$(EXE) testjoystick$(EXE) testkeys$(EXE) testlock$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testsem$(EXE) testsprite$(EXE) testsprite2$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm$(EXE) testwm2$(EXE) threadwin$(EXE) torturethread$(EXE)
 
 all: Makefile $(TARGETS)
 
@@ -26,6 +26,9 @@
 testaudioinfo$(EXE): $(srcdir)/testaudioinfo.c
 	$(CC) -o $@ $? $(CFLAGS) $(LIBS)
 
+testmultiaudio$(EXE): $(srcdir)/testmultiaudio.c
+	$(CC) -o $@ $? $(CFLAGS) $(LIBS)
+
 testalpha$(EXE): $(srcdir)/testalpha.c
 	$(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/testmultiaudio.c	Tue Oct 03 23:45:36 2006 +0000
@@ -0,0 +1,136 @@
+#include "SDL.h"
+
+static SDL_AudioSpec spec;
+static Uint8 *sound = NULL;            /* Pointer to wave data */
+static Uint32 soundlen = 0;            /* Length of wave data */
+
+typedef struct
+{
+    SDL_AudioDeviceID dev;
+    int soundpos;
+    volatile int done;
+} callback_data;
+
+void SDLCALL play_through_once(void *arg, Uint8 * stream, int len)
+{
+    callback_data *cbd = (callback_data *) arg;
+    Uint8 *waveptr = sound + cbd->soundpos;
+    int waveleft = soundlen - cbd->soundpos;
+    int cpy = len;
+    if (cpy > waveleft)
+        cpy = waveleft;
+
+    memcpy(stream, waveptr, cpy);
+    len -= cpy;
+    cbd->soundpos += cpy;
+    if (len > 0) {
+        stream += cpy;
+        memset(stream, spec.silence, len);
+        cbd->done++;
+    }
+}
+
+static void test_multi_audio(int devcount)
+{
+    callback_data cbd[64];
+    int keep_going = 1;
+    int i;
+
+    if (devcount > 64) {
+        fprintf(stderr, "Too many devices (%d), clamping to 64...\n", devcount);
+        devcount = 64;
+    }
+
+    spec.callback = play_through_once;
+
+    for (i = 0; i < devcount; i++) {
+        const char *devname = SDL_GetAudioDeviceName(i, 0);
+        printf("playing on device #%d: ('%s')...", i, devname);
+        fflush(stdout);
+
+        memset(&cbd[0], '\0', sizeof (callback_data));
+        spec.userdata = &cbd[0];
+        cbd[0].dev = SDL_OpenAudioDevice(devname, 0, &spec, NULL);
+        if (cbd[0].dev == 0) {
+            printf("Open device failed: %s\n", SDL_GetError());
+        } else {
+            SDL_PauseAudioDevice(cbd[0].dev, 0);
+            while (!cbd[0].done)
+                SDL_Delay(100);
+            SDL_PauseAudioDevice(cbd[0].dev, 1);
+            printf("done.\n");
+            SDL_CloseAudioDevice(cbd[0].dev);
+        }
+    }
+
+    memset(cbd, '\0', sizeof (cbd));
+
+    printf("playing on all devices...\n");
+    for (i = 0; i < devcount; i++) {
+        const char *devname = SDL_GetAudioDeviceName(i, 0);
+        spec.userdata = &cbd[i];
+        cbd[i].dev = SDL_OpenAudioDevice(devname, 0, &spec, NULL);
+        if (cbd[i].dev == 0) {
+            printf("Open device %d failed: %s\n", i, SDL_GetError());
+        }
+    }
+
+    for (i = 0; i < devcount; i++) {
+        if (cbd[i].dev) {
+            SDL_PauseAudioDevice(cbd[i].dev, 0);
+        }
+    }
+
+    while (keep_going) {
+        keep_going = 0;
+        for (i = 0; i < devcount; i++) {
+            if ((cbd[i].dev) && (!cbd[i].done)) {
+                keep_going = 1;
+            }
+        }
+        SDL_Delay(100);
+    }
+
+    for (i = 0; i < devcount; i++) {
+        if (cbd[i].dev) {
+            SDL_PauseAudioDevice(cbd[i].dev, 1);
+            SDL_CloseAudioDevice(cbd[i].dev);
+        }
+    }
+
+    printf("All done!\n");
+}
+
+
+int main(int argc, char **argv)
+{
+    int devcount = 0;
+
+    /* Load the SDL library */
+    if (SDL_Init(SDL_INIT_AUDIO) < 0) {
+        fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
+        return (1);
+    }
+
+    printf("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
+
+    devcount = SDL_GetNumAudioDevices(0);
+    if (devcount < 1) {
+        fprintf(stderr, "Don't see more than one device!\n");
+    } else {
+        if (argv[1] == NULL) {
+            argv[1] = "sample.wav";
+        }
+
+        /* Load the wave file into memory */
+        if (SDL_LoadWAV(argv[1], &spec, &sound, &soundlen) == NULL) {
+            fprintf(stderr, "Couldn't load %s: %s\n", argv[1], SDL_GetError());
+        } else {
+            test_multi_audio(devcount);
+            SDL_FreeWAV(sound);
+        }
+    }
+
+    SDL_Quit();
+    return 0;
+}