test/testmultiaudio.c
author David Ludwig <dludwig@pobox.com>
Wed, 25 Dec 2013 21:39:48 -0500
changeset 8563 c0e68f3b6bbb
parent 7639 9406b7dd2f2d
child 8149 681eb46b8ac4
permissions -rw-r--r--
WinRT: compiled the d3d11 renderer's shaders into SDL itself

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