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

作为 Device (对象中引用的 WDFDEVICE 的父级的 框架对象) 摘要 中所述的 WDFDEVICE 对象。

Factory

现有线路工厂 ACXFACTORYCIRCUIT 对象。 有关 ACX 对象的详细信息,请参阅 ACX 对象的摘要

Config

定义新 ACXCIRCUIT 配置的 ACX_FACTORY_CIRCUIT_ADD_CIRCUIT 结构。

Device

指向接收新 WDFDEVICE 框架对象句柄的位置的指针, (框架对象摘要) 中所述。

返回值

STATUS_SUCCESS如果调用成功,则返回 。 否则,它将返回相应的错误代码。 有关详细信息,请参阅 使用 NTSTATUS 值

注解

AcxFactoryCircuit 表示能够按需创建 ACXCIRCUIT 的工厂对象。

驱动程序可以向 ACX 注册一个或多个 ACXFACTORYCIRCUIT,此操作将使 ACX 知道驱动程序能够创建定义良好的类型的 ACXCIRCUIT。

ACX 在检测到音频路径需要工厂提供的 ACXCIRCUIT 之一时调用 ACXFACTORYCIRCUIT 的回调。

ACXFACTORYCIRCUIT 对象支持动态 ACXCIRCUIT,这意味着工厂创建的每个 ACXCIRCUIT 都与 WDFDEVICE 相关联,并且这两个对象具有相同的生存期。

AcxFactoryCircuit 具有专用的 WDF 队列。 有关 WDF 队列的详细信息,请参阅 框架队列对象

示例

示例用法如下所示。

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 版本概述

要求

要求
Header acxcircuit.h
IRQL PASSIVE_LEVEL

另请参阅