Compartir a través de


Latencia de WavePci

El controlador de puerto WavePci controla el almacenamiento en búfer de una transmisión de audio de forma diferente al controlador WaveCyclic.

Si el controlador minipuerto WavePci hace una combinación de hardware, DirectSound envía un IRP al controlador de puerto WavePci que contiene toda la transmisión de onda de DirectSound en un único búfer cíclico. DirectSound asigna el búfer como un bloque contiguo de memoria virtual. Para evitar que se copie el búfer de DirectSound, la capa de streaming basado en kernel asigna el búfer a la memoria virtual en modo kernel y genera una MDL (lista de descriptores de memoria) que indica las direcciones virtuales y físicas de las páginas de memoria en el búfer cíclico. El controlador de puerto WavePci divide el búfer cíclico en una secuencia de asignación de tramas (consulte Asignadores de KS). El controlador minipuerto indica el volumen de asignación de tramas preferido cuando el controlador de puerto llama al método IMiniportWavePciStream::GetAllocatorFraming durante la inicialización de la transmisión. Sin embargo, SysAudio, el generador de gráficos del sistema, puede invalidar las preferencias del controlador minipuerto para adaptarse a los requisitos de los demás componentes del gráfico de filtros de audio.

El controlador de puerto WavePci expone el búfer cíclico al controlador minipuerto como una secuencia de asignaciones. Una asignación es una trama de asignación completa o una parte de la trama. Si una trama de asignación determinada se encuentra completamente dentro de una página, el controlador de puerto presentará esa trama al controlador minipuerto como una sola asignación. Si una trama de asignación separa uno o varios límites de página, el controlador de puerto dividirá la trama en cada límite de página y la presentará como dos o varias asignaciones. Cada llamada a IPortWavePciStream::GetMapping genera la siguiente asignación sucesiva en la secuencia.

A diferencia del caso de WaveCyclic, donde el controlador minipuerto tiene poco control sobre la cantidad de milisegundos de datos que se almacenan en búfer en el hardware, el controlador minipuerto WavePci tiene bastante control sobre el número de asignaciones que tiene abierto en cualquier momento. El número de asignaciones abiertas aumenta en uno con cada llamada a GetMapping y disminuye en uno con cada llamada a ReleaseMapping. (Un llamada a GetMapping puede producir un error, por supuesto, por lo que el controlador tiene menos control total sobre el número de asignaciones). Al controlar el número de asignaciones abiertas y realizar un seguimiento del volumen acumulado de asignaciones, el controlador minipuerto puede determinar (dentro de una tolerancia en función del volumen de asignación) el número de milisegundos de almacenamiento en búfer que están disponibles para el hardware. El controlador minipuerto WavePci debe solicitar suficientes asignaciones de páginas para reducir las posibilidades de colapso a niveles aceptables.

Si la directiva del controlador minipuerto es almacenar en búfer hasta 50 milisegundos de datos, por ejemplo, entre los punteros de lectura y escritura, recuerde que este límite representa la cantidad máxima de datos que acumulará el controlador, pero no representa (ni debe representar) la contribución del controlador a la latencia de la transmisión. El controlador debe diseñarse para reducir la latencia todo lo posible. Cuando un controlador minipuerto recibe el conjunto inicial de asignaciones antes de empezar a reproducir una nueva transmisión, el controlador minipuerto puede seguir solicitando asignaciones hasta que alcance el límite del búfer (50 milisegundos en este ejemplo) o no habrá más asignaciones disponibles de forma inmediata. Sin embargo, en este último caso, el controlador minipuerto no debe esperar hasta que haya más asignaciones disponibles antes de empezar a reproducir la transmisión. En su lugar, el controlador debe empezar a reproducir inmediatamente las asignaciones que ya ha obtenido. Luego, a medida que haya más asignaciones disponibles, el controlador puede seguir recibiendo asignaciones adicionales hasta que alcance el límite de tamaño del búfer o no haya más asignaciones disponibles de forma inmediata.

En general, el hardware de DMA de un dispositivo WavePci debe diseñarse para acceder directamente a tramas de audio almacenadas en alineaciones arbitrarias de bytes y que se encuentran entre páginas no contiguas de memoria física. Si tiene un dispositivo que requiere que las asignaciones sean un número entero de tramas de audio, ese dispositivo estará limitado en los tipos de formatos de audio que admita. Aun así, un dispositivo con esta limitación debería ser capaz de controlar un volumen de tramas de audio que sea una potencia de dos.

Por ejemplo, un dispositivo con cuatro canales y un tamaño de muestra de 16 bits requiere un volumen de tramas de audio de ocho bytes. Un número entero de tramas de audio se ajusta perfectamente a una página (o cualquier otro volumen de tramas de asignación que sea múltiplo de ocho bytes). Sin embargo, en el caso de una transmisión de canal 5.1 con muestreos de 16 bits, el tamaño de la trama de audio será de 12 bytes y una transmisión que supere el tamaño de una sola página necesariamente incluirá tramas de audio que sobrepasarán los límites de página. (Las cifras de Filtros de onda dan buena cuenta de este problema). El hardware que no puede controlar las alineaciones arbitrarias de bytes y las asignaciones arbitrarias de longitud de bytes deben depender del controlador para realizar una copia intermedia, lo que afecta negativamente al rendimiento.

El controlador de adaptador de ejemplo Ac97 del Kit para controladores de Microsoft Windows (WDK) implementa un método GetAllocatorFraming. El controlador minipuerto usa este método para comunicar su volumen de asignación de tramas preferido. En Windows 2000 y Windows Me, el controlador de puerto llama a este método solo cuando se crea una instancia del controlador del sistema de Splitter (Splitter.sys) encima del pin de salida. En Windows XP y versiones posteriores, el controlador de puerto también llama a este método para las transmisiones de entrada. Recuerde que SysAudio puede ignorar las preferencias del controlador minipuerto al decidir un volumen de asignación de tramas.