Поделиться через


функция обратного вызова 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

См. также раздел