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 |