EVT_ACX_AUDIOMODULE_PROCESSCOMMAND 콜백 함수(acxelements.h)
EVT_ACX_AUDIOMODULE_PROCESSCOMMAND 콜백은 드라이버에 오디오 모듈 요소에 대한 명령을 처리하도록 지시합니다.
구문
EVT_ACX_AUDIOMODULE_PROCESSCOMMAND EvtAcxAudiomoduleProcesscommand;
NTSTATUS EvtAcxAudiomoduleProcesscommand(
ACXAUDIOMODULE AudioModule,
PVOID InBuffer,
ULONG InBufferCb,
PVOID OutBuffer,
PULONG OutBufferCb
)
{...}
매개 변수
AudioModule
ACXAUDIOMODULE 개체입니다. ACX 개체에 대한 자세한 내용은 ACX 개체 요약을 참조하세요.
InBuffer
입력 버퍼에 대한 포인터입니다.
InBufferCb
바이트 수의 입력 버퍼 크기입니다.
OutBuffer
출력 버퍼에 대한 포인터입니다.
OutBufferCb
출력 버퍼 크기(바이트 수)입니다.
반환 값
호출이 성공하면 를 반환합니다 STATUS_SUCCESS
. 그렇지 않으면 적절한 오류 코드를 반환합니다. 자세한 내용은 NTSTATUS 값 사용을 참조하세요.
설명
예제
사용 예제는 다음과 같습니다.
EVT_ACX_AUDIOMODULE_PROCESSCOMMAND CodecR_EvtProcessCommand0;
NTSTATUS
CodecR_EvtProcessCommand0(
_In_ ACXAUDIOMODULE AudioModule,
_In_ PVOID InBuffer,
_In_ ULONG InBufferCb,
_In_ PVOID OutBuffer,
_Inout_ PULONG OutBufferCb
)
{
NTSTATUS status = STATUS_SUCCESS;
BOOL fNewValue = FALSE;
PVOID currentValue;
PVOID inBuffer = NULL;
ULONG inBufferCb = 0;
PCODEC_AUDIOMODULE0_CONTEXT audioModuleCtx;
AUDIOMODULE_PARAMETER_INFO * parameterInfo = NULL;
AUDIOMODULE_CUSTOM_COMMAND * command = NULL;
PAGED_CODE();
audioModuleCtx = GetCodecAudioModule0Context(AudioModule);
if (audioModuleCtx == NULL)
{
ASSERT(FALSE); // this should not happen.
status = STATUS_INTERNAL_ERROR;
goto exit;
}
//
// Basic parameter validation (module specific).
//
if (InBuffer == NULL || InBufferCb == 0)
{
return STATUS_INVALID_PARAMETER;
}
if (InBufferCb < sizeof(AUDIOMODULE_CUSTOM_COMMAND))
{
return STATUS_INVALID_PARAMETER;
}
command = (AUDIOMODULE_CUSTOM_COMMAND*)InBuffer;
if (command->ParameterId >= SIZEOF_ARRAY(AudioModule0_ParameterInfo))
{
return STATUS_INVALID_PARAMETER;
}
//
// Validate the parameter referenced in the command.
//
switch (command->ParameterId)
{
case AudioModuleParameter1:
currentValue = &audioModuleCtx->Parameter1;
parameterInfo = &AudioModule0_ParameterInfo[AudioModuleParameter1];
break;
case AudioModuleParameter2:
currentValue = &audioModuleCtx->Parameter2;
parameterInfo = &AudioModule0_ParameterInfo[AudioModuleParameter2];
break;
default:
status = STATUS_INVALID_PARAMETER;
goto exit;
}
//
// Update input buffer ptr/size.
//
inBuffer = (PVOID)((ULONG_PTR)InBuffer + sizeof(AUDIOMODULE_CUSTOM_COMMAND));
inBufferCb = InBufferCb - sizeof(AUDIOMODULE_CUSTOM_COMMAND);
if (inBufferCb == 0)
{
inBuffer = NULL;
}
status = AudioModule_GenericHandler(
command->Verb,
command->ParameterId,
parameterInfo,
currentValue,
inBuffer,
inBufferCb,
OutBuffer,
OutBufferCb,
&fNewValue);
if (!NT_SUCCESS(status))
{
goto exit;
}
if (fNewValue &&
(parameterInfo->Flags & AUDIOMODULE_PARAMETER_FLAG_CHANGE_NOTIFICATION))
{
AUDIOMODULE_CUSTOM_NOTIFICATION customNotification = {0};
customNotification.Type = AudioModuleParameterChanged;
customNotification.ParameterChanged.ParameterId = command->ParameterId;
status = AcxPnpEventGenerateEvent(audioModuleCtx->Event, &customNotification, (USHORT)sizeof(customNotification));
if (!NT_SUCCESS(status))
{
goto exit;
}
}
// Normalize error code.
status = STATUS_SUCCESS;
exit:
return status;
}
ACX 요구 사항
최소 ACX 버전: 1.0
ACX 버전에 대한 자세한 내용은 ACX 버전 개요를 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
헤더 | acxelements.h |
IRQL | PASSIVE_LEVEL |