동적 하위 서비스 등록 및 등록 취소
어떤 형태의 잭 프레즌스 검색을 지원하는 디바이스를 동적 디바이스라고 하며 잭은 KSPROPERTY_JACK_DESCRIPTION 속성을 지원해야 합니다. 다음 단계에서는 동적 디바이스의 드라이버가 이러한 동적 디바이스에 대해 연결된 하위 서비스를 만들거나 등록하거나 등록 취소하는 데 사용하는 알고리즘을 보여 줍니다. 하위 서비스가 필터 형식으로 만들어집니다.
다음 단계에서는 오디오 디바이스 드라이버가 로드될 때 잭에 연결된 오디오 디바이스가 있을 때 어떤 일이 발생하는지 보여 줍니다.
드라이버는 잭 프레즌스 검색을 사용하여 잭에 연결된 디바이스가 있는지 확인합니다. 드라이버는 PcRegisterSubdevice 를 호출하여 토폴로지 필터를 Portcls에 등록합니다. 토폴로지 필터 등록의 결과로 KSCATEGORY_AUDIO 인터페이스가 만들어집니다.
오디오 스택은 KSCATEGORY_AUDIO 인터페이스가 만들어지고 AudioEndpoint Builder 가 연결된 엔드포인트를 만들고 초기화한 다음 상태를 활성으로 설정하면 알림을 받습니다.
드라이버가 포트클에 웨이브 필터를 등록하고 오디오 스택에 알림이 표시됩니다.
드라이버는 PcRegisterPhysicalConnection 을 호출하여 웨이브 필터를 토폴로지 필터와 연결합니다. 그러면 이 물리적 연결이 Portcls에 등록됩니다.
드라이버는 KSJACK_DESCRIPTION 구조체의 IsConnected 멤버를 TRUE 로 설정하여 잭에 연결된 디바이스가 있음을 나타냅니다.
참고 오디오 디바이스에 잭 프레즌스 검색이 없는 경우 IsConnected 멤버는 항상 TRUE여야 합니다. 디바이스가 잭 프레즌스 검색을 지원하는지 여부를 확인하기 위해 클라이언트 애플리케이션은 IKsJackDescription2::GetJackDescription2 를 호출하여 KSJACK_DESCRIPTION2 구조의 JackCapabilities 플래그를 읽을 수 있습니다. 이 플래그에 JACKDESC2_PRESENCE_DETECT_CAPABILITY 비트 집합이 있는 경우 엔드포인트가 잭 프레즌스 검색을 지원한다는 것을 나타냅니다. 이 경우 IsConnected 멤버의 반환 값은 잭의 삽입 상태를 정확하게 반영한 것으로 해석될 수 있습니다.
다음 단계에서는 드라이버가 로드될 때 잭에 연결된 오디오 디바이스가 없으면 어떻게 되는지 설명합니다.
드라이버는 잭 프레즌스 검색을 사용하여 잭에 연결된 디바이스가 없는지 확인합니다. 그러나 토폴로지 필터를 잭의 Portcls에 등록하고 KSCATEGORY_AUDIO 인터페이스가 만들어집니다.
오디오 스택은 KSCATEGORY_AUDIO 인터페이스를 만들 때 알림을 받습니다. AudioEndpointBuilder는 미니포트 드라이버를 쿼리하여 KSJACK_DESCRIPTION 속성에서 엔드포인트의 상태를 분리된 상태로 설정할지 여부를 확인합니다.
드라이버는 KSJACK_DESCRIPTION 구조체의 IsConnected 멤버를 FALSE로 설정하여 잭에 연결된 디바이스가 없음을 나타냅니다.
오디오 엔드포인트의 다양한 상태에 대한 자세한 내용은 오디오 엔드포인트 작성기 알고리즘을 참조하세요.
하위 서비스 등록 및 등록 취소 프로세스에 대한 이전 설명을 준수하려면 잭 프레즌스 검색을 지원하는 디바이스 드라이버가 플러그 삽입 및 제거에 대한 응답으로 다음과 같은 방식으로 반응해야 합니다.
플러그 삽입에 대한 디바이스 드라이버 응답
드라이버는 PcRegisterSubdevice 를 호출하여 포트클에 웨이브 필터를 등록해야 합니다. 참고 드라이버가 잭에 연결된 디바이스 없이 로드되었을 때 이미 토폴로지 필터에서 PcRegisterSubdevice 를 호출했습니다.
드라이버는 PcRegisterPhysicalConnection 을 호출하여 Portcls에 "웨이브-토폴로지 필터" 연결을 등록해야 합니다.
드라이버는 KSJACK_DESCRIPTION 구조체의 IsConnected 멤버를 TRUE로 설정해야 합니다.
플러그 제거에 대한 디바이스 드라이버 응답
드라이버는 IUnregisterPhysicalConnection::UnregisterPhysicalConnection 을 호출하여 웨이브 필터와 토폴로지 필터 간의 물리적 연결을 등록 취소해야 합니다.
드라이버는 IUnregisterSubdevice::UnregisterSubdevice 를 호출하여 웨이브 필터를 등록 취소해야 합니다.
드라이버는 KSJACK_DESCRIPTION 구조 FALSE의 IsConnected 멤버를 설정해야 합니다.