Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En un gráfico de filtros de audio, una secuencia de audio puede fluir desde el pin 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 un flujo de audio a un pin de recepción en un filtro o recibir un flujo de audio desde un pin de origen en un filtro solo si el cliente y el pin admiten un formato común para el flujo. Los filtros de audio usan una técnica denominada intersección de datos (abreviación de intersección de rangos de datos) para identificar un formato de flujo que es común entre dos pins o entre 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 admite cada patilla 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 muestreo
Número de canales
La estructura KSDATARANGE_AUDIO especifica los valores mínimo y máximo para los intervalos de bits por muestra y frecuencia de ejemplo, 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 pines consiste en buscar dos intervalos de datos, uno de cada pin, cada uno de los cuales se intersecta con el otro. Un par de intervalos de datos interseca 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 rangos del número de canales para dos pines siempre deben superponerse porque ambos pines admiten al menos un canal. Obviamente, un adaptador de hardware con un número mínimo de canales mayor 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 (vea el ejemplo en Propietario Data-Intersection Controladores).
Al buscar un par de intervalos de datos intersectantes para los dos pines, el manejador 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 ejemplo 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 números de canales.
Por ejemplo, al negociar un formato común para el pin de entrada 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 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 de forma iterativa 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 de intervalos de datos del pin receptor del controlador de miniport. A continuación, itera a través de la matriz, comenzando por el primer elemento, hasta que consigue encontrar una intersección entre los intervalos de datos de los pin de receptor y el rango de datos del pin de origen actual. El controlador selecciona un formato común que se encuentra dentro de la intersección y lo devuelve al llamante.
En cada paso de la iteración, el controlador de puerto llama al manejador de intersección de datos propietario del miniport con los dos intervalos de datos—uno para cada uno de los dos pines. 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 patilla de origen y un intervalo de datos de patilla receptor 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 pin. 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 los formatos preferidos hacia el principio de la matriz.