Compartir a través de


Bloques de datos de audio

[La característica asociada a esta página, Waveform Audio, es una característica heredada. Se ha reemplazado por WASAPI y Audio Graphs. WASAPI y Audio Graphs se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use WASAPI y Audio Graphs en lugar de Waveform Audio, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Las funciones waveInAddBuffer y waveOutWrite requieren que las aplicaciones asignen bloques de datos para pasar a los controladores de dispositivo con fines de grabación o reproducción. Ambas funciones usan la estructura WAVEHDR para describir su bloque de datos.

Antes de usar una de estas funciones para pasar un bloque de datos a un controlador de dispositivo, debe asignar memoria para el bloque de datos y la estructura de encabezados que describe el bloque de datos. Los encabezados se pueden preparar y eliminar mediante las siguientes funciones.

Función Descripción
waveInPrepareHeader Prepara un bloque de datos de entrada de audio de forma de onda.
waveInUnprepareHeader Limpia la preparación en un bloque de datos de entrada de audio de forma de onda.
waveOutPrepareHeader Prepara un bloque de datos de salida de audio de forma de onda.
waveOutUnprepareHeader Limpia la preparación en un bloque de datos de salida de audio de forma de onda.

 

Antes de pasar un bloque de datos de audio a un controlador de dispositivo, debe preparar el bloque de datos pasandolo a waveInPrepareHeader o waveOutPrepareHeader. Cuando el controlador del dispositivo haya terminado con el bloque de datos y lo devuelva, debe limpiar esta preparación pasando el bloque de datos a waveInUnprepareHeader o waveOutUnprepareHeader antes de que se pueda liberar cualquier memoria asignada.

A menos que los datos de entrada y salida de audio de forma de onda sean lo suficientemente pequeños como para incluirse en un único bloque de datos, las aplicaciones deben proporcionar continuamente al controlador del dispositivo bloques de datos hasta que se complete la reproducción o grabación.

Incluso si se usa un único bloque de datos, una aplicación debe poder determinar cuándo un controlador de dispositivo ha terminado con el bloque de datos para que la aplicación pueda liberar la memoria asociada con el bloque de datos y la estructura del encabezado. Hay varias maneras de determinar cuándo finaliza un controlador de dispositivo con un bloque de datos:

  • Especificando una función de devolución de llamada para recibir un mensaje enviado por el controlador cuando haya terminado con un bloque de datos.
  • Mediante una devolución de llamada de evento
  • Especificando una ventana o un subproceso para recibir un mensaje enviado por el controlador cuando haya terminado con un bloque de datos.
  • Al sondear el bit de WHDR_DONE en el miembro dwFlags de la estructura WAVEHDR enviada con cada bloque de datos

Si una aplicación no obtiene un bloque de datos al controlador del dispositivo cuando es necesario, puede haber una brecha audible en la reproducción o una pérdida de información grabada entrante. Esto requiere al menos un esquema de almacenamiento en búfer doble: mantener al menos un bloque de datos delante del controlador del dispositivo.

En los temas siguientes se describen formas de determinar cuándo un controlador de dispositivo ha terminado con un bloque de datos:

Uso de una función de devolución de llamada para procesar mensajes del controlador