共用方式為


EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE回呼函式 (acxcircuit.h)

當驅動程式必須為新的 ACXCIRCUIT 物件建立 WDFDEVICE 時,ACX 會叫用 EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE 回呼。

語法

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE EvtAcxFactoryCircuitCreateCircuitdevice;

NTSTATUS EvtAcxFactoryCircuitCreateCircuitdevice(
  WDFDEVICE Parent,
  ACXFACTORYCIRCUIT Factory,
  PACX_FACTORY_CIRCUIT_ADD_CIRCUIT Config,
  WDFDEVICE *Device
)
{...}

參數

Parent

WDFDEVICE 物件(如 Framework Objects摘要中所述),這是 Device 物件中所參考 WDFDEVICE 的父代。

Factory

現有的線路處理站 ACXFACTORYCIRCUIT 物件。 如需 ACX 物件的詳細資訊,請參閱 ACX 物件的 摘要

Config

定義新 ACXCIRCUIT 組態的 ACX_FACTORY_CIRCUIT_ADD_CIRCUIT 結構。

Device

接收新 WDFDEVICE 架構物件句柄的位置指標(如 Framework 物件的摘要中所述)。

傳回值

如果呼叫成功,則傳回 STATUS_SUCCESS。 否則,它會傳回適當的錯誤碼。 如需詳細資訊,請參閱使用NTSTATUS值

言論

AcxFactoryCircuit 代表能夠視需要建立 ACXCIRCUIT 的 Factory 物件。

驅動程式可以向 ACX 註冊一或多個 ACXFACTORYCIRCUIT,此動作會讓 ACX 知道驅動程式能夠建立定義完善的 ACXCIRCUIT。

當 ACX 偵測到音訊路徑需要其中一個提供 ACXCIRCUIT 的處理站時,ACX 會叫用 ACXFACTORYCIRCUIT 的回呼。

ACXFACTORYCIRCUIT 對象支援動態 ACXCIRCUIT,這表示 Factory 所建立的每個 ACXCIRCUIT 都會與 WDFDEVICE 相關聯,而且這兩個物件具有相同存留期。

AcxFactoryCircuit 有專用的 WDF 佇列。 如需 WDF 佇列的詳細資訊,請參閱 Framework Queue Objects

範例使用方式如下所示。

NTSTATUS
Dsp_EvtAcxFactoryCircuitCreateCircuitDevice(
    _In_  WDFDEVICE                         Parent,
    _In_  ACXFACTORYCIRCUIT                 Factory,
    _In_  PACX_FACTORY_CIRCUIT_ADD_CIRCUIT  CircuitConfig,
    _Out_ WDFDEVICE* Device
)
{
    ACXOBJECTBAG circuitProperties;

    PAGED_CODE();

    NTSTATUS status = STATUS_SUCCESS;
    WDF_OBJECT_ATTRIBUTES attributes;

    *Device = NULL;

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

    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));

    // 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_EvtAcxFactoryCircuitCreateCircuitDevice(Parent, Factory, CircuitConfig, Device);
    }
    else if (IsEqualGUID(circuitId, DSP_CIRCUIT_SPEAKER_GUID) || IsEqualGUID(circuitId, DSP_CIRCUIT_UNIVERSALJACK_RENDER_GUID))
    {
        return DspR_EvtAcxFactoryCircuitCreateCircuitDevice(Parent, Factory, CircuitConfig, Device);
    }

    status = STATUS_NOT_SUPPORTED;
    DrvLogError(g_SDCAVDspLog, FLAG_INIT, L"Unexpected CircuitId %!GUID!, %!STATUS!", &circuitId, status);
    return status;
}

ACX 需求

ACX 最低版本: 1.0

如需 ACX 版本的詳細資訊,請參閱 ACX 版本概觀

要求

要求 價值
標頭 acxcircuit.h
IRQL PASSIVE_LEVEL

另請參閱