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 WavePci chama o método IPreFetchOffset::SetPreFetchOffset para especificar o deslocamento de pré-busca de um fluxo de saída DirectSound acelerado por hardware. Esse deslocamento é o número de bytes de dados que separam o cursor de gravação do cursor de reprodução no buffer de hardware do dispositivo de áudio. O cursor de gravação especifica a posição do buffer na qual um aplicativo DirectSound pode gravar com segurança o próximo exemplo de som. O cursor de reprodução especifica a posição do buffer do exemplo de som que está sendo reproduzido no momento pelo dispositivo de áudio.
O DirectSound consulta o driver de porta WavePci para as posições atuais dos cursores de reprodução e gravação enviando uma solicitação de propriedade KSPROPERTY_AUDIO_POSITION . Em resposta a essa solicitação, o driver de porta obtém a posição de reprodução atual do driver de miniporto chamando IMiniportWavePciStream::GetPosition. A forma como o driver de porta determina a posição de gravação depende se SetPreFetchOffset foi chamado.
Por padrão, o driver de porta posiciona o cursor de gravação no último mapeamento solicitado pelo driver de miniporto. Com cada chamada para IPortWavePciStream::GetMapping, o deslocamento de pré-busca padrão se torna maior. Se o driver de miniporto WavePci adquirir um grande número de mapeamentos, o deslocamento padrão poderá crescer muito.
Chamar SetPreFetchOffset substitui o padrão. Após essa chamada, o driver de porta calcula a posição de gravação adicionando o deslocamento de pré-busca especificado à posição de reprodução (levando em conta a solução alternativa no final do buffer DirectSound).
Um driver de miniporto pode alocar um grande número de mapeamentos por alguns motivos. Uma delas é reduzir a sobrecarga de operações de áudio no processador do sistema. Com mais mapeamentos, o driver requer menos interrupções para manter o dispositivo de áudio continuamente fornecido com dados. Outro motivo é que alocar mais mapeamentos diminui a probabilidade de que a reprodução de áudio sofra interrupções quando drivers de dispositivo mal comportados ocupam o sistema por curtos períodos.
Um problema associado a um grande deslocamento de pré-busca é que alguns aplicativos DirectSound podem ficar confusos em relação às posições relativas dos cursores de reprodução e gravação. No Windows 95/98, os VxDs de áudio mantêm um deslocamento de pré-busca relativamente pequeno e os aplicativos DirectSound desenvolvidos para esses sistemas operacionais podem não ser executados corretamente se o deslocamento for maior do que eles esperam.
Por exemplo, um aplicativo pode dividir o buffer DirectSound em uma metade superior e uma metade inferior e, em seguida, alternar as duas metades entre o aplicativo e o dispositivo. Quando o cursor de gravação entra pela primeira vez na metade superior ou inferior do buffer, ele grava uma quantidade de dados suficiente para encher essa metade do buffer. Esse esquema pressupõe que o cursor de reprodução esteja sempre posicionado na metade oposta do buffer, a metade que não está sendo gravada. Observe que essa suposição está incorreta se o deslocamento de pré-busca exceder metade do tamanho do buffer. Nesse caso, quando o cursor de gravação atinge o final do buffer do DirectSound e volta ao início do buffer, ele estará na mesma metade do buffer que o cursor de reprodução. Quando o aplicativo grava o equivalente a metade de um buffer de dados na nova posição do cursor de gravação, isso acaba por sobrescrever a posição do cursor de reprodução e destruir dados que ainda não foram reproduzidos.
Embora o aplicativo em si certamente possa ser responsabilizado por esse tipo de falha, um driver de miniporto WavePci pode eliminar o modo de falha simplesmente chamando SetPreFetchOffset para definir o deslocamento de pré-busca para um valor menor.
Definir o deslocamento de pré-busca para um valor menor move o cursor de gravação resultante ainda mais perto do cursor de reprodução. Você deve definir o deslocamento de pré-busca para o tamanho FIFO do hardware. Um deslocamento de pré-busca típico é de cerca de 64 amostras, dependendo do design de hardware do mecanismo de DMA.
Para permanecer compatível com determinados aplicativos DirectSound mais antigos, o DirectSound atualmente adiciona um preenchimento de 10 milissegundos aos cursores de gravação dos pinos acelerados por hardware. Note que a quantidade de preenchimento pode mudar no futuro.
Para obter informações adicionais sobre como gerenciar cursores de gravação e cursores de reprodução no nível do driver, consulte Propriedade de Posição de Áudio.