Compartilhar via


Latência WaveCyclic

Se o driver de miniporto WaveCyclic fornecer a combinação de hardware de um fluxo de reprodução de áudio, o DirectSound enviará um IRP para o driver de porta WaveCyclic que contém todo o fluxo de ondas directSound em um único buffer cíclico. O driver de porta WaveCyclic recebe o IRP e alimenta os dados de onda por peça no buffer de DMA exposto pelo driver. WaveCyclic tenta manter o ponteiro de gravação do buffer DMA cerca de 40 milissegundos à frente do ponteiro de leitura. Mesmo quando o driver está fazendo a combinação de hardware com o DirectSound, ele pode esperar cerca de 40 milissegundos de dados extras no buffer de DMA.

O fato de que o driver de porta WaveCyclic tenta acumular até 40 milissegundos de dados no buffer cíclico não significa que o driver de porta WaveCyclic adiciona 40 milissegundos à latência do fluxo. Na verdade, o driver de porta adiciona muito pouca latência. Pouco antes de um novo fluxo começar a ser reproduzido, enquanto o driver de porta ainda estiver gravando os dados iniciais no início do buffer cíclico, o driver de porta continuará gravando até que não haja mais dados disponíveis ou o buffer contenha um total de 40 milissegundos de dados. No entanto, se menos do que essa quantidade de dados estiver disponível imediatamente, o driver de porta não forçará o driver de miniporto a aguardar. Em vez disso, ele permite que o driver de miniporto comece a reproduzir os dados já armazenados em buffer imediatamente. Posteriormente, à medida que mais dados ficam disponíveis, o driver de porta continua gravando os dados no buffer até que não haja mais dados disponíveis ou a quantidade de dados armazenados em buffer entre os ponteiros de leitura e gravação atinja 40 milissegundos.

Após um período de quase fome, um fluxo KMixer pode conter intervalos de silêncio. Se WaveCyclic tiver recebido apenas dados de onda suficientes do KMixer para manter trinta em vez de quarenta milissegundos de dados extras no buffer de DMA, WaveCyclic começará a gravar silêncio no buffer de AMD após o fim dos dados válidos do KMixer. Essa política garante que, se ocorrer fome e o dispositivo ler além do final dos dados válidos, o dispositivo de áudio renderizará o silêncio em vez de dados obsoletos ou não inicializados.

A quantidade de silêncio gravada no buffer DMA é mantida bastante pequena e, se o KMixer conseguir fornecer ao driver de porta WaveCyclic dados adicionais antes que o silêncio seja reproduzido, esses dados substituirão o silêncio no buffer. Na ausência de fome, o dispositivo de áudio recebe um fluxo contínuo de dados mistos sem intervalos de silêncio forçado. No entanto, ao depurar o driver, você poderá ver o método IMiniportWaveCyclicStream::Silence do driver de miniport sendo chamado, mesmo que o renderizador de áudio não esteja faminto.