當驅動程式必須使用指定的組態建立 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
WDFDEVICE 物件(如 Framework Objects摘要中所述),這是 Device 物件中所參考 WDFDEVICE 的父代。
Device
在EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE回呼中建立的 WDFDEVICE 物件(如 Framework 物件的摘要中所述。 此裝置將會與新的 ACXCIRCUIT 相關聯。
Factory
現有的線路處理站 ACXFACTORYCIRCUIT 物件。 如需 ACX 物件的詳細資訊,請參閱 ACX 物件的 摘要。
Config
定義新 ACXCIRCUIT 組態的 ACX_FACTORY_CIRCUIT_ADD_CIRCUIT 結構。
CircuitInit
ACXCIRCUIT_INIT是用於線路初始化的不透明物件。 使用 AcxCircuitInitAllocate 初始化ACXCIRCUIT_INIT結構。
傳回值
如果呼叫成功,則傳回 STATUS_SUCCESS
。 否則,它會傳回適當的錯誤碼。 如需詳細資訊,請參閱使用NTSTATUS值 。
言論
AcxFactoryCircuit 代表能夠視需要建立 ACXCIRCUIT 的 Factory 物件。
驅動程式可以向 ACX 註冊一或多個 ACXFACTORYCIRCUIT,此動作會讓 ACX 知道驅動程式能夠建立定義完善的 ACXCIRCUIT。
當 ACX 偵測到音訊路徑需要其中一個提供 ACXCIRCUIT 的處理站時,ACX 會叫用 ACXFACTORYCIRCUIT 的回呼。
AcxFactoryCircuit 有專用的 WDF 佇列。 如需 WDF 佇列的詳細資訊,請參閱 Framework Queue Objects。
例
範例使用方式如下所示。
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 版本概觀。
要求
要求 | 價值 |
---|---|
標頭 | acxcircuit.h |
IRQL | PASSIVE_LEVEL |