EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE コールバック関数 (acxcircuit.h)

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE コールバックは、ドライバーが新しい ACXCIRCUIT オブジェクトの WDFDEVICE を作成する必要がある場合に、ACX によって呼び出されます。

構文

EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE EvtAcxFactoryCircuitCreateCircuitdevice;

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

パラメーター

Parent

Device オブジェクトで参照される WDFDEVICE の親である WDFDEVICE オブジェクト (フレームワーク オブジェクトの概要に関するページで説明されています)。

Factory

既存の回線ファクトリ ACXFACTORYCIRCUIT オブジェクト。 ACX オブジェクトの詳細については、「 ACX オブジェクトの概要」を参照してください。

Config

新しい ACXCIRCUIT の構成を定義する ACX_FACTORY_CIRCUIT_ADD_CIRCUIT 構造体。

Device

新しい WDFDEVICE フレームワーク オブジェクトへのハンドルを受け取る場所へのポインター (「フレームワーク オブジェクト の概要」を参照)。

戻り値

STATUS_SUCCESS呼び出しが成功した場合は を返します。 それ以外の場合は、適切なエラー コードを返します。 詳細については、「 NTSTATUS 値の使用」を参照してください。

注釈

AcxFactoryCircuit は、オンデマンドで ACXCIRCUIT を作成できるファクトリ オブジェクトを表します。

ドライバーは ACX に 1 つ以上の ACXFACTORYCIRCUIT を登録できます。このアクションにより、ドライバーが適切に定義された型の ACXCIRCUIT を作成できることが ACX に通知されます。

ACX は、オーディオ パスに ACXCIRCUIT が提供されているファクトリの 1 つが必要であることを検出すると、ACXFACTORYCIRCUIT のコールバックを呼び出します。

ACXFACTORYCIRCUIT オブジェクトは動的 ACXCIRCUIT をサポートしています。つまり、ファクトリによって作成された各 ACXCIRCUIT は WDFDEVICE に関連付けられ、これら 2 つのオブジェクトの有効期間は同じです。

AcxFactoryCircuit には、専用の WDF キューがあります。 WDF キューの詳細については、「 フレームワーク キュー オブジェクト」を参照してください。

使用例を次に示します。

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

ACX の要件

最小 ACX バージョン: 1.0

ACX バージョンの詳細については、「 ACX バージョンの概要」を参照してください。

要件

要件
Header acxcircuit.h
IRQL PASSIVE_LEVEL

こちらもご覧ください