Deslocamentos de pré-busca
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 miniport 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 miniporta. Com cada chamada para IPortWavePciStream::GetMapping, o deslocamento de pré-busca padrão aumenta. 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 miniporta 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 falhas quando drivers de dispositivo mal comportados ligam o sistema por curtos períodos.
Um problema com um grande deslocamento de pré-busca é que alguns aplicativos DirectSound podem ficar confusos sobre as 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 gravados para esses sistemas operacionais podem não ser executados corretamente se o deslocamento for maior do que o esperado.
Por exemplo, um aplicativo pode dividir o buffer directSound em uma metade superior e uma metade inferior e, em seguida, "ping pong" 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 a metade dos dados do buffer nessa metade do buffer. Esse esquema pressupõe que o cursor de reprodução esteja sempre posicionado na outra metade do buffer – a metade na qual não está sendo gravado. Observe que essa suposição estará incorreta se o deslocamento de pré-busca exceder metade do tamanho do buffer. Nesse caso, quando o cursor de gravação atingir o final do buffer DirectSound e encapsular ao redor até o início do buffer, ele estará na mesma metade do buffer que o cursor de reprodução. Quando o aplicativo grava um meio buffer de dados na nova posição do cursor de gravação, ele acaba substituindo a posição do cursor de reprodução e destruindo dados que ainda não foram reproduzidos.
Embora o próprio aplicativo 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 para 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 preenche os cursores de gravação de pinos acelerados por hardware em 10 milissegundos. Observe que a quantidade de preenchimento pode mudar no futuro.
Para obter informações adicionais sobre como gerenciar cursores de gravação e reproduzir cursores no nível do driver, consulte Propriedade De posição de áudio.