diff test/testmultiaudio.c @ 2049:5f6550e5184f

Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
author Ryan C. Gordon <icculus@icculus.org>
date Tue, 17 Oct 2006 09:15:21 +0000
parents
children 866052b01ee5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/testmultiaudio.c	Tue Oct 17 09:15:21 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 any specific audio devices!\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;
+}