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 バージョンの概要」を参照してください。
要件
要件 | 値 |
---|---|
Header | acxelements.h |
IRQL | PASSIVE_LEVEL |