SDL 2.0
testaudiohotplug.c File Reference
#include "SDL_config.h"
#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"
+ Include dependency graph for testaudiohotplug.c:

Go to the source code of this file.

Functions

static void quit (int rc)
 
void fillerup (void *_pos, Uint8 *stream, int len)
 
void poked (int sig)
 
static const char * devtypestr (int iscapture)
 
static void iteration ()
 
int main (int argc, char *argv[])
 

Variables

static SDL_AudioSpec spec
 
static Uint8sound = NULL
 
static Uint32 soundlen = 0
 
static int posindex = 0
 
static Uint32 positions [64]
 
static int done = 0
 

Function Documentation

◆ devtypestr()

static const char * devtypestr ( int  iscapture)
static

Definition at line 78 of file testaudiohotplug.c.

79{
80 return iscapture ? "capture" : "output";
81}

Referenced by iteration().

◆ fillerup()

void fillerup ( void _pos,
Uint8 stream,
int  len 
)

Definition at line 46 of file testaudiohotplug.c.

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}
#define SDL_memcpy
GLuint GLuint stream
GLenum GLsizei len
uint32_t Uint32
Definition: SDL_stdinc.h:203
uint8_t Uint8
Definition: SDL_stdinc.h:179
static Uint8 * sound
static Uint32 soundlen

References SDL_memcpy, sound, and soundlen.

Referenced by iteration().

◆ iteration()

static void iteration ( )
static

Definition at line 84 of file testaudiohotplug.c.

85{
88 while (SDL_PollEvent(&e)) {
89 if (e.type == SDL_QUIT) {
90 done = 1;
91 } else if (e.type == SDL_KEYUP) {
92 if (e.key.keysym.sym == SDLK_ESCAPE)
93 done = 1;
94 } else if (e.type == SDL_AUDIODEVICEADDED) {
95 int index = e.adevice.which;
96 int iscapture = e.adevice.iscapture;
97 const char *name = SDL_GetAudioDeviceName(index, iscapture);
98 if (name != NULL)
99 SDL_Log("New %s audio device at index %u: %s\n", devtypestr(iscapture), (unsigned int) index, name);
100 else {
101 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Got new %s device at index %u, but failed to get the name: %s\n",
102 devtypestr(iscapture), (unsigned int) index, SDL_GetError());
103 continue;
104 }
105 if (!iscapture) {
106 positions[posindex] = 0;
109 dev = SDL_OpenAudioDevice(name, 0, &spec, NULL, 0);
110 if (!dev) {
111 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open '%s': %s\n", name, SDL_GetError());
112 } else {
113 SDL_Log("Opened '%s' as %u\n", name, (unsigned int) dev);
114 SDL_PauseAudioDevice(dev, 0);
115 }
116 }
117 } else if (e.type == SDL_AUDIODEVICEREMOVED) {
118 dev = (SDL_AudioDeviceID) e.adevice.which;
119 SDL_Log("%s device %u removed.\n", devtypestr(e.adevice.iscapture), (unsigned int) dev);
121 }
122 }
123}
Uint32 SDL_AudioDeviceID
Definition: SDL_audio.h:330
#define SDL_GetError
#define SDL_PollEvent
#define SDL_GetAudioDeviceName
#define SDL_OpenAudioDevice
#define SDL_LogError
#define SDL_PauseAudioDevice
#define SDL_CloseAudioDevice
#define SDL_Log
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 Uint32 * e
@ SDL_QUIT
Definition: SDL_events.h:60
@ SDL_AUDIODEVICEREMOVED
Definition: SDL_events.h:148
@ SDL_AUDIODEVICEADDED
Definition: SDL_events.h:147
@ SDL_KEYUP
Definition: SDL_events.h:97
@ SDLK_ESCAPE
Definition: SDL_keycode.h:55
@ SDL_LOG_CATEGORY_APPLICATION
Definition: SDL_log.h:66
GLuint index
GLuint const GLchar * name
#define NULL
Definition: begin_code.h:167
SDL_AudioCallback callback
Definition: SDL_audio.h:187
void * userdata
Definition: SDL_audio.h:188
static Uint32 positions[64]
static const char * devtypestr(int iscapture)
static SDL_AudioSpec spec
static int done
void fillerup(void *_pos, Uint8 *stream, int len)
static int posindex
General event structure.
Definition: SDL_events.h:558

References SDL_AudioSpec::callback, devtypestr(), done, e, fillerup(), NULL, posindex, positions, SDL_AUDIODEVICEADDED, SDL_AUDIODEVICEREMOVED, SDL_CloseAudioDevice, SDL_GetAudioDeviceName, SDL_GetError, SDL_KEYUP, SDL_Log, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_OpenAudioDevice, SDL_PauseAudioDevice, SDL_PollEvent, SDL_QUIT, SDLK_ESCAPE, spec, and SDL_AudioSpec::userdata.

Referenced by main(), SDLTest_GenerateExecKey(), and video_getSetWindowData().

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 137 of file testaudiohotplug.c.

138{
139 int i;
140 char filename[4096];
141
142 /* Enable standard application logging */
144
145 /* Load the SDL library */
147 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
148 return (1);
149 }
150
151 /* Some targets (Mac CoreAudio) need an event queue for audio hotplug, so make and immediately hide a window. */
153
154 if (argc > 1) {
155 SDL_strlcpy(filename, argv[1], sizeof(filename));
156 } else {
157 SDL_strlcpy(filename, "sample.wav", sizeof(filename));
158 }
159 /* Load the wave file into memory */
160 if (SDL_LoadWAV(filename, &spec, &sound, &soundlen) == NULL) {
161 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s\n", filename, SDL_GetError());
162 quit(1);
163 }
164
165#if HAVE_SIGNAL_H
166 /* Set the signals */
167#ifdef SIGHUP
168 signal(SIGHUP, poked);
169#endif
170 signal(SIGINT, poked);
171#ifdef SIGQUIT
172 signal(SIGQUIT, poked);
173#endif
174 signal(SIGTERM, poked);
175#endif /* HAVE_SIGNAL_H */
176
177 /* Show the list of available drivers */
178 SDL_Log("Available audio drivers:");
179 for (i = 0; i < SDL_GetNumAudioDrivers(); ++i) {
180 SDL_Log("%i: %s", i, SDL_GetAudioDriver(i));
181 }
182
183 SDL_Log("Select a driver with the SDL_AUDIODRIVER environment variable.\n");
184 SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
185
186#ifdef __EMSCRIPTEN__
187 emscripten_set_main_loop(loop, 0, 1);
188#else
189 while (!done) {
190 SDL_Delay(100);
191 iteration();
192 }
193#endif
194
195 /* Clean up on signal */
196 /* Quit audio first, then free WAV. This prevents access violations in the audio threads. */
199 SDL_Quit();
200 return (0);
201}
#define SDL_INIT_AUDIO
Definition: SDL.h:78
#define SDL_INIT_VIDEO
Definition: SDL.h:79
#define SDL_LoadWAV(file, spec, audio_buf, audio_len)
Definition: SDL_audio.h:484
#define SDL_CreateWindow
#define SDL_GetNumAudioDrivers
#define SDL_GetCurrentAudioDriver
#define SDL_strlcpy
#define SDL_LogSetPriority
#define SDL_FreeWAV
#define SDL_Delay
#define SDL_Quit
#define SDL_Init
#define SDL_GetAudioDriver
#define SDL_MinimizeWindow
#define SDL_QuitSubSystem
@ SDL_LOG_PRIORITY_INFO
Definition: SDL_log.h:106
#define SDL_WINDOWPOS_UNDEFINED
Definition: SDL_video.h:130
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
void loop()
Definition: checkkeys.c:152
static void iteration()
static void quit(int rc)
void poked(int sig)

References done, sort_controllers::filename, i, iteration(), loop(), NULL, poked(), quit(), SDL_CreateWindow, SDL_Delay, SDL_FreeWAV, SDL_GetAudioDriver, SDL_GetCurrentAudioDriver, SDL_GetError, SDL_GetNumAudioDrivers, SDL_Init, SDL_INIT_AUDIO, SDL_INIT_VIDEO, SDL_LoadWAV, SDL_Log, SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, SDL_LogError, SDL_LogSetPriority, SDL_MinimizeWindow, SDL_Quit, SDL_QuitSubSystem, SDL_strlcpy, SDL_WINDOWPOS_UNDEFINED, sound, soundlen, and spec.

◆ poked()

void poked ( int  sig)

Definition at line 72 of file testaudiohotplug.c.

73{
74 done = 1;
75}

References done.

Referenced by main().

◆ quit()

static void quit ( int  rc)
static

Definition at line 39 of file testaudiohotplug.c.

40{
41 SDL_Quit();
42 exit(rc);
43}

References SDL_Quit.

Referenced by main().

Variable Documentation

◆ done

int done = 0
static

Definition at line 70 of file testaudiohotplug.c.

Referenced by iteration(), main(), and poked().

◆ posindex

int posindex = 0
static

Definition at line 34 of file testaudiohotplug.c.

Referenced by iteration().

◆ positions

Uint32 positions[64]
static

Definition at line 35 of file testaudiohotplug.c.

Referenced by iteration().

◆ sound

Uint8* sound = NULL
static

Definition at line 31 of file testaudiohotplug.c.

Referenced by fillerup(), and main().

◆ soundlen

Uint32 soundlen = 0
static

Definition at line 32 of file testaudiohotplug.c.

Referenced by fillerup(), and main().

◆ spec

SDL_AudioSpec spec
static

Definition at line 30 of file testaudiohotplug.c.

Referenced by iteration(), and main().