SDL_audio.h

Estructura SDL_AudioSpec

Una estructura que contiene el formato de salida de audio. También contiene una llamada de retorno que se llama cuando el dispositivo de audio necesita más datos.

typedef struct SDL_AudioSpec
{
    int freq;                   /**< DSP frequency -- samples per second */
    SDL_AudioFormat format;     /**< Audio data format */
    Uint8 channels;             /**< Number of channels: 1 mono, 2 stereo */
    Uint8 silence;              /**< Audio buffer silence value (calculated) */
    Uint16 samples;             /**< Audio buffer size in sample FRAMES (total samples divided by channel count) */
    Uint16 padding;             /**< Necessary for some compile environments */
    Uint32 size;                /**< Audio buffer size in bytes (calculated) */
    SDL_AudioCallback callback; /**< Callback that feeds the audio device (NULL to use SDL_QueueAudio()). */
    void *userdata;             /**< Userdata passed to callback (ignored for NULL callbacks). */
} SDL_AudioSpec;

Miembros

frec
Frecuencia del DSP (muestras por segundo).
format
Formato de audio.
channels
Número de canales de sonido separados.
silence
Valor de silencio para el buffer de audio.
samples
Tamaño del buffer de audio en muestras (potencia de 2).
size
Tamaño del buffer en bytes (calculado).
callback
Funciona a llamar cuando el dispositivo de audio necesite más datos.
userdata
Un puntero que es pasado a la función de retrollamada.(de lo contrario, SDL lo ignora).

Observaciones

Esta estructura es usada por SDL_OpenAudioDevice() y SDL_LoadWAV(). Mientras que todos los campos son usados por SDL_OpenAudioDevice(), solo freq, format, channels y samples son usados por SDL_LoadWAV().

freq especifica el número de cuadros de muestra enviados al dispositivo de sonido por segundo. El Teorema de Nyquist establece que la frecuencia de muestreo de audio debe ser exactamente el doble de la frecuencia más alta representada en el audio. Los humanos podemos oír hasta algo menos de 20kHz, disminuyendo a 16kHz o menos a medida que envejecemos. El audio estándar de calidad CD utiliza 44100. Los DVD y el códec de audio Opus utilizan 48000. Los valores superiores a 48000 generalmente no deben utilizarse para fines de reproducción, ya que utilizan más memoria, más CPU y pueden causar otros problemas, como se explica en esta entrada de blog de Chris Montgomery de Xiph.

format especifica el tamaño y el tipo de cada elemento de muestra y puede ser uno de los siguientes:

formatSignificado
AUDIO_S8signed 8-bit samples
AUDIO_U8unsigned 8-bit samples
AUDIO_S16LSBsigned 16-bit samples in little-endian byte order
AUDIO_S16MSBsigned 16-bit samples in big-endian byte order
AUDIO_S16SYSsigned 16-bit samples in native byte order
AUDIO_S16AUDIO_S16LSB
AUDIO_U16LSBunsigned 16-bit samples in little-endian byte order
AUDIO_U16MSBunsigned 16-bit samples in big-endian byte order
AUDIO_U16SYSunsigned 16-bit samples in native byte order
AUDIO_U16AUDIO_U16LSB
AUDIO_S32LSB32-bit integer samples in little-endian byte order
AUDIO_S32MSB32-bit integer samples in big-endian byte order
AUDIO_S32SYS32-bit integer samples in native byte order
AUDIO_S32AUDIO_S32LSB
AUDIO_F32LSB32-bit floating point samples in little-endian byte order
AUDIO_F32MSB32-bit floating point samples in big-endian byte order
AUDIO_F32SYS32-bit floating point samples in native byte order
AUDIO_F32AUDIO_F32LSB

Ver SDL_AudioFormat para más información.

channels especifica el número de canales de salida. A partir de SDL 2.0, los valores admitidos son 1 (mono), 2 (estéreo), 4 (cuádruple) y 6 (5.1).

i>samples especifica una unidad de datos de audio. Cuando se usa con SDL_OpenAudioDevice() se refiere al tamaño del buffer de audio en cuadros de muestra. Un cuadro de muestra es un trozo de datos de audio del tamaño especificado en format multiplicado por el número de canales. Cuando se utiliza SDL_AudioSpec con SDL_LoadWAV() samples se establece en 4096. El valor de este campo debe ser una potencia de dos.

Los valores silence y size son calculados por SDL_OpenAudioDevice().

Los datos de canal se intercalan. Las muestras estéreo se almacenan en orden izquierda/derecha. Quad se almacena en orden frontal-izquierda/frontal-derecha/posterior-izquierda/posterior-derecha. 5.1 se almacena en orden frontal-izquierdo/frontal-derecho/central/bajo-frecuencia/trasero-izquierdo/trasero-derecho ("bajo-frecuencia" es el altavoz ".1").

El prototipo de función para la callback es:

void SDL_AudioCallback(void*  userdata,
                       Uint8* stream,
                       int    len)

Donde sus parámetros son:

userdata
Un parámetro específico de la aplicación guardado en el campo userdata de la estructura SDL_AudioSpec.
stream
Un puntero al buffer de datos de audio llenado por SDL_AudioCallback().
len
La longitud de ese buffer en bytes.

Una vez que vuelve la retrollamada, el búfer deja de ser válido. Las muestras estéreo se almacenan en una ordenación LRLRLR.

La retrollamada debe inicializar completamente el buffer; a partir de SDL 2.0, este buffer no se inicializa antes de llamar a la llamada de retorno. Si no hay nada que reproducir, la llamada de retorno debe llenar el buffer con silencio.

Con SDL >= 2.0.4 se puede elegir evitar las retrollamadas y usar SDL_QueueAudio() en su lugar, si se desea. Simplemente hay que abrir tu dispositivo de audio con un callback NULL.

Ejemplo

SDL_AudioSpec want, have;
SDL_AudioDeviceID dev;

SDL_memset(&want, 0, sizeof(want)); /* or SDL_zero(want) */
want.freq = 48000;
want.format = AUDIO_F32;
want.channels = 2;
want.samples = 4096;
want.callback = MyAudioCallback;  // you wrote this function elsewhere.
dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, SDL_AUDIO_ALLOW_FORMAT_CHANGE);