SDL_mixer.h

Función Mix_OpenAudioDevice

Sintaxis

int Mix_OpenAudioDevice(int frequency, Uint16 format, int channels, int chunksize, const char* device, int allowed_changes);

Descripción

Abre un dispositivo de audio específico para su reproducción.

Parámetros

frequency
La frecuencia a la que se reproducirá el audio (en Hz).
format
Formato de audio, uno de los valores AUDIO_* de SDL.
channels
Número de canales (1 es mono, 2 es estéreo, etc).
chunksize
Tamaño del buffer de audio en FRAMES de muestra (total de muestras dividido por el número de canales).
device
El nombre del dispositivo a abrir, o NULL para elegir un predeterminado razonable.
allowed_changes
Permitir banderas de cambio (ver banderas SDL_AUDIO_ALLOW_*)

Valor de retorno

Devuelve 0 en caso de éxito, -1 en caso de error.

Observaciones

(Una versión ligeramente más simple de esta función está disponible en Mix_OpenAudio(), que aún así podría satisfacer las necesidades de la mayoría de las aplicaciones).

Un dispositivo de audio es lo que genera sonido, por lo que la aplicación debe abrir uno para hacer ruido.

Esta función comprobará si el sistema de audio de SDL está inicializado, y si no, lo inicializará llamando a SDL_Init(SDL_INIT_AUDIO). Se puede (y se recomienda) a inicializarlo antes de llamar a esta función, ya que esto da al programa más control sobre el proceso.

Si no se está particularmente preocupado por los detalles del dispositivo de audio, y los datos no están en un formato específico, los valores que se utilicen aquí pueden ser simplemente valores por defecto razonables. SDL_mixer convertirá los datos de audio que se le proporcionen al formato correcto bajo demanda.

Dicho esto, si se tiene el control de los datos de audio y se conoce su formato de antemano, se puede ahorrar tiempo de CPU abriendo el dispositivo de audio en ese formato exacto para que SDL_mixer no tenga que gastar tiempo convirtiendo nada entre bastidores, y pueda simplemente pasar los datos directamente al hardware. En algunas plataformas, donde el hardware sólo soporta configuraciones específicas, puede que se tenga que tener cuidado para que todo coincida, pero los datos propios son a menudo más fáciles de controlar, así que se debe intentar abrir el dispositivo para lo que se necesite.

La otra razón para preocuparse por formatos específicos: si se planea tocar el buffer de mezcla directamente (con Mix_SetPostMix, un efecto registrado, o Mix_HookMusic), puede que se tenga código que espere que esté en un formato específico, y se debería especificar aquí.

La frecuencia del dispositivo de audio se especifica en Hz; en los tiempos modernos, 48000 es a menudo un valor predeterminado razonable.

El formato del dispositivo de audio es una de las constantes AUDIO_* de SDL. AUDIO_S16SYS (audio de 16 bits) es probablemente un valor por defecto seguro. Los sistemas más modernos pueden preferir AUDIO_F32SYS (audio de 32 bits en coma flotante).

Los canales del dispositivo de audio son generalmente 1 para salida mono, o 2 para estéreo, pero el valiente puede probar configuraciones de sonido envolvente con 4 (quad), 6 (5.1), 7 (6.1) u 8 (7.1).

El tamaño del chunk del dispositivo de audio es el número de fotogramas de muestra (una muestra por fotograma para salida mono, dos muestras por fotograma en una configuración estéreo, etc.) que se introducen en el dispositivo a la vez. Cuanto menor sea el número, menor será la latencia, pero se corre el riesgo de que se produzcan caídas si es demasiado bajo. 2048 suele ser un valor por defecto razonable, pero tu aplicación podría experimentar con 1024 o 4096.

Solo se puede tener abierto un dispositivo de audio a la vez; si se quiere cambiar un ajuste, se debe cerrar el dispositivo y volver a abrirlo, algo que no se puede hacer sin problemas durante la reproducción.

Esta función permite seleccionar el hardware de audio específico en el sistema con el parámetro device. Si se especifica NULL, SDL_mixer elegirá el mejor predeterminado que pueda (que, en muchos casos, es exactamente lo que se quiere de todos modos). SDL_mixer no ofrece un mecanismo para determinar los nombres de los dispositivos a abrir, pero se puede utilizar SDL_GetNumAudioDevices() para obtener un recuento de los dispositivos disponibles y luego SDL_GetAudioDeviceName() en un bucle para obtener una lista. Si se hace esto, hay que asegurarse de llamar primero a SDL_Init(SDL_INIT_AUDIO) para inicializar el sistema de audio de SDL.

El parámetro allowed_changes especifica qué ajustes son flexibles. Estas son las banderas SDL_AUDIO_ALLOW_* de SDL. Estos le dicen a SDL_mixer que a la aplicación no le importa si un ajuste específico cambia. Por ejemplo, la aplicación puede necesitar datos estéreo en formato Sint16, pero si la frecuencia de muestreo o el tamaño del chunk cambia, la aplicación puede manejarlo. En ese caso, la aplicación especificaría SDL_AUDIO_ALLOW_FORMAT_CHANGE|SDL_AUDIO_ALLOW_SAMPLES_CHANGE. En este caso, si el hardware del sistema requiere algo distinto al formato solicitado, SDL_mixer puede seleccionar lo que el hardware demanda en lugar de la app. Si la bandera SDL_AUDIO_ALLOW_ no es especificada, SDL_mixer debe convertir los datos entre bastidores entre lo que la aplicación demanda y lo que el hardware requiere. Si la app necesita precisamente lo que se solicita, especificar cero para allowed_changes.

Si se permitieron cambios, la aplicación puede utilizar Mix_QuerySpec() para determinar la configuración final del dispositivo.

Si esta función se ejecuta correctamente, se está listo para empezar a hacer ruido. Se pueden cargar algunos datos de audio y empezar a tocar.

Cuando se termine con un dispositivo de audio, probablemente al final del programa, la app debería deshacerse del dispositivo con Mix_CloseAudio().