Share via


필터, 고정 및 노드 속성

Microsoft WDM(Windows 드라이버 모델) 오디오 드라이버는 오디오 디바이스를 KS 필터로 나타내며 디바이스의 하드웨어 버퍼를 필터의 핀으로 나타냅니다. 클라이언트가 이러한 필터 또는 핀 개체 중 하나에 속성 요청을 보내면 포트 드라이버는 요청을 수신하고 포트 드라이버 또는 미니포트 드라이버의 적절한 속성 처리기로 요청을 라우팅합니다.

오디오 디바이스는 다음 세 가지 종류의 속성을 지원합니다.

  • 필터 속성

    필터 속성은 필터 내의 특정 핀 또는 노드 속성이 아닌 전체 필터의 속성입니다. 필터 속성에 대한 요청은 필터 핸들을 지정하지만 노드 ID는 지정하지 않습니다.

  • 고정 속성

    핀 속성은 필터의 특정 핀 instance 속성입니다. 이러한 속성에 대한 요청은 핀 핸들을 지정하지만 노드 ID는 지정하지 않습니다.

  • 노드 속성

    노드 속성은 필터 내의 토폴로지 노드의 속성입니다. 노드 속성에 대한 요청은 필터 핸들 또는 핀 핸들과 노드 ID를 지정합니다.

노드 속성 요청이 필터 또는 핀 핸들을 지정하는지 여부는 노드가 필터에 고유한지 여부에 따라 달라집니다. 자세한 내용은 다음 노드 속성 섹션을 참조하세요.

다음 그림에서는 핀 instance 전송된 핀 속성 요청, 노드로 전송된 노드 속성 요청(필터 또는 핀 instance) 및 필터 instance 전송된 필터 속성 요청의 세 가지 종류의 속성 요청을 보여 줍니다.

필터, 핀 및 노드 속성 요청을 보여 주는 다이어그램

일반적으로 포트 드라이버는 필터 및 핀 속성에 대한 대부분의 요청을 처리하고 미니포트 드라이버는 노드 속성에 대한 요청을 처리합니다.

포트 드라이버는 SysAudio 시스템 드라이버 ( KSPROPSETID_SysaudioKSPROPSETID_Sysaudio_Pin 참조) 및 WDMAud 시스템 드라이버에서 사용하는 필터 및 핀 속성에 대한 자체 기본 제공 처리기를 제공합니다. 미니포트 드라이버는 포트 드라이버가 처리하는 속성에 대한 처리기를 구현할 필요가 없습니다. 일반적인 미니포트 드라이버는 필터 및 핀 속성에 대한 몇 가지 처리기를 제공합니다. 미니포트 드라이버는 오디오 디바이스의 하드웨어 종속 기능을 나타내는 노드 속성에 대한 처리기를 제공합니다. 포트 드라이버는 KSPROPERTY_TOPOLOGY_NAME 제외하고 노드 속성의 기본 제공 처리를 제공하지 않습니다.

포트 드라이버와 미니포트 드라이버가 모두 동일한 속성에 대한 처리기를 제공하는 경우 포트 드라이버는 자체 처리기를 사용하고 미니포트 드라이버의 처리기를 무시합니다.

필터 설명자

포트 드라이버는 IMiniport::GetDescription 메서드를 호출하여 미니포트 드라이버의 속성 처리기에 대한 포인터를 가져옵니다. 이 메서드를 통해 포트 드라이버는 PCFILTER_DESCRIPTOR 형식의 구조인 미니포트 드라이버의 필터 설명자에 대한 포인터를 검색합니다. 이 구조체는 필터, 핀 및 노드 속성에 대한 미니포트 드라이버의 속성 처리기를 지정합니다.

  • PCFILTER_DESCRIPTOR 구조체의 AutomationTable 멤버는 필터에 대한 자동화 테이블을 가리킵니다. 이 표에서는 필터 속성에 대한 미니포트 드라이버의 속성 처리기를 지정합니다.

  • PCFILTER_DESCRIPTOR 구조체의 Pin 멤버에는 핀 에 대한 자동화 테이블이 포함되어 있습니다. 각 테이블은 특정 핀 유형의 핀 속성에 대한 속성 처리기를 지정합니다.

  • PCFILTER_DESCRIPTOR 구조체의 Nodes 멤버에는 필터 내의 토폴로지 노드에 대한 자동화 테이블이 포함되어 있습니다. 각 테이블은 특정 노드 형식의 노드 속성에 대한 속성 처리기를 지정합니다.

필터 속성

포트 드라이버는 PCFILTER_DESCRIPTOR AutomationTable 멤버를 통해 미니포트 드라이버의 필터 속성 처리기에 액세스합니다. 일반적으로 이 자동화 테이블에는 포트 드라이버가 SysAudio 및 WDMAud가 오디오 디바이스를 쿼리하고 구성하는 데 사용하는 모든 필터 속성에 대한 자체 기본 제공 처리기를 제공하므로 몇 가지 처리기가 포함되어 있습니다.

그러나 미니포트 드라이버는 포트 드라이버에서 사용할 수 없는 하드웨어 종속 정보를 제공하는 KSPROPERTY_GENERAL_COMPONENTID 같은 필터 속성에 대한 처리기를 제공할 수 있습니다. Microsoft WDK(Windows 드라이버 키트)의 두 샘플 오디오 드라이버가 KSPROPERTY_GENERAL_COMPONENTID 속성을 처리합니다. 자세한 내용은 샘플 오디오 드라이버에서 설명하는 Sysvad 샘플 드라이버의 미니포트 드라이버 구현을 참조 하세요.

Portcls.sys 모든 포트 드라이버는 KSPROPSETID_PinKSPROPSETID_Topology 속성 집합에 대한 처리를 제공합니다. 이러한 집합의 모든 속성은 노드 속성인 KSPROPERTY_TOPOLOGY_NAME 제외하고 필터 속성입니다(핀 핸들이 아닌 필터 핸들을 사용하여 요청에 대한 대상을 지정). 포트 드라이버는 KSPROPSETID_Pin 속성의 다음 하위 집합을 지원합니다.

KSPROPERTY_PIN_CATEGORY

KSPROPERTY_PIN_CINSTANCES

KSPROPERTY_PIN_COMMUNICATION

KSPROPERTY_PIN_CONSTRAINEDDATARANGES

KSPROPERTY_PIN_CTYPES

KSPROPERTY_PIN_DATAFLOW

KSPROPERTY_PIN_DATAINTERSECTION

KSPROPERTY_PIN_DATARANGES

KSPROPERTY_PIN_GLOBALCINSTANCES

KSPROPERTY_PIN_INTERFACES

KSPROPERTY_PIN_MEDIUMS

KSPROPERTY_PIN_NAME

KSPROPERTY_PIN_NECESSARYINSTANCES

KSPROPERTY_PIN_PHYSICALCONNECTION

KSPROPERTY_PIN_PROPOSEDATAFORMAT

KSPROPERTY_PIN_PROPOSEDATAFORMAT2

이러한 속성은 필터에 속하는 핀 팩터리에 대한 정보를 제공합니다. 일반적으로 클라이언트는 핀 인스턴스를 만들기 전에 이러한 속성에 대한 필터를 쿼리합니다. 포트 드라이버는 필터의 내부 토폴로지 정보를 제공하는 네 가지 KSPROPSETID_Topology 속성을 모두 지원합니다.

또한 DMus 포트 드라이버는 directMusic 필터의 get-only 속성인 KSPROPERTY_SYNTH_MASTERCLOCK 속성에 대한 처리기를 제공합니다. KSPROPERTY_SYNTH_MASTERCLOCK KSPROPSETID_SynthClock 속성 집합의 멤버입니다.

고정 속성

포트 드라이버는 PCFILTER_DESCRIPTOR Pin 멤버를 통해 미니포트 드라이버의 핀 속성 처리기에 액세스 합니다 . 이 멤버는 핀 설명자의 배열을 가리키며, 각 설명자는 핀 유형에 대한 자동화 테이블을 가리킵니다(단순히 배열 인덱스인 핀 ID로 식별됨).

일반적으로 이러한 자동화 테이블에는 포트 드라이버가 SysAudio 및 WDMAud에서 사용하는 모든 핀 속성에 대한 자체 처리기를 제공하므로 몇 가지 항목이 포함되어 있습니다. 미니포트 드라이버에는 포트 드라이버가 처리하지 않는 하나 이상의 핀 속성에 대한 처리기를 제공하는 옵션이 있지만 이러한 속성에 대해 알고 있는 클라이언트만 속성 요청을 보낼 수 있습니다.

토폴로지 포트 드라이버를 제외하고 Portcls.sys 모든 포트 드라이버는 다음 핀 속성에 대한 기본 제공 처리기를 제공합니다.

KSPROPERTY_CONNECTION_STATE

KSPROPERTY_CONNECTION_DATAFORMAT

KSPROPERTY_CONNECTION_ALLOCATORFRAMING

KSPROPERTY_STREAM_ALLOCATOR

KSPROPERTY_STREAM_MASTERCLOCK

KSPROPERTY_AUDIO_POSITION

KSPROPERTY_DRMAUDIOSTREAM_CONTENTID

이 목록의 일부 속성에는 미니포트 드라이버의 하드웨어 종속 정보가 필요합니다. 포트 드라이버가 이러한 속성 중 하나에 대한 요청이 포함된 IRP를 받으면 IRP를 미니포트 드라이버에 전달하지 않습니다. 대신 포트 드라이버는 요청 자체를 처리하지만 해당 처리기는 미니포트 드라이버에서 진입점을 호출하여 필요한 정보를 가져옵니다. 예를 들어 포트 드라이버는 KSPROPERTY_AUDIO_POSITION 요청에 대한 자체 속성 처리기를 제공합니다. 이 처리기는 미니포트 드라이버 스트림의 GetPosition 메서드(예: IMiniportWavePciStream::GetPosition)를 호출하여 현재 위치를 가져옵니다.

노드 속성

포트 드라이버는 PCFILTER_DESCRIPTOR Nodes 멤버를 통해 미니포트 드라이버의 노드 속성 처리기에 액세스합니다. 이 멤버는 노드 설명자의 배열을 가리키고 각 설명자는 노드 형식에 대한 자동화 테이블을 가리킵니다(단순히 배열 인덱스인 노드 ID로 식별됨). 일반적으로 미니포트 드라이버에 속하는 속성 처리기의 전부 또는 대부분은 Nodes 배열에 상주합니다. 오디오 드라이버는 오디오 디바이스의 하드웨어 컨트롤을 토폴로지 노드로 나타내며 속성 메커니즘을 사용하여 클라이언트에 하드웨어 종속 컨트롤 설정에 대한 액세스 권한을 제공합니다.

앞에서 설명한 대로 클라이언트는 필터-속성 요청을 필터 핸들에 보내고 핀 핸들에 pin 속성 요청을 보냅니다. 필터 또는 핀 instance 달리 노드는 커널 개체가 아니며 핸들이 없습니다. 클라이언트는 핀 핸들 또는 필터 핸들에 노드 속성 요청을 보내지만 요청은 핀 또는 필터 속성이 아닌 노드 속성에 대한 요청임을 나타내는 노드 ID도 지정합니다.

다음은 노드 속성이 필터 핸들 또는 핀 핸들을 사용해야 하는지 여부를 결정하는 일반적인 규칙입니다.

  • 필터에 특정 핀 유형의 여러 인스턴스가 포함되어 있고 해당 형식의 각 핀에 특정 노드 ID가 있는 노드가 포함된 경우 각 핀 instance 노드의 instance 포함합니다. 이 경우 노드 속성 요청은 필터 핸들이 아닌 핀 핸들을 지정하여 동일한 노드 유형의 여러 인스턴스를 구분해야 합니다. 핀 핸들과 노드 ID의 조합은 요청의 대상으로 instance 특정 노드를 명확하게 식별합니다.

  • 필터에 특정 노드의 instance 하나만 포함된 경우 노드 속성 요청은 필터 핸들을 지정합니다. 필터 핸들과 노드 ID의 조합은 요청의 대상인 노드를 명확하게 식별하기에 충분합니다.

그러나 특정 노드 속성에 대한 처리기를 구현하기 전에 드라이버 작성기는 오디오 드라이버 속성 집합을 참조하여 속성의 대상을 필터 핸들 또는 핀 핸들로 지정해야 하는지 여부를 검사 합니다.

Portcls.sys 포트 드라이버는 현재 KSPROPERTY_TOPOLOGY_NAME 제외하고 노드 속성의 기본 제공 처리를 제공하지 않습니다.

초과 지정 및 지정되지 않은 속성 요청

드라이버는 이전 규칙을 따르지 않는 클라이언트의 속성 요청을 처리할 준비가 되어 있어야 합니다. 요청은 과도하게 지정되거나 지정되지 않을 수 있습니다.

  • 과도하게 지정한 요청

    속성 요청에 필터 핸들만 필요하지만 클라이언트가 대신 핀 핸들에 요청을 보내는 경우 요청의 대상이 과도하게 지정됩니다. 그러나 드라이버는 일반적으로 요청을 유효한 것으로 처리합니다. 즉, 핀이 포함된 필터로 전송된 것처럼 요청을 처리합니다.

  • 지정되지 않은 요청

    속성 요청에 핀 핸들이 필요하지만 클라이언트가 대신 필터 핸들로 요청을 보내는 경우 요청 대상은 지정되지 않습니다. 예를 들어 필터에 동일한 노드 형식의 여러 핀 인스턴스가 포함되어 있고 클라이언트가 해당 노드 형식의 속성에 대한 요청을 핀 핸들이 아닌 필터 핸들로 보내는 경우 드라이버는 요청을 받을 노드 instance 결정할 방법이 없습니다. 이 경우 동작은 드라이버에 따라 달라집니다. 지정되지 않은 모든 요청을 자동으로 실패하는 대신 일부 드라이버는 지정되지 않은 set-property 요청을 유효한 것으로 처리합니다. 이 경우 요청이 지정된 노드 ID의 기본값을 설정한다는 해석이 있습니다. 핀 팩터리에서 instance 새 노드를 만들면 새 노드에 속하는 속성이 기본값으로 초기화됩니다. 기본값을 변경하는 요청은 요청 전에 만든 노드 인스턴스에 영향을 주지 않습니다. 또한 드라이버가 지정되지 않은 get-property 요청에 균일하게 실패합니다. 처리기는 속성을 쿼리할 노드 instance 결정할 방법이 없기 때문입니다.

규칙에 대한 예외

기록적인 이유로 몇 가지 오디오 속성에는 이러한 일반적인 규칙을 위반하는 동작 단점이 있습니다. 예제는 다음과 같습니다.

  • Speaker-Configuration 설정 적용에 설명된 대로 클라이언트는 3D 노드(KSNODETYPE_3D_EFFECTS)의 KSPROPERTY_AUDIO_CHANNEL_CONFIG 속성을 설정하여 오디오 디바이스의 스피커 구성을 변경할 수 있습니다. 스피커 구성 설정은 디바이스가 스피커를 통해 재생되는 혼합의 일부인 모든 스트림에 대한 스피커 구성을 변경하기 때문에 전역입니다. 일반 규칙에 따라 필터 전체에 영향을 주는 노드 속성 요청은 필터 핸들(노드 ID 추가)을 지정해야 합니다. 그러나 이 특정 속성에는 필터 핸들 대신 핀 핸들이 필요합니다. 핀 핸들은 요청의 대상인 3D 노드를 포함하는 핀 instance 지정합니다.

  • KSPROPERTY_SYNTH_VOLUMEKSPROPERTY_SYNTH_MASTERCLOCK 신디사이저 노드(KSNODETYPE_SYNTHESIZER)의 속성입니다. 둘 다 노드 속성이지만 이러한 속성에 대한 요청에는 노드 ID가 포함되지 않습니다. 요청에 대한 속성 설명자는 KSNODEPROPERTY가 아닌 KSPROPERTY 형식의 구조입니다. 이 동작은 노드 속성에 노드 ID가 필요한 일반 규칙을 위반합니다. 이러한 불일치에도 불구하고 두 속성 중 하나를 지원하는 미니포트 드라이버는 pins 멤버 대신 PCFILTER_DESCRIPTOR Nodes 멤버를 통해 속성 처리기를 제공해야 합니다.