Latencia de transmisión durante la reproducción
Mientras una secuencia de reproducción de audio está en estado Ejecutar, el rol del controlador de puerto WaveRT es mínimo. Como se muestra en el diagrama siguiente, durante la reproducción, el cliente del controlador de puerto waveRT escribe sus datos en el búfer cíclico y el dispositivo de audio lee estos datos del búfer. Esta actividad no requiere intervención del controlador de puerto. En otras palabras, los datos de audio fluyen directamente entre la aplicación en modo de usuario y el hardware de audio sin que los componentes de software del modo kernel los toquen.
En el diagrama, las posiciones de escritura y reproducción avanzan continuamente de izquierda a derecha a medida que el flujo de datos de audio fluye a través del búfer cíclico. El búfer se describe como cíclico porque cuando la posición de reproducción o la posición de escritura llega al final del búfer, se ajusta automáticamente al inicio del búfer.
La latencia de secuencia durante la reproducción tiene dos orígenes principales, designados en el diagrama siguiente como A y B.
En el diagrama anterior, la posición de escritura es la ubicación justo después del último ejemplo que el cliente escribió en el búfer. La posición de reproducción es la muestra que el dispositivo de audio está reproduciendo actualmente a través del altavoz.
Latencia desde el momento en que el cliente escribe una muestra de audio en el búfer hasta que el dispositivo de audio reproduce simplemente es la separación entre las posiciones de escritura y reproducción. Esta separación es la suma de los dos orígenes siguientes de latencia (marcados como A y B en el diagrama):
Latencia A: después de que el dispositivo de audio lee los datos del búfer, los datos residen en un búfer de hardware "primero, primero en salir" (FIFO) hasta que el dispositivo de audio relojiza los datos a través del convertidor digital a analógico (DAC).
Latencia B: después de que el cliente escriba datos en el búfer cíclico, los datos residen en el búfer hasta que el dispositivo de audio lee los datos.
El cliente no tiene control sobre la latencia A, que depende completamente del hardware. Un FIFO típico podría almacenar suficientes muestras para alimentar la DAC durante aproximadamente 64 tics del reloj de muestra. Sin embargo, el cliente controla la latencia B. Si la latencia B es demasiado grande, se introducen retrasos innecesarios en el sistema; sin embargo, lo que hace que sea demasiado pequeño riesgo de agotar el dispositivo de audio.
Aunque el cliente puede configurar un temporizador para activar periódicamente su subproceso de escritura en búfer, este método no logra la latencia más pequeña. Para reducir aún más la latencia, el cliente puede configurar el dispositivo para generar una notificación de hardware cada vez que el dispositivo termine de leer un nuevo bloque de datos de reproducción del búfer. En este caso, el subproceso de cliente se activa mediante notificaciones de hardware en lugar de por un temporizador.
Al hacer que el dispositivo de audio notifique al cliente cada vez que termine de leer un bloque de datos del búfer, el cliente puede hacer que la latencia sea más pequeña que, de lo contrario, sería práctica.
El cliente puede obtener un resumen de los retrasos que contribuyen a la latencia del flujo mediante el envío de una solicitud de KSPROPERTY_RTAUDIO_HWLATENCY al controlador de puerto waveRT.
Una vez que el cliente determina la cantidad de separación que se debe mantener entre las posiciones de escritura y de reproducción, el cliente supervisa los cambios en la posición de juego para determinar hasta dónde avanzar la posición de escritura. En Windows Server 2008 y sistemas operativos posteriores, el cliente envía una solicitud de propiedad de KSPROPERTY_RTAUDIO_POSITIONREGISTER para determinar la posición de juego. La compatibilidad con esta característica se proporciona mediante mejoras en el controlador del sistema PortCls.
Si el dispositivo de audio tiene un registro de posición como se muestra en el diagrama anterior, la solicitud de propiedad asigna el registro a una dirección de memoria virtual que es accesible para el cliente en modo de usuario. Una vez asignado el registro de posición, el cliente puede leer el contenido de la dirección de memoria para determinar la posición de reproducción actual.