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

Go to the source code of this file.

Functions

static void loop ()
 
int main (int argc, char **argv)
 

Variables

static SDL_Windowwindow = NULL
 
static SDL_Rendererrenderer = NULL
 
static SDL_AudioSpec spec
 
static SDL_AudioDeviceID devid_in = 0
 
static SDL_AudioDeviceID devid_out = 0
 

Function Documentation

◆ loop()

static void loop ( )
static

Definition at line 27 of file testaudiocapture.c.

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  }
59 
60  if (please_quit) {
61  /* stop playing back, quit. */
62  SDL_Log("Shutting down.\n");
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));
83  if (br < sizeof (buf)) {
84  break;
85  }
86  }
87 }

References devid_in, devid_out, e, renderer, SDL_AUDIO_PLAYING, SDL_CloseAudioDevice, SDL_DequeueAudio, SDL_DestroyRenderer, SDL_DestroyWindow, SDL_FALSE, SDL_GetAudioDeviceStatus, SDL_KEYDOWN, SDL_Log, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP, SDL_PauseAudioDevice, SDL_PollEvent, SDL_QueueAudio, SDL_Quit, SDL_QUIT, SDL_RenderClear, SDL_RenderPresent, SDL_SetRenderDrawColor, SDL_TRUE, and SDLK_ESCAPE.

Referenced by main().

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 90 of file testaudiocapture.c.

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);
109  SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
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 }

References AUDIO_F32SYS, SDL_AudioSpec::callback, SDL_AudioSpec::channels, devid_in, devid_out, SDL_AudioSpec::format, SDL_AudioSpec::freq, i, loop(), NULL, renderer, SDL_AudioSpec::samples, SDL_AUDIO_ALLOW_ANY_CHANGE, SDL_CreateRenderer, SDL_CreateWindow, SDL_Delay, SDL_FALSE, SDL_GetAudioDeviceName, SDL_GetCurrentAudioDriver, SDL_GetError, SDL_GetNumAudioDevices, SDL_Init, SDL_INIT_AUDIO, SDL_INIT_VIDEO, SDL_Log, SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, SDL_LogError, SDL_LogSetPriority, SDL_OpenAudioDevice, SDL_Quit, SDL_RenderClear, SDL_RenderPresent, SDL_SetRenderDrawColor, SDL_TRUE, SDL_WINDOWPOS_CENTERED, SDL_zero, and spec.

Variable Documentation

◆ devid_in

SDL_AudioDeviceID devid_in = 0
static

Definition at line 23 of file testaudiocapture.c.

Referenced by loop(), and main().

◆ devid_out

SDL_AudioDeviceID devid_out = 0
static

Definition at line 24 of file testaudiocapture.c.

Referenced by loop(), and main().

◆ renderer

SDL_Renderer* renderer = NULL
static

Definition at line 21 of file testaudiocapture.c.

Referenced by _Redraw(), AllocateRenderCommand(), DrawLines(), DrawOnViewport(), DrawPoints(), DrawRectLineIntersections(), DrawRectRectIntersections(), DrawRects(), FlushRenderCommands(), FlushRenderCommandsIfNotBatching(), FlushRenderCommandsIfTextureNeeded(), GetClosestSupportedFormat(), GetWindowViewportValues(), IsSupportedBlendMode(), IsSupportedFormat(), LoadSprite(), LoadTexture(), loop(), main(), MoveSprites(), PrepQueueCmdDraw(), PrepQueueCmdDrawSolid(), PrepQueueCmdDrawTexture(), QueueCmdClear(), QueueCmdCopy(), QueueCmdCopyEx(), QueueCmdDrawLines(), QueueCmdDrawPoints(), QueueCmdFillRects(), QueueCmdSetClipRect(), QueueCmdSetDrawColor(), QueueCmdSetViewport(), Redraw(), render(), RenderDrawLinesWithRects(), RenderDrawLinesWithRectsF(), RenderDrawPointsWithRects(), RenderDrawPointsWithRectsF(), SDL_AllocateRenderVertices(), SDL_CreateRenderer(), SDL_CreateSoftwareRenderer(), SDL_CreateTexture(), SDL_CreateTextureFromSurface(), SDL_CreateWindowAndRenderer(), SDL_CreateWindowTexture(), SDL_DestroyRenderer(), SDL_DestroyTexture(), SDL_GetRenderDrawBlendMode(), SDL_GetRenderDrawColor(), SDL_GetRendererInfo(), SDL_GetRendererOutputSize(), SDL_GetRenderTarget(), SDL_GL_BindTexture(), SDL_GL_UnbindTexture(), SDL_LockTexture(), SDL_RenderClear(), SDL_RenderCopy(), SDL_RenderCopyEx(), SDL_RenderCopyExF(), SDL_RenderCopyF(), SDL_RenderDrawLine(), SDL_RenderDrawLineF(), SDL_RenderDrawLines(), SDL_RenderDrawLinesF(), SDL_RenderDrawPoint(), SDL_RenderDrawPointF(), SDL_RenderDrawPoints(), SDL_RenderDrawPointsF(), SDL_RenderDrawRect(), SDL_RenderDrawRectF(), SDL_RenderDrawRects(), SDL_RenderDrawRectsF(), SDL_RendererEventWatch(), SDL_RenderFillRect(), SDL_RenderFillRectF(), SDL_RenderFillRects(), SDL_RenderFillRectsF(), SDL_RenderFlush(), SDL_RenderGetClipRect(), SDL_RenderGetIntegerScale(), SDL_RenderGetLogicalSize(), SDL_RenderGetMetalCommandEncoder(), SDL_RenderGetMetalLayer(), SDL_RenderGetScale(), SDL_RenderGetViewport(), SDL_RenderIsClipEnabled(), SDL_RenderPresent(), SDL_RenderReadPixels(), SDL_RenderSetClipRect(), SDL_RenderSetIntegerScale(), SDL_RenderSetLogicalSize(), SDL_RenderSetScale(), SDL_RenderSetViewport(), SDL_RenderTargetSupported(), SDL_SetRenderDrawBlendMode(), SDL_SetRenderDrawColor(), SDL_SetRenderTarget(), SDL_SetTextureBlendMode(), SDL_SetTextureScaleMode(), SDL_UnlockTexture(), SDL_UpdateTexture(), SDL_UpdateYUVTexture(), SDLTest_DrawCharacter(), SDLTest_DrawString(), SDLTest_ScreenShot(), SW_ActivateRenderer(), SW_CreateRendererForSurface(), SW_DestroyRenderer(), SW_GetOutputSize(), SW_QueueCopy(), SW_QueueCopyEx(), SW_QueueDrawPoints(), SW_QueueFillRects(), SW_RenderPresent(), SW_RenderReadPixels(), SW_RunCommandQueue(), SW_SetRenderTarget(), SW_WindowEvent(), unifont_cleanup(), unifont_load_texture(), UpdateLogicalSize(), and VerifyDrawQueueFunctions().

◆ spec

SDL_AudioSpec spec
static

Definition at line 22 of file testaudiocapture.c.

Referenced by main().

◆ window

SDL_Window* window = NULL
static

Definition at line 20 of file testaudiocapture.c.

SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:418
SDL_CloseAudioDevice
#define SDL_CloseAudioDevice
Definition: SDL_dynapi_overrides.h:97
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:179
SDL_GetError
#define SDL_GetError
Definition: SDL_dynapi_overrides.h:113
SDL_RenderPresent
#define SDL_RenderPresent
Definition: SDL_dynapi_overrides.h:346
SDL_AudioSpec::channels
Uint8 channels
Definition: SDL_audio.h:182
SDL_PauseAudioDevice
#define SDL_PauseAudioDevice
Definition: SDL_dynapi_overrides.h:85
SDL_GetNumAudioDevices
#define SDL_GetNumAudioDevices
Definition: SDL_dynapi_overrides.h:79
SDL_WINDOWPOS_CENTERED
#define SDL_WINDOWPOS_CENTERED
Definition: SDL_video.h:138
SDL_PollEvent
#define SDL_PollEvent
Definition: SDL_dynapi_overrides.h:122
NULL
#define NULL
Definition: begin_code.h:167
SDL_OpenAudioDevice
#define SDL_OpenAudioDevice
Definition: SDL_dynapi_overrides.h:81
SDL_AudioSpec::samples
Uint16 samples
Definition: SDL_audio.h:184
SDLK_ESCAPE
@ SDLK_ESCAPE
Definition: SDL_keycode.h:55
SDL_AudioSpec::format
SDL_AudioFormat format
Definition: SDL_audio.h:181
SDL_AudioSpec::callback
SDL_AudioCallback callback
Definition: SDL_audio.h:187
SDL_MOUSEBUTTONUP
@ SDL_MOUSEBUTTONUP
Definition: SDL_events.h:107
SDL_AudioSpec
Definition: SDL_audio.h:179
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:203
SDL_KEYDOWN
@ SDL_KEYDOWN
Definition: SDL_events.h:96
SDL_CreateWindow
#define SDL_CreateWindow
Definition: SDL_dynapi_overrides.h:514
SDL_LogError
#define SDL_LogError
Definition: SDL_dynapi_overrides.h:36
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: SDL_opengl_glext.h:2483
SDL_GetAudioDeviceName
#define SDL_GetAudioDeviceName
Definition: SDL_dynapi_overrides.h:80
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_Log
#define SDL_Log
Definition: SDL_dynapi_overrides.h:31
SDL_LOG_CATEGORY_APPLICATION
@ SDL_LOG_CATEGORY_APPLICATION
Definition: SDL_log.h:66
SDL_QueueAudio
#define SDL_QueueAudio
Definition: SDL_dynapi_overrides.h:588
SDL_AUDIO_ALLOW_ANY_CHANGE
#define SDL_AUDIO_ALLOW_ANY_CHANGE
Definition: SDL_audio.h:144
SDL_QUIT
@ SDL_QUIT
Definition: SDL_events.h:60
AUDIO_F32SYS
#define AUDIO_F32SYS
Definition: SDL_audio.h:125
loop
static void loop()
Definition: testaudiocapture.c:27
SDL_Quit
#define SDL_Quit
Definition: SDL_dynapi_overrides.h:58
SDL_GetAudioDeviceStatus
#define SDL_GetAudioDeviceStatus
Definition: SDL_dynapi_overrides.h:83
SDL_TRUE
@ SDL_TRUE
Definition: SDL_stdinc.h:164
SDL_Delay
#define SDL_Delay
Definition: SDL_dynapi_overrides.h:486
SDL_AudioSpec::freq
int freq
Definition: SDL_audio.h:180
SDL_GetCurrentAudioDriver
#define SDL_GetCurrentAudioDriver
Definition: SDL_dynapi_overrides.h:77
SDL_INIT_VIDEO
#define SDL_INIT_VIDEO
Definition: SDL.h:80
SDL_LOG_PRIORITY_INFO
@ SDL_LOG_PRIORITY_INFO
Definition: SDL_log.h:106
renderer
static SDL_Renderer * renderer
Definition: testaudiocapture.c:21
SDL_LogSetPriority
#define SDL_LogSetPriority
Definition: SDL_dynapi_overrides.h:236
SDL_AUDIO_PLAYING
@ SDL_AUDIO_PLAYING
Definition: SDL_audio.h:398
e
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
Definition: SDL_dynapi_procs.h:117
SDL_DequeueAudio
#define SDL_DequeueAudio
Definition: SDL_dynapi_overrides.h:604
SDL_RenderClear
#define SDL_RenderClear
Definition: SDL_dynapi_overrides.h:334
SDL_SetRenderDrawColor
#define SDL_SetRenderDrawColor
Definition: SDL_dynapi_overrides.h:330
SDL_MOUSEBUTTONDOWN
@ SDL_MOUSEBUTTONDOWN
Definition: SDL_events.h:106
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:162
spec
static SDL_AudioSpec spec
Definition: testaudiocapture.c:22
SDL_Event
General event structure.
Definition: SDL_events.h:559
SDL_FALSE
@ SDL_FALSE
Definition: SDL_stdinc.h:163
SDL_CreateRenderer
#define SDL_CreateRenderer
Definition: SDL_dynapi_overrides.h:301
SDL_Init
#define SDL_Init
Definition: SDL_dynapi_overrides.h:54
SDL_DestroyRenderer
#define SDL_DestroyRenderer
Definition: SDL_dynapi_overrides.h:348
devid_out
static SDL_AudioDeviceID devid_out
Definition: testaudiocapture.c:24
devid_in
static SDL_AudioDeviceID devid_in
Definition: testaudiocapture.c:23
SDL_DestroyWindow
#define SDL_DestroyWindow
Definition: SDL_dynapi_overrides.h:549
i
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
SDL_INIT_AUDIO
#define SDL_INIT_AUDIO
Definition: SDL.h:79