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.
Um driver de miniporto WaveCyclic copia dados de áudio entre o buffer de DMA, que o hardware do controlador de áudio HD acessa, e o buffer do cliente, que o aplicativo de áudio no modo de usuário acessa:
Para um fluxo de dados de reprodução, o driver copia os dados do buffer do cliente para o buffer de DMA.
Para um fluxo de dados de captura, o driver copia os dados do buffer DMA para o buffer do cliente.
Para fluxos de reprodução e captura, o driver pode obter o melhor desempenho habilitando o cache da memória do buffer DMA (tipo de cache MmCached) e contando com o mecanismo de bisbilhotagem de barramento do controlador PCI para garantir a coerência do cache. No entanto, algumas implementações do controlador PCI Express não bisbilhotam as transferências de dados isocronas do controlador de áudio HD (como o chipset PCI Express inicial da Intel).
O driver de função não pode detectar se o hardware do controlador PCI dá suporte à espionagem de transferências de buffer de DMA ou executa transferências de dados isocronas. Para evitar possíveis problemas de coerência de cache, o driver desabilita o cache da memória do buffer de DMA especificando o tipo de cache para essa memória como MmWriteCombined. (MmNonCached também funcionaria, mas pode não ter um bom desempenho.) Se você escrever um driver de adaptador personalizado baseado no driver de função de exemplo, o driver de miniporto WaveCyclic deverá se comportar da mesma forma, a menos que você possa verificar se o controlador PCI de fato dá suporte à espionagem de transferências de buffer de DMA.
Para dar suporte a dispositivos e sistemas que não executam a espionagem de ônibus, um driver de função personalizado deve seguir estas regras:
Para um fluxo de reprodução, especifique o tipo de cache do buffer DMA como MmWriteCombined. Depois de copiar um bloco de dados do buffer do cliente para o buffer DMA, chame a função KeMemoryBarrier para tornar os dados visíveis para o mecanismo DMA. KeMemoryBarrier libera os dados copiados para a memória de uma maneira eficiente que deixa os caches de dados do processador em grande parte não alterados.
Para um fluxo de captura, especifique o tipo de cache do buffer DMA como MmWriteCombined ou MmNonCached. Além disso, o driver de função deve evitar gravar no buffer de DMA. Se for necessário executar o processamento local de amostras de áudio, deve primeiro copiar os dados para outro lugar.
O bloco de dados que o driver de função copia para ou do buffer DMA não precisa começar ou terminar em um limite de buffer Write-Combining, e seu tamanho não precisa ser um múltiplo do tamanho do buffer Write-Combining (normalmente, 32 ou 64 bytes).
Para drivers de função codec que usam a versão HDAUDIO_BUS_INTERFACE_BDL da DDI, a rotina AllocateContiguousDmaBuffer executa a alocação e o mapeamento da memória do buffer DMA. A rotina sempre define o tipo de cache do buffer como MmWriteCombined.
Para obter mais informações sobre write-combining, consulte o Manual do Desenvolvedor de Software de Arquitetura Intel IA-32 no site da Intel.