Partager via


EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT fonction de rappel (acxcircuit.h)

Le rappel EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT est appelé par ACX lorsque le pilote doit créer un objet ACXCIRCUIT avec la configuration spécifiée.

Syntaxe

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUIT EvtAcxFactoryCircuitCreateCircuit;

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

Paramètres

Parent

Objet WDFDEVICE (décrit dans Summary of Framework Objects) qui est le parent de WDFDEVICE référencé dans l’objet Device.

Device

Objet WDFDEVICE (décrit dans Summary of Framework Objects) créé dans le rappel EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE. Cet appareil sera associé au nouveau ACXCIRCUIT.

Factory

Objet ACXFACTORYCIRCUIT de la fabrique de circuit existante. Pour plus d’informations sur les objets ACX, consultez Résumé des objets ACX.

Config

Structure ACX_FACTORY_CIRCUIT_ADD_CIRCUIT qui définit la configuration du nouveau ACXCIRCUIT.

CircuitInit

ACXCIRCUIT_INIT est un objet opaque utilisé pour l’initialisation de circuit. Utilisez AcxCircuitInitAllocate pour initialiser la structure ACXCIRCUIT_INIT.

Valeur de retour

Retourne STATUS_SUCCESS si l’appel a réussi. Sinon, elle retourne un code d’erreur approprié. Pour plus d’informations, consultez Using NTSTATUS Values.

Remarques

Un AcxFactoryCircuit représente un objet de fabrique capable de créer un ACXCIRCUIT à la demande.

Un pilote peut inscrire un ou plusieurs ACXFACTORYCIRCUIT auprès d’ACX, cette action indique à ACX que le pilote est capable de créer des ACXCIRCUITs d’un type bien défini.

ACX appelle les rappels d’ACXFACTORYCIRCUIT lorsqu’il détecte qu’un chemin audio nécessite l’une des fonctions ACXCIRCUIT fournies par acXCIRCUIT.

Un AcxFactoryCircuit a une file d’attente WDF dédiée. Pour plus d’informations sur les files d’attente WDF, consultez Framework Queue Objects.

Exemple

L’exemple d’utilisation est illustré ci-dessous.

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

Configuration requise pour ACX

version minimale d’ACX : 1.0

Pour plus d’informations sur les versions ACX, consultez vue d’ensemble de la version ACX.

Exigences

Exigence Valeur
d’en-tête acxcircuit.h
IRQL PASSIVE_LEVEL

Voir aussi