Intersección de datos
En un gráfico de filtros de audio, una secuencia de audio puede fluir desde la patilla de origen de un filtro hasta la patilla receptora de otro filtro solo si los dos patillas admiten un formato común para la secuencia. Del mismo modo, un cliente puede enviar una secuencia de audio a un anclaje receptor en un filtro o recibir una secuencia de audio de un pin de origen en un filtro solo si el cliente y la patilla admiten un formato de secuencia común. Los filtros de audio usan una técnica denominada intersección de datos (corta para la intersección de intervalos de datos) para identificar un formato de secuencia común a dos patillas o a un cliente y un pin.
Por ejemplo, en Windows Server 2003, Windows XP, Windows 2000 y Windows Me/98, el controlador del sistema SysAudio usa la técnica de intersección de datos para construir un grafo de filtro conectando pares de patillas de filtro que admiten formatos de datos de audio compatibles.
Un generador de patillas especifica el conjunto de formatos que cada patilla admite como una matriz de intervalos de datos, donde cada intervalo de datos es una estructura de tipo KSDATARANGE_AUDIO. Un intervalo de datos especifica un tipo de formato general, que puede ser KSDATAFORMAT_WAVEFORMATEX o KSDATAFORMAT_DSOUND. Además, el intervalo de datos especifica un intervalo de valores para cada uno de los parámetros siguientes:
Bits por muestra
Frecuencia de ejemplo
Número de canales
La estructura de KSDATARANGE_AUDIO especifica valores mínimos y máximos para los intervalos de bits por muestra y frecuencia de muestra, pero solo un máximo para el intervalo de número de canales. El número mínimo de canales es implícitamente uno.
El trabajo de negociar un formato de datos común para dos patillas consiste en buscar dos intervalos de datos,uno de cada pin, que se interseca entre sí. Un par de intervalos de datos se intersecan si:
Admiten el mismo formato de onda general (KSDATAFORMAT_WAVEFORMATEX o KSDATAFORMAT_DSOUND).
Sus intervalos de bits por muestra se superponen.
Sus intervalos de frecuencia de muestra se superponen.
Como se mencionó anteriormente, la estructura de KSDATAFORMAT_AUDIO implica un modelo de hardware en el que el número mínimo de canales admitidos por un pin siempre es uno. Según este modelo, los intervalos de número de canales para los dos pines siempre deben superponerse porque ambos patillas admiten al menos un canal. Obviamente, un adaptador de hardware con un número mínimo de canales mayores que uno no se ajusta a este modelo, pero el controlador del adaptador puede incluir un controlador de intersección de datos propietario para tratar este tipo de problema (consulte el ejemplo en Propietario Data-Intersection Controladores).
Después de encontrar un par de intervalos de datos intersecntes para los dos pines, el controlador selecciona un formato de datos común de la región de intersección de la siguiente manera:
El número de bits por muestra se selecciona en la región en la que se superponen los dos intervalos de bits por muestra.
La frecuencia de muestra se selecciona en la región en la que se superponen los dos intervalos de frecuencia de muestra.
El número de canales se selecciona de la región en la que se superponen los dos intervalos de canales.
Por ejemplo, al negociar un formato común para el anclaje receptor del controlador de puerto de audio y el pin de origen de otro filtro (normalmente, el controlador del sistema KMixer), SysAudio obtiene primero la matriz de intervalos de datos del pin de origen. A continuación, SysAudio envía una solicitud de KSPROPERTY_PIN_DATAINTERSECTION al pin receptor e incluye la matriz de intervalos de datos del pin de origen con esta solicitud. La capa de streaming de kernel intercepta la solicitud y llama iterativamente al controlador de intersección de datos del controlador de puerto una vez para cada elemento sucesivo de la matriz de intervalos de datos del pin de origen, empezando por el primer elemento, hasta que el controlador consigue encontrar una intersección de datos.
Con cada llamada que SysAudio realiza al controlador de intersección de datos del controlador de puerto, el controlador obtiene primero la matriz del intervalo de datos del pin receptor del controlador de miniporte. A continuación, recorre en iteración la matriz, empezando por el primer elemento, hasta que se consigue encontrar una intersección entre un intervalo de datos de patillas receptoras y el intervalo de datos del pin de origen actual. El controlador selecciona un formato común que se encuentra dentro de la intersección y genera este formato al autor de la llamada.
En cada paso de la iteración, el controlador de puerto llama al controlador de intersección de datos propietario del controlador de miniporte con los dos intervalos de datos, uno para cada una de las dos patillas. Si en cualquier paso, el controlador propietario rechaza controlar una comprobación de intersección de datos entre los dos intervalos de datos, el controlador de intersección de datos del controlador de puerto realiza la comprobación en su lugar.
En resumen, la búsqueda de una intersección entre un intervalo de datos de patillas de origen y un intervalo de datos de patillas receptores es un proceso iterativo:
En el bucle externo, la capa de streaming de kernel recorre en iteración los elementos sucesivos de la matriz de intervalos de datos del pin de origen, empezando por el primer elemento de matriz.
En el bucle interno, el controlador de puerto recorre en iteración los elementos sucesivos de la matriz de intervalos de datos del pin receptor, empezando por el primer elemento de matriz.
La búsqueda se detiene al encontrar la primera intersección de datos. Este proceso tiende a favorecer los elementos hacia el principio de la matriz de intervalos de datos de cada patilla. Al especificar una matriz de intervalos de datos para un pin, un controlador de adaptador debe ordenar los elementos de matriz colocando intervalos de datos para formatos preferidos hacia el principio de la matriz.