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 |