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

WDFDEVICE 对象 (在EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE回调中创建 的框架对象摘要) 中所述。 此设备将与新的 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 版本概述

要求

要求
Header acxcircuit.h
IRQL PASSIVE_LEVEL

另请参阅