Partilhar via


EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT função de retorno de chamada (acxcircuit.h)

O retorno de chamada EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT é invocado pelo ACX quando o driver deve criar um objeto ACXCIRCUIT com a configuração especificada.

Sintaxe

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT EvtAcxFactoryCircuitCreateCircuit;

NTSTATUS EvtAcxFactoryCircuitCreateCircuit(
  WDFDEVICE Parent,
  WDFDEVICE Device,
  ACXFACTORYCIRCUIT Factory,
  PACX_FACTORY_CIRCUIT_ADD_CIRCUIT Config,
  PACXCIRCUIT_INIT CircuitInit
)
{...}

Parâmetros

Parent

Um objeto WDFDEVICE (descrito em Summary of Framework Objects) que é o pai do WDFDEVICE referenciado no objeto Device.

Device

Um objeto WDFDEVICE (descrito em Resumo de Objetos da Estrutura) criado no EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE retorno de chamada. Esse dispositivo será associado ao novo ACXCIRCUIT.

Factory

O objeto ACXFACTORYCIRCUIT da fábrica de circuitos existente. Para obter mais informações sobre objetos ACX, consulte Resumo de objetos ACX.

Config

Uma estrutura ACX_FACTORY_CIRCUIT_ADD_CIRCUIT que define a configuração do novo ACXCIRCUIT.

CircuitInit

ACXCIRCUIT_INIT é um objeto opaco usado para inicialização do circuito. Use AcxCircuitInitAllocate para inicializar a estrutura de ACXCIRCUIT_INIT.

Valor de retorno

Retorna STATUS_SUCCESS se a chamada foi bem-sucedida. Caso contrário, ele retornará um código de erro apropriado. Para obter mais informações, consulte Usando valores NTSTATUS.

Observações

Um AcxFactoryCircuit representa um objeto de fábrica capaz de criar um ACXCIRCUIT sob demanda.

Um driver pode registrar um ou mais ACXFACTORYCIRCUIT com ACX, essa ação permitirá que o ACX saiba que o driver é capaz de criar ACXCIRCUITs de um tipo bem definido.

O ACX invoca os retornos de chamada do ACXFACTORYCIRCUIT quando detecta que um caminho de áudio requer um dos ACXCIRCUITs fornecidos pela fábrica.

Um AcxFactoryCircuit tem uma fila WDF dedicada. Para obter mais informações sobre filas do WDF, consulte de Objetos de Fila da Estrutura.

Exemplo

O uso de exemplo é mostrado abaixo.

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;
}

Requisitos do ACX

versão mínima do ACX: 1.0

Para obter mais informações sobre versões do ACX, consulte visão geral da versão do ACX.

Requisitos

Requisito Valor
cabeçalho acxcircuit.h
IRQL PASSIVE_LEVEL

Consulte também