다음을 통해 공유


ACX 디바이스 열거형

이 항목에서는 ACX 디바이스 열거형, 시작 및 종료 및 디바이스 균형 조정에 대해 설명합니다. ACX에 대한 일반적인 개요는 ACX 오디오 클래스 확장 개요를 참조하세요. ACX 전원 관리 및 PnP에 대한 자세한 내용은 ACX 전원 관리를 참조하세요.

정적 오디오 디바이스에 대한 ACX 디바이스 열거 및 시작

ACX 시작 작동 방식에 대해 알아보려면 다음 시나리오를 설명합니다.

  • 오디오 디바이스는 단일 회로로 표시됩니다.
  • 오디오/회로 수명은 PnP 디바이스 수명에 연결됩니다.
  • 단일 디바이스는 서로 다른 오디오 디바이스에 대해 여러 회로를 만들 수 있습니다.
  • KMDF 커널 모드 환경.

시작 시퀀스는 다음과 같습니다.

  • WDM DriverEntry. 드라이버 범위입니다. WDF 드라이버 루틴용 DriverEntry

    • 추적을 초기화합니다.
    • 필요에 따라 언로드를 등록합니다.
    • WDFDRIVER을 만듭니다.
    • ACX를 호출하여 포스트 드라이버 init를 수행합니다.
    • 필요에 따라 post driver init를 수행합니다.
  • WDF DeviceAdd. 디바이스 범위입니다. 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를 수행합니다.
  • WDF PrepareHardware. 디바이스 범위입니다. 콜백 함수를 EVT_WDF_DEVICE_PREPARE_HARDWARE.

    • 하드웨어 리소스를 만들고 초기화합니다(인터럽트 및 스레드의 경우 ACX에 등록).

    • 하나 이상의 회로를 만듭니다(한 번 생성).

      • AcxCircuitInit 컨텍스트를 만듭니다.
      • 콜백을 추가합니다.
      • AcxCircuit을 만듭니다.
      • 필요에 따라 사후 회로 init를 수행합니다.
      • AcxDeviceAddCircuitDevice를 사용하여 회로를 등록합니다.
  • WDF 디바이스 D0 항목 콜백. 디바이스 범위입니다. 콜백 함수를 EVT_WDF_DEVICE_D0_ENTRY.

  • ACX는 모든 회로에서 EvtAcxCircuitPowerUp 콜백 을 호출합니다. 회로 범위입니다.

  • ACX는 디바이스 전원이 끊어지기 전에 스트림(있는 경우)을 이전 상태로 이동합니다. Stream 인스턴스 범위입니다.

  • 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 디바이스 열거 및 시작

이 시나리오에서는 다음을 가정합니다.

  • 동적 오디오 지원(런타임에 오디오 디바이스 만들기/삭제).
  • 디바이스 수명은 회로 수명에 연결되지 않습니다.
  • 단일 디바이스는 서로 다른 오디오 디바이스에 대해 여러 회로를 만들 수 있습니다.
  • 위에서 설명한 단순 정적 패턴의 Piggyback은 동적 패턴에 특정된 요소만 추가합니다.
  • 자식 원시 PDO를 사용합니다.
  • KMDF 커널 모드 환경.

이 시나리오의 시작 순서는 다음과 같습니다.

  • WDM DriverEntry. 드라이버 범위입니다.

    • 추적을 초기화합니다.
    • 필요에 따라 언로드를 등록합니다.
    • WDFDRIVER을 만듭니다.
    • ACX를 호출하여 포스트 드라이버 init를 수행합니다.
    • 필요에 따라 post driver init를 수행합니다.
  • WDF DeviceAdd. 디바이스 범위입니다.

    • ACX를 호출하여 디바이스 init 컨텍스트를 초기화합니다.
    • 디바이스를 만듭니다.
    • ACX를 호출하여 디바이스 초기화 후 작업을 수행합니다.
    • 필요에 따라 모든 사후 디바이스 init를 수행합니다.
  • WDF PrepareHardware. 디바이스 범위입니다.

    • 하드웨어 리소스를 만들고 초기화합니다(인터럽트 및 스레드의 경우 ACX에 등록).
  • WDF 디바이스 D0 항목 콜백. 디바이스 범위입니다.

  • WDF 큐가 다시 시작됩니다.

  • WDF DeviceSelfManagedIoInit. 디바이스 범위입니다.

  • WDF DeviceSelfManagedIoRestart. 디바이스 범위입니다.

    • Dx에서 각 전원이 켜진 후 초기화합니다.

회로 동적 생성(언제든지)

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 요청에 실패합니다.

참고 항목

ACX 오디오 클래스 확장 개요

ACX 참조 설명서

PnP 및 전원 관리 콜백 시퀀스