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