2 Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
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.
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
13 /* Program to test hotplugging of audio devices */
15 #include "SDL_config.h"
25 #include <emscripten/emscripten.h>
30 static SDL_AudioSpec spec;
31 static Uint8 *sound = NULL; /* Pointer to wave data */
32 static Uint32 soundlen = 0; /* Length of wave data */
34 static int posindex = 0;
35 static Uint32 positions[64];
37 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
46 fillerup(void *_pos, Uint8 * stream, int len)
48 Uint32 pos = *((Uint32 *) _pos);
52 /* Set up the pointers */
53 waveptr = sound + pos;
54 waveleft = soundlen - pos;
57 while (waveleft <= len) {
58 SDL_memcpy(stream, waveptr, waveleft);
65 SDL_memcpy(stream, waveptr, len);
67 *((Uint32 *) _pos) = pos;
81 SDL_AudioDeviceID dev;
82 while (SDL_PollEvent(&e)) {
83 if (e.type == SDL_QUIT || e.key.keysym.sym == 0) {
85 } else if (e.type == SDL_AUDIODEVICEADDED) {
86 const char *name = SDL_GetAudioDeviceName(e.adevice.which, 0);
87 SDLTest_Log("New %s audio device: %s\n", e.adevice.iscapture ? "capture" : "output", name);
88 if (!e.adevice.iscapture) {
89 positions[posindex] = 0;
90 spec.userdata = &positions[posindex++];
91 spec.callback = fillerup;
92 dev = SDL_OpenAudioDevice(name, 0, &spec, NULL, 0);
94 SDLTest_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open '%s': %s\n", name, SDL_GetError());
96 SDLTest_Log("Opened '%s' as %u\n", name, (unsigned int) dev);
97 SDL_PauseAudioDevice(dev, 0);
100 } else if (e.type == SDL_AUDIODEVICEREMOVED) {
101 dev = (SDL_AudioDeviceID) e.adevice.which;
102 SDLTest_Log("%s device %u removed.\n", e.adevice.iscapture ? "capture" : "output", (unsigned int) dev);
103 SDL_CloseAudioDevice(dev);
108 #ifdef __EMSCRIPTEN__
113 emscripten_cancel_main_loop();
119 SDL_main(int argc, char *argv[])
124 /* Enable standard application logging */
125 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
127 /* Load the SDL library */
128 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
129 SDLTest_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
133 /* Some targets (Mac CoreAudio) need an event queue for audio hotplug, so make and immediately hide a window. */
134 SDL_MinimizeWindow(SDL_CreateWindow("testaudiohotplug", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0));
137 SDL_strlcpy(filename, argv[1], sizeof(filename));
139 SDL_strlcpy(filename, "res/sample.wav", sizeof(filename));
141 /* Load the wave file into memory */
142 if (SDL_LoadWAV(filename, &spec, &sound, &soundlen) == NULL) {
143 SDLTest_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s\n", filename, SDL_GetError());
148 /* Set the signals */
150 signal(SIGHUP, poked);
152 signal(SIGINT, poked);
154 signal(SIGQUIT, poked);
156 signal(SIGTERM, poked);
157 #endif /* HAVE_SIGNAL_H */
159 /* Show the list of available drivers */
160 SDLTest_Log("Available audio drivers:");
161 for (i = 0; i < SDL_GetNumAudioDrivers(); ++i) {
162 SDLTest_Log("%i: %s", i, SDL_GetAudioDriver(i));
165 SDLTest_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
167 #ifdef __EMSCRIPTEN__
168 emscripten_set_main_loop(loop, 0, 1);
176 /* Clean up on signal */
182 /* vi: set ts=4 sw=4 expandtab: */