EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT 콜백 함수(acxcircuit.h)

드라이버가 지정된 구성을 사용하여 ACXCIRCUIT 개체를 만들어야 하는 경우 ACX에서 EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT 콜백을 호출합니다.

구문

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT EvtAcxFactoryCircuitCreateCircuit;

NTSTATUS EvtAcxFactoryCircuitCreateCircuit(
  WDFDEVICE Parent,
  WDFDEVICE Device,
  ACXFACTORYCIRCUIT Factory,
  PACX_FACTORY_CIRCUIT_ADD_CIRCUIT Config,
  PACXCIRCUIT_INIT CircuitInit
)
{...}

매개 변수

Parent

Device 개체에서 참조되는 WDFDEVICE의 부모인 WDFDEVICE 개체( 프레임워크 개체 요약에 설명됨)입니다.

Device

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE 콜백에서 만든 WDFDEVICE 개체(프레임워크 개체 요약에 설명됨)입니다. 이 디바이스는 새 ACXCIRCUIT와 연결됩니다.

Factory

기존 회로 팩터리 ACXFACTORYCIRCUIT 개체입니다. ACX 개체에 대한 자세한 내용은 ACX 개체 요약을 참조하세요.

Config

새 ACXCIRCUIT에 대한 구성을 정의하는 ACX_FACTORY_CIRCUIT_ADD_CIRCUIT 구조체입니다.

CircuitInit

ACXCIRCUIT_INIT 회로 초기화에 사용되는 불투명 개체입니다. AcxCircuitInitAllocate를 사용하여 ACXCIRCUIT_INIT 구조를 초기화합니다.

반환 값

호출에 성공하면 를 반환합니다 STATUS_SUCCESS . 그렇지 않으면 적절한 오류 코드를 반환합니다. 자세한 내용은 NTSTATUS 값 사용을 참조하세요.

설명

AcxFactoryCircuit은 주문형 ACXCIRCUIT을 만들 수 있는 팩터리 개체를 나타냅니다.

드라이버는 ACX에 하나 이상의 ACXFACTORYCIRCUIT를 등록할 수 있습니다. 이 작업을 통해 ACX는 드라이버가 잘 정의된 형식의 ACXCIRCUIT를 만들 수 있음을 알 수 있습니다.

ACX는 오디오 경로에 팩터리 제공 ACXCIRCUIT 중 하나가 필요하다는 것을 감지하면 ACXFACTORYCIRCUIT의 콜백을 호출합니다.

AcxFactoryCircuit에는 전용 WDF 큐가 있습니다. WDF 큐에 대한 자세한 내용은 프레임워크 큐 개체를 참조하세요.

예제

예제 사용법은 다음과 같습니다.

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT Dsp_EvtAcxFactoryCircuitCreateCircuit;

NTSTATUS
Dsp_EvtAcxFactoryCircuitCreateCircuit(
    _In_ WDFDEVICE                          Parent,
    _In_ WDFDEVICE                          Device,
    _In_ ACXFACTORYCIRCUIT                  Factory,
    _In_ PACX_FACTORY_CIRCUIT_ADD_CIRCUIT   CircuitConfig,
    _In_ PACXCIRCUIT_INIT                   CircuitInit
)
{
    ACXOBJECTBAG circuitProperties;

    PAGED_CODE();

    NTSTATUS status = STATUS_SUCCESS;

    // Create object bag from the CompositeProperties
    ACX_OBJECTBAG_CONFIG propConfig;
    ACX_OBJECTBAG_CONFIG_INIT(&propConfig);
    propConfig.Handle = CircuitConfig->CircuitProperties;
    propConfig.Flags |= AcxObjectBagConfigOpenWithHandle;

    WDF_OBJECT_ATTRIBUTES attributes;
    WDF_OBJECT_ATTRIBUTES_INIT(&attributes);

    RETURN_NTSTATUS_IF_FAILED(AcxObjectBagOpen(&attributes, &propConfig, &circuitProperties));

    auto cleanupPropConfig = scope_exit([=]() {
        WdfObjectDelete(circuitProperties);
        }
    );

    // Retrieve the intended Circuit ID from the object bag
    GUID circuitId;
    RETURN_NTSTATUS_IF_FAILED(Dsp_DetermineCircuitGuidFromVendorProperties(circuitProperties, &circuitId));

    AcxCircuitInitSetComponentId(CircuitInit, &circuitId);

    // Call the appropriate CreateCircuitDevice based on the Circuit ID
    if (IsEqualGUID(circuitId, DSP_CIRCUIT_MICROPHONE_GUID) || IsEqualGUID(circuitId, DSP_CIRCUIT_UNIVERSALJACK_CAPTURE_GUID))
    {
        return DspC_EvtAcxFactoryCircuitCreateCircuit(Parent, Device, Factory, CircuitConfig, CircuitInit);
    }
    else if (IsEqualGUID(circuitId, DSP_CIRCUIT_SPEAKER_GUID) || IsEqualGUID(circuitId, DSP_CIRCUIT_UNIVERSALJACK_RENDER_GUID))
    {
        return DspR_EvtAcxFactoryCircuitCreateCircuit(Parent, Device, Factory, CircuitConfig, CircuitInit);
    }

    status = STATUS_NOT_SUPPORTED;
    return status;
}

ACX 요구 사항

최소 ACX 버전: 1.0

ACX 버전에 대한 자세한 내용은 ACX 버전 개요를 참조하세요.

요구 사항

요구 사항
헤더 acxcircuit.h
IRQL PASSIVE_LEVEL

추가 정보