팩터리 필터링

오디오 어댑터 드라이버는 필터 인스턴스화를 관리하는 필터 팩터리를 제공합니다. 각 필터 팩터리는 특정 형식의 하나 이상의 KS 필터를 인스턴스화할 수 있습니다. 필터 형식이 특정 하드웨어 함수를 캡슐화하는 경우 팩터리가 인스턴스화할 수 있는 해당 유형의 필터 수는 기본 하드웨어 리소스에 의해 제한됩니다.

필터 팩터리는 주로 자율적인 하드웨어 기능 블록을 관리하므로 각 필터 팩터리는 자체적으로 디바이스 드라이버로 간주될 수 있습니다. 실제로 이전 단락에서 사용되는 어댑터 드라이버라는 용어는 어댑터 카드 다양한 하드웨어 기능을 관리하기 위해 함께 패키지된 관련 드라이버(필터 팩터리)의 컬렉션을 나타냅니다.

다른 Microsoft WDM(Windows 드라이버 모델) 드라이버와 마찬가지로 필터 팩터리는 전원 관리 및 설정 기능을 처리합니다. 설치하는 동안 드라이버의 INF 파일은 하나 이상의 필터 디바이스 이름을 등록 합니다(디바이스 식별 문자열 참조). 이 프로세스는 이름을 시스템 레지스트리에 로드하고 오디오 어댑터용 디바이스 인터페이스 설치에 설명된 대로 각 필터 팩터리를 하나 이상의 KS 필터 범주와 연결합니다. 모든 오디오 디바이스는 KSCATEGORY_AUDIO 따라 분류되지만 오디오 디바이스는 KSCATEGORY_RENDER(오디오 렌더링 디바이스의 경우) 또는 KSCATEGORY_CAPTURE(오디오 캡처 디바이스의 경우)와 같은 추가 범주로 분류될 수도 있습니다. 드라이버는 해당 디바이스에 대한 필터를 등록하는 다양한 범주를 통해 디바이스의 일반적인 기능을 보급합니다. 예를 들어 SysAudio 시스템 드라이버에 특정 유형의 오디오 디바이스가 필요한 경우 레지스트리에서 적절한 범주에 속하는 디바이스를 찾습니다.

운영 체제는 디바이스 설치 구성 요소에 설명된 대로 설치 API를 사용하여 레지스트리의 모든 KSCATEGORY_AUDIO 필터 팩터리를 검색하고 열거합니다. 각 팩터리의 레지스트리 항목은 필터 팩터리의 식별 이름과 디바이스 이름을 모두 지정합니다. 이 이름은 클라이언트가 필터를 인스턴스화하는 만들기 파일 호출에 전달하는 긴 문자열입니다. 이 호출은 커널 모드에서 ZwCreateFile 또는 사용자 모드에서 CreateFile으로 호출 될 수 있습니다. 필터는 커널 모드 개체이며 커널 핸들로 식별됩니다. create-file 호출은 클라이언트가 필터를 참조하는 데 사용할 수 있는 instance 핸들을 반환합니다. 오디오 그래프의 사용자 모드 클라이언트 또는 업스트림 필터는 이 핸들을 사용하여 IOCTL 요청을 필터에 보내거나 전달할 수 있습니다. CreateFile에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.

예를 들어 일반적인 WDM 오디오 어댑터 카드 PCI 버스에 상주할 수 있으며 웨이브 데이터를 렌더링하거나 캡처하기 위한 여러 I/O 커넥터를 포함할 수 있습니다. 이 카드 단일 오디오 장치에는 스피커 및 라인아웃 케이블 세트를 구동하기 위한 아날로그 오디오 아웃 잭과 마이크 및 라인인 케이블에서 신호를 수신하기 위한 아날로그 오디오 인 잭이 포함될 수 있습니다. WDM 오디오 시스템은 디바이스를 필터로 나타내고 오디오 잭을 해당 필터의 핀으로 나타냅니다.

오디오 디바이스에 대한 필터는 한마음으로 작동하도록 함께 바인딩된 별도의 포트 및 미니포트 드라이버로 구현됩니다.

  • 미니포트 드라이버에는 하드웨어 관련 코드가 포함되어 있습니다.

  • 포트 드라이버에는 특정 형식의 모든 필터에 공통적인 제네릭 코드가 포함되어 있습니다.

공급업체는 필터가 오디오 하드웨어를 관리하는 데 필요한 모든 독점 코드를 포함하는 미니포트 드라이버를 작성합니다. 운영 체제는 PortCls 시스템 드라이버(Portcls.sys를 통해 액세스할 수 있는 포트 드라이버를 제공합니다. 포트 클래스 어댑터 드라이버 및 PortCls 시스템 드라이버 참조). 필터 구현을 포트 및 미니포트 드라이버로 분할하면 전용 디바이스에 대한 드라이버를 작성하는 작업이 간소화됩니다.

필터 팩터리는 필터를 인스턴스화하면 먼저 필터에 대한 미니포트 드라이버 개체를 만듭니다. 그런 다음 필터 팩터리는 적절한 포트 개체의 instance 만들고 미니포트 드라이버 개체를 해당 instance 바인딩하여 완벽하게 작동하는 필터를 형성합니다. 하위 서비스 만들기의 코드 예제는 이 프로세스를 보여 줍니다. 포트 및 미니포트 드라이버는 잘 정의된 소프트웨어 인터페이스를 통해 서로 통신합니다. 이러한 인터페이스에 대한 자세한 내용은 미니포트 인터페이스 및디바이스 지원을 참조하세요.

오디오 필터는 기본 오디오 디바이스의 구조를 핀 팩터리, 노드 및 내부 연결의 컬렉션으로 노출합니다. 미니포트 드라이버는 이 정보를 PCFILTER_DESCRIPTOR 형식의 구조인 필터 설명자로 통합합니다. 이 구조체에는 필터의 핀 팩터리, 노드 및 내부 연결에 대한 개별 설명자가 포함됩니다. 이러한 설명자는 다음 형식의 구조체입니다.

PCPIN_DESCRIPTOR

PCNODE_DESCRIPTOR

PCCONNECTION_DESCRIPTOR

미니포트 드라이버에서 필터 설명자를 가져오기 위해 포트 드라이버는 IMiniport::GetDescription 메서드를 호출합니다.

드라이버가 PCFILTER_DESCRIPTOR 구조를 설정하는 방법에 대한 예제는 샘플 오디오 드라이버에서 설명하는 Sysvad 샘플 드라이버를 참조하세요.