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.
O driver de porta WavePci manipula o buffer de um fluxo de áudio de forma diferente do driver WaveCyclic.
Se o driver de miniporto WavePci fornecer mixagem de hardware, o DirectSound enviará um IRP para o driver de porta WavePci que contém todo o fluxo de áudio DirectSound em um único buffer cíclico. O DirectSound aloca o buffer como um bloco contíguo de memória virtual. Para evitar copiar o buffer DirectSound, a camada de streaming de kernel mapeia o buffer para memória virtual no modo kernel e gera um MDL (lista de descritores de memória) que especifica os endereços virtuais e físicos das páginas de memória no buffer cíclico. O driver de porta WavePci particiona o buffer cíclico em uma sequência de quadros alocadores (consulte Alocadores KS). O driver de miniporto especifica seu tamanho preferencial de quadro alocador quando seu método IMiniportWavePciStream::GetAllocatorFraming é chamado pelo driver de porta durante a inicialização do fluxo. No entanto, o SysAudio, o criador de gráficos do sistema, pode sobrepor as preferências do driver de miniporte para atender aos requisitos dos outros componentes no gráfico de filtro de áudio.
O driver de porta WavePci expõe o buffer circular ao driver de miniporto na forma de uma sequência de mapeamentos. Um mapeamento é um quadro de alocação inteiro ou uma parte dele. Se um quadro de alocação específico estiver completamente dentro de uma página, o driver de porta apresentará esse quadro para o driver de miniporto como um único mapeamento. Se um quadro de alocação ultrapassar um ou mais limites de página, o driver de porta dividirá o quadro em cada limite de página e o apresentará como dois ou mais mapeamentos. Cada chamada para IPortWavePciStream::GetMapping produz o próximo mapeamento sucessivo na sequência.
Em contraste com o caso WaveCyclic, em que o driver de miniporto tem pouco controle sobre quantos milissegundos de dados são armazenados em buffer no hardware, o driver de miniporto WavePci tem um controle considerável sobre a quantidade de mapeamentos que ele mantém abertos a qualquer momento. O número de mapeamentos abertos aumenta em um com cada chamada para GetMapping e diminui em um com cada chamada para ReleaseMapping. (Uma chamada GetMapping pode falhar, é claro, para que o driver tenha menos controle total sobre o número de mapeamentos.) Controlando o número de mapeamentos abertos e acompanhando o tamanho cumulativo dos mapeamentos, o driver de miniporto pode determinar (dentro de uma tolerância dependente do tamanho do mapeamento) o número de milissegundos de buffer que estão disponíveis para o hardware. O driver de miniporto WavePci deve solicitar mapeamentos de página suficientes para reduzir as chances de fome para níveis aceitáveis.
Se a política do driver de miniporto for armazenar em buffer até 50 milissegundos de dados, por exemplo, entre os ponteiros de leitura e gravação, lembre-se de que esse limite representa a quantidade máxima de dados que o driver pode acumular, mas não representa, e não deve representar, a contribuição do driver para a latência do fluxo. Seu driver deve ser projetado para manter sua latência o menor possível. Quando um driver de miniporto obtém seu conjunto inicial de mapeamentos antes de começar a reproduzir um novo fluxo, o driver de miniport pode continuar solicitando mapeamentos até atingir seu limite de buffer (50 milissegundos neste exemplo) ou não há mais mapeamentos disponíveis imediatamente. No último caso, no entanto, o driver de miniporto não deve esperar pela disponibilização de mais mapeamentos antes de começar a reproduzir o fluxo. Em vez disso, o driver deve começar imediatamente a executar os mapeamentos que já obteve. Posteriormente, à medida que mais mapeamentos se tornam disponíveis, o driver pode continuar a adquirir mapeamentos adicionais até atingir seu limite de tamanho de buffer ou não há mais mapeamentos disponíveis imediatamente.
Em geral, o hardware DMA de um dispositivo WavePci deve ser projetado para acessar diretamente quadros de áudio armazenados em alinhamentos arbitrários de bytes e que ultrapassam limites entre páginas nãotiguosas de memória física. Se você tiver um dispositivo que exija que os mapeamentos sejam um número integral de quadros de áudio, esse dispositivo será limitado nos tipos de formatos de áudio compatíveis. É claro que um dispositivo com essa limitação ainda deve ser capaz de lidar com um tamanho de quadro de áudio que é uma potência de 2.
Por exemplo, um dispositivo com quatro canais e um tamanho de exemplo de 16 bits requer um tamanho de quadro de áudio de oito bytes. Um número integral de quadros de áudio se encaixa perfeitamente em uma página (ou qualquer outro tamanho de quadro de alocação que seja um múltiplo de oito bytes). No entanto, no caso de um fluxo de 5,1 canais com amostras de 16 bits, o tamanho do quadro de áudio é de 12 bytes e um fluxo que excede o tamanho de uma única página contém necessariamente quadros de áudio que ultrapassam os limites da página. (Os números em Filtros de Onda ilustram esse problema.) O hardware que não pode lidar com alinhamentos de bytes arbitrários e mapeamentos arbitrários de comprimento de bytes deve depender do driver para executar uma cópia intermediária, o que degrada o desempenho.
O driver do adaptador de exemplo Ac97 no Microsoft Windows Driver Kit (WDK) implementa um método GetAllocatorFraming. O driver de miniport usa esse método para comunicar sua dimensão preferencial de alocação de frames. No Windows 2000 e no Windows Me, o driver de porta chama esse método somente quando o driver do sistema Splitter (Splitter.sys) é instanciado acima do pino de saída. No Windows XP e posterior, o driver de porta também chama esse método para fluxos de entrada. Lembre-se de que o SysAudio pode optar por ignorar as preferências do driver de miniporto ao determinar o tamanho de alocação de quadros.