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 |