PortCls 오디오 드라이버에 대한 PnP 리밸런스 구현
PnP 리밸런싱은 메모리 리소스를 다시 할당해야 하는 특정 PCI 시나리오에서 사용됩니다.
두 가지 기본 시나리오에서 재균형을 트리거할 수 있습니다.
- PCI 핫플러그: 사용자가 디바이스에 연결하고 PCI 버스에 새 디바이스에 대한 드라이버를 로드하기에 충분한 리소스가 없습니다. 이 범주에 속하는 디바이스의 몇 가지 예로는 Thunderbolt, USB-C 및 NVME Storage가 있습니다. 이 시나리오에서는 추가되는 추가 디바이스를 지원하기 위해 메모리 리소스를 다시 정렬하고 통합(재조정)해야 합니다.
- PCI 크기 조정 가능한 BAR: 디바이스에 대한 드라이버가 메모리에 성공적으로 로드되면 추가 리소스를 요청합니다. 디바이스의 몇 가지 예로는 고급 그래픽 카드 및 스토리지 디바이스가 있습니다. 비디오 드라이버 지원에 대한 자세한 내용은 크기 조정 가능한 BAR 지원을 참조하세요. 이 항목에서는 PortCls 오디오 드라이버에 대한 PnP 리밸런스를 구현하기 위해 수행해야 하는 작업에 대해 설명합니다.
PnP 리밸런싱은 Windows 10 버전 1511 이상 버전의 Windows에서 사용할 수 있습니다.
리밸런스 요구 사항
포트클 오디오 드라이버는 다음 조건이 충족되는 경우 리밸런스를 지원할 수 있습니다.
- 미니포트는 IAdapterPnpManagement 인터페이스를 Portcls에 등록해야 합니다.
- 미니포트는 IAdapterPnpManagement::GetSupportedRebalanceType에서 PcRebalanceRemoveSubdevices를 반환해야 합니다.
- 토폴로지와 WaveRT는 지원되는 두 가지 포트 형식입니다.
활성 오디오 스트림이 있을 때 균형 조정을 지원하려면 포트클 오디오 드라이버가 이러한 두 가지 추가 요구 사항 중 하나를 충족해야 합니다.
- 드라이버는 오디오 스트림에 대한 IMiniportWaveRTInputStream::GetReadPacket 및 IMiniportWaveRTOutputStream 패킷 인터페이스를 지원합니다. 이 옵션을 사용하는 것이 좋습니다.
또는
- 드라이버가 스트림에 대한 IMiniportWaveRT 가져오기/쓰기를 지원하지 않는 경우 드라이버는 KSPROPERTY_RTAUDIO_POSITIONREGISTER 및 KSPROPERTY_RTAUDIO_CLOCKREGISTER 지원하지 않아야 합니다. 오디오 엔진은 이 시나리오에서 IMiniportWaveRTStream::GetPosition 을 사용합니다.
리밸런싱이 발생할 때 오디오 스트림 동작
리밸런스가 트리거되고 활성 오디오 스트림이 있고 드라이버가 활성 오디오 스트림에 대한 리밸런스를 지원하는 경우 모든 활성 오디오 스트림이 중지되고 자동으로 다시 시작되지 않습니다.
IPortClsPnp COM 인터페이스
IPortClsPnp
는 포트 클래스 드라이버(PortCls)가 어댑터에 노출하는 PnP 관리 인터페이스입니다.
IPortClsPnp
는 IUnknown에서 상속되며 다음 메서드도 지원합니다.
오디오 미니포트 드라이버는 Portcls 내보내기를 사용하거나 WaveRT 포트 개체에 노출된 IPortClsPnp COM 인터페이스 IPortClsPnp를 통해 PNP 알림 인터페이스를 등록할 수 있습니다. IPortClsPnp::RegisterAdapterPnpManagement 및 IPortClsPnp::UnregisterAdapterPnpManagement를 사용하여 등록 및 등록을 취소합니다.
필수 PortCls 내보내기 DDI
IAdapterPnpManagement 는 어댑터가 PnP 관리 메시지를 수신하려는 경우 구현하고 등록해야 하는 인터페이스입니다. PcRegisterAdapterPnpManagement를 사용하여 이 인터페이스를 PortCls에 등록합니다. PcUnregisterAdapterPnpManagement를 사용하여 PortCls에서 이 인터페이스의 등록을 취소합니다.
필수 드라이버 DDI
재조정을 지원하려면 다음 IAdapterPnpManagement DDI를 구현해야 합니다.
IAdapterPnpManagement::GetSupportedRebalanceType 은 QueryStop을 처리하는 동안 Portcls에서 호출됩니다. 미니포트는 PC_REBALANCE_TYPE 열거형에 정의된 대로 지원되는 리밸런스 형식을 반환합니다.
이 호출을 하기 전에 Portcls는 디바이스 전역 잠금을 획득하므로 미니포트는 이 호출을 가능한 한 빨리 실행해야 합니다.
IAdapterPnpManagement::P npQueryStop 은 QueryStop IRP를 성공하기 직전에 포트클로 호출됩니다. 이는 알림일 뿐이며 호출은 값을 반환하지 않습니다.
이 호출을 하기 전에 Portcls는 디바이스 전역 잠금을 획득하므로 미니포트는 이 호출을 가능한 한 빨리 실행해야 합니다. 중지가 보류 중인 동안 Portcls는 새 만들기 요청을 차단(보류)합니다.
IAdapterPnpManagement::P npCancelStop 은 CanceStop IRP를 처리하는 동안 포트클에 의해 호출됩니다. 이것은 단지 알림일 뿐입니다. 이전에 PnpQueryStop 알림을 받지 않아도 미니포트가 PnpCancelStop을 받을 수 있습니다. 이 동작을 수용하기 위해 미니포트를 작성해야 합니다. 예를 들어 Portcls가 이 알림을 미니포트에 전달할 기회가 있기 전에 QueryStop 논리가 IRP에 실패하는 경우입니다. 이 시나리오에서 PnP 관리자는 여전히 PnP 취소 중지를 호출합니다.
이 호출을 하기 전에 Portcls는 디바이스 전역 잠금을 획득하므로 미니포트는 이 호출을 가능한 한 빨리 실행해야 합니다. 중지가 보류 중인 동안 Portcls는 새 만들기 요청을 차단(보류)합니다. 보류 중인 중지가 취소되면 PortCls는 보류 중인 만들기 요청을 다시 시작합니다.
IAdapterPnpManagement::P npStop 은 모든 Ioctl 작업을 중지하고 활성 스트림을 [run|pause|acquire] 상태에서 [stop] 상태로 이동한 후 Portcls에서 호출됩니다. 이 호출은 디바이스 전역 잠금을 유지하는 동안 수행되지 않습니다. 따라서 미니포트는 비동기 작업(작업 항목, dpc, 비동기 스레드)을 기다린 후 오디오 하위 서비스 등록을 취소할 수 있습니다. 이 호출에서 반환하기 전에 미니포트는 모든 h/w 리소스가 해제되었는지 확인해야 합니다.
참고 : 미니포트는 기존 오디오 클라이언트가 현재 핸들을 해제할 시기가 불분명하기 때문에 현재 미니포트/스트림 개체가 삭제될 때까지 기다리지 않아야 합니다. PnpStop 스레드는 시스템을 충돌하지 않고 영원히 차단할 수 없습니다. 즉, PnP/Power 스레드입니다.
IMiniportPnpNotify
IMiniportPnpNotify 는 미니포트 개체(오디오 하위 서비스)가 PnP 상태 변경 알림을 받을 수 있도록 하는 선택적 인터페이스입니다.
미니포트는 등록한 각 오디오 하위 서비스에 대해 PnP 중지 알림을 받을 수 있습니다. 이 알림을 받으려면 하위 서비스가 IMiniportPnpNotify를 지원해야 합니다. IMiniportPnpNotify::P npStop 알림만 이 인터페이스에 정의되어 있습니다.
사용 가능한 IMiniportPnpNotify 인터페이스는 WaveRT와 토폴로지 모두에서 사용할 수 있습니다.
이 호출을 하기 전에 Portcls가 디바이스 전역 잠금을 획득하기 때문에 미니포트는 이 호출을 가능한 한 빨리 실행해야 합니다. 미니포트는 다른 스레드/작업 항목이 디바이스 전역 잠금을 기다리는 경우 교착 상태를 방지하기 위해 이 호출을 처리하는 동안 다른 작업을 기다리지 않아야 합니다. 필요한 경우 미니포트는 IAdapterPnpManagement::P npStop 호출에서 대기할 수 있습니다.