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_Window * | window = NULL
static SDL_Renderer * | renderer = 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.

References SDL_MouseButtonEvent::button, SDL_Event::button, devid_in, devid_out, e, SDL_Event::key, SDL_KeyboardEvent::keysym, 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, SDLK_ESCAPE, SDL_Keysym::sym, and SDL_Event::type.

Referenced by main().

{
SDL_bool please_quit = SDL_FALSE;
SDL_Event e;
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
please_quit = SDL_TRUE;
} else if (e.type == SDL_KEYDOWN) {
if (e.key.keysym.sym == SDLK_ESCAPE) {
please_quit = SDL_TRUE;
}
} else if (e.type == SDL_MOUSEBUTTONDOWN) {
if (e.button.button == 1) {
SDL_PauseAudioDevice(devid_out, SDL_TRUE);
SDL_PauseAudioDevice(devid_in, SDL_FALSE);
}
} else if (e.type == SDL_MOUSEBUTTONUP) {
if (e.button.button == 1) {
SDL_PauseAudioDevice(devid_in, SDL_TRUE);
SDL_PauseAudioDevice(devid_out, SDL_FALSE);
}
}
}
if (SDL_GetAudioDeviceStatus(devid_in) == SDL_AUDIO_PLAYING) {
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
} else {
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
}
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
if (please_quit) {
/* stop playing back, quit. */
SDL_Log("Shutting down.\n");
SDL_PauseAudioDevice(devid_in, 1);
SDL_CloseAudioDevice(devid_in);
SDL_PauseAudioDevice(devid_out, 1);
SDL_CloseAudioDevice(devid_out);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
#ifdef __EMSCRIPTEN__
emscripten_cancel_main_loop();
#endif
exit(0);
}
/* Note that it would be easier to just have a one-line function that
calls SDL_QueueAudio() as a capture device callback, but we're
trying to test the API, so we use SDL_DequeueAudio() here. */
while (SDL_TRUE) {
Uint8 buf[1024];
const Uint32 br = SDL_DequeueAudio(devid_in, buf, sizeof (buf));
SDL_QueueAudio(devid_out, buf, br);
if (br < sizeof (buf)) {
break;
}
}
}
devid_out
static SDL_AudioDeviceID devid_out
Definition: testaudiocapture.c:24
SDL_PollEvent
#define SDL_PollEvent
Definition: SDL_dynapi_overrides.h:122
SDL_KEYDOWN
Definition: SDL_events.h:93
SDL_CloseAudioDevice
#define SDL_CloseAudioDevice
Definition: SDL_dynapi_overrides.h:97
SDL_TRUE
Definition: SDL_stdinc.h:142
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_MOUSEBUTTONUP
Definition: SDL_events.h:104
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_MOUSEBUTTONDOWN
Definition: SDL_events.h:103
SDL_QUIT
Definition: SDL_events.h:60
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_Log
#define SDL_Log
Definition: SDL_dynapi_overrides.h:31
SDL_MouseButtonEvent::button
Uint8 button
Definition: SDL_events.h:254
SDL_QueueAudio
#define SDL_QueueAudio
Definition: SDL_dynapi_overrides.h:588
renderer
static SDL_Renderer * renderer
Definition: testaudiocapture.c:21
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:157
devid_in
static SDL_AudioDeviceID devid_in
Definition: testaudiocapture.c:23
SDL_Quit
#define SDL_Quit
Definition: SDL_dynapi_overrides.h:58
SDL_GetAudioDeviceStatus
#define SDL_GetAudioDeviceStatus
Definition: SDL_dynapi_overrides.h:83
SDL_KeyboardEvent::keysym
SDL_Keysym keysym
Definition: SDL_events.h:199
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: SDL_opengl_glext.h:2480
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
SDL_RenderClear
#define SDL_RenderClear
Definition: SDL_dynapi_overrides.h:334
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_Event::key
SDL_KeyboardEvent key
Definition: SDL_events.h:530
SDL_DequeueAudio
#define SDL_DequeueAudio
Definition: SDL_dynapi_overrides.h:604
SDL_Keysym::sym
SDL_Keycode sym
Definition: SDL_keyboard.h:50
SDL_Event::button
SDL_MouseButtonEvent button
Definition: SDL_events.h:534
SDL_Event
General event structure.
Definition: SDL_events.h:525
SDL_SetRenderDrawColor
#define SDL_SetRenderDrawColor
Definition: SDL_dynapi_overrides.h:330
SDL_DestroyRenderer
#define SDL_DestroyRenderer
Definition: SDL_dynapi_overrides.h:348
SDL_AUDIO_PLAYING
Definition: SDL_audio.h:397
SDLK_ESCAPE
Definition: SDL_keycode.h:55
SDL_DestroyWindow
#define SDL_DestroyWindow
Definition: SDL_dynapi_overrides.h:549
SDL_RenderPresent
#define SDL_RenderPresent
Definition: SDL_dynapi_overrides.h:346
SDL_Event::type
Uint32 type
Definition: SDL_events.h:527
SDL_PauseAudioDevice
#define SDL_PauseAudioDevice
Definition: SDL_dynapi_overrides.h:85

## main()

int main | ( | int | argc,
|  | char ** | argv
| ) |  |

Definition at line 90 of file testaudiocapture.c.

References AUDIO_F32SYS, SDL_AudioSpec::callback, SDL_AudioSpec::channels, devid_in, devid_out, SDL_AudioSpec::format, SDL_AudioSpec::freq, i, loop(), NULL, 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, and SDL_zero.

{
/* (argv[1] == NULL means "open default device.") */
const char *devname = argv[1];
SDL_AudioSpec wanted;
int devcount;
int i;
/* Enable standard application logging */
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
/* Load the SDL library */
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
return (1);
}
window = SDL_CreateWindow("testaudiocapture", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 320, 240, 0);
renderer = SDL_CreateRenderer(window, -1, 0);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
devcount = SDL_GetNumAudioDevices(SDL_TRUE);
for (i = 0; i < devcount; i++) {
SDL_Log(" Capture device #%d: '%s'\n", i, SDL_GetAudioDeviceName(i, SDL_TRUE));
}
SDL_zero(wanted);
wanted.freq = 44100;
wanted.format = AUDIO_F32SYS;
wanted.channels = 1;
wanted.samples = 4096;
wanted.callback = NULL;
SDL_zero(spec);
/* DirectSound can fail in some instances if you open the same hardware
for both capture and output and didn't open the output end first,
according to the docs, so if you're doing something like this, always
open your capture devices second in case you land in those bizarre
circumstances. */
SDL_Log("Opening default playback device...\n");
devid_out = SDL_OpenAudioDevice(NULL, SDL_FALSE, &wanted, &spec, SDL_AUDIO_ALLOW_ANY_CHANGE);
if (!devid_out) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open an audio device for playback: %s!\n", SDL_GetError());
SDL_Quit();
exit(1);
}
SDL_Log("Opening capture device %s%s%s...\n",
devname ? "'" : "",
devname ? devname : "[[default]]",
devname ? "'" : "");
devid_in = SDL_OpenAudioDevice(argv[1], SDL_TRUE, &spec, &spec, 0);
if (!devid_in) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open an audio device for capture: %s!\n", SDL_GetError());
SDL_Quit();
exit(1);
}
SDL_Log("Ready! Hold down mouse or finger to record!\n");
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(loop, 0, 1);
#else
while (1) { loop(); SDL_Delay(16); }
#endif
return 0;
}
SDL_GetNumAudioDevices
#define SDL_GetNumAudioDevices
Definition: SDL_dynapi_overrides.h:79
devid_out
static SDL_AudioDeviceID devid_out
Definition: testaudiocapture.c:24
SDL_WINDOWPOS_CENTERED
#define SDL_WINDOWPOS_CENTERED
Definition: SDL_video.h:139
SDL_GetError
#define SDL_GetError
Definition: SDL_dynapi_overrides.h:113
SDL_TRUE
Definition: SDL_stdinc.h:142
loop
static void loop()
Definition: testaudiocapture.c:27
SDL_OpenAudioDevice
#define SDL_OpenAudioDevice
Definition: SDL_dynapi_overrides.h:81
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_AudioSpec
Definition: SDL_audio.h:177
SDL_AudioSpec::samples
Uint16 samples
Definition: SDL_audio.h:183
SDL_CreateWindow
#define SDL_CreateWindow
Definition: SDL_dynapi_overrides.h:514
spec
static SDL_AudioSpec spec
Definition: testaudiocapture.c:22
SDL_LogError
#define SDL_LogError
Definition: SDL_dynapi_overrides.h:36
SDL_GetAudioDeviceName
#define SDL_GetAudioDeviceName
Definition: SDL_dynapi_overrides.h:80
SDL_Log
#define SDL_Log
Definition: SDL_dynapi_overrides.h:31
SDL_AudioSpec::freq
int freq
Definition: SDL_audio.h:179
AUDIO_F32SYS
#define AUDIO_F32SYS
Definition: SDL_audio.h:125
SDL_AudioSpec::channels
Uint8 channels
Definition: SDL_audio.h:181
renderer
static SDL_Renderer * renderer
Definition: testaudiocapture.c:21
devid_in
static SDL_AudioDeviceID devid_in
Definition: testaudiocapture.c:23
SDL_Quit
#define SDL_Quit
Definition: SDL_dynapi_overrides.h:58
SDL_AUDIO_ALLOW_ANY_CHANGE
#define SDL_AUDIO_ALLOW_ANY_CHANGE
Definition: SDL_audio.h:143
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
SDL_LOG_PRIORITY_INFO
Definition: SDL_log.h:106
SDL_AudioSpec::callback
SDL_AudioCallback callback
Definition: SDL_audio.h:186
SDL_Delay
#define SDL_Delay
Definition: SDL_dynapi_overrides.h:486
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_LogSetPriority
#define SDL_LogSetPriority
Definition: SDL_dynapi_overrides.h:236
SDL_GetCurrentAudioDriver
#define SDL_GetCurrentAudioDriver
Definition: SDL_dynapi_overrides.h:77
NULL
#define NULL
Definition: begin_code.h:164
SDL_RenderClear
#define SDL_RenderClear
Definition: SDL_dynapi_overrides.h:334
SDL_INIT_AUDIO
#define SDL_INIT_AUDIO
Definition: SDL.h:77
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_AudioSpec::format
SDL_AudioFormat format
Definition: SDL_audio.h:180
SDL_Init
#define SDL_Init
Definition: SDL_dynapi_overrides.h:54
SDL_SetRenderDrawColor
#define SDL_SetRenderDrawColor
Definition: SDL_dynapi_overrides.h:330
SDL_LOG_CATEGORY_APPLICATION
Definition: SDL_log.h:66
SDL_INIT_VIDEO
#define SDL_INIT_VIDEO
Definition: SDL.h:78
SDL_CreateRenderer
#define SDL_CreateRenderer
Definition: SDL_dynapi_overrides.h:301
SDL_RenderPresent
#define SDL_RenderPresent
Definition: SDL_dynapi_overrides.h:346

## 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(), IsSDLWindowEventPending(), LoadSprite(), loop(), main(), Redraw(), SDL_CreateRenderer(), SDL_CreateSoftwareRenderer(), SDL_CreateTexture(), SDL_CreateWindowTexture(), SDL_DestroyTexture(), SDL_GL_BindTexture(), SDL_GL_UnbindTexture(), SDL_LockTexture(), SDL_RendererEventWatch(), SDL_SetTextureAlphaMod(), SDL_SetTextureBlendMode(), SDL_SetTextureColorMod(), SDL_UnlockTexture(), SDL_UpdateTexture(), SDL_UpdateYUVTexture(), SW_CreateRendererForSurface(), unifont_cleanup(), and unifont_load_texture().

## spec

SDL_AudioSpec spec

static

Definition at line 22 of file testaudiocapture.c.

## window

SDL_Window* window = NULL

static

Definition at line 20 of file testaudiocapture.c.