ACX 디바이스 나열
이 항목에서는 ACX 디바이스 열거형, 시작 및 종료 및 디바이스 균형 조정에 대해 설명합니다. ACX에 대한 일반적인 개요는 ACX 오디오 클래스 확장 개요참조하세요. ACX 전원 관리 및 PnP에 대한 자세한 내용은 ACX 전원 관리참조하세요.
정적 오디오 디바이스에 대한 ACX 디바이스 열거 및 시작
ACX 시작 작동 방식에 대해 알아보려면 다음 시나리오를 설명합니다.
- 오디오 디바이스는 단일 회로로 표시됩니다.
- 오디오/회로 수명은 PnP 디바이스 수명에 연결됩니다.
- 단일 디바이스는 서로 다른 오디오 디바이스에 대해 여러 회로를 만들 수 있습니다.
- KMDF 커널 모드 환경.
시작 시퀀스는 다음과 같습니다.
WDM DriverEntry. 드라이버 범위입니다. WDF 드라이버의 루틴에 대한
DriverEntry - 추적을 시작합니다.
- 필요에 따라 언로드를 등록합니다.
- WDFDRIVER을 만듭니다.
- ACX를 호출하여 포스트 드라이버 init를 수행합니다.
- 필요에 따라 post driver 초기화를 수행합니다.
WDF 디바이스 추가. 디바이스에 한정됨. EVT_WDF_DRIVER_DEVICE_ADD 콜백 함수
- ACX를 호출하여 디바이스 init 컨텍스트를 초기화합니다.
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
ACX_DEVICEINIT_CONFIG_INIT 함수 - WDF PnP 전원 콜백 등록 -
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- AcxDeviceInitialize 사용하여 디바이스 만들기
- ACX를 호출하여 장치 초기화 후 해야 할 작업을 수행하십시오.
- 필요에 따라 모든 사후 디바이스 init를 수행합니다.
- ACX를 호출하여 디바이스 init 컨텍스트를 초기화합니다.
WDF PrepareHardware. 디바이스에 한정됩니다. EVT_WDF_DEVICE_PREPARE_HARDWARE 콜백 함수.
하드웨어 리소스를 만들고 초기화합니다(인터럽트 및 스레드의 경우 ACX에 등록).
하나 이상의 회로를 만듭니다(한 번 생성).
- AcxCircuitInit 컨텍스트를 만듭니다.
- 콜백을 추가합니다.
- AcxCircuit을 만듭니다.
- 필요에 따라 사후 회로 init를 수행합니다.
- AcxDeviceAddCircuitDevice을(를) 사용하여 회로를 등록합니다.
WDF 디바이스 D0 진입 콜백. 디바이스에 한정된. EVT_WDF_DEVICE_D0_ENTRY 콜백 함수.
ACX는 모든 회로에서 EvtAcxCircuitPowerUp 콜백 호출합니다. 회로 범위
ACX는 디바이스 전원이 끊어지기 전에 스트림(있는 경우)을 이전 상태로 이동합니다. 스트림 인스턴스 범위 지정.
WDF 큐가 다시 시작됩니다.
EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT 콜백 함수. 디바이스 범위로 지정됨.
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART 콜백 함수. 디바이스 범위 - Dx에서 각 전원이 켜진 후 초기화합니다.
ACX 스트림 추가
- ACX 회로의 ACX 스트림 추가(인스턴스)(ACX 회로의 ACX 콜백) – WDF 자체 관리형 I/O Init 또는 Restart가 호출되고 디바이스가 D0에 있는 후 언제든지 호출됩니다. 회로 범위로 제한됨
- 입력: AcxStreamInit 컨텍스트, ACXCIRCUIT.
- 콜백을 추가합니다.
- AcxStream(인스턴스)을 만듭니다.
- 필요에 따라 스트림 인스턴스 초기화를 수행합니다.
- 반환할 때 ACX는 이 스트림 인스턴스를 활성화하며, 이 시나리오에서는 오디오 경로에 있는 유일한 인스턴스이므로 스트림 메시지를 통과할 수 있습니다.
동적 오디오 디바이스에 대한 ACX 디바이스 열거 및 시작
이 시나리오에서는 다음을 가정합니다.
- 동적 오디오 지원(런타임에 오디오 디바이스 만들기/삭제).
- 디바이스 수명은 회로 수명에 연결되지 않습니다.
- 단일 디바이스는 서로 다른 오디오 디바이스에 대해 여러 회로를 만들 수 있습니다.
- 위에서 설명한 단순 정적 패턴을 활용하여 동적 패턴에 특정된 요소만 추가합니다.
- 자식 원시 PDO를 사용합니다.
- KMDF 커널 모드 환경.
이 시나리오의 시작 순서는 다음과 같습니다.
WDM DriverEntry. 드라이버 범위입니다.
- 추적을 초기화합니다.
- 필요에 따라 언로드를 등록합니다.
- WDFDRIVER을 만듭니다.
- ACX를 호출하여 포스트 드라이버 초기화를 수행합니다.
- 필요에 따라 드라이버 초기화를 수행합니다.
WDF DeviceAdd. 디바이스에 한정됨.
- ACX를 호출하여 디바이스 초기화 컨텍스트를 설정합니다.
- 디바이스를 만듭니다.
- ACX를 호출하여 디바이스 초기화 이후 작업을 시작하세요.
- 필요에 따라 모든 사후 디바이스 init를 수행합니다.
WDF PrepareHardware. 디바이스 한정.
- 하드웨어 리소스를 만들고 초기화합니다(인터럽트 및 스레드의 경우 ACX에 등록).
WDF 디바이스 D0 항목 콜백. 디바이스 제한.
WDF 큐가 다시 시작됩니다.
WDF DeviceSelfManagedIoInit. 디바이스 범위의
WDF DeviceSelfManagedIoRestart. 디바이스 범위입니다.
- Dx에서 전원이 켜질 때마다 초기화합니다.
회로 동적 생성(언제든지)
- 드라이버는
WdfPdoInitAllocate 호출하여WDFDEVICE_INIT 구조를 할당합니다. 드라이버는 디바이스를 성공적으로 만들기 전에 오류가 발생하는 경우 WdfDeviceInitFree 호출해야 합니다. - 드라이버는 수신하려는 PnP/전원 콜백을 지정합니다.
- 드라이버는 디바이스를 만듭니다.
- 드라이버는 AcxDeviceAddCircuitDevice호출하여 새 디바이스/회로를 인스턴스화합니다.
- WDF/PnP가 인수되고 이전 섹션에서 설명한 간단한 열거형/시작 패턴이 발생합니다.
AcxFactoryCircuit
ACX 드라이버는 AcxFactoryCircuitCreate 함수 및 AcxDeviceAddFactoryCircuit 함수사용하여 전원 켜기 시퀀스 중에 AcxFactoryCircuit 개체(회로 공급자)를 만들 수도 있습니다.
ACX 드라이버가 ACX에 회로 팩터리로 등록되었기 때문에 ACX 프레임워크는 등록된 팩터리를 사용하여 드라이버에 새 회로를 만들도록 요청합니다.
AcxFactoryCircuitCreate(Device, &attributes, &factoryInit, &factory);
AcxDeviceAddFactoryCircuit(Device, factory);
ACX 디바이스 리밸런스
시스템 리소스 사용 시 운영 체제가 디바이스 간에 리소스의 균형을 다시 조정해야 하는 경우 리밸런싱이 수행됩니다. 균형 조정에 대한 일반적인 내용은 PortCls 오디오 드라이버대한 PnP 리밸런스 구현을 참조하세요.
ACX는 다음과 같이 디바이스 재조정을 지원합니다.
전원 다운 WDF/ACX 시퀀스에서 드라이버는 모든 스트리밍 리소스(EvtAcxStreamPowerDown, EvtAcxStreamReleaseHardware), 회로 리소스(EvtAcxCircuitPowerDown, EvtAcxCircuitReleaseHardware) 및 디바이스 리소스(EvtDeviceReleaseHardware)를 해제합니다.
모든 요청이 보류되고 핸들이 열린 채로 남아 있습니다.
전원이 켜지는 WDF/ACX 시퀀스에서 드라이버는 새 리소스가 현재 리소스와 호환되는지 확인하고, 허용된 설정 조정을 수행합니다. 리소스가 현재 디바이스/회로 초기화와 호환되지 않는 경우 드라이버는 현재 회로를 삭제하고 새 회로를 만들어야 합니다. 자세한 내용은 아래를 참조하세요.
전원 켜기 시퀀스에서 WDF는 EvtDevicePrepareHardware 및 EvtDeviceD0 항목을 호출하고 ACX는 해당 EvtAcxCircuitPrepareHardware 및 EvtAcxCircuitPowerUp을 호출하고 모든 스트림을 기존 상태로 이동합니다.
큐가 전원이 켜지거나 실행 상태로 전환되면 I/O가 다시 흐릅니다.
ACX는 활성(RUN) 상태의 스트림이 있는 경우 제거(쿼리 제거 실패) 또는 리밸런스(쿼리 중지 실패)가 수행되도록 허용하지 않습니다.
드라이버는 항상 리밸런스 시 오디오 장치를 파괴하고 다시 만들도록 선택할 수도 있습니다. 디바이스가 새 설정이 이전 설정과 호환되지 않는 것을 감지하는 경우 위의 시나리오와 동일합니다. 회로 삭제는 EvtDevicePrepareHardware/EvtDeviceReleaseHardware 콜백에서 수행해야 하며 새 회로는 EvtDevicePrepareHardware에서 다시 만들어집니다. 드라이버는 회로 등록을 취소하여 회로를 삭제합니다(AcxDeviceRemoveCircuit사용). 일반적으로 공장 회로는 리밸런스 중에 제거해서는 안 됩니다.
사용자 모드 파일 핸들
ACX는 새 회로를 다시 만들기 전에 사용자 모드 파일 핸들을 닫을 때까지 기다리지 않습니다. 파일 시스템 핸들의 수명은 장치나 회로에서 사용되는 하드웨어 리소스의 수명과 연결되어 있지 않습니다. 클라이언트는 인터페이스 도착/제거를 수신 대기하고 파일 핸들을 닫고 다시 열어야 합니다.
이전 파일 핸들은 사용되지 않는 것으로 표시되고 ACX는 연결된 모든 I/O 요청에 실패합니다.