2 Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
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.
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
17 #include <emscripten/emscripten.h>
20 static SDL_Window *window = NULL;
21 static SDL_Renderer *renderer = NULL;
22 static SDL_AudioSpec spec;
23 static SDL_AudioDeviceID devid_in = 0;
24 static SDL_AudioDeviceID devid_out = 0;
29 SDL_bool please_quit = SDL_FALSE;
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;
39 } else if (e.type == SDL_MOUSEBUTTONDOWN) {
40 if (e.button.button == 1) {
41 SDL_PauseAudioDevice(devid_out, SDL_TRUE);
42 SDL_PauseAudioDevice(devid_in, SDL_FALSE);
44 } else if (e.type == SDL_MOUSEBUTTONUP) {
45 if (e.button.button == 1) {
46 SDL_PauseAudioDevice(devid_in, SDL_TRUE);
47 SDL_PauseAudioDevice(devid_out, SDL_FALSE);
52 if (SDL_GetAudioDeviceStatus(devid_in) == SDL_AUDIO_PLAYING) {
53 SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
55 SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
57 SDL_RenderClear(renderer);
58 SDL_RenderPresent(renderer);
61 /* stop playing back, quit. */
62 SDL_Log("Shutting down.\n");
63 SDL_PauseAudioDevice(devid_in, 1);
64 SDL_CloseAudioDevice(devid_in);
65 SDL_PauseAudioDevice(devid_out, 1);
66 SDL_CloseAudioDevice(devid_out);
67 SDL_DestroyRenderer(renderer);
68 SDL_DestroyWindow(window);
71 emscripten_cancel_main_loop();
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. */
81 const Uint32 br = SDL_DequeueAudio(devid_in, buf, sizeof (buf));
82 SDL_QueueAudio(devid_out, buf, br);
83 if (br < sizeof (buf)) {
90 main(int argc, char **argv)
92 /* (argv[1] == NULL means "open default device.") */
93 const char *devname = argv[1];
98 /* Enable standard application logging */
99 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
101 /* Load the SDL library */
102 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
103 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
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);
113 SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
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));
122 wanted.format = AUDIO_F32SYS;
124 wanted.samples = 4096;
125 wanted.callback = NULL;
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
135 SDL_Log("Opening default playback device...\n");
136 devid_out = SDL_OpenAudioDevice(NULL, SDL_FALSE, &wanted, &spec, SDL_AUDIO_ALLOW_ANY_CHANGE);
138 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open an audio device for playback: %s!\n", SDL_GetError());
143 SDL_Log("Opening capture device %s%s%s...\n",
145 devname ? devname : "[[default]]",
148 devid_in = SDL_OpenAudioDevice(argv[1], SDL_TRUE, &spec, &spec, 0);
150 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open an audio device for capture: %s!\n", SDL_GetError());
155 SDL_Log("Ready! Hold down mouse or finger to record!\n");
157 #ifdef __EMSCRIPTEN__
158 emscripten_set_main_loop(loop, 0, 1);
160 while (1) { loop(); SDL_Delay(16); }