Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Em um gráfico 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 suportarem um formato comum para o fluxo. Da mesma forma, um cliente pode enviar um fluxo de áudio para um pino de sumidouro num filtro ou receber um fluxo de áudio de um pino de origem num filtro apenas se o cliente e o pino suportarem um formato de transmissão 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 que é 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 gráfico de filtro de áudio conectando pares de pinos de filtro que suportam formatos de dados de áudio compatíveis.
Uma fábrica de pinos especifica o conjunto de formatos que cada pino suporta como uma matriz de intervalos de dados, onde 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 da amostra
Número de canais
A estrutura KSDATARANGE_AUDIO especifica valores mínimos e máximos para os intervalos de bits por amostra e de 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 encontrar dois intervalos de dados - um de cada pino - que se cruzam. Um par de intervalos de dados se cruzam se:
Eles suportam o mesmo formato de onda geral (KSDATAFORMAT_WAVEFORMATEX ou KSDATAFORMAT_DSOUND).
Seus intervalos de bits por amostra se sobrepõem.
As suas gamas de frequências de amostragem sobrepõem-se.
Como mencionado anteriormente, a estrutura KSDATAFORMAT_AUDIO implica um modelo de hardware em que o número mínimo de canais suportados por um pino é sempre um. De acordo com este modelo, os intervalos de número de canais para quaisquer dois pinos devem sempre sobrepor-se, porque ambos os pinos suportam 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 (veja 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 da região de interseção da seguinte maneira:
O número de bits por amostra é selecionado a partir da região na qual os dois intervalos de bits por amostra se sobrepõem.
A frequência da amostra é selecionada a partir da região em que as duas gamas de frequências da amostra se sobrepõem.
O número de canais é selecionado a partir da 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 de saída de um driver de porta de áudio e o pino de origem de outro filtro (normalmente, o driver do sistema KMixer), o SysAudio obtém primeiro o array de intervalos de dados do pino de origem. Em seguida, o SysAudio envia uma solicitação KSPROPERTY_PIN_DATAINTERSECTION para o pino de receção e inclui a matriz de intervalo de dados do pino de origem com essa solicitação. A camada de streaming do kernel interceta 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.
Cada vez que o SysAudio faz uma chamada para o controlador de interseção de dados do driver de porta, o controlador primeiro obtém o array de intervalo de dados do pino de saída do driver de miniporta. Em seguida, ele itera através da matriz, começando com o primeiro elemento, até conseguir 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 envia 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 miniporta 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 verificação de interseção de dados entre os dois intervalos de dados, o manipulador de interseção de dados do driver de porta executará a verificação.
Para resumir, a busca por uma interseção entre um intervalo de dados de pino de origem e um intervalo de dados de pino de destino é um processo iterativo:
No loop externo, a camada de streaming do kernel itera através 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 controlador de porta itera através dos elementos sucessivos na matriz de intervalo de dados do pino de destino, começando com o primeiro elemento da matriz.
A pesquisa para ao encontrar a primeira intersecção de dados. Este processo tende a favorecer os elementos em direção ao início da matriz de intervalos de dados de cada pino. Ao especificar uma matriz de intervalos de dados para um pino, um driver de adaptador deve ordenar os elementos da matriz colocando intervalos de dados para formatos preferenciais no início da matriz.