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 对象的摘要中所述),它是设备对象中引用的 WDFDEVICE 的父对象。

Factory

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

Config

定义新 ACXCIRCUIT 配置的 ACX_FACTORY_CIRCUIT_ADD_CIRCUIT 结构。

Device

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

返回值

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

言论

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

驱动程序可以将一个或多个 ACXFACTORYCIRCUIT 注册到 ACX,此作将让 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 版本概述

要求

要求 价值
标头 acxcircuit.h
IRQL PASSIVE_LEVEL

另请参阅