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

WDFDEVICE 物件 (描述於 Framework 物件的摘要) ,該對像是 Device 物件中所參考 WDFDEVICE 的父系。

Device

WDFDEVICE 物件 (描述於EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE回呼中建立的 Framework 物件摘要) 。 此裝置將會與新的 ACXCIRCUIT 相關聯。

Factory

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

Config

定義新 ACXCIRCUIT 組態 的ACX_FACTORY_CIRCUIT_ADD_CIRCUIT 結構。

CircuitInit

ACXCIRCUIT_INIT是用於線路初始化的不透明物件。 使用 AcxCircuitInitAllocate 初始化ACXCIRCUIT_INIT結構。

傳回值

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

備註

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

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

ACX 會在偵測到音訊路徑需要其中一個原廠提供的 ACXCIRCUIT 時,叫用 ACXFACTORYCIRCUIT 的回呼。

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

範例

範例使用方式如下所示。

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

另請參閱