Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O modelo de driver de miniporta sintetizador é projetado para permitir a sincronização da saída de áudio entre vários dispositivos. Como tal, contém um modelo de temporização mais complexo do que o fornecido por um dispositivo UART puro.
Os eventos são enviados para (e capturados do) o controlador de miniporta com um carimbo de data/hora associado. Este carimbo de data/hora é relativo a um relógio mestre. O relógio mestre é o mesmo relógio usado por todo o sequenciamento em todo o sistema. O tempo do relógio mestre é medido em unidades de ticks de 100 nanossegundos.
O driver de miniporta obtém a hora atual do relógio mestre chamando IMasterClock::GetTime. No momento da criação do pino, o controlador de porta passa a interface IMasterClock do modo de kernel para o controlador de miniporta como um dos parâmetros de entrada para o método IMiniportDMus::NewStream. Atualmente, o relógio mestre controla o relógio em tempo real do sistema. O relógio mestre nunca muda quando há pinos que exigem que ele esteja no estado de execução . É um relógio de taxa constante que nunca para.
Todos os dispositivos de renderização têm alguma latência entre o momento em que aceitam um evento e o momento em que o evento pode ser ouvido. Esta latência pode ser constante ou variável (como no caso de um sintetizador de software, onde a latência depende da posição de reprodução atual do buffer de áudio). Esta latência é compensada por:
Permitindo que o driver de miniporta DMus receba eventos com antecedência suficiente para que eles possam ser reproduzidos a tempo, apesar da latência do dispositivo. Os eventos são sequenciados para o driver de miniporta por um mecanismo sequenciador no driver de porta DMus.
No momento da criação do pino, o driver da porta consulta o driver da miniporta para obter um tempo delta em unidades de 100 nanossegundos. Este tempo delta é o tempo que o controlador de miniport quer receber o evento antes do tempo de apresentação de cada evento. O motorista do porto faz o seu melhor esforço para entregar eventos tão à frente. A especificação de um valor muito grande para esse delta (especificado pelo parâmetro SchedulePreFetch de IMiniportDMus::NewStream) faz com que o driver de porta passe os eventos para o driver de miniporta assim que eles são entregues ao driver de porta do modo de usuário.
Informar as candidaturas com quanto tempo de antecedência podem agendar eventos. O uso da latência máxima não é desejável neste caso. Como os eventos não podem ser cancelados depois de enviados, quanto mais próximos os eventos puderem ser enviados de seu tempo de apresentação, mais responsivamente o aplicativo e o sintetizador poderão interagir. Para lidar com esse requisito, o DirectMusic introduziu o conceito de um relógio de latência.
O relógio de latência fornece a hora mais próxima no futuro em que um evento pode ser programado para executar e ainda executar a tempo. Em outras palavras, se o aplicativo agenda um evento para ser jogado antes da hora atual de acordo com o relógio de latência, então o evento é jogado tarde. Os miniport drivers do sintetizador fornecem um relógio de latência ao responder ao item de propriedade KSPROPERTY_SYNTH_LATENCYCLOCK.
O driver de miniport é consultado para KSPROPSETID_Synth e KSPROPERTY_SYNTH_LATENCYCLOCK. O manipulador de propriedades do driver de miniporta deve retornar um relógio de latência que indique, em relação ao relógio mestre, a próxima vez que os dados possam ser renderizados no momento oportuno. Por exemplo, se o relógio mestre lê atualmente 50 e atualmente há 25 unidades de latência, então o relógio de latência lê 75. A razão pela qual o relógio é implementado dessa maneira é que a latência não precisa ser constante, e o valor retornado é mais útil para aplicativos do que apenas o delta.