[SDL_Tizen] Do set_buffer_transform
[platform/upstream/SDL.git] / test / testaudiohotplug.c
1 /*
2   Copyright (C) 1997-2016 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
13 /* Program to test hotplugging of audio devices */
14
15 #include "SDL_config.h"
16
17 #include <stdio.h>
18 #include <stdlib.h>
19
20 #if HAVE_SIGNAL_H
21 #include <signal.h>
22 #endif
23
24 #ifdef __EMSCRIPTEN__
25 #include <emscripten/emscripten.h>
26 #endif
27
28 #include "SDL.h"
29
30 static SDL_AudioSpec spec;
31 static Uint8 *sound = NULL;     /* Pointer to wave data */
32 static Uint32 soundlen = 0;     /* Length of wave data */
33
34 static int posindex = 0;
35 static Uint32 positions[64];
36
37 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
38 static void
39 quit(int rc)
40 {
41     SDL_Quit();
42     exit(rc);
43 }
44
45 void SDLCALL
46 fillerup(void *_pos, Uint8 * stream, int len)
47 {
48     Uint32 pos = *((Uint32 *) _pos);
49     Uint8 *waveptr;
50     int waveleft;
51
52     /* Set up the pointers */
53     waveptr = sound + pos;
54     waveleft = soundlen - pos;
55
56     /* Go! */
57     while (waveleft <= len) {
58         SDL_memcpy(stream, waveptr, waveleft);
59         stream += waveleft;
60         len -= waveleft;
61         waveptr = sound;
62         waveleft = soundlen;
63         pos = 0;
64     }
65     SDL_memcpy(stream, waveptr, len);
66     pos += len;
67     *((Uint32 *) _pos) = pos;
68 }
69
70 static int done = 0;
71 void
72 poked(int sig)
73 {
74     done = 1;
75 }
76
77 static void
78 iteration()
79 {
80     SDL_Event e;
81     SDL_AudioDeviceID dev;
82     while (SDL_PollEvent(&e)) {
83         if (e.type == SDL_QUIT || e.key.keysym.sym == 0) {
84             done = 1;
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);
93                 if (!dev) {
94                     SDLTest_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open '%s': %s\n", name, SDL_GetError());
95                 } else {
96                     SDLTest_Log("Opened '%s' as %u\n", name, (unsigned int) dev);
97                     SDL_PauseAudioDevice(dev, 0);
98                 }
99             }
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);
104         }
105     }
106 }
107
108 #ifdef __EMSCRIPTEN__
109 void
110 loop()
111 {
112     if(done)
113         emscripten_cancel_main_loop();
114     else
115         iteration();
116 }
117 #endif
118 int
119 SDL_main(int argc, char *argv[])
120 {
121     int i;
122     char filename[4096];
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_VIDEO | SDL_INIT_AUDIO) < 0) {
129         SDLTest_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
130         return (1);
131     }
132
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));
135
136     if (argc > 1) {
137         SDL_strlcpy(filename, argv[1], sizeof(filename));
138     } else {
139         SDL_strlcpy(filename, "res/sample.wav", sizeof(filename));
140     }
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());
144         quit(1);
145     }
146
147 #if HAVE_SIGNAL_H
148     /* Set the signals */
149 #ifdef SIGHUP
150     signal(SIGHUP, poked);
151 #endif
152     signal(SIGINT, poked);
153 #ifdef SIGQUIT
154     signal(SIGQUIT, poked);
155 #endif
156     signal(SIGTERM, poked);
157 #endif /* HAVE_SIGNAL_H */
158
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));
163     }
164
165     SDLTest_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
166
167 #ifdef __EMSCRIPTEN__
168     emscripten_set_main_loop(loop, 0, 1);
169 #else
170     while (!done) {
171         SDL_Delay(100);
172         iteration();
173     }
174 #endif
175
176     /* Clean up on signal */
177     SDL_FreeWAV(sound);
178     SDL_Quit();
179     return (0);
180 }
181
182 /* vi: set ts=4 sw=4 expandtab: */