오디오 어댑터용 디바이스 인터페이스 설치
클라이언트는 공급업체가 어댑터의 INF 파일에 지정하는 디바이스 인터페이스 집합을 통해 오디오 디바이스에 액세스합니다. INF 파일에 지정된 디바이스 인터페이스에는 어댑터 드라이버가 디바이스를 초기화할 때 만드는 하위 서비스에 대한 일대일 대응이 있습니다( 하위 서비스 만들기 참조). 각 디바이스 인터페이스에 대해 INF 파일은 인터페이스의 레지스트리 키 아래에 있는 사용자 모드에서 액세스할 수 있는 FriendlyName 항목 값을 지정합니다.
커널 스트리밍 아키텍처에서 토폴로지 범주( KSPROPERTY_TOPOLOGY_CATEGORIES 참조)는 디바이스 인터페이스 클래스를 나타냅니다.
다음 표에서는 오디오 어댑터가 하위 서비스의 기능을 설명하는 데 사용할 가능성이 가장 높은 토폴로지 범주를 나열합니다.
범주 | Description |
---|---|
KSCATEGORY_ACOUSTIC_ECHO_CANCEL | 음향 에코 취소를 수행할 수 있는 오디오 장치( DirectSound 캡처 효과 참조)는 이 범주에 등록됩니다. |
KSCATEGORY_AUDIO | 모든 오디오 디바이스는 이 범주에 따라 등록됩니다. |
KSCATEGORY_CAPTURE | 데이터 스트림을 캡처할 수 있는 오디오 디바이스는 이 범주에 따라 자체 등록됩니다. |
KSCATEGORY_DATATRANSFORM | 스트림에서 데이터 변환을 수행하는 오디오 디바이스는 이 범주에 따라 자체 등록됩니다. |
KSCATEGORY_MIXER | 데이터 스트림을 혼합할 수 있는 오디오 디바이스는 이 범주에 따라 자체 등록됩니다. |
KSCATEGORY_RENDER | 데이터 스트림을 렌더링할 수 있는 오디오 디바이스는 이 범주에 등록됩니다. |
KSCATEGORY_SYNTHESIZER | MIDI 메시지를 웨이브 오디오 샘플 또는 아날로그 출력 신호로 변환할 수 있는 오디오 디바이스가 이 범주에 등록 됩니다(신시사이저 및 웨이브 싱크 참조). |
KSCATEGORY_TOPOLOGY | 디바이스의 토폴로지 미니포트 드라이버는 이 범주에 등록됩니다. |
KSCATEGORY_DRM_DESCRAMBLE | DRM으로 보호되는 웨이브 스트림을 해독할 수 있는 오디오 디바이스가 이 범주에 등록됩니다( 디지털 권한 관리 참조). |
토폴로지 범주의 전체 목록은 헤더 파일 Ks.h 및 Ksmedia.h에 정의된 KSCATEGORY_XXX GUID를 참조하세요.
모든 오디오 디바이스는 KSCATEGORY_AUDIO 따라 분류되지만 오디오 디바이스는 KSCATEGORY_RENDER(오디오 렌더링 디바이스의 경우) 또는 KSCATEGORY_SYNTHESIZER(신시사이저의 경우)와 같은 추가 범주로 분류될 수도 있습니다. INF 파일이 디바이스에 대해 지정하는 각 범주에 대해 Windows Installer는 범주 이름 아래에 해당 디바이스에 대한 레지스트리 항목 집합을 빌드 합니다(필터 팩터리 참조).
기본 제공 신시사이저가 포함된 디바이스만 범주 KSCATEGORY_SYNTHESIZER 따라 등록해야 합니다. 이 범주는 순수 MPU-401 디바이스를 제외합니다. UART에서 원시 MIDI를 출력하거나 입력할 수 있는 순수 MPU-401 디바이스는 다음 범주에 따라 등록해야 합니다.
KSCATEGORY_AUDIO
KSCATEGORY_RENDER
KSCATEGORY_CAPTURE
SysAudio 시스템 드라이버는 레지스트리 범주를 가상 오디오 디바이스에만 KSCATEGORY_AUDIO_DEVICE 예약합니다. 어댑터 드라이버는 이 범주에 등록하면 안 됩니다.
다음 예제에서는 어댑터가 일반적으로 오디오 디바이스에 대해 지원하는 네 가지 일반적인 시스템 정의 디바이스 인터페이스를 설치합니다.
예: 오디오 디바이스 인터페이스 설치
이 예제에서 XYZ 오디오 디바이스의 device-install 섹션은 INF AddInterface 지시문을 사용하여 4개의 오디오 어댑터 인터페이스를 설치합니다. 다음에서 네 개의 지시문 각각은 인터페이스에 고유한 참조 문자열을 할당합니다. 이 문자열은 어댑터 드라이버가 각 인터페이스 클래스의 인스턴스를 구분하는 데 사용할 수 있습니다.
[XYZ-Audio-Device.Interfaces]
AddInterface=%KSCATEGORY_AUDIO%,%KSName_Wave%,XYZ-Audio-Device.Wave
AddInterface=%KSCATEGORY_RENDER%,%KSName_Wave%,XYZ-Audio-Device.Wave
AddInterface=%KSCATEGORY_CAPTURE%,%KSName_Wave%,XYZ-Audio-Device.Wave
AddInterface=%KSCATEGORY_TOPOLOGY%,%KSName_Topology%,XYZ-Audio-Device.Topology
처음 세 개의 AddInterface 지시문은 XYZ-Audio-Device.Wave라는 추가 인터페이스 섹션을 지정합니다. 마지막은 XYZ-Audio-Device.Topology라는 추가 인터페이스 섹션을 지정합니다. 각 추가 인터페이스 섹션은 다음 레지스트리 항목을 \DeviceClasses\<InterfaceGUID> 레지스트리 키 아래의 사용자 모드에서 액세스할 수 있는 디바이스 인터페이스 하위 키에 추가합니다.
FriendlyName 레지스트리 항목은 각 디바이스 인터페이스의 이름을 지정합니다.
Microsoft DirectShow에는 KSProxy 시스템 드라이버에서 어댑터에 액세스하고 제어할 수 있음을 나타내는 프록시 GUID 값으로 설정된 CLSID 레지스트리 항목이 필요합니다.
레지스트리에 각 인터페이스의 FriendlyName 및 CLSID를 추가하는 INF 파일 항목이 포함된 두 개의 추가 인터페이스 섹션이 다음 예제에 표시됩니다.
[XYZ-Audio-Device.Wave]
AddReg=XYZ-Audio-Device.Wave.AddReg
[XYZ-Audio-Device.Wave.AddReg]
HKR,,FriendlyName,,%WaveDeviceName%
HKR,,CLSID,,%Proxy.CLSID%
[XYZ-Audio-Device.Topology]
AddReg=XYZ-Audio-Device.Topology.AddReg
[XYZ-Audio-Device.Topology.AddReg]
HKR,,FriendlyName,,%WaveDeviceMixerName%
HKR,,CLSID,,%Proxy.CLSID%
이 예제의 키워드(keyword) HKR은 디바이스에 대한 시스템 제공 레지스트리 경로를 표시합니다. 자세한 내용은 INF AddReg 지시문을 참조하세요.
다음은 이 예제의 문자열 섹션입니다.
[Strings]
KSCATEGORY_AUDIO="{6994AD04-93EF-11D0-A3CC-00A0C9223196}"
KSCATEGORY_RENDER="{65E8773E-8F56-11D0-A3B9-00A0C9223196}"
KSCATEGORY_CAPTURE="{65E8773D-8F56-11D0-A3B9-00A0C9223196}"
KSCATEGORY_TOPOLOGY="{DDA54A40-1E4C-11D1-A050-405705C10000}"
Proxy.CLSID="{17CCA71B-ECD7-11D0-B908-00A0C9223196}"
WaveDeviceName="XYZ Audio Device"
WaveDeviceMixerName="XYZ Audio Device Super Mixer"
어댑터 드라이버가 내부적으로 문자열 상수와 동일한 이름을 사용하므로 addInterface 지시문이 KSCATEGORY_XXX 디바이스 인터페이스에 대해 지정하는 문자열 이름을 지역화할 수 없습니다. WDK(Windows 드라이버 키트)의 샘플 어댑터 드라이버는 오디오 디바이스 인터페이스에 다음 문자열 이름을 사용합니다.
KSNAME_Wave="Wave"
KSNAME_UART="UART"
KSNAME_FMSynth="FMSynth"
KSNAME_Topology="Topology"
KSNAME_Wavetable="Wavetable"
KSNAME_DMusic="DMusic"
균일성을 위해 독점 드라이버는 해당 디바이스 인터페이스에 동일한 이름을 할당해야 합니다. 드라이버가 독점적인 추가 디바이스 인터페이스를 지원하는 경우 이러한 인터페이스에 대한 고유한 고유한 이름을 발명할 수 있습니다. 드라이버에서 사용하는 이름이 INF 파일의 이름과 일치하는지 확인합니다. 문자열이 일치하지 않으면 시스템 설정에서 드라이버를 로드하지 않습니다.