Partager via


fonction de rappel EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE (acxcircuit.h)

Le rappel EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE est appelé par ACX lorsque le pilote doit créer un WDFDEVICE pour un nouvel objet ACXCIRCUIT.

Syntaxe

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE EvtAcxFactoryCircuitCreateCircuitdevice;

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

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.

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.

Device

Pointeur vers un emplacement qui reçoit un handle vers le nouvel objet framework WDFDEVICE (décrit dans Summary of Framework Objects).

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.

L’objet ACXFACTORYCIRCUIT prend en charge les ACXCIRCUITs dynamiques, cela signifie que chaque ACXCIRCUIT créé par la fabrique est associé à un WDFDEVICE et que ces deux objets ont la même durée de vie.

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.

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

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