SDL  2.0
testaudiocapture.c
Go to the documentation of this file.
1 /*
2  Copyright (C) 1997-2018 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 #include "SDL.h"
13 
14 #include <stdlib.h>
15 
16 #ifdef __EMSCRIPTEN__
17 #include <emscripten/emscripten.h>
18 #endif
19 
25 
26 static void
28 {
29  SDL_bool please_quit = SDL_FALSE;
30  SDL_Event e;
31 
32  while (SDL_PollEvent(&e)) {
33  if (e.type == SDL_QUIT) {
34  please_quit = SDL_TRUE;
35  } else if (e.type == SDL_KEYDOWN) {
36  if (e.key.keysym.sym == SDLK_ESCAPE) {
37  please_quit = SDL_TRUE;
38  }
39  } else if (e.type == SDL_MOUSEBUTTONDOWN) {
40  if (e.button.button == 1) {
43  }
44  } else if (e.type == SDL_MOUSEBUTTONUP) {
45  if (e.button.button == 1) {
48  }
49  }
50  }
51 
53  SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
54  } else {
55  SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
56  }
57  SDL_RenderClear(renderer);
58  SDL_RenderPresent(renderer);
59 
60  if (please_quit) {
61  /* stop playing back, quit. */
62  SDL_Log("Shutting down.\n");
67  SDL_DestroyRenderer(renderer);
68  SDL_DestroyWindow(window);
69  SDL_Quit();
70  #ifdef __EMSCRIPTEN__
71  emscripten_cancel_main_loop();
72  #endif
73  exit(0);
74  }
75 
76  /* Note that it would be easier to just have a one-line function that
77  calls SDL_QueueAudio() as a capture device callback, but we're
78  trying to test the API, so we use SDL_DequeueAudio() here. */
79  while (SDL_TRUE) {
80  Uint8 buf[1024];
81  const Uint32 br = SDL_DequeueAudio(devid_in, buf, sizeof (buf));
82  SDL_QueueAudio(devid_out, buf, br);
83  if (br < sizeof (buf)) {
84  break;
85  }
86  }
87 }
88 
89 int
90 main(int argc, char **argv)
91 {
92  /* (argv[1] == NULL means "open default device.") */
93  const char *devname = argv[1];
94  SDL_AudioSpec wanted;
95  int devcount;
96  int i;
97 
98  /* Enable standard application logging */
100 
101  /* Load the SDL library */
103  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
104  return (1);
105  }
106 
107  window = SDL_CreateWindow("testaudiocapture", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 320, 240, 0);
108  renderer = SDL_CreateRenderer(window, -1, 0);
109  SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
110  SDL_RenderClear(renderer);
111  SDL_RenderPresent(renderer);
112 
113  SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
114 
115  devcount = SDL_GetNumAudioDevices(SDL_TRUE);
116  for (i = 0; i < devcount; i++) {
117  SDL_Log(" Capture device #%d: '%s'\n", i, SDL_GetAudioDeviceName(i, SDL_TRUE));
118  }
119 
120  SDL_zero(wanted);
121  wanted.freq = 44100;
122  wanted.format = AUDIO_F32SYS;
123  wanted.channels = 1;
124  wanted.samples = 4096;
125  wanted.callback = NULL;
126 
127  SDL_zero(spec);
128 
129  /* DirectSound can fail in some instances if you open the same hardware
130  for both capture and output and didn't open the output end first,
131  according to the docs, so if you're doing something like this, always
132  open your capture devices second in case you land in those bizarre
133  circumstances. */
134 
135  SDL_Log("Opening default playback device...\n");
137  if (!devid_out) {
138  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open an audio device for playback: %s!\n", SDL_GetError());
139  SDL_Quit();
140  exit(1);
141  }
142 
143  SDL_Log("Opening capture device %s%s%s...\n",
144  devname ? "'" : "",
145  devname ? devname : "[[default]]",
146  devname ? "'" : "");
147 
148  devid_in = SDL_OpenAudioDevice(argv[1], SDL_TRUE, &spec, &spec, 0);
149  if (!devid_in) {
150  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open an audio device for capture: %s!\n", SDL_GetError());
151  SDL_Quit();
152  exit(1);
153  }
154 
155  SDL_Log("Ready! Hold down mouse or finger to record!\n");
156 
157 #ifdef __EMSCRIPTEN__
158  emscripten_set_main_loop(loop, 0, 1);
159 #else
160  while (1) { loop(); SDL_Delay(16); }
161 #endif
162 
163  return 0;
164 }
165 
#define SDL_GetNumAudioDevices
static SDL_AudioDeviceID devid_out
#define SDL_WINDOWPOS_CENTERED
Definition: SDL_video.h:139
#define SDL_PollEvent
#define SDL_GetError
#define SDL_CloseAudioDevice
static void loop()
#define SDL_OpenAudioDevice
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
Uint16 samples
Definition: SDL_audio.h:183
#define SDL_CreateWindow
uint32_t Uint32
Definition: SDL_stdinc.h:181
static SDL_AudioSpec spec
int main(int argc, char **argv)
#define SDL_LogError
#define SDL_GetAudioDeviceName
#define SDL_Log
#define SDL_QueueAudio
#define AUDIO_F32SYS
Definition: SDL_audio.h:125
Uint8 channels
Definition: SDL_audio.h:181
static SDL_Renderer * renderer
uint8_t Uint8
Definition: SDL_stdinc.h:157
static SDL_AudioDeviceID devid_in
#define SDL_Quit
#define SDL_AUDIO_ALLOW_ANY_CHANGE
Definition: SDL_audio.h:143
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
#define SDL_GetAudioDeviceStatus
SDL_Keysym keysym
Definition: SDL_events.h:199
SDL_AudioCallback callback
Definition: SDL_audio.h:186
GLenum GLuint GLenum GLsizei const GLchar * buf
#define SDL_Delay
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
#define SDL_LogSetPriority
#define SDL_GetCurrentAudioDriver
#define NULL
Definition: begin_code.h:164
SDL_bool
Definition: SDL_stdinc.h:139
#define SDL_RenderClear
#define SDL_INIT_AUDIO
Definition: SDL.h:77
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_KeyboardEvent key
Definition: SDL_events.h:530
#define SDL_DequeueAudio
Uint32 SDL_AudioDeviceID
Definition: SDL_audio.h:329
SDL_AudioFormat format
Definition: SDL_audio.h:180
The type used to identify a window.
Definition: SDL_sysvideo.h:73
SDL_Keycode sym
Definition: SDL_keyboard.h:50
SDL_MouseButtonEvent button
Definition: SDL_events.h:534
#define SDL_Init
General event structure.
Definition: SDL_events.h:525
#define SDL_SetRenderDrawColor
#define SDL_DestroyRenderer
#define SDL_DestroyWindow
#define SDL_INIT_VIDEO
Definition: SDL.h:78
#define SDL_CreateRenderer
#define SDL_RenderPresent
Uint32 type
Definition: SDL_events.h:527
#define SDL_PauseAudioDevice