static unsigned int S_CaptureDriverUpdate (void* driverContext, unsigned char* buffer, int minBytes, int maxBytes) { SDL_AudioDeviceID inputdevid = (SDL_AudioDeviceID)driverContext; unsigned int available = SDL_GetQueuedAudioSize (inputdevid); if (available > minBytes) { return SDL_DequeueAudio (inputdevid, buffer, maxBytes); } return 0; }
void SNDDMA_Capture(int samples, byte *data) { #ifdef USE_SDL_AUDIO_CAPTURE // multiplied by 2 to convert from (mono16) samples to bytes. if (sdlCaptureDevice) { SDL_DequeueAudio(sdlCaptureDevice, data, samples * 2); } else #endif { SDL_memset(data, '\0', samples * 2); } }
static void loop() { 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; } } }