Partilhar via


Plano de fundo do suporte a não PCM

Vários problemas impediram que versões anteriores do Microsoft Windows dessem suporte a formatos não PCM por meio das APIs waveOut e DirectSound. Esses problemas e como eles foram resolvidos são discutidos abaixo.

API waveOut

A camada de software que separa aplicativos waveOut de drivers de onda VxD é bastante fina. Drivers e aplicativos que dão suporte a um formato de onda personalizado podem transmitir dados nesse formato, independentemente de o sistema operacional entender o formato.

No entanto, no Windows 2000 e no Windows 98, a estrutura de áudio do WDM força todos os dados de áudio processados pela API waveOut (e pelo renderizador waveOut do DirectShow) a passar pelo driver do sistema KMixer (Kmixer.sys), que é o mixer de áudio kernel. Uma chamada waveOutOpen só terá êxito se o KMixer der suporte ao formato, independentemente de o driver dar suporte ao formato.

O KMixer manipula WAVE_FORMAT_PCM em todos os sistemas operacionais WDM. O Windows 2000 e posterior e o Windows 98 SE estendem o KMixer para dar suporte não apenas a WAVE_FORMAT_IEEE_FLOAT, mas também a variantes WAVEFORMATEXTENSIBLE de formatos PCM e IEEE-float. Como o KMixer não dá suporte a formatos não PCM, uma tentativa de passar dados não PCM por meio do KMixer falha.

O Windows dá suporte a formatos não PCM, permitindo que dados de áudio não PCM simplesmente ignorem o KMixer. Especificamente, os dados waveOut não PCM fluem diretamente para PortCls (ou USBAudio) em vez de passar primeiro pelo KMixer. Qualquer combinação de dados não PCM deve ser feita em hardware, mas aplicativos que usam dados não PCM em um formato como AC-3 ou WMA Pro normalmente não exigem mistura e os drivers normalmente não dão suporte à combinação de hardware nesse formato.

DirectSound API

Em drivers waveOut herdados e drivers VxD, o DirectSound dá suporte a formatos DE PCM WAVEFORMATEX (mas não WAVEFORMATEXTENSIBLE) para buffers primários e secundários, com 8 ou 16 bits por exemplo, um ou dois canais e uma taxa de amostragem entre 100 Hz e 100 kHz. Os drivers VxD podem limitar ainda mais os formatos permitidos para buffers primários quando o nível cooperativo é definido como DSSCL_WRITEPRIMARY (consulte a descrição do método IDirectSoundBuffer::SetFormat no SDK do DirectX). Essas limitações não foram alteradas no Windows Me ou no Windows XP.

Os drivers WDM podem dar suporte a formatos PCM no formato WAVEFORMATEX e WAVEFORMATEXTENSIBLE. Para Windows 2000 e posterior, Windows Me e Windows 98 SE, os drivers também podem dar suporte ao formato WAVE_FORMAT_IEEE_FLOAT para buffers de DSBCAPS_LOCSOFTWARE primários e secundários (misturados por KMixer) no formato WAVEFORMATEX e WAVEFORMATEXTENSIBLE.

Chamar SetFormat para especificar o formato de dados de um buffer primário tem apenas um efeito indireto no formato de combinação final escolhido pela cartão de som. O objeto buffer primário é usado para obter a interface IDirectSound3DListener e para definir o volume e a panela globais do dispositivo, mas não representa o fluxo de saída único do som cartão. Em vez disso, o KMixer combina os dados do buffer primário para permitir que vários clientes DSSCL_WRITEPRIMARY DirectSound sejam executados simultaneamente.

No Windows 2000 e no Windows 98, o DirectSound dá suporte apenas a dados pcm. (O mesmo se aplica ao DirectShow, que usa o renderizador do DirectSound.) Uma chamada para CreateSoundBuffer com um formato não PCM sempre falha, mesmo que o driver dê suporte ao formato. A falha ocorre por dois motivos. Primeiro, sempre que o DirectSound cria um pin KS, ele especifica automaticamente KSDATAFORMAT_SUBTYPE_PCM em vez de derivar o subtipo do membro wFormatTag da estrutura WAVEFORMATEX usada para criar o objeto IDirectSoundBuffer . Em segundo lugar, o DirectSound exige que cada caminho de dados tenha nós de volume e SRC (conversão de taxa de exemplo) (KSNODETYPE_VOLUME e KSNODETYPE_SRC), independentemente de os controles de painel, volume ou frequência de solicitações do cliente no buffer DirectSound. Esse requisito será atendido se os dados passarem pelo KMixer ou o dispositivo executar a combinação de hardware. No entanto, para formatos não PCM, o KMixer não está presente no caminho de dados e os próprios drivers normalmente falham quando solicitados a executar a combinação de hardware.

Windows XP e posterior, e Windows Me, removem as limitações que impediram os aplicativos DirectSound de usar formatos não PCM. O DirectSound 8 (e versões posteriores) usa o subtipo de formato correto e não exige mais automaticamente nós de volume e SRC em cada caminho de dados.