Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Em um grafo de filtro de áudio, um fluxo de áudio poderá 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 destino em um filtro ou receber um fluxo de áudio de um pino de origem em um filtro somente se o cliente e o pino oferecerem 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 que 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 amostragem
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 pin, que se cruzam. Um par de intervalos de dados se cruza se:
Eles dão suporte ao mesmo formato de onda geral (KSDATAFORMAT_WAVEFORMATEX ou KSDATAFORMAT_DSOUND).
Os intervalos de bits por amostra se sobrepõem.
Seus intervalos de frequência de amostragem se sobrepõem.
Conforme mencionado anteriormente, a estrutura de KSDATAFORMAT_AUDIO implica em 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 da região de interseção da seguinte maneira:
O número de bits por amostra é selecionado na região na qual os intervalos de bits por amostra se sobrepõem.
A frequência de exemplo é selecionada na região na qual os dois intervalos de frequência de exemplo se sobrepõem.
O número de canais é selecionado na região na qual os dois intervalos de número de canais se sobrepõem.
Por exemplo, durante a negociação do formato comum para o pino de destino 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 intervalos de dados do pino de origem. O SysAudio envia uma solicitação KSPROPERTY_PIN_DATAINTERSECTION para o pino de destino e inclui a matriz de intervalo de dados do pino de origem com essa solicitação. A camada de streaming do kernel intercepta a solicitação e chama o manipulador de interseção de dados do driver de porta de forma iterativa uma vez para cada elemento sucessivo na matriz de faixa de dados do pino de origem, começando com o primeiro elemento, até que o manipulador consiga encontrar uma interseção de dados.
A cada chamada feita pelo SysAudio 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 de entrada do driver de miniporto. Em seguida, varre a matriz, começando com o primeiro elemento, até encontrar uma interseção entre um intervalo de dados de pino de saída e o intervalo de dados de pino de origem atual. O manipulador seleciona um formato comum que se encontra na interseção e transmite esse formato ao 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 realizar 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 realiza 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 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 pino, um driver de adaptador deve ordenar os elementos da matriz colocando intervalos de dados para formatos preferenciais no início da matriz.