Kernel-Mode 소프트웨어 신시사이저용 웨이브 싱크

신시사이저 및 웨이브 싱크에 설명된 대로 DMus 포트 드라이버는 커널 모드에서 작동하는 소프트웨어 신시사이저에 대한 웨이브 싱크를 구현합니다. 신시사이저의 미니포트 드라이버는 ISynthSinkDMus 인터페이스를 포트 드라이버에 노출합니다. 포트 드라이버의 웨이브 싱크는 이 인터페이스를 사용하여 신시사이저에서 생성되는 웨이브 데이터를 읽습니다.

DMus 포트 드라이버의 웨이브 싱크를 사용하려면 DMus 미니포트 드라이버가 두 가지 유형의 핀으로 DirectMusic 필터를 정의해야 합니다.

  • DirectMusic 입력 핀 또는 MIDI 입력 핀입니다. 이 핀은 MIDI 메시지를 포함하는 렌더링 스트림의 싱크입니다.

  • 웨이브 출력 핀입니다. 이 핀은 PCM 샘플이 포함된 렌더링 스트림의 원본입니다.

다음 그림에서는 신시사이저 노드(KSNODETYPE_SYNTHESIZER)를 포함하는 DirectMusic 필터를 보여 줍니다. 이 필터는 DirectMusic 입력 핀과 웨이브 출력 핀을 제공하여 커널 모드 소프트웨어 신시사이저에 대한 이전 요구 사항을 충족합니다. 또한 레거시 MIDI 합성을 지원하는 DMus 미니포트 드라이버는 MIDI 입력 핀을 제공할 수 있습니다.

DirectMusic 입력 핀 및 웨이브 출력 핀이 있는 커널 모드 소프트웨어 신시사이저에 대한 DirectMusic 필터를 보여 주는 다이어그램

그림의 왼쪽에서 MIDI 스트림은 DirectMusic 입력 핀을 통해 필터를 입력합니다. 이 핀에는 포트 드라이버에 노출되는 IMXF 인터페이스가 있습니다. 포트 드라이버는 IMiniportDMus::NewStream 메서드를 호출하여 이 인터페이스를 가져옵니다. 포트 드라이버는 IMXF::P utMessage 메서드를 호출하여 MIDI 메시지를 핀에 공급합니다.

그림의 오른쪽에서 웨이브 스트림은 웨이브 출력 핀을 통해 필터를 종료하고 포트 드라이버의 웨이브 싱크로 흐릅니다. 포트 드라이버는 ISynthSinkDMus 인터페이스를 통해 핀과 통신합니다. 포트 드라이버는 먼저 IMiniportDMus::NewStream 을 호출하여 IMXF 인터페이스를 사용하여 스트림 개체를 가져온 다음 해당 ISynthSinkDMus 인터페이스에 대한 개체를 쿼리하여 이 인터페이스를 가져옵니다. 웨이브 싱크는 ISynthSinkDMus::Render 메서드를 호출하여 핀에서 웨이브 데이터를 가져옵니다.

하드웨어 신시사이저는 기본적으로 렌더링을 위해 포트 드라이버의 웨이브 싱크를 사용할 수 있지만 ISynthSinkDMus::Render 를 호출하면 MIDI 스트림에 충분한 대기 시간이 추가되어 많은 대화형 애플리케이션에 매력적이지 않습니다. 스트림 대기 시간을 줄이기 위해 하드웨어 신시사이저는 포트 드라이버의 웨이브 싱크를 사용하는 대신 혼합 및 웨이브 렌더링 하드웨어에 대한 내부 연결을 가질 수 있습니다. 이 유형의 신시사이저는 이전 그림의 오른쪽에 있는 웨이브 출력 핀을 하드웨어 믹서에 대한 하드 와이어 연결( 브리지 핀으로 표시)으로 바꿉니다.

ISynthSinkDMus 인터페이스는 웨이브 싱크를 통해 웨이브 데이터를 렌더링하고, 참조 시간에서 샘플 시간 및 뒤로 변환하고, master 클록에 동기화하는 메서드를 제공합니다.

ISynthSinkDMus::RefTimeToSample

ISynthSinkDMus::Render

ISynthSinkDMus::SampleToRefTime

ISynthSinkDMus::SyncToMaster

ISynthSinkDMus는IMXF 인터페이스에서 상속됩니다. 자세한 내용은 ISynthSinkDMus를 참조하세요.

이전 그림의 DMus 미니포트 드라이버는 다음과 같이 DirectMusic 입력 핀 및 웨이브 출력 핀을 식별합니다.

  • DirectMusic 입력 핀을 식별하기 위해 미니포트 드라이버는 KSDATAFORMAT_TYPE_MUSIC 형식의 주요 형식과 KSDATAFORMAT_SUBTYPE_DIRECTMUSIC 형식의 하위 형식을 갖도록 핀의 데이터 범위를 정의합니다. 이 조합은 핀이 타임스탬프를 적용한 MIDI 스트림을 허용한다는 것을 나타냅니다. 데이터 범위 설명자는 KSDATARANGE_MUSIC 형식의 구조체입니다. (예제는 DirectMusic Stream 데이터 범위를 참조하세요.) 미니포트 드라이버는 KSPIN_DATAFLOW_IN 핀의 데이터 흐름 방향을 정의합니다. (PCPIN_DESCRIPTOR 구조체의 KsPinDescriptor입니다. DataFlow 멤버는 데이터 흐름 방향을 나타냅니다.) IMiniportDMus::NewStream을 호출하여 이 핀에 대한 스트림 개체를 만들 때 포트 드라이버는 StreamType 매개 변수를 DMUS_STREAM_MIDI_RENDER 설정합니다.

  • 웨이브 출력 핀을 식별하기 위해 미니포트 드라이버는 핀의 데이터 범위를 정의하여 KSDATAFORMAT_TYPE_AUDIO 형식의 주요 형식과 KSDATAFORMAT_SUBTYPE_PCM 형식의 하위 형식을 갖습니다. 이 조합은 핀이 PCM 샘플이 포함된 웨이브 오디오 스트림을 내보낸다는 것을 나타냅니다. 데이터 범위 설명자는 KSDATARANGE_AUDIO 형식의 구조입니다. ( PCM 스트림 데이터 범위의 예제를 참조하세요.) 미니포트 드라이버는 KSPIN_DATAFLOW_OUT 핀의 데이터 흐름 방향을 정의합니다. IMiniportDMus::NewStream을 호출하여 이 핀에 대한 스트림 개체를 만들 때 포트 드라이버는 StreamType 매개 변수를 DMUS_STREAM_WAVE_SINK 설정합니다.

또한 드라이버가 신시사이저에 MIDI 입력 핀을 지원하는 경우 해당 정의는 DirectMusic 입력 핀의 정의와 유사하지만 핀 정의는 KSDATAFORMAT_SUBTYPE_MIDI 형식의 하위 폼을 지정하고 핀은 타임스탬프 MIDI 스트림이 아닌 원시 MIDI 스트림을 허용합니다.