Descritores de Wave-Format extensíveis
A figura a seguir mostra o descritor de formato de dados para um fluxo de áudio de onda.
Conforme indicado na figura, a quantidade de informações de formato adicionais após a estrutura KSDATAFORMAT varia dependendo do formato de dados.
Os sistemas de áudio usam esse tipo de descritor de formato de várias maneiras:
Um descritor de formato como o mostrado na figura anterior é passado como um parâmetro de chamada para o método NewStream de um driver de miniport (por exemplo, consulte IMiniportWaveCyclic::NewStream).
O parâmetro ResultantFormat do método IMiniport::D ataRangeIntersection aponta para um buffer no qual o método grava um descritor de formato como o mostrado na figura anterior.
O KSPROPERTY_PIN_DATAINTERSECTION solicitação get-property recupera um descritor de formato como o mostrado na figura anterior.
O KSPROPERTY_PIN_PROPOSEDATAFORMAT solicitação set-property aceita um descritor de formato como o mostrado na figura anterior.
Um formato semelhante é usado para o parâmetro de chamada Connect da função KsCreatePin. Esse parâmetro aponta para a estrutura KSPIN_CONNECT no início de um buffer que também contém um descritor de formato. O descritor de formato, que segue imediatamente a estrutura KSPIN_CONNECT, começa com uma estrutura KSDATAFORMAT como a mostrada na figura anterior.
As informações de formato que seguem a estrutura KSDATAFORMAT devem ser uma estrutura WAVEFORMATEXTENSIBLE . WAVEFORMATEXTENSIBLE é uma versão estendida de WAVEFORMATEX que pode descrever uma gama mais ampla de formatos do que WAVEFORMATEX.
WAVEFORMAT é obsoleto e não é compatível com o subsistema de áudio WDM em nenhuma versão do Microsoft Windows. A estrutura PCMWAVEFORMAT é uma versão estendida de WAVEFORMAT que também está obsoleta.
As quatro estruturas de formato de onda – WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX e WAVEFORMATEXTENSIBLE – começam com os mesmos cinco membros, começando com wFormatTag. A figura anterior mostra essas quatro estruturas sobrepostas umas sobre as outras para realçar as partes das estruturas idênticas.
WAVEFORMATEXTENSIBLE estende WAVEFORMATEX adicionando três membros, começando com Samples.wValidBitsPerSample. (Amostras é uma união cujo outro membro, wValidSamplesPerBlock, é usado em vez de wValidBitsPerSample para alguns formatos compactados.) O membro wFormatTag , que segue imediatamente o final da estrutura KSDATAFORMAT no buffer, especifica que tipo de informação de formato segue KSDATAFORMAT.
Ao contrário de WAVEFORMATEX, WAVEFORMATEXTENSIBLE pode fazer o seguinte:
Especifique o número de bits por amostra separadamente do tamanho do contêiner de exemplo. Por exemplo, um exemplo de 20 bits pode ser armazenado à esquerda justificado em um contêiner de três bytes. WAVEFORMATEX, que não consegue distinguir o número de bits de dados por amostra do tamanho do contêiner de exemplo, não consegue descrever esse formato sem ambiguidade.
Atribua locais de alto-falante específicos a canais de áudio em fluxos multicanal. WAVEFORMATEX não tem essa funcionalidade e pode dar suporte adequadamente apenas a fluxos estéreo mono e (dois canais).
Uso herdado de WAVEFORMATEX
Qualquer formato descrito por WAVEFORMATEX também pode ser descrito por WAVEFORMATEXTENSIBLE. Para obter informações sobre como converter uma estrutura WAVEFORMATEX em WAVEFORMATEXTENSIBLE, consulte Converter entre marcas de formato e GUIDs de subformulário.
WAVEFORMATEX é suficiente para descrever formatos com tamanhos de exemplo de 8 ou 16 bits, mas WAVEFORMATEXTENSIBLE é necessário para descrever adequadamente formatos com uma precisão de amostra de maior que 16 bits. Veja dois exemplos:
Um fluxo com uma precisão de exemplo de 24 bits pode usar um tamanho de contêiner de 32 bits para processamento eficiente, mas pode ser convertido para usar um contêiner de 24 bits para melhorar a eficiência de armazenamento sem perda de dados.
Ao processar um fluxo com dados de exemplo de 24 bits, um dispositivo de renderização que fornece apenas 20 bits de precisão pode usar dithering para melhorar a fidelidade de seu sinal de saída. O dithering, no entanto, requer tempo de processamento adicional e, se o fluxo original for preciso para apenas 20 bits, o processamento adicional será desnecessário.
Em ambos os exemplos, preservar a qualidade do sinal e, ao mesmo tempo, fazer a compensação certa entre o processamento e a eficiência de armazenamento só será possível se a precisão da amostra e o tamanho do contêiner forem conhecidos.
Se um formato simples puder ser descrito sem ambiguidade por uma estrutura WAVEFORMATEX ou WAVEFORMATEXTENSIBLE, um driver de áudio terá a opção de selecionar qualquer estrutura para descrever o formato. No entanto, os drivers de áudio normalmente usam WAVEFORMATEX para especificar formatos PCM estéreo mono e (de dois canais) com amostras de 8 ou 16 bits, e alguns aplicativos mais antigos podem esperar que todos os drivers de áudio usem WAVEFORMATEX para especificar esses formatos.
Se um driver der suporte a um formato de áudio que possa ser especificado sem ambiguidade como uma estrutura WAVEFORMATEX ou WAVEFORMATEXTENSIBLE, o driver deverá reconhecer o formato independentemente de quais das duas estruturas um aplicativo cliente ou componente usa para especificar a estrutura. Por exemplo, se um dispositivo de áudio der suporte a um formato PCM estéreo de 44,1 kHz, 16 bits, o manipulador de propriedades KSPROPERTY_PIN_PROPOSEDATAFORMAT do driver de miniport e sua implementação do método NewStream devem aceitar esse formato, independentemente de o formato ser especificado como uma estrutura WAVEFORMATEX ou WAVEFORMATEXTENSIBLE.
Para simplificar o processamento de dados de formato, os drivers normalmente usam estruturas WAVEFORMATEXTENSIBLE para representar formatos internamente. Essa abordagem pode exigir a conversão de uma estrutura WAVEFORMATEX de entrada em uma representação INTERNA WAVEFORMATEXTENSIBLE ou a conversão de uma representação WAVEFORMATEXTENSIBLE interna em uma estrutura WAVEFORMATEX de saída.
Em WAVEFORMATEXTENSIBLE, dwBitsPerSample é o tamanho do contêiner e wValidBitsPerSample é o número de bits de dados válidos por exemplo. Os contêineres são sempre alinhados por bytes na memória e o tamanho do contêiner deve ser especificado como um múltiplo de oito bits.