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.
A figura a seguir mostra o descritor de formato de dados para um fluxo de áudio WAV.
Como indicado na figura, a quantidade de informações de formato adicional seguindo a estrutura KSDATAFORMAT varia dependendo do formato de dados.
Os sistemas de áudio utilizam este tipo de descritor de formato de várias formas:
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 miniporta (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.
A solicitação de obtenção da propriedade KSPROPERTY_PIN_DATAINTERSECTION recupera um descritor de formato como o mostrado na figura anterior.
O pedido de definição de propriedade KSPROPERTY_PIN_PROPOSEDATAFORMAT 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. Este 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 do WAVEFORMATEX que pode descrever uma gama mais ampla de formatos do que WAVEFORMATEX.
WAVEFORMAT é obsoleto e não é suportado pelo subsistema de áudio WDM em qualquer versão do Microsoft Windows. A estrutura PCMWAVEFORMAT é uma versão estendida do WAVEFORMAT que também é obsoleta.
As quatro estruturas de formato de onda - WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX e WAVEFORMATEXTENSÍVEL - começam com os mesmos cinco membros, começando com wFormatTag. A figura anterior mostra estas quatro estruturas sobrepostas umas às outras para destacar as partes das estruturas que são idênticas.
WAVEFORMATEXTENSIBLE estende WAVEFORMATEX adicionando três membros, começando com Samples.wValidBitsPerSample. (Samples é 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 recipiente de amostras. Por exemplo, uma amostra de 20 bits pode ser armazenada justificada à esquerda dentro de 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 recipiente de amostra, é incapaz de descrever tal formato de forma inequívoca.
Atribua localizações específicas de altifalantes a canais de áudio em fluxos multicanal. WAVEFORMATEX não tem essa capacidade e pode suportar adequadamente apenas fluxos mono e fluxos estéreo de dois canais.
Uso legado do 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 Convertendo entre tags de formato e GUIDs de subformato.
WAVEFORMATEX é suficiente para descrever formatos com tamanhos de amostra de 8 ou 16 bits, mas WAVEFORMATEXTENSIBLE é necessário para descrever adequadamente formatos com uma precisão de amostra superior a 16 bits. Veja a seguir dois exemplos:
Um fluxo com uma precisão de amostra 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 amostra de 24 bits, um dispositivo de renderização que fornece apenas 20 bits de precisão pode usar pontilhamento para melhorar a fidelidade de seu sinal de saída. O pontilhamento, no entanto, requer tempo de processamento adicional e, se o fluxo original tiver precisão de apenas 20 bits, o processamento adicional é desnecessário.
Em ambos os exemplos, preservar a qualidade do sinal e, ao mesmo tempo, fazer a compensação certa entre a eficiência de processamento e armazenamento só é possível se a precisão da amostra e o tamanho do recipiente forem conhecidos.
Se um formato simples pode ser descrito inequivocamente por um WAVEFORMATEX ou uma estrutura WAVEFORMATEXTENSIBLE, um driver de áudio tem 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 (dois canais) com amostras de 8 bits 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 suporta um formato de áudio que pode ser especificado inequivocamente como uma estrutura WAVEFORMATEX ou WAVEFORMATEXTENSIBLE, o driver deve reconhecer o formato independentemente de qual das duas estruturas um aplicativo cliente ou componente usa para especificar a estrutura. Por exemplo, se um dispositivo de áudio suportar um formato PCM estéreo de 44,1 kHz e 16 bits, o manipulador de propriedades KSPROPERTY_PIN_PROPOSEDATAFORMAT do driver de miniporta e sua implementação do método NewStream deverão 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. Esta abordagem pode exigir a conversão de uma estrutura WAVEFORMATEX de entrada para uma representação interna WAVEFORMATEXTENSIBLE ou a conversão de uma representação interna WAVEFORMATEXTENSIBLE para 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 amostra. 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.