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.
O modelo de driver do miniportador 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) ao driver de miniporto com um carimbo de data/hora associado. Esse 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 tiques de 100 nanossegundos.
O driver de miniporto obtém a hora atual do relógio mestre chamando IMasterClock::GetTime. No momento da criação do pino, o driver de porta passa a interface IMasterClock em modo núcleo para o driver de miniporto como um dos parâmetros de entrada do método IMiniportDMus::NewStream. Atualmente, o relógio mestre encapsula o relógio em tempo real do sistema. O relógio primário nunca é alterado quando há pinos que exigem que ele esteja no estado de funcionamento. É um relógio de taxa constante que nunca pausa.
Todos os dispositivos de renderização têm alguma latência entre o tempo em que aceitam um evento e o tempo 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:
Permitindo que o driver de miniporto DMus receba eventos com antecedência suficiente para que 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 pin, o driver de porta consulta o driver de miniporta para um intervalo de tempo delta em unidades de 100 nanossegundos. Esse delta de tempo é o quão à frente do horário de apresentação de cada evento o driver de miniporta deseja receber o evento. O driver de porta faz o máximo para entregar os eventos com a maior antecedência possível. 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 quanto há antecedência para agendar eventos. O uso da latência máxima não é desejável nesse caso. Como os eventos não podem ser cancelados depois de enviados, quanto mais próximos do horário da apresentação os eventos puderem ser enviados, 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 agendado para ser reproduzido e ainda ser executado 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 miniporto é consultado para KSPROPSETID_Synth e KSPROPERTY_SYNTH_LATENCYCLOCK. O manipulador de propriedades do driver de miniport deve retornar um relógio de latência que especifica, em termos do relógio mestre, a próxima vez que os dados puderem ser renderizados a tempo. Por exemplo, se o relógio mestre atualmente lê 50 e há atualmente 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 é de mais uso para aplicativos do que apenas o delta.