Relógios de latência
O modelo de driver de miniporta do sintetizador foi projetado para permitir a sincronização da saída de áudio entre vários dispositivos. Dessa forma, ele contém um modelo de tempo mais complexo do que o fornecido por um dispositivo UART puro.
Os eventos são entregues (e capturados do) driver de miniporta com um carimbo de data/hora associado. Esse carimbo de data/hora é relativo a um relógio master. O relógio master é o mesmo relógio usado por todo o sequenciamento em todo o sistema. O tempo do relógio mestre é medido em unidades de tiques de 100 nanossegundos.
O driver de miniporta obtém a hora atual do relógio master chamando IMasterClock::GetTime. No momento da criação do pino, o driver de porta passa a interface IMasterClock do modo kernel para o driver de miniport como um dos parâmetros de entrada para o método IMiniportDMus::NewStream . Atualmente, o relógio master encapsula o relógio em tempo real do sistema. O relógio master nunca é alterado quando há pinos que exigem que ele esteja no estado de execução. É um relógio de taxa constante que nunca faz uma pausa.
Todos os dispositivos de renderização têm alguma latência entre o momento em que aceitam um evento e a hora em que o evento pode ser ouvido. Essa latência pode ser constante ou variável (como no caso de um sintetizador de software, em que a latência depende da posição de reprodução atual do buffer de áudio). Essa latência é compensada por:
Permitir que o driver de miniporto 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 miniporto por um mecanismo de sequenciador no driver de porta DMus.
No momento da criação do pino, o driver de porta consulta o driver de miniporta para um tempo delta em unidades de 100 nanossegundos. Esse tempo delta é o quão à frente do tempo de apresentação de cada evento o driver de miniporto deseja receber o evento. O driver de porta faz seu melhor esforço para entregar eventos tão à frente. Especificar 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 miniporto assim que eles são entregues ao driver de porta do modo de usuário.
Informando aos aplicativos o quão adiantado agendar eventos. Nesse caso, não é desejável usar a latência máxima. Como os eventos não podem ser cancelados depois de enviados, quanto mais próximos os eventos podem ser enviados ao tempo de apresentação, mais responsivamente o aplicativo e o sintetizador podem 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 agendado para ser reproduzido e ainda reproduzido a tempo. Em outras palavras, se o aplicativo agendar um evento a ser reproduzido antes da hora atual de acordo com o relógio de latência, o evento será reproduzido com atraso. Os drivers de miniporto do sintetizador fornecem um relógio de latência respondendo ao item de propriedade KSPROPERTY_SYNTH_LATENCYCLOCK .
O driver de miniporta é 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 especifica, em termos do relógio master, a próxima vez que os dados puderem ser renderizados a tempo. Por exemplo, se o relógio de master atualmente lê 50 e atualmente há 25 unidades de latência, o relógio de latência lê 75. O motivo pelo qual o relógio é implementado dessa forma é que a latência não precisa ser constante e o valor retornado é mais usado para aplicativos do que apenas o delta.