Compartir a través de


Latencia de WavePci

El controlador de puerto WavePci controla el almacenamiento en búfer de una secuencia de audio de forma diferente del controlador WaveCíclico.

Si el controlador de miniporte WavePci proporciona mezcla por hardware, DirectSound envía un IRP al controlador de puerto WavePci que contiene toda la transmisión de audio de DirectSound en un único búfer cíclico. DirectSound asigna el búfer como un bloque contiguo de memoria virtual. Para evitar copiar el búfer de DirectSound, la capa de streaming del kernel asigna el búfer a la memoria virtual en modo kernel y genera una MDL (lista de descriptores de memoria) que especifica 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 frames de asignación (consulte Asignadores KS). El controlador de miniport especifica su tamaño de marco de asignador preferido cuando el controlador de puerto llama a su método IMiniportWavePciStream::GetAllocatorFraming durante la inicialización de la secuencia. Sin embargo, SysAudio, el generador de gráficos del sistema, puede invalidar las preferencias del controlador de miniporte 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 de miniporte como una secuencia de asignaciones. Un mapeo es o bien un marco de asignación completo o una parte de un marco. Si un marco de asignación determinado se encuentra completamente dentro de una página, el controlador de puerto presenta dicho marco al controlador miniport como un solo mapeo. Si un marco de asignación separa uno o varios límites de página, el controlador de puertos divide el marco en cada límite de página y lo presenta como dos o más mapeos. Cada llamada a IPortWavePciStream::GetMapping produce la siguiente asignación sucesiva en la secuencia.

A diferencia del caso WaveCyclic, donde el controlador de minipuerto tiene poco control sobre cuántos milisegundos de datos se almacenan en búfer en el hardware, el controlador de miniport WavePci tiene un control considerable sobre el número de asignaciones que tiene abiertos en cualquier momento. El número de mapeos abiertos aumenta en uno con cada llamada a GetMapping y disminuye en uno con cada llamada a ReleaseMapping. (Una llamada a GetMapping puede producir un error, por supuesto, por lo que el controlador tiene menos de control total sobre el número de asignaciones). Al controlar el número de asignaciones abiertas y realizar un seguimiento del tamaño acumulado de las asignaciones, el controlador de miniporte puede determinar (dentro de una tolerancia dependiente del tamaño de asignación) el número de milisegundos de almacenamiento en búfer que están disponibles para el hardware. El controlador de miniporte WavePci debe solicitar suficientes mapeos de páginas para reducir las posibilidades de escasez a niveles aceptables.

Si la directiva del controlador de miniporte 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 y no debe representar la contribución del controlador a la latencia de la secuencia. El controlador debe diseñarse para mantener su latencia lo más pequeña posible. Cuando un controlador de miniporte obtiene su conjunto inicial de asignaciones antes de empezar a reproducir una nueva secuencia, el controlador de miniporte puede seguir solicitando asignaciones hasta que alcance su límite de búfer (50 milisegundos en este ejemplo) o no haya más asignaciones disponibles inmediatamente. Sin embargo, en este último caso, el controlador de miniporte no debe esperar hasta que haya más asignaciones disponibles antes de empezar a reproducir la secuencia. En su lugar, el controlador debe empezar a ejecutar inmediatamente las asignaciones que ya ha obtenido. Más adelante, a medida que haya más asignaciones disponibles, el controlador puede seguir adquierendo asignaciones adicionales hasta que alcance su límite de tamaño de búfer o no haya más asignaciones disponibles inmediatamente.

En general, el hardware DMA de un dispositivo WavePci debe diseñarse para acceder directamente a marcos de audio almacenados en alineaciones arbitrarias de bytes y que cruzan los límites entre páginas no contiguas de memoria física. Si tiene un dispositivo que requiere que los mapeos sean un número entero de fotogramas de audio, ese dispositivo está limitado en los formatos de audio que admite. Por supuesto, un dispositivo con esta limitación todavía debe ser capaz de manejar un tamaño de fotograma 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 tamaño de marco de audio de ocho bytes. Una cantidad entera de marcos de audio se ajusta perfectamente dentro de una página (o cualquier otro tamaño del marco de asignación que sea un múltiplo de ocho bytes). Sin embargo, en el caso de una secuencia de 5.1 canales con muestras de 16 bits, el tamaño de la trama de audio es de 12 bytes y una secuencia que supera el tamaño de una sola página necesariamente contiene tramas de audio que se extienden por los límites de página. (Las cifras de Filtros de Onda ilustran este problema). El hardware que no puede manejar las alineaciones arbitrarias de bytes y las asignaciones de longitud de bytes arbitrarias debe depender del controlador para realizar una copia intermedia, lo que degrada el rendimiento.

El controlador de adaptador de ejemplo AC97 del Kit de controladores de Microsoft Windows (WDK) implementa un método GetAllocatorFraming. El controlador de miniporte usa este método para comunicar su tamaño de asignación de fotogramas 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 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 flujos de entrada. Recuerde que SysAudio puede optar por ignorar las preferencias del controlador miniport al decidir el tamaño de asignación de fotogramas.