Поделиться через


функция обратного вызова 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.

Remarks

Пример

Ниже приведен пример использования.

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

См. также раздел