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 |