음악 기술 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 메서드 구현을 참조하세요.
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기