EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE 콜백 함수(acxcircuit.h)
드라이버가 새 ACXCIRCUIT 개체에 대한 WDFDEVICE를 만들어야 하는 경우 ACX에서 EVT_ACX_FACTORY_CIRCUIT_CREATE_CIRCUITDEVICE 콜백을 호출합니다.
구문
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에 하나 이상의 ACXFACTORYCIRCUIT를 등록할 수 있습니다. 이 작업은 드라이버가 잘 정의된 형식의 ACXCIRCUIT를 만들 수 있음을 ACX에 알릴 수 있습니다.
ACX는 오디오 경로에 팩터리 제공 ACXCIRCUIT 중 하나가 필요하다는 것을 감지하면 ACXFACTORYCIRCUIT의 콜백을 호출합니다.
ACXFACTORYCIRCUIT 개체는 동적 ACXCIRCUIT를 지원합니다. 즉, 팩터리에서 만든 각 ACXCIRCUIT가 WDFDEVICE와 연결되고 이러한 두 개체의 수명이 동일합니다.
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 버전 개요를 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
헤더 | acxcircuit.h |
IRQL | PASSIVE_LEVEL |