신시사이저 미니포트 드라이버 모델은 여러 디바이스 간의 오디오 출력 동기화를 허용하도록 설계되었습니다. 따라서 순수 UART 디바이스에서 제공하는 것보다 더 복잡한 타이밍 모델을 포함합니다.
이벤트는 연결된 타임스탬프를 사용하여 미니포트 드라이버에 전달되고 캡처됩니다. 이 타임스탬프는 마스터 클록을 기준으로 합니다. 마스터 클록은 전체 시스템의 모든 시퀀싱에서 사용하는 것과 동일한 클록입니다. 마스터 클록 시간은 100나노초 틱 단위로 측정됩니다.
미니포트 드라이버는 IMasterClock::GetTime을 호출하여 마스터 클록에서 현재 시간을 가져옵니다. 핀을 만들 때 포트 드라이버는 커널 모드 IMasterClock 인터페이스를 IMiniportDMus::NewStream 메서드에 대한 입력 매개 변수 중 하나로 미니포트 드라이버에 전달합니다. 현재 마스터 시계는 시스템 실시간 시계를 감쌉니다. 마스터 클록이 실행 상태여야 하는 핀이 있는 경우 마스터 클록은 변경되지 않습니다. 그것은 결코 일시 중지되지 않는 일정한 속도 시계입니다.
모든 렌더링 디바이스는 이벤트를 수락하는 시간과 이벤트를 들을 수 있는 시간 사이에 약간의 대기 시간이 있습니다. 이 대기 시간은 상수 또는 변수일 수 있습니다(소프트웨어 신시사이저의 경우와 같이 대기 시간은 오디오 버퍼의 현재 재생 위치에 따라 다름). 이 대기 시간은 다음을 통해 보정됩니다.
DMus 미니포트 드라이버가 디바이스의 대기 시간에도 불구하고 정시에 재생할 수 있도록 이벤트를 미리 수신할 수 있도록 허용합니다. 이벤트는 DMus 포트 드라이버의 시퀀서 엔진에 의해 미니포트 드라이버에 대해 시퀀스됩니다.
핀 생성 시 포트 드라이버는 100나노초 단위로 델타 시간에 대한 미니포트 드라이버를 쿼리합니다. 이 델타 시간은 미니포트 드라이버가 이벤트를 수신하려는 각 이벤트의 프레젠테이션 시간보다 훨씬 앞서 있습니다. 포트 드라이버는 이벤트를 훨씬 앞서 전달하기 위해 최선을 다하고 있습니다. 이 델타에 대해 매우 큰 값(IMiniportDMus::NewStream의 SchedulePreFetch 매개 변수로 지정됨)을 지정하면 포트 드라이버가 사용자 모드에서 포트 드라이버로 배달되는 즉시 미니포트 드라이버에 이벤트를 전달합니다.
이벤트를 예약하는 데 얼마나 앞서 있는지 애플리케이션에 알릴 수 있습니다. 이 경우 최대 대기 시간을 사용하는 것이 바람직하지 않습니다. 이벤트가 제출된 후에는 취소할 수 없으므로 이벤트를 프레젠테이션 시간에 제출할수록 애플리케이션과 신디사이저가 보다 반응적으로 상호 작용할 수 있습니다. 이 요구 사항을 처리하기 위해 DirectMusic은 대기 시간 시계의 개념을 도입했습니다.
대기 시간 클록은 이벤트를 미래의 가능한 시간에 예약하여 정시에 재생할 수 있도록 가장 가까운 시간을 제공합니다. 즉, 애플리케이션이 대기 시간 시계에 따라 현재 시간 전에 재생되도록 이벤트를 예약하면 이벤트가 늦게 재생됩니다. 신시사이저 미니포트 드라이버는 KSPROPERTY_SYNTH_LATENCYCLOCK 속성 항목에 응답하여 대기 시간 시계를 제공합니다.
미니포트 드라이버는 KSPROPSETID_Synth 및 KSPROPERTY_SYNTH_LATENCYCLOCK 대해 쿼리됩니다. 미니포트 드라이버의 속성 처리기는 마스터 클록을 기준으로 다음에 데이터를 제시간에 렌더링할 수 있도록 대기 시간 클록을 반환해야 합니다. 예를 들어 마스터 클록이 현재 50을 읽고 현재 대기 시간이 25단위인 경우 대기 시간 클록은 75를 읽습니다. 이러한 방식으로 클록이 구현되는 이유는 대기 시간이 일정할 필요가 없으며 반환된 값이 델타보다 애플리케이션에 더 많이 사용되기 때문입니다.