Condividi tramite


EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE funzione di callback (acxcircuit.h)

Il callback EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE viene richiamato da ACX quando il driver deve creare un WDFDEVICE per un nuovo oggetto ACXCIRCUIT.

Sintassi

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE EvtAcxFactoryCircuitCreateCircuitdevice;

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

Parametri

Parent

Oggetto WDFDEVICE (descritto in Riepilogo degli oggetti framework) padre di WDFDEVICE a cui si fa riferimento nell'oggetto Device.

Factory

Oggetto ACXFACTORYCIRCUIT della fabbrica di circuiti esistente. Per altre informazioni sugli oggetti ACX, vedere Riepilogo degli oggetti ACX.

Config

Struttura ACX_FACTORY_CIRCUIT_ADD_CIRCUIT che definisce la configurazione per il nuovo ACXCIRCUIT.

Device

Puntatore a una posizione che riceve un handle per il nuovo oggetto framework WDFDEVICE (descritto in Riepilogo degli oggetti framework).

Valore restituito

Restituisce STATUS_SUCCESS se la chiamata ha avuto esito positivo. In caso contrario, restituisce un codice di errore appropriato. Per altre informazioni, vedere Uso dei valori NTSTATUS.

Commenti

Un oggetto AcxFactoryCircuit rappresenta un oggetto factory in grado di creare un oggetto ACXCIRCUIT su richiesta.

Un driver può registrare uno o più ACXFACTORYCIRCUIT con ACX. Questa azione informa ACX che il driver è in grado di creare ACXCIRCUIT di un tipo ben definito.

ACX richiama i callback di ACXFACTORYCIRCUIT quando rileva che un percorso audio richiede uno degli ACXCIRCUIT forniti dalla factory.

L'oggetto ACXFACTORYCIRCUIT supporta ACXCIRCUITs dinamico, pertanto ogni ACXCIRCUIT creato dalla factory è associato a un WDFDEVICE e questi due oggetti hanno la stessa durata.

AcxFactoryCircuit ha una coda WDF dedicata. Per altre informazioni sulle code WDF, vedere Framework Queue Objects.

Esempio

Di seguito è riportato un esempio di utilizzo.

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

Requisiti di ACX

Versione minima di ACX: 1.0

Per altre informazioni sulle versioni ACX, vedere La panoramica della versione di ACX.

Requisiti

Requisito Valore
Intestazione acxcircuit.h
IRQL PASSIVE_LEVEL

Vedi anche