test/testmultiaudio.c
author Andreas Schiffler <aschiffler@ferzkopp.net>
Wed, 14 Aug 2013 23:30:10 -0700
changeset 7639 9406b7dd2f2d
parent 7517 965d57022c01
child 8149 681eb46b8ac4
permissions -rw-r--r--
Fix bug 2034: replace printf by SDL_Log in tests; update loopwave VS solution: copy missing dependency
     1 /*
     2   Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
     3 
     4   This software is provided 'as-is', without any express or implied
     5   warranty.  In no event will the authors be held liable for any damages
     6   arising from the use of this software.
     7 
     8   Permission is granted to anyone to use this software for any purpose,
     9   including commercial applications, and to alter it and redistribute it
    10   freely.
    11 */
    12 #include "SDL.h"
    13 
    14 static SDL_AudioSpec spec;
    15 static Uint8 *sound = NULL;     /* Pointer to wave data */
    16 static Uint32 soundlen = 0;     /* Length of wave data */
    17 
    18 typedef struct
    19 {
    20     SDL_AudioDeviceID dev;
    21     int soundpos;
    22     volatile int done;
    23 } callback_data;
    24 
    25 void SDLCALL
    26 play_through_once(void *arg, Uint8 * stream, int len)
    27 {
    28     callback_data *cbd = (callback_data *) arg;
    29     Uint8 *waveptr = sound + cbd->soundpos;
    30     int waveleft = soundlen - cbd->soundpos;
    31     int cpy = len;
    32     if (cpy > waveleft)
    33         cpy = waveleft;
    34 
    35     SDL_memcpy(stream, waveptr, cpy);
    36     len -= cpy;
    37     cbd->soundpos += cpy;
    38     if (len > 0) {
    39         stream += cpy;
    40         SDL_memset(stream, spec.silence, len);
    41         cbd->done++;
    42     }
    43 }
    44 
    45 static void
    46 test_multi_audio(int devcount)
    47 {
    48     callback_data cbd[64];
    49     int keep_going = 1;
    50     int i;
    51 
    52     if (devcount > 64) {
    53         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Too many devices (%d), clamping to 64...\n",
    54                 devcount);
    55         devcount = 64;
    56     }
    57 
    58     spec.callback = play_through_once;
    59 
    60     for (i = 0; i < devcount; i++) {
    61         const char *devname = SDL_GetAudioDeviceName(i, 0);
    62         SDL_Log("playing on device #%d: ('%s')...", i, devname);
    63         fflush(stdout);
    64 
    65         SDL_memset(&cbd[0], '\0', sizeof(callback_data));
    66         spec.userdata = &cbd[0];
    67         cbd[0].dev = SDL_OpenAudioDevice(devname, 0, &spec, NULL, 0);
    68         if (cbd[0].dev == 0) {
    69             SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Open device failed: %s\n", SDL_GetError());
    70         } else {
    71             SDL_PauseAudioDevice(cbd[0].dev, 0);
    72             while (!cbd[0].done)
    73                 SDL_Delay(100);
    74             SDL_PauseAudioDevice(cbd[0].dev, 1);
    75             SDL_Log("done.\n");
    76             SDL_CloseAudioDevice(cbd[0].dev);
    77         }
    78     }
    79 
    80     SDL_memset(cbd, '\0', sizeof(cbd));
    81 
    82     SDL_Log("playing on all devices...\n");
    83     for (i = 0; i < devcount; i++) {
    84         const char *devname = SDL_GetAudioDeviceName(i, 0);
    85         spec.userdata = &cbd[i];
    86         cbd[i].dev = SDL_OpenAudioDevice(devname, 0, &spec, NULL, 0);
    87         if (cbd[i].dev == 0) {
    88             SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Open device %d failed: %s\n", i, SDL_GetError());
    89         }
    90     }
    91 
    92     for (i = 0; i < devcount; i++) {
    93         if (cbd[i].dev) {
    94             SDL_PauseAudioDevice(cbd[i].dev, 0);
    95         }
    96     }
    97 
    98     while (keep_going) {
    99         keep_going = 0;
   100         for (i = 0; i < devcount; i++) {
   101             if ((cbd[i].dev) && (!cbd[i].done)) {
   102                 keep_going = 1;
   103             }
   104         }
   105         SDL_Delay(100);
   106     }
   107 
   108     for (i = 0; i < devcount; i++) {
   109         if (cbd[i].dev) {
   110             SDL_PauseAudioDevice(cbd[i].dev, 1);
   111             SDL_CloseAudioDevice(cbd[i].dev);
   112         }
   113     }
   114 
   115     SDL_Log("All done!\n");
   116 }
   117 
   118 
   119 int
   120 main(int argc, char **argv)
   121 {
   122     int devcount = 0;
   123 
   124 	/* Enable standard application logging */
   125     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
   126 
   127     /* Load the SDL library */
   128     if (SDL_Init(SDL_INIT_AUDIO) < 0) {
   129         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
   130         return (1);
   131     }
   132 
   133     SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
   134 
   135     devcount = SDL_GetNumAudioDevices(0);
   136     if (devcount < 1) {
   137         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Don't see any specific audio devices!\n");
   138     } else {
   139         if (argv[1] == NULL) {
   140             argv[1] = "sample.wav";
   141         }
   142 
   143         /* Load the wave file into memory */
   144         if (SDL_LoadWAV(argv[1], &spec, &sound, &soundlen) == NULL) {
   145             SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s\n", argv[1],
   146                     SDL_GetError());
   147         } else {
   148             test_multi_audio(devcount);
   149             SDL_FreeWAV(sound);
   150         }
   151     }
   152 
   153     SDL_Quit();
   154     return 0;
   155 }