Udostępnij przez


Zegary opóźnień

Model sterowników miniportu syntetyzatora został zaprojektowany w celu umożliwienia synchronizacji danych wyjściowych dźwięku między wieloma urządzeniami. W związku z tym zawiera bardziej złożony model chronometrażu niż dostarczony przez czyste urządzenie UART.

Zdarzenia są dostarczane do (i przechwytywane z) sterownika miniportu z powiązaną sygnaturą czasową. Znacznik czasu odnosi się do zegara głównego. Zegar główny jest tym samym zegarem używanym przez wszystkie sekwencjonowanie w całym systemie. Czas zegara głównego jest mierzony w jednostkach 100-nanosekundowych tików.

Sterownik miniportu uzyskuje bieżącą godzinę z zegara głównego przez wywołanie IMasterClock::GetTime. W czasie tworzenia pinu sterownik portu przekazuje interfejs trybu jądra IMasterClock do sterownika miniport jako jeden z parametrów wejściowych do metody IMiniportDMus::NewStream. Obecnie zegar główny opakowuje zegar czasu rzeczywistego systemu. Główny zegar nigdy się nie zmienia, gdy istnieją piny, które wymagają, aby znajdował się w stanie uruchomienia. Jest to zegar o stałej szybkości, który nigdy nie przestaje działać.

Wszystkie urządzenia renderowania mają pewne opóźnienie między czasem akceptowania zdarzenia a czasem, w jakim można usłyszeć zdarzenie. To opóźnienie może być stałe lub zmienne (tak jak w przypadku syntetyzatora oprogramowania, gdzie opóźnienie zależy od bieżącej pozycji odtwarzania buforu audio). To opóźnienie jest kompensowane przez:

  • Zezwolenie sterownikowi DMus miniport na odbieranie zdarzeń z odpowiednim wyprzedzeniem, aby można było je odtwarzać na czas, pomimo opóźnień urządzenia. Zdarzenia są sekwencjonowane dla sterownika miniportowego przez silnik sekwencjonatora w sterowniku portu DMus.

    W czasie tworzenia pinu sterownik portu wysyła zapytanie do sterownika miniportu o czas delta podany w jednostkach 100-nanosekundowych. Czas delta określa, jak daleko przed czasem prezentacji każdego zdarzenia sterownik miniportu chce odebrać to zdarzenie. Sterownik portu dokłada wszelkich starań, aby dostarczać zdarzenia z dużym wyprzedzeniem. Określenie bardzo dużej wartości dla tego delta (określonego przez parametr SchedulePreFetchIMiniportDMus::NewStream) powoduje, że sterownik portu przekazuje zdarzenia do sterownika miniportu od razu po ich dostarczeniu do sterownika portu z trybu użytkownika.

  • Informowanie aplikacji o tym, jak daleko w przyszłość zaplanować zdarzenia. Użycie maksymalnego opóźnienia nie jest pożądane w tym przypadku. Ponieważ nie można anulować zdarzeń po ich przesłaniu, im bliżej można przesyłać zdarzenia do czasu prezentacji, tym szybciej aplikacja i synth mogą wchodzić w interakcje. Aby obsłużyć to wymaganie, DirectMusic wprowadza koncepcję zegara opóźnienia.

    Zegar opóźnienia zapewnia najbliższy czas w przyszłości, że wydarzenie można zaplanować i nadal grać na czas. Innymi słowy, jeśli aplikacja planuje rozegranie zdarzenia przed bieżącą godziną zgodnie z zegarem opóźnienia, zdarzenie jest odtwarzane późno. Sterowniki miniportatora zapewniają zegar opóźnienia, odpowiadając na element właściwości KSPROPERTY_SYNTH_LATENCYCLOCK .

    Sterownik miniportu jest zapytany o KSPROPSETID_Synth i KSPROPERTY_SYNTH_LATENCYCLOCK. Procedura obsługi właściwości sterownika miniportu powinna zwrócić miernik opóźnienia, który określa, w odniesieniu do zegara głównego, kiedy dane mogą być renderowane na czas. Jeśli na przykład zegar główny odczytuje obecnie 50, a obecnie istnieje 25 jednostek opóźnienia, zegar opóźnienia odczytuje 75. Powodem, dla którego zegar jest zaimplementowany w ten sposób, jest to, że opóźnienie nie musi być stałe, a zwracana wartość jest bardziej używana dla aplikacji niż tylko delta.