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:
format | Significado |
---|---|
AUDIO_S8 | signed 8-bit samples |
AUDIO_U8 | unsigned 8-bit samples |
AUDIO_S16LSB | signed 16-bit samples in little-endian byte order |
AUDIO_S16MSB | signed 16-bit samples in big-endian byte order |
AUDIO_S16SYS | signed 16-bit samples in native byte order |
AUDIO_S16 | AUDIO_S16LSB |
AUDIO_U16LSB | unsigned 16-bit samples in little-endian byte order |
AUDIO_U16MSB | unsigned 16-bit samples in big-endian byte order |
AUDIO_U16SYS | unsigned 16-bit samples in native byte order |
AUDIO_U16 | AUDIO_U16LSB |
AUDIO_S32LSB | 32-bit integer samples in little-endian byte order |
AUDIO_S32MSB | 32-bit integer samples in big-endian byte order |
AUDIO_S32SYS | 32-bit integer samples in native byte order |
AUDIO_S32 | AUDIO_S32LSB |
AUDIO_F32LSB | 32-bit floating point samples in little-endian byte order |
AUDIO_F32MSB | 32-bit floating point samples in big-endian byte order |
AUDIO_F32SYS | 32-bit floating point samples in native byte order |
AUDIO_F32 | AUDIO_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);