음악 기술 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 메서드 구현을 참조하세요.