Added support to loopwave for hotplugging audio devices
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
diff --git a/test/loopwave.c b/test/loopwave.c
index b04d39d..0a7649b 100644
--- a/test/loopwave.c
+++ b/test/loopwave.c
@@ -38,6 +38,7 @@ static struct
int soundpos; /* Current play position */
} wave;
+static SDL_AudioDeviceID device;
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static void
@@ -47,6 +48,37 @@ quit(int rc)
exit(rc);
}
+static void
+close_audio()
+{
+ if (device != 0) {
+ SDL_CloseAudioDevice(device);
+ device = 0;
+ }
+}
+
+static void
+open_audio()
+{
+ /* Initialize fillerup() variables */
+ device = SDL_OpenAudioDevice(NULL, SDL_FALSE, &wave.spec, NULL, 0);
+ if (!device) {
+ SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open audio: %s\n", SDL_GetError());
+ SDL_FreeWAV(wave.sound);
+ quit(2);
+ }
+
+
+ /* Let the audio run */
+ SDL_PauseAudioDevice(device, SDL_FALSE);
+}
+
+static void reopen_audio()
+{
+ close_audio();
+ open_audio();
+}
+
void SDLCALL
fillerup(void *unused, Uint8 * stream, int len)
@@ -82,7 +114,7 @@ poked(int sig)
void
loop()
{
- if(done || (SDL_GetAudioStatus() != SDL_AUDIO_PLAYING))
+ if(done || (SDL_GetAudioDeviceStatus(device) != SDL_AUDIO_PLAYING))
emscripten_cancel_main_loop();
}
#endif
@@ -97,7 +129,7 @@ main(int argc, char *argv[])
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
/* Load the SDL library */
- if (SDL_Init(SDL_INIT_AUDIO) < 0) {
+ if (SDL_Init(SDL_INIT_AUDIO|SDL_INIT_EVENTS) < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
return (1);
}
@@ -114,45 +146,40 @@ main(int argc, char *argv[])
}
wave.spec.callback = fillerup;
-#if HAVE_SIGNAL_H
- /* Set the signals */
-#ifdef SIGHUP
- signal(SIGHUP, poked);
-#endif
- signal(SIGINT, poked);
-#ifdef SIGQUIT
- signal(SIGQUIT, poked);
-#endif
- signal(SIGTERM, poked);
-#endif /* HAVE_SIGNAL_H */
/* Show the list of available drivers */
SDL_Log("Available audio drivers:");
for (i = 0; i < SDL_GetNumAudioDrivers(); ++i) {
SDL_Log("%i: %s", i, SDL_GetAudioDriver(i));
- }
+ }
- /* Initialize fillerup() variables */
- if (SDL_OpenAudio(&wave.spec, NULL) < 0) {
- SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open audio: %s\n", SDL_GetError());
- SDL_FreeWAV(wave.sound);
- quit(2);
- }
+ SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
- SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
+ open_audio();
- /* Let the audio run */
- SDL_PauseAudio(0);
+ SDL_FlushEvents(SDL_AUDIODEVICEADDED, SDL_AUDIODEVICEREMOVED);
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(loop, 0, 1);
#else
- while (!done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING))
- SDL_Delay(1000);
+ while (!done) {
+ SDL_Event event;
+
+ while (SDL_PollEvent(&event) > 0) {
+ if (event.type == SDL_QUIT) {
+ done = 1;
+ }
+ if ((event.type == SDL_AUDIODEVICEADDED && !event.adevice.iscapture) ||
+ (event.type == SDL_AUDIODEVICEREMOVED && !event.adevice.iscapture && event.adevice.which == device)) {
+ reopen_audio();
+ }
+ }
+ SDL_Delay(100);
+ }
#endif
/* Clean up on signal */
- SDL_CloseAudio();
+ close_audio();
SDL_FreeWAV(wave.sound);
SDL_Quit();
return (0);