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


функция обратного вызова EVT_ACX_STREAM_PREPARE_HARDWARE (acxstreams.h)

Событие EvtAcxStreamPrepareHardware сообщает драйверу, что необходимо подготовить оборудование для потоковой передачи.

Синтаксис

EVT_ACX_STREAM_PREPARE_HARDWARE EvtAcxStreamPrepareHardware;

NTSTATUS EvtAcxStreamPrepareHardware(
  ACXSTREAM Stream
)
{...}

Параметры

Stream

Объект ACXSTREAM представляет аудиопоток, созданный каналом. Поток состоит из списка элементов, созданных на основе элементов родительского канала. Дополнительные сведения см. в разделе ACX — сводка по объектам ACX.

Возвращаемое значение

Возвращает значение STATUS_SUCCESS , если вызов был выполнен успешно. В противном случае возвращается соответствующий код ошибки. Дополнительные сведения см. в разделе Использование значений NTSTATUS.

Комментарии

AcxStream поддерживает различные состояния. Эти состояния указывают, когда поток звука (состояние RUN), звук не течет, но звуковое оборудование подготовлено (состояние PAUSE) или звук не течет и звуковое оборудование не подготовлено (состояние STOP).

Событие EvtAcxStreamPrepareHardware передаст состояние потока из состояния Stop в состояние Pause. Драйвер должен выделить все аппаратные ресурсы, необходимые для потоковой передачи в этом случае, например подсистемы DMA.

Когда поток перейдет в состояние Приостановка, драйвер может получить событие EvtAcxStreamRun для перехода в состояние Run или драйвер может получить событие EvtAcxStreamReleaseHardware для перехода в состояние Stop.

События ACX аналогичны состояниям KS, как описано в этой таблице.

Состояние запуска Конечное состояние Вызывается событие драйвера ACX Примечания
STOP ПРИОБРЕСТИ PrepareHardware Драйвер выполняет выделение оборудования и подготовку
ПРИОБРЕСТИ PAUSE (Без вызова)
PAUSE ВЫПОЛНИТЬ Выполнить
ВЫПОЛНИТЬ PAUSE Пауза
PAUSE ПРИОБРЕСТИ (Без вызова)
ПРИОБРЕСТИ STOP ReleaseHardware Драйвер освобождает выделение оборудования

EvtAcxStreamAllocateRtPackets вызывается перед EvtAcxStreamPrepareHardware, чтобы разрешить выделение пакетов RT до EvtAcxStreamPrepareHardware.

Выделение буфера и DMA

Выделение буфера обычно включает только выделение системной памяти таким образом, чтобы ее можно было использовать с оборудованием DMA. Как правило, выделение буфера не оказывает никакого влияния на оборудование потоковой передачи. Этап подготовки оборудования используется для того, чтобы драйвер подготавливал поток к запуску, выполняя такие задачи, как резервирование пропускной способности, программирование DMA и подготовка к запросу на запуск потока. Как правило, код подготовки оборудования использует выделенные буферы для подготовки DMA и связанных действий к запуску потока.

Очистка памяти

Выделение пакетов (физическая память в системе) выполняется до evtAcxStreamPrepareHardware, а их выпуск (EvtAcxStreamFreeRtPackets) выполняется после EvtAcxStreamReleaseHardware. Этот шаблон является существующим устаревшим поведением, внедренным в поток настройки аудиопотока верхних слоев (ks allocate buffer prop init).

Удаление ресурсов потока можно выполнить при очистке контекста потока драйвера (а не уничтожении). Никогда не помещайте удаление всего, что совместно используется в контексте объекта, чтобы уничтожить обратный вызов. Это руководство относится ко всем объектам ACX.

Обратный вызов destroy вызывается после того, как последняя ссылка исчезает, когда она неизвестна.

Обратный вызов очистки потока вызывается при закрытии дескриптора. Одним из исключений из этого является создание потока драйвером в обратном вызове. Если ACX не удалось добавить этот поток в его stream-bridge непосредственно перед возвратом из операции stream-create, поток отменяется асинхронный, а текущий поток возвращает ошибку клиенту create-stream. На этом этапе поток не должен иметь выделенных выделений mem.

Пример

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

    ACX_STREAM_CALLBACKS streamCallbacks;
    ACX_STREAM_CALLBACKS_INIT(&streamCallbacks);
    streamCallbacks.EvtAcxStreamPrepareHardware     = Codec_EvtStreamPrepareHardware;
    ...
    status = AcxStreamInitAssignAcxStreamCallbacks(StreamInit, &streamCallbacks);
#pragma code_seg("PAGE")
NTSTATUS
Codec_EvtStreamPrepareHardware(
    _In_ ACXSTREAM Stream
    )
{
    PSTREAM_CONTEXT ctx;
    NTSTATUS        status;

    PAGED_CODE();

    ctx = GetStreamContext(Stream);

    status = AllocateStreamHardware(Stream);

    if (NT_SUCCESS(status))
    {
        ctx->StreamState = AcxStreamStatePause;
    }

    return status;
}

Требования к ACX

Минимальная версия ACX: 1.0

Дополнительные сведения о версиях ACX см. в статье Обзор версий ACX.

Требования

Требование Значение
Заголовок acxstreams.h
IRQL PASSIVE_LEVEL

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