/* * FredyGames: the PortAudio V18 calls of Jason Rohrer's minorGems games, on top of SDL2 audio * (float32 stereo, one callback). Public domain, like the games. */ #include #include #include "portaudio.h" struct FgStream { SDL_AudioDeviceID device; PortAudioCallback *callback; void *userData; unsigned long frames; }; static void fgAudioCallback(void *userdata, Uint8 *stream, int len) { FgStream *s = (FgStream *)userdata; unsigned long frames = (unsigned long)len / (2 * sizeof(float)); s->callback(NULL, stream, frames, 0, s->userData); } PaError Pa_Initialize(void) { if (SDL_WasInit(SDL_INIT_AUDIO)) return paNoError; return SDL_InitSubSystem(SDL_INIT_AUDIO) == 0 ? paNoError : paHostError; } PaError Pa_Terminate(void) { return paNoError; } const char *Pa_GetErrorText(PaError) { return SDL_GetError(); } PaDeviceID Pa_GetDefaultOutputDeviceID(void) { return 0; } PaError Pa_OpenStream(PortAudioStream **stream, PaDeviceID, int, PaSampleFormat, void *, PaDeviceID, int, PaSampleFormat, void *, double sampleRate, unsigned long framesPerBuffer, unsigned long, unsigned long, PortAudioCallback *callback, void *userData) { FgStream *s = (FgStream *)calloc(1, sizeof(FgStream)); s->callback = callback; s->userData = userData; s->frames = framesPerBuffer; SDL_AudioSpec want; SDL_zero(want); want.freq = (int)sampleRate; want.format = AUDIO_F32SYS; want.channels = 2; want.samples = (Uint16)framesPerBuffer; want.callback = fgAudioCallback; want.userdata = s; s->device = SDL_OpenAudioDevice(NULL, 0, &want, NULL, 0); if (s->device == 0) { free(s); return paHostError; } *stream = s; return paNoError; } PaError Pa_StartStream(PortAudioStream *stream) { SDL_PauseAudioDevice(((FgStream *)stream)->device, 0); return paNoError; } PaError Pa_StopStream(PortAudioStream *stream) { SDL_PauseAudioDevice(((FgStream *)stream)->device, 1); return paNoError; } PaError Pa_CloseStream(PortAudioStream *stream) { FgStream *s = (FgStream *)stream; SDL_CloseAudioDevice(s->device); free(s); return paNoError; }