다음을 통해 공유


음악 기술 GUID

MIDI 또는 DMus 미니포트 드라이버는 각 핀이 처리할 수 있는 스트림 형식 범위를 지정해야 합니다. 핀 팩터리에 설명된 대로 드라이버는 이 정보를 하나 이상의 데이터 범위 설명자의 배열로 지정하며, 각 설명자는 KSDATARANGE_MUSIC 형식의 구조입니다. 이 구조체의 기술 멤버는 MIDI 또는 DirectMusic 디바이스에서 사용하는 신시사이저 기술의 유형을 나타냅니다. 미니포트 드라이버는 기술 멤버를 다음 표(왼쪽 열)에 표시된 GUID 값 중 하나로 설정할 수 있습니다.

KSDATARANGE_MUSIC 기술 GUID MIDIOUTCAPS wTechnology 값 의미

KSMUSIC_TECHNOLOGY_PORT

MOD_MIDIPORT

디바이스는 MPU-401 디바이스입니다.

KSMUSIC_TECHNOLOGY_SYNTH

MOD_SYNTH

디바이스가 신시사이저입니다.

KSMUSIC_TECHNOLOGY_SQSYNTH

MOD_SQSYNTH

디바이스는 정사각형 파형 신시사이저입니다.

KSMUSIC_TECHNOLOGY_FMSYNTH

MOD_FMSYNTH

디바이스는 FM 신시사이저입니다.

KSMUSIC_TECHNOLOGY_MAPPER

MOD_MAPPER

디바이스는 Microsoft MIDI 매퍼입니다.

KSMUSIC_TECHNOLOGY_WAVETABLE

MOD_WAVETABLE

디바이스는 하드웨어 파동 가능 신시사이저입니다.

KSMUSIC_TECHNOLOGY_SWSYNTH

MOD_SWSYNTH

디바이스는 소프트웨어 신시사이저입니다.

midiOutGetDevCaps 함수는 드라이버에서 수신하는 기술 GUID를 호출자에게 출력하는 MIDIOUTCAPS 구조체의 wTechnology 멤버에 쓰는 인덱스로 변환합니다. 앞의 표에는 각 기술 GUID에 해당하는 wTechnology 값(가운데 열)이 표시됩니다. midiOutGetDevCaps 및 MIDIOUTCAPS에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.

디바이스를 열거할 때 Windows 멀티미디어 midiOut 또는 midiIn API를 사용하는 MIDI 애플리케이션은 MIDI 핀을 볼 수 있지만 DirectMusic 핀은 볼 수 없습니다. DirectMusic 애플리케이션은 MIDI 및 DirectMusic 핀을 모두 볼 수 있습니다. MIDI 또는 DMus 미니포트 드라이버는 핀의 데이터 범위에서 하위 형식 GUID를 KSDATAFORMAT_SUBTYPE_MIDI 설정하여 MIDI 핀을 식별합니다. DMus 미니포트 드라이버는 하위 유형 GUID를 KSDATAFORMAT_SUBTYPE_DIRECTMUSIC 설정하여 DirectMusic 핀을 식별합니다. MIDI 및 DirectMusic 핀에 대한 데이터 범위의 예는 MIDI 스트림 데이터 범위DirectMusic 스트림 데이터 범위를 참조하세요.

MIDI 및 DirectMusic 필터에 설명된 대로 어댑터 드라이버는 PcNewMiniport 함수를 호출하여 Portcls.sys 시스템 제공 미니포트 드라이버 중 하나의 instance 만듭니다. 호출자는 다음 표에 있는 드라이버 GUID 중 하나를 지정하여 인스턴스화할 미니포트 드라이버를 지정합니다.

드라이버 GUID 기술 GUID

CLSID_MiniportDriverDMusUART

KSMUSIC_TECHNOLOGY_PORT

CLSID_MiniportDriverDMusUARTCapture

KSMUSIC_TECHNOLOGY_PORT

CLSID_MiniportDriverFmSynth

KSMUSIC_TECHNOLOGY_FMSYNTH

CLSID_MiniportDriverFmSynthWithVol

KSMUSIC_TECHNOLOGY_FMSYNTH

CLSID_MiniportDriverUart

KSMUSIC_TECHNOLOGY_PORT

앞의 표의 오른쪽 열은 해당 미니포트 드라이버가 핀의 데이터 범위에서 지정하는 기술 GUID를 나타냅니다. 예를 들어 FmSynth 미니포트 드라이버는 핀에 기술 GUID KSMUSIC_TECHNOLOGY_FMSYNTH 할당합니다.

일부 파동형 신시사이저 디바이스는 MPU-401 디바이스(기술 GUID KSMUSIC_TECHNOLOGY_PORT)로 애플리케이션에 노출됩니다. 외부 신시사이저가 없는 경우 파동 가능한 신시사이저를 통해 원시 MIDI 바이트 스트림을 재생할 수 있습니다.

그러나 midiOut API는 기본(기본 설정) MIDI 재생 디바이스를 선택할 때 파동 가능한 신시사이저 디바이스(기술 GUID KSMUSIC_TECHNOLOGY_WAVETABLE 포함)를 선호합니다. MPU-401 디바이스를 기본 디바이스로 선택하지 않도록 명시적으로 방지합니다.

기본 디바이스가 될 수 있도록 하려면 원시 MIDI를 재생할 수 있는 파동 가능 디바이스가 MPU-401 디바이스가 아닌 파형 디바이스로 노출되어야 합니다. 그러나 어댑터 드라이버가 시스템 제공 MPU-401 미니포트 드라이버인 DMusUART를 사용하여 파동 가능한 신시사이저 디바이스를 관리하는 경우 미니포트 드라이버는 핀에 기술 GUID KSMUSIC_TECHNOLOGY_PORT 정적으로 할당합니다.

IMusicTechnology::SetTechnology 메서드를 호출하면 어댑터 드라이버가 미니포트 드라이버의 데이터 범위에서 기술 GUID를 덮어쓸 수 있습니다. 다음 코드 예제에서 어댑터 드라이버는 DMusUART 미니포트 드라이버의 데이터 범위에서 기본값인 KSMUSIC_TECHNOLOGY_PORT 기술 GUID를 KSMUSIC_TECHNOLOGY_WAVETABLE 값으로 변경합니다. 이 새 설정을 사용하면 MPU와 유사한 웨이브 가능 디바이스를 midiOut API에서 기본 MIDI 디바이스로 선택할 수 있습니다.

  // Create the miniport object.
  PUNKNOWN miniport;

  ntStatus = PcNewMiniport((PMINIPORT*)&miniport, CLSID_MiniportDriverDMusUART);

  // Query the miniport driver for the IMusicTechnology interface.
  IMusicTechnology* pMusicTechnology;

  if (NT_SUCCESS(ntStatus))
  {
      ntStatus = miniport->QueryInterface(IID_IMusicTechnology, (PVOID*)&pMusicTechnology);
  }

  // Set the Technology members in the DirectMusic data-range entries
  // for all the pins that are exposed by this miniport.
  // SetTechnology should be called before initializing the miniport.
  if (NT_SUCCESS(ntStatus))
  {
      ntStatus = pMusicTechnology->SetTechnology(&KSMUSIC_TECHNOLOGY_WAVETABLE);
  }

이전 코드 예제의 주석에 표시된 것처럼 어댑터 드라이버는 포트 드라이버의 Init 메서드를 호출하기 전에 SetTechnology를 호출해야 합니다(즉, 미니포트 드라이버의 Init 메서드를 호출함). 시스템 제공 DMusUART 및 UART 미니포트 드라이버는 모두 IMusicTechnology 인터페이스를 지원합니다. 다른 미니포트 드라이버의 경우 IMusicTechnology에 대한 지원은 선택 사항입니다. 자세한 내용은 Microsoft WDK(Windows 드라이버 키트)의 DMusUART 샘플 오디오 드라이버에서 SetTechnology 메서드 구현을 참조하세요.