функция обратного вызова EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT (acxcircuit.h)
Обратный вызов EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT вызывается ACX, когда драйвер должен создать объект ACXCIRCUIT с указанной конфигурацией.
Синтаксис
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 ( описанный в разделе Сводка объектов платформы), который является родительским объектом WDFDEVICE, на который ссылается объект Device.
Device
Объект WDFDEVICE ( описанный в разделе Сводка объектов платформы), созданный при обратном вызове EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE. Это устройство будет связано с новым ACXCIRCUIT.
Factory
Объект ACXFACTORYCIRCUIT существующей фабрики цепи. Дополнительные сведения об объектах ACX см. в разделе Сводка по объектам ACX.
Config
Структура ACX_FACTORY_CIRCUIT_ADD_CIRCUIT , которая определяет конфигурацию для нового ACXCIRCUIT.
CircuitInit
ACXCIRCUIT_INIT является непрозрачным объектом, используемым для инициализации канала. Используйте AcxCircuitInitAllocate для инициализации структуры ACXCIRCUIT_INIT.
Возвращаемое значение
Возвращает значение STATUS_SUCCESS
, если вызов был успешным. В противном случае возвращается соответствующий код ошибки. Дополнительные сведения см. в разделе Использование значений NTSTATUS.
Комментарии
AcxFactoryCircuit представляет объект фабрики, способный создавать ACXCIRCUIT по запросу.
Драйвер может зарегистрировать один или несколько ACXFACTORYCIRCUIT в ACX. Это действие сообщит ACX, что драйвер может создавать ACXCIRCUITs с четко определенным типом.
ACX вызывает обратные вызовы ACXFACTORYCIRCUIT, когда обнаруживает, что для звукового пути требуется один из предоставленных фабрикой ACXCIRCUITs.
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.
Требования
Требование | Значение |
---|---|
Заголовок | acxcircuit.h |
IRQL | PASSIVE_LEVEL |