Condividi tramite


Clock di latenza

Il modello di driver miniport di sintetizzatore è progettato per consentire la sincronizzazione dell'output audio tra più dispositivi. Di conseguenza, contiene un modello di intervallo più complesso rispetto a quello fornito da un dispositivo UART puro.

Gli eventi vengono recapitati a (e acquisiti) dal driver miniport con un timestamp associato. Questo timestamp è relativo a un orologio master. L'orologio master è lo stesso orologio usato da tutti i sequenziamento nell'intero sistema. L'ora dell'orologio master viene misurata in unità di 100-nanosecondi.

Il driver miniport ottiene l'ora corrente dall'orologio master chiamando IMasterClock::GetTime. Al momento della creazione del pin, il driver di porta passa l'interfaccia IMasterClock in modalità kernel al driver miniport come uno dei parametri di input al metodo IMiniportDMus::NewStream . Attualmente, l'orologio master esegue il wrapping dell'orologio in tempo reale del sistema. L'orologio master non cambia mai quando sono presenti pin che richiedono che sia nello stato di esecuzione . È un orologio a frequenza costante che non sospende mai.

Tutti i dispositivi di rendering hanno una certa latenza tra il momento in cui accettano un evento e l'ora in cui l'evento può essere sentito. Questa latenza può essere costante o variabile (come nel caso di un sintetizzatore software, in cui la latenza dipende dalla posizione di riproduzione corrente del buffer audio). Questa latenza viene compensata da:

  • Consentendo al driver miniport DMus di ricevere eventi abbastanza in anticipo in modo che possano essere riprodotti in tempo, nonostante la latenza del dispositivo. Gli eventi vengono sequenziati per il driver miniport da un motore sequencer nel driver della porta DMus.

    Al momento della creazione del pin, il driver di porta esegue una query sul driver miniport per un tempo differenziale in 100-nanosecondi. Questa ora differenziale è quanto prima della presentazione di ogni evento il driver miniport vuole ricevere l'evento. Il driver della porta fa il suo meglio per offrire eventi in avanti. Specificando un valore molto grande per questo delta (specificato dal parametro SchedulePreFetch di IMiniportDMus::NewStream) il driver di porta passa gli eventi al driver miniport non appena vengono recapitati al driver di porta dalla modalità utente.

  • Informare le applicazioni in anticipo per pianificare gli eventi. L'uso della latenza massima non è auspicabile in questo caso. Poiché gli eventi non possono essere annullati una volta inviati, gli eventi più vicini possono essere inviati al loro tempo di presentazione, l'applicazione e il synth possono interagire in modo più reattivo. Per gestire questo requisito, DirectMusic ha introdotto il concetto di un orologio di latenza.

    L'orologio di latenza fornisce l'ora più vicina in futuro in cui è possibile pianificare la riproduzione di un evento e continuare a giocare in tempo. In altre parole, se l'applicazione pianifica un evento da riprodurre prima dell'ora corrente in base all'orologio di latenza, l'evento viene riprodotto in ritardo. I driver miniport di sintetizzatore forniscono un orologio di latenza rispondendo all'elemento della proprietà KSPROPERTY_SYNTH_LATENCYCLOCK .

    Il driver miniport viene sottoposto a query per KSPROPSETID_Synth e KSPROPERTY_SYNTH_LATENCYCLOCK . Il gestore delle proprietà del driver miniport deve restituire un orologio di latenza che specifica, in termini di orologio master, la prossima volta che i dati possono essere sottoposti a rendering in tempo. Ad esempio, se l'orologio master legge attualmente 50 e attualmente sono presenti 25 unità di latenza, l'orologio latenza legge 75. Il motivo per cui l'orologio viene implementato in questo modo è che la latenza non deve essere costante e il valore restituito è di più uso per le applicazioni che solo per il delta.