Compartilhar via


Interseção de dados

Em um grafo de filtro de áudio, um fluxo de áudio pode fluir do pino de origem de um filtro para o pino do coletor de outro filtro somente se os dois pinos derem suporte a um formato comum para o fluxo. Da mesma forma, um cliente pode enviar um fluxo de áudio para um pino de coletor em um filtro ou receber um fluxo de áudio de um pino de origem em um filtro somente se o cliente e o pino derem suporte a um formato de fluxo comum. Os filtros de áudio usam uma técnica chamada interseção de dados (abreviação de interseção de intervalo de dados) para identificar um formato de fluxo comum a dois pinos ou a um cliente e um pino.

Por exemplo, no Windows Server 2003, Windows XP, Windows 2000 e Windows Me/98, o driver do sistema SysAudio usa a técnica de interseção de dados para construir um grafo de filtro de áudio conectando pares de pinos de filtro que dão suporte a formatos de dados de áudio compatíveis.

Uma fábrica de pinos especifica o conjunto de formatos aos quais cada pino dá suporte como uma matriz de intervalos de dados, em que cada intervalo de dados é uma estrutura do tipo KSDATARANGE_AUDIO. Um intervalo de dados especifica um tipo de formato geral, que pode ser KSDATAFORMAT_WAVEFORMATEX ou KSDATAFORMAT_DSOUND. Além disso, o intervalo de dados especifica um intervalo de valores para cada um dos seguintes parâmetros:

  • Bits por amostra

  • Frequência de exemplo

  • Número de canais

A estrutura KSDATARANGE_AUDIO especifica valores mínimos e máximos para os intervalos bits por amostra e frequência de amostra, mas apenas um máximo para o intervalo de número de canais. O número mínimo de canais é implicitamente um.

O trabalho de negociar um formato de dados comum para dois pinos consiste em localizar dois intervalos de dados, um de cada pin, que se cruzam entre si. Um par de intervalos de dados se cruza se:

  • Eles dão suporte ao mesmo formato de onda geral (KSDATAFORMAT_WAVEFORMATEX ou KSDATAFORMAT_DSOUND).

  • Seus intervalos de bits por amostra se sobrepõem.

  • Seus intervalos de frequência de exemplo se sobrepõem.

Conforme mencionado anteriormente, a estrutura de KSDATAFORMAT_AUDIO implica um modelo de hardware no qual o número mínimo de canais com suporte por um pin é sempre um. De acordo com esse modelo, os intervalos de número de canais para dois pinos sempre devem se sobrepor porque ambos os pinos dão suporte a pelo menos um canal. Obviamente, um adaptador de hardware com um número mínimo de canais maior que um não está em conformidade com esse modelo, mas o driver do adaptador pode incluir um manipulador de interseção de dados proprietário para lidar com esse tipo de problema (consulte o exemplo em Manipuladores de Data-Intersection Proprietários).

Ao encontrar um par de intervalos de dados de interseção para os dois pinos, o manipulador seleciona um formato de dados comum na região da interseção da seguinte maneira:

  • O número de bits por amostra é selecionado na região em que os dois intervalos de bits por amostra se sobrepõem.

  • A frequência de exemplo é selecionada na região em que os dois intervalos de frequência de amostra se sobrepõem.

  • O número de canais é selecionado na região em que os dois intervalos de número de canais se sobrepõem.

Por exemplo, ao negociar um formato comum para o pino do coletor de um driver de porta de áudio e o pino de origem de outro filtro (normalmente, o driver do sistema KMixer), o SysAudio primeiro obtém a matriz de intervalo de dados do pino de origem. O SysAudio envia uma solicitação de KSPROPERTY_PIN_DATAINTERSECTION para o pino do coletor e inclui a matriz de intervalo de dados do pino de origem com essa solicitação. A camada de streaming de kernel intercepta a solicitação e chama iterativamente o manipulador de interseção de dados do driver de porta uma vez para cada elemento sucessivo na matriz de intervalo de dados do pino de origem, começando com o primeiro elemento, até que o manipulador consiga encontrar uma interseção de dados.

Com cada chamada que sysAudio faz para o manipulador de interseção de dados do driver de porta, o manipulador primeiro obtém a matriz de intervalo de dados do pino do coletor do driver de miniporto. Em seguida, itera pela matriz, começando com o primeiro elemento, até que ele consiga encontrar uma interseção entre um intervalo de dados de pino de coletor e o intervalo de dados de pino de origem atual. O manipulador seleciona um formato comum que está dentro da interseção e gera esse formato para o chamador.

Em cada etapa da iteração, o driver de porta chama o manipulador de interseção de dados proprietário do driver de miniport com os dois intervalos de dados– um para cada um dos dois pinos. Se, em qualquer etapa, o manipulador proprietário se recusar a lidar com uma interseção de dados marcar entre os dois intervalos de dados, o manipulador de interseção de dados do driver de porta executará a marcar.

Para resumir, a pesquisa por uma interseção entre um intervalo de dados de pino de origem e um intervalo de dados de pino de coletor é um processo iterativo:

  • No loop externo, a camada de streaming de kernel itera por meio de elementos sucessivos na matriz de intervalo de dados do pino de origem, começando com o primeiro elemento de matriz.

  • No loop interno, o driver de porta itera por meio de elementos sucessivos na matriz de intervalo de dados do pino do coletor, começando com o primeiro elemento de matriz.

A pesquisa para ao localizar a primeira interseção de dados. Esse processo tende a favorecer os elementos para o início da matriz de intervalo de dados de cada pino. Ao especificar uma matriz de intervalos de dados para um pin, um driver de adaptador deve ordenar os elementos da matriz colocando intervalos de dados para formatos preferenciais no início da matriz.