SDL_OpenAudio(3)

πŸ’– SDL_OpenAudio β€” SDL API Reference πŸ’–

okay bestie, welcome to the SDL_OpenAudio(3) page, part of the SDL API Reference. this is the one that gets your audio device open with the parameters you actually want, so let's go 🎧✨


✨ NAME ✨

SDL_OpenAudio β€” opens the audio device with the desired parameters.


🌸 SYNOPSIS 🌸

#include "SDL.h"

int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained);

πŸ¦‹ DESCRIPTION πŸ¦‹

so here's the vibe: this function opens the audio device with the parameters you desire, and returns 0 if it worked, dropping the actual hardware parameters into the structure that obtained points at. but wait β€” if obtained is NULL, then the audio data handed to your callback function is guaranteed to be in the requested format, and it'll get automatically converted to the hardware audio format if it needs to be. and if it flops? it returns -1 if it failed to open the audio device, or if it couldn't set up the audio thread. 😭

to open the audio device, you have to make a desired SDL_AudioSpec first. like:

SDL_AudioSpec *desired;
.
.
desired=(SDL_AudioSpec *)malloc(sizeof(SDL_AudioSpec));

then you must fill this structure with your desired audio specifications. the fields are:

  • desired->freq
  • desired->format
  • desired->samples
  • desired->callback β€” which looks like this:
void callback(void *userdata, Uint8 *stream, int len);
  • userdata is the pointer stored in the userdata field of the SDL_AudioSpec. stream is a pointer to the audio buffer you want to fill with information, and len is the length of the audio buffer in bytes. 🫢
  • desired->userdata

SDL_OpenAudio reads these fields from the desired SDL_AudioSpec structure you pass to the function and attempts to find an audio configuration matching your desired one. and like we said above: if the obtained parameter is NULL, then SDL will convert from your desired audio settings to the hardware settings as it plays. πŸ’…

if obtained is NULL, then the desired SDL_AudioSpec is your working specification. otherwise the obtained SDL_AudioSpec becomes the working specification and the desired specification can be deleted. the data in the working specification is used when building SDL_AudioCVT's for converting loaded data to the hardware format.

SDL_OpenAudio also calculates the size and silence fields for both the desired and obtained specifications. the size field stores the total size of the audio buffer in bytes, while the silence stores the value used to represent silence in the audio buffer.

⚠️ lowkey important, bestie: the audio device starts out playing silence when it's opened, and it should be enabled for playing by calling SDL_PauseAudio(0) when you are ready for your audio callback function to be called. and since the audio driver may modify the requested size of the audio buffer, you should allocate any local mixing buffers after you open the audio device. no cap. 🚨

πŸŽ€ EXAMPLES πŸŽ€

here's the whole glow-up in code, fr fr:

/* Prototype of our callback function */
void my_audio_callback(void *userdata, Uint8 *stream, int len);

/* Open the audio device */
SDL_AudioSpec *desired, *obtained;
SDL_AudioSpec *hardware_spec;

/* Allocate a desired SDL_AudioSpec */
desired=(SDL_AudioSpec *)malloc(sizeof(SDL_AudioSpec));

/* Allocate space for the obtained SDL_AudioSpec */
obtained=(SDL_AudioSpec *)malloc(sizeof(SDL_AudioSpec));

/* 22050Hz - FM Radio quality */
desired->freq=22050;

/* 16-bit signed audio */
desired->format=AUDIO_S16LSB;

/* Mono */
desired->channels=0;

/* Large audio buffer reduces risk of dropouts but increases response time */
desired->samples=8192;

/* Our callback function */
desired->callback=my_audio_callback;

desired->userdata=NULL;

/* Open the audio device */
if ( SDL_OpenAudio(desired, obtained) < 0 ){
  fprintf(stderr, "Couldn't open audio: %s
", SDL_GetError());
  exit(-1);
}
/* desired spec is no longer needed */
free(desired);
hardware_spec=obtained;
.
.
/* Prepare callback for playing */
.
.
.
/* Start playing */
SDL_PauseAudio(0);
πŸ™ˆ yes, that fprintf line really is split across two lines like that, with the string running right into the next line β€” that's exactly how this page has it, so it's staying exactly as-is. iconic in its own chaotic way.

πŸ‘‘ SEE ALSO πŸ‘‘

  • SDL_AudioSpec
  • SDL_LockAudio
  • SDL_UnlockAudio
  • SDL_PauseAudio

and that's the whole page, bestie β€” you ate. this one came from the <strong>SDL</strong> source, dated <strong>Tue 11 Sep 2001, 22:58</strong>, and yes it is <strong>SDL_OpenAudio(3)</strong>. go make some noise πŸŽΆπŸ’œ

πŸ“¦ where this page comes from