Compartilhar 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 Resumo de Objetos framework) que é o pai do WDFDEVICE referenciado no objeto Device.

Device

Um objeto WDFDEVICE (descrito em Resumo de Objetos framework) criado no EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE retorno de chamada. Este 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 de circuito. Use AcxCircuitInitAllocate para inicializar a estrutura ACXCIRCUIT_INIT.

Retornar valor

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.

Comentários

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 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 as versões do ACX, consulte Visão geral da versão do ACX.

Requisitos

Requisito Valor
Cabeçalho acxcircuit.h
IRQL PASSIVE_LEVEL

Confira também