Share via


EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE función de devolución de llamada (acxcircuit.h)

ACX invoca la EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE devolución de llamada cuando el controlador debe crear un WDFDEVICE para un nuevo objeto ACXCIRCUIT.

Sintaxis

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE EvtAcxFactoryCircuitCreateCircuitdevice;

NTSTATUS EvtAcxFactoryCircuitCreateCircuitdevice(
  WDFDEVICE Parent,
  ACXFACTORYCIRCUIT Factory,
  PACX_FACTORY_CIRCUIT_ADD_CIRCUIT Config,
  WDFDEVICE *Device
)
{...}

Parámetros

Parent

Objeto WDFDEVICE (descrito en Resumen de objetos de marco) que es el elemento primario del WDFDEVICE al que se hace referencia en el objeto Device.

Factory

Objeto ACXFACTORYCIRCUIT de fábrica de circuitos existente. Para obtener más información sobre los objetos ACX, vea Resumen de objetos ACX.

Config

Estructura ACX_FACTORY_CIRCUIT_ADD_CIRCUIT que define la configuración del nuevo ACXCIRCUIT.

Device

Puntero a una ubicación que recibe un identificador para el nuevo objeto de marco WDFDEVICE (descrito en Resumen de objetos de marco).

Valor devuelto

Devuelve STATUS_SUCCESS si la llamada se realizó correctamente. De lo contrario, devuelve un código de error adecuado. Para obtener más información, vea Uso de valores NTSTATUS.

Comentarios

Un AcxFactoryCircuit representa un objeto de fábrica capaz de crear un ACXCIRCUIT a petición.

Un controlador puede registrar uno o varios ACXFACTORYCIRCUIT con ACX, esta acción informará a ACX de que el controlador es capaz de crear ACXCIRCUIT de un tipo bien definido.

ACX invoca las devoluciones de llamada de ACXFACTORYCIRCUIT cuando detecta que una ruta de acceso de audio requiere uno de los ACXCIRCUITs proporcionados por el generador.

El objeto ACXFACTORYCIRCUIT admite ACXCIRCUITs dinámicos, lo que significa que cada ACXCIRCUIT creado por la fábrica está asociado a un WDFDEVICE y estos dos objetos tienen la misma duración.

AcxFactoryCircuit tiene una cola WDF dedicada. Para obtener más información sobre las colas de WDF, vea Objetos de cola de marco.

Ejemplo

A continuación se muestra un ejemplo de uso.

NTSTATUS
Dsp_EvtAcxFactoryCircuitCreateCircuitDevice(
    _In_  WDFDEVICE                         Parent,
    _In_  ACXFACTORYCIRCUIT                 Factory,
    _In_  PACX_FACTORY_CIRCUIT_ADD_CIRCUIT  CircuitConfig,
    _Out_ WDFDEVICE* Device
)
{
    ACXOBJECTBAG circuitProperties;

    PAGED_CODE();

    NTSTATUS status = STATUS_SUCCESS;
    WDF_OBJECT_ATTRIBUTES attributes;

    *Device = NULL;

    // Create object bag from the CircuitProperties
    ACX_OBJECTBAG_CONFIG propConfig;
    ACX_OBJECTBAG_CONFIG_INIT(&propConfig);
    propConfig.Handle = CircuitConfig->CircuitProperties;
    propConfig.Flags |= AcxObjectBagConfigOpenWithHandle;

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

    // 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_EvtAcxFactoryCircuitCreateCircuitDevice(Parent, Factory, CircuitConfig, Device);
    }
    else if (IsEqualGUID(circuitId, DSP_CIRCUIT_SPEAKER_GUID) || IsEqualGUID(circuitId, DSP_CIRCUIT_UNIVERSALJACK_RENDER_GUID))
    {
        return DspR_EvtAcxFactoryCircuitCreateCircuitDevice(Parent, Factory, CircuitConfig, Device);
    }

    status = STATUS_NOT_SUPPORTED;
    DrvLogError(g_SDCAVDspLog, FLAG_INIT, L"Unexpected CircuitId %!GUID!, %!STATUS!", &circuitId, status);
    return status;
}

Requisitos de ACX

Versión mínima de ACX: 1.0

Para obtener más información sobre las versiones de ACX, consulte Introducción a la versión de ACX.

Requisitos

Requisito Valor
Header acxcircuit.h
IRQL PASSIVE_LEVEL

Consulte también